LangChain开发智能问答(RAG)系统实战教程:从零构建知识驱动型AI助手
一、RAG技术解析与LangChain简介
1.1 RAG架构核心原理
Retrieval-Augmented Generation(检索增强生成)通过结合信息检索与文本生成的优势:
[用户问题] → [向量检索] → [相关文档] → [上下文增强] → [LLM生成] → [精准回答]
与传统问答系统相比,RAG具有:
- 知识可更新:只需更新文档库,无需重新训练模型
- 来源可追溯:每个回答都能关联参考文档
- 成本更低:相比微调大模型,资源消耗大幅降低
1.2 LangChain核心组件
python
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA
二、环境配置与数据准备
2.1 快速安装指南
bash
# 创建conda环境
conda create -n rag python=3.10
conda activate rag
# 安装核心依赖
pip install langchain langchain-community langchain-openai faiss-cpu tiktoken
2.2 知识库构建实战
python
# 从网页加载数据
loader = WebBaseLoader(["https://example.com/doc1", "https://example.com/doc2"])
documents = loader.load()
# 文档分块处理
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len
)
docs = text_splitter.split_documents(documents)
三、向量检索系统搭建
3.1 向量库构建与持久化
python
from langchain_openai import OpenAIEmbeddings
# 使用OpenAI嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 创建FAISS向量库
vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore.save_local("faiss_index") # 保存到本地
# 加载已有索引
loaded_vectorstore = FAISS.load_local("faiss_index", embeddings)
3.2 检索优化技巧
python
# 混合检索策略
retriever = vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性
search_kwargs={"k": 5, "lambda_mult": 0.25}
)
# 分数阈值过滤
retriever = vectorstore.as_retriever(
search_kwargs={"score_threshold": 0.7}
)
四、问答链集成与优化
4.1 基础问答链实现
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff" # 简单文档拼接
)
response = qa_chain.invoke({"query": "如何申请休假?"})
print(response["result"])
4.2 高级Prompt工程
python
from langchain_core.prompts import PromptTemplate
custom_prompt = PromptTemplate(
input_variables=["context", "question"],
template="""
你是一个专业客服助手,请根据以下上下文回答问题:
{context}
问题:{question}
回答要求:
1. 如果信息不完整,明确告知用户
2. 引用文档中的具体条款
3. 使用中文简洁回答
"""
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type_kwargs={"prompt": custom_prompt}
)
五、生产级优化方案
5.1 性能提升技巧
python
# 异步处理提升吞吐量
async def async_query(question):
return await qa_chain.ainvoke({"query": question})
# 缓存机制
from langchain.cache import SQLiteCache
import langchain
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")
5.2 监控与评估
python
# 记录问答历史
from langchain.callbacks import FileCallbackHandler
handler = FileCallbackHandler('logs.json')
qa_chain.invoke(
{"query": "年度奖金如何计算?"},
config={"callbacks": [handler]}
)
# 评估检索质量
from langchain.evaluation import load_evaluator
evaluator = load_evaluator("context_qa")
eval_result = evaluator.evaluate(
examples=[...],
predictions=[...]
)
六、完整项目示例:企业知识问答系统
6.1 项目结构
/project
/data
policies.pdf
handbook.docx
/vector_store
faiss_index
app.py
config.py
6.2 可部署的FastAPI服务
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Query(BaseModel):
question: str
@app.post("/ask")
async def ask_question(query: Query):
result = qa_chain.invoke({"query": query.question})
return {
"answer": result["result"],
"sources": [doc.metadata["source"] for doc in result["source_documents"]]
}
七、常见问题解决方案
7.1 高频问题排查
-
检索结果不相关:
- 调整chunk_size(300-1000之间)
- 尝试不同的embedding模型
- 添加元数据过滤
-
回答质量差:
- 优化prompt模板
- 限制回答长度
max_tokens=500
- 添加few-shot示例
-
处理长文档:
- 使用
chain_type="map_reduce"
- 实现分级检索(先检索章节,再检索内容)
- 使用
7.2 扩展方向
- 多模态RAG:支持图片/表格检索
- 实时知识更新:自动同步最新文档
- 多轮对话:结合对话历史优化检索
- 权限控制:基于用户角色的知识过滤
最佳实践建议:
- 从少量高质量文档开始验证流程
- 构建评估集量化系统表现
- 实现自动化知识库更新机制
- 添加用户反馈收集环节
完整代码示例可参考:[GitHub仓库链接](此处替换为实际仓库地址)