去年我在为一家金融科技公司搭建智能客服系统时,首次接触到RAG技术。当时客户要求系统能准确回答复杂的金融产品问题,而单纯使用大模型经常出现"幻觉"回答。经过多次尝试,最终采用RAG架构将回答准确率从63%提升到了89%。今天我就把构建RAG系统的完整方法论和实战经验分享给大家。
RAG(检索增强生成)是目前最实用的大模型落地技术之一,它完美结合了信息检索和文本生成的优势。简单来说,就是先检索相关文档片段,再让大模型基于这些片段生成回答。这种架构既能利用大模型强大的语言理解能力,又能确保回答内容的事实准确性。
本文将手把手教你用LangChain构建完整的RAG系统。不同于其他教程只讲概念,我会重点分享实际项目中积累的:
大模型虽然知识丰富,但存在三个致命缺陷:
RAG通过引入检索环节完美解决了这些问题。在我参与的医疗问答项目中,使用RAG后错误用药建议减少了76%。
典型的RAG系统包含两个阶段:
索引阶段(离线):
查询阶段(在线):
这种架构的优势在于:
LangChain支持多种文档加载器:
python复制from langchain.document_loaders import (
WebBaseLoader,
PyPDFLoader,
Docx2txtLoader
)
# 加载网页
loader = WebBaseLoader(["https://example.com"])
web_docs = loader.load()
# 加载PDF
loader = PyPDFLoader("report.pdf")
pdf_docs = loader.load()
避坑经验:
分块大小直接影响检索效果:
推荐策略:
python复制from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100,
length_function=len
)
splits = text_splitter.split_documents(docs)
参数选择原则:
主流向量数据库对比:
| 数据库 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| FAISS | 速度快 | 无持久化 | 开发测试 |
| Chroma | 易用 | 规模受限 | 中小项目 |
| Pinecone | 全托管 | 收费 | 生产环境 |
| Weaviate | 功能全 | 配置复杂 | 企业级 |
配置示例:
python复制from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=splits,
embedding=OpenAIEmbeddings()
)
重要提示:生产环境建议使用GPU加速的嵌入模型(如bge-large),速度可提升5-8倍
python复制from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vectorstore.as_retriever(),
chain_type="stuff"
)
result = qa_chain.run("RAG的核心优势是什么?")
参数调优建议:
python复制from langchain.agents import Tool
from langchain.agents import initialize_agent
tool = Tool(
name="RAG System",
func=qa_chain.run,
description="用于回答技术问题"
)
agent = initialize_agent(
[tool],
llm,
agent="zero-shot-react-description",
verbose=True
)
agent.run("请比较RAG和微调各自的优缺点")
方案选择指南:
混合检索方案:
python复制from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25_retriever = BM25Retriever.from_documents(docs)
vector_retriever = vectorstore.as_retriever()
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6]
)
重排序策略:
python复制from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=ensemble_retriever
)
问题1:返回无关内容
问题2:响应速度慢
问题3:生成内容不准确
在实际项目中,我建议先用小数据集验证核心流程,再逐步扩展。例如先构建100篇文档的测试系统,验证效果后再扩展到企业级知识库。记住,RAG系统的效果70%取决于数据质量,30%才是算法调优。