共计 1915 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要 RAG 技术?
传统的生成模型(如 GPT 系列)虽然能流畅生成文本,但存在两个关键缺陷:

- 知识截止问题 :模型训练完成后,其知识就固定了。例如 GPT-3.5 的知识截止到 2021 年,无法获取最新信息。
- 幻觉问题 :当模型遇到不熟悉的话题时,可能会生成看似合理但实际错误的回答。
检索增强生成(RAG)通过结合检索系统和生成模型,让模型能够从外部知识库中实时获取信息,再基于这些信息生成回答,有效缓解了上述问题。
RAG 核心组件与工作流程
一个典型的 RAG 系统包含三个主要组件:
- Agent:协调整个流程的控制器,决定何时检索、如何结合检索结果生成最终回答。
- Retriever:从知识库中检索与输入相关的文档片段。
- Generator:基于检索到的内容和原始输入,生成最终回答。
数据流动方向如下:
用户输入 → Agent → Retriever → 知识库 → Generator → 最终回答
动手搭建 RAG 系统
环境准备
首先安装必要的 Python 库:
pip install langchain openai faiss-cpu chromadb
文档加载与分块
好的分块(chunking)策略对检索质量至关重要。这里展示两种常见的分块方法:
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 方法一:按固定大小分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
# 方法二:按语义分块(需要嵌入模型)from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings
text_splitter = SemanticChunker(OpenAIEmbeddings())
构建向量检索
我们对比两种流行的向量数据库:
# 使用 FAISS
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
vectorstore = FAISS.from_texts(texts, OpenAIEmbeddings())
# 使用 Chroma
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_texts(texts, OpenAIEmbeddings())
FAISS 更适合内存有限的场景,而 Chroma 提供了更完善的持久化功能。
集成生成模型
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(model="gpt-3.5-turbo"),
chain_type="stuff",
retriever=vectorstore.as_retriever())
result = qa_chain.run("什么是 RAG 技术?")
print(result)
生产环境优化建议
当系统需要处理真实用户流量时,需要考虑:
- 延迟优化 :
- 对高频查询实现缓存层
-
使用轻量级的嵌入模型(如 sentence-transformers/all-MiniLM-L6-v2)
-
准确性提升 :
- 设置相似度阈值过滤低质量检索结果
-
在 prompt 中明确要求模型标注引用来源
-
混合检索策略 :
- 结合关键词检索和向量检索(HyDE 技术)
- 对不同的查询类型使用不同的检索方法
新手常见陷阱及解决方案
- 分块大小不合适
- 症状:检索结果要么太零碎,要么包含无关信息
-
解决方案:尝试不同 chunk size(通常 300-800 字),并通过评估找到最佳值
-
缺少元数据过滤
- 症状:检索到过期或来源不可靠的内容
-
解决方案:为每个 chunk 添加发布时间、来源等元数据,并在检索时过滤
-
prompt 设计不佳
- 症状:模型忽略检索到的内容,依然产生幻觉
- 解决方案:在 prompt 中明确要求模型必须基于提供的上下文回答
进一步思考的方向
RAG 系统在实际应用中仍面临一些挑战:
- 如何处理知识库中的时效性信息?(比如新闻、股价等实时数据)
- 当检索到多个相互矛盾的文档片段时,如何让模型做出合理判断?
- 如何评估 RAG 系统的效果,与传统生成模型相比有哪些量化指标?
这些问题没有标准答案,期待大家在实践中探索自己的解决方案。
正文完
