大家好,我是python222_小锋老师,分享一套优质的AI大模型-基于LangChain的RAG医疗健康知识智能问答系统(Flask+Vue3+Ollama+Chroma) 。
项目简介
随着人工智能技术的快速发展,大语言模型(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
相关截图
核心代码
"""
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