基于 RAG 的知识库问答系统设计与实现
项目代码地址:https://github.com/AI-Meet/Knowledge_QA_RAG
1. 系统介绍
基于 Retrieval-Augmented Generation (RAG) 的知识库问答系统通过结合信息检索与生成式模型,为知识库问答提供了一种高效且智能的解决方案。传统问答系统在面对动态知识更新和复杂问题时,往往存在响应不准确、更新不及时等问题,而 RAG 系统通过将知识检索与自然语言生成相结合,显著提升了回答的精准性和上下文相关性。为此,本文设计了一种基于 RAG 的知识库问答系统 Demo,采用前后端分离的架构设计,具体如下:
- 前端:基于 HTML/CSS/JavaScript 构建用户交互界面,支持问题输入、知识库创建和清空功能。
- 后端:基于 FastAPI 构建,结合 LangChain 框架,提供问答服务和知识管理接口。
2. 技术与方法
- 文档加载与分块:利用 LangChain 的
DocumentLoader
模块高效加载文件内容,并通过text_splitter
模块对文本进行分块处理,生成更小的知识单元,便于向量化存储和检索。 - 嵌入生成:通过 LangChain 的
Embedding
模块,将分块后的文本向量化存储,本系统采用的是jina-embeddings-v3
嵌入模型。 - 检索与问答链:LangChain 提供了
RetrievalQA
模块,整合检索和问答流程,支持快速集成向量数据库检索与语言模型生成的功能。 - 向量化检索与存储:采用 Milvus 向量数据库管理嵌入模型生成的语义向量,通过配置索引参数和搜索参数,实现高效的 k-NN 检索,确保检索准确性和性能。
3. 核心功能代码片段
3.1 知识库创建
@app.post("/rag/create/")
async def create_knowledge(file: UploadFile = File(...)):
"""
上传文件到指定目录后,处理文件内容并添加到向量库。
"""
folder = './upload_files' # 文件存储目录
os.makedirs(folder, exist_ok=True) # 确保目录存在
file_path = os.path.join(folder, file.filename)
try:
# 保存文件
with open(file_path, "wb") as f:
content = await file.read()
f.write(content)
folder: str = './upload_files'
file_path = os.path.join(folder, file.filename)
# 初始化文件处理器
file_processor = RagFileProcessor(chunk_size=64)
# 处理文件内容并插入到向量库
text_datas = file_processor.get_data(file_path=file_path)
# 连接到 Milvus
vector_store.add_texts(**text_datas)
return {
"status": "success",
"message": f"文件 '{file.filename}' 上传成功并添加至向量数据库.",
}
except Exception as e:
return {
"status": "error",
"message": f"文件 '{file.filename}'处理失败. 原因: {str(e)}",
}
3.2 知识对话问答
@app.post("/rag/chat/")
async def chat(request: ChatRequest):
"""
根据用户问题,从向量库检索并返回回答。
"""
print(f"Q: {request.question}")
try:
# 初始化 OpenAI Chat 模型
llm = ChatOpenAI(model=config.llm_model_name, api_key=config.api_key, base_url=config.base_url)
# 定义 Prompt 模板
qa_prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
# 定义搜索参数
search_kwargs = {"score_threshold": 0.3, "k": 5}
retriever = vector_store.as_retriever(search_type="similarity_score_threshold", search_kwargs=search_kwargs)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": qa_prompt},
return_source_documents=True
)
result = qa_chain.invoke({"query": request.question})
answer_result = result.get("result", "")
print(f"A: {answer_result}")
source = {"source_documents": [{"content": doc.page_content, "metadata": doc.metadata} for doc in
result.get("source_documents", [])]}
print(f"source: {source}")
return {"answer": answer_result}
except Exception as e:
return {"status": "error", "message": str(e)}
3.3 知识库清空
@app.post("/rag/clear/")
async def clear_knowledge(collection_name: str = config.milvus_collection_name,
host: str = config.milvus_host,
port: int = config.milvus_port):
"""
清空 Milvus 知识库集合,并删除指定目录中的文件
"""
folder = "./upload_files"
try:
connections.connect("default", host=host, port=port)
if utility.has_collection(collection_name):
collection = Collection(name=collection_name)
collection.drop()
print(f"Collection '{collection_name}' 成功删除.")
else:
print(f"Collection '{collection_name}' 不存在.")
connections.disconnect("default")
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
return {"message": f"知识库清空: Collection '{collection_name}' 删除, 文件夹 '{folder}' 清空."}
except Exception as e:
return {"error": f"知识库清空失败. 原因: {str(e)}"}
4. 系统运行效果截图
4.1 文件上传与知识库创建
- 点击 创建知识库 选择上传的文件,上传成功后提示:文件 xxx 上传成功并添加至向量数据库.
- 向量数据库中成功创建 knowledge_collection,并将向量数据加载到内存中。
4.2 知识库问答
- 在输入框中输入问题,点击 发送 即可得到回答。
4.3 文件删除与知识库清空
- 点击 清空知识库 ,清除成功后提示:知识库清空:Collection ‘knowledge_collection’ 删除,文件夹 './upload_files’清空.
- 此时,向量数据库中成功删除 knowledge_collection,已经没有Collection。
总结
本系统以理解 RAG 技术为目标,提供了一种面向知识库问答的简单实现示例。通过结合文档加载、文本分块、向量检索与生成式问答,系统展示了 RAG 技术在小规模知识库中的应用潜力。然而,由于示例场景相对简单,系统尚未涉及多轮对话、检索召回重排序、提示词优化、分布式向量存储等更为复杂的问题。所以,可以进一步优化系统性能,例如引入多轮对话的上下文管理、使用先进的重排序模型提升检索精度,或探索更高效的提示词设计等,以支持更复杂的知识问答场景,为实践 RAG 技术提供更全面的支持。
项目代码地址:https://github.com/AI-Meet/Knowledge_QA_RAG
标签:RAG,知识库,collection,file,path,问答 From: https://blog.csdn.net/weixin_47936614/article/details/143932997