用 LangChain 搭建 RAG 系统的正确姿势和常见误区
Raj Kumar | 2026-09-13T23:33:00 | Python, AI
RAG(检索增强生成)是当下最火的 AI 应用模式。用 LangChain 搭了几个 RAG 系统之后,总结了一些经验和避坑指南。
RAG(Retrieval-Augmented Generation)大概是 2025-2026 年最热门的 AI 应用模式了。简单说就是让大模型在回答问题之前先检索相关文档,避免幻觉。 用 LangChain 搭了三个 RAG 系统之后,总结一下经验。 ## 基本流程 ``` 用户提问 → 向量检索相关文档 → 把文档 + 问题一起发给 LLM → 生成回答 ``` 用 LangChain 实现: ```python from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.chains import RetrievalQA # 1. 构建向量库 embeddings = OpenAIEmbeddings() vectorstore = Chroma.from_documents(documents, embeddings) # 2. 创建检索链 qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4"), retriever=vectorstore.as_retriever(search_kwargs={"k": 5}), return_source_documents=True, ) # 3. 提问 result = qa_chain.invoke({"query": "公司的退款政策是什么?"}) ``` 看起来很简单对吧?但实际做下来会发现效果可能很差。 ## 常见误区 ### 误区 1:文档切分太粗暴 很多人直接按固定长度(500 字)切分文档,结果一个段落被切成两半,语义丢失。 正确做法: - 按段落/章节自然边界切分 - 使用 overlap(重叠)保留上下文 - 对于表格和列表,保持完整性 ```python from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=100, # 100 字重叠 separators=[" ", " ", "。", "!", "?", ".", " "], # 按自然边界切 ) ``` ### 误区 2:只靠向量搜索 纯向量搜索(语义相似度)在很多场景下不够用。比如用户问"2024 年 Q3 的营收",语义搜索可能返回的是"2023 年 Q3 的营收",因为它们语义很相似。 解决方案:混合搜索(向量 + 关键词) ```python from langchain.retrievers import EnsembleRetriever from langchain_community.retrievers import BM25Retriever bm25_retriever = BM25Retriever.from_documents(documents) vector_retriever = vectorstore.as_retriever() ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_retriever], weights=[0.4, 0.6], # BM25 和向量搜索的权重 ) ``` ### 误区 3:检索了不相关的内容 检索到的文档如果跟问题不相关,反而会误导 LLM。需要加一个相关性过滤: ```python retriever = vectorstore.as_retriever( search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.7, "k": 5}, ) ``` 分数低于 0.7 的文档直接丢弃。 ### 误区 4:忽略了 Prompt 的重要性 检索到了好的文档,但 Prompt 写得不好,LLM 可能还是会胡说。要在 Prompt 里明确告诉它: - 只根据提供的文档回答 - 如果文档中没有相关信息,说"我不知道" - 引用来源 ## 效果提升的关键 按重要程度排序: 1. **文档质量和切分策略** > 2. **检索策略(混合搜索)** > 3. **Prompt 优化** > 4. **模型选择** 很多人在模型选择上纠结,但其实文档处理和检索策略的影响更大。