分享一套锋哥原创的【优质AI大模型源码】AI大模型-基于LangChain的RAG医疗健康知识智能问答系统(Flask+Vue3+Ollama+Chroma)

0 阅读3分钟

大家好,我是python222_小锋老师,分享一套优质的AI大模型-基于LangChain的RAG医疗健康知识智能问答系统(Flask+Vue3+Ollama+Chroma)  。  

3.jpg

项目简介

随着人工智能技术的快速发展,大语言模型(Large Language Model,LLM)在自然语言处理领域展现出强大的理解与生成能力。然而,通用大语言模型存在"幻觉"问题,即可能生成与事实不符的内容,且无法直接获取企业内部的专有知识。检索增强生成(Retrieval-Augmented Generation,RAG)技术通过将外部知识库与大语言模型相结合,有效解决了上述问题,使AI能够基于真实文档内容进行精准回答。

本论文设计并实现了一个基于RAG技术的企业知识库智能问答系统。系统采用前后端分离的B/S架构,前端使用Vue3框架配合Element Plus组件库构建用户界面,后端基于Python Flask框架提供RESTful API服务。系统核心功能包括:知识库管理、文档上传与向量化处理、基于RAG的智能问答、对话历史管理、用户权限控制以及数据统计分析。在向量化处理环节,系统利用Ollama部署本地嵌入模型将文档文本转化为向量表示,并存储于ChromaDB向量数据库;在问答环节,通过LangChain框架编排RAG处理链,实现从用户提问到向量检索、上下文构建、LLM生成回答的完整流程。

源码下载

链接: pan.baidu.com/s/14Bw9F7RQ…

提取码: 1234

相关截图

2.jpg

image.png

4.jpg

5.jpg

6.jpg

核心代码

"""  
RAG问答核心服务  
基于LangChain构建检索增强生成(RAG)问答链  
使用Ollama的qwen3:8b作为大语言模型  
"""  
from flask import current_app  
from langchain_ollama import ChatOllama  
from langchain_core.prompts import ChatPromptTemplate  
from langchain_core.output_parsers import StrOutputParser  
from langchain_core.runnables import RunnablePassthrough  
from services.vector_service import VectorService  
  
  
# RAG系统提示词模板  
SYSTEM_PROMPT = """你是一个企业内部知识库智能问答助手。请根据以下提供的参考资料来回答用户的问题。  
  
要求:  
1. 仅根据参考资料中的内容来回答问题,不要编造信息  
2. 如果参考资料中没有相关信息,请如实告知用户  
3. 回答要准确、简洁、专业  
4. 使用中文回答  
  
参考资料:  
{context}  
"""  
  
# 用户提问模板  
USER_PROMPT = "{question}"  
  
  
class RAGService:  
"""RAG问答服务类"""  
  
def __init__(self):  
"""初始化LLM模型和向量服务"""  
self.llm = ChatOllama(  
model=current_app.config['OLLAMA_LLM_MODEL'],  
base_url=current_app.config['OLLAMA_BASE_URL'],  
temperature=0.3,  
timeout=3600  
)  
self.vector_service = VectorService()  
  
def _format_docs(self, docs):  
"""  
将检索到的文档格式化为上下文文本  
:param docs: 检索到的文档列表  
:return: 格式化后的文本  
"""  
formatted = []  
for i, doc in enumerate(docs, 1):  
source = doc.metadata.get('file_name', '未知来源')  
formatted.append(f"[来源{i}: {source}]\n{doc.page_content}")  
return '\n\n'.join(formatted)  
  
def _extract_source_docs(self, docs):  
"""  
提取参考文档来源信息  
:param docs: 检索到的文档列表  
:return: 来源信息列表  
"""  
sources = []  
seen = set()  
for doc in docs:  
file_name = doc.metadata.get('file_name', '未知')  
if file_name not in seen:  
seen.add(file_name)  
sources.append({  
'file_name': file_name,  
'content': doc.page_content[:200]  
})  
return sources  
  
def ask(self, question, kb_id):  
"""  
RAG问答主方法  
流程: 用户提问 -> 向量检索 -> 构建上下文 -> LLM生成回答  
:param question: 用户问题  
:param kb_id: 知识库ID  
:return: (回答文本, 参考来源列表)  
"""  
# 获取知识库的检索器  
retriever = self.vector_service.get_retriever(kb_id)  
  
# 检索相关文档  
docs = retriever.invoke(question)  
  
if not docs:  
return '抱歉,在知识库中未找到与您问题相关的内容,请尝试换个方式提问。', []  
  
# 构建提示词  
prompt = ChatPromptTemplate.from_messages([  
('system', SYSTEM_PROMPT),  
('human', USER_PROMPT)  
])  
  
# 构建RAG链:检索 -> 格式化上下文 -> 提示词 -> LLM -> 解析输出  
rag_chain = (  
{  
'context': lambda x: self._format_docs(docs),  
'question': RunnablePassthrough()  
}  
| prompt  
| self.llm  
| StrOutputParser()  
)  
  
# 执行问答  
answer = rag_chain.invoke(question)  
  
# 提取参考来源  
source_docs = self._extract_source_docs(docs)  
  
return answer, source_docs