RAG检索增强生成指南已更新
什么是RAG?RAG(Retrieval-Augmented Generation)让LLM引用外部知识库来生成回答,解决知识截止日期、幻觉问题、专业知识需求。
工作流程:1.数据准备(文档->分块->Embedding->向量库) 2.检索生成(用户查询->向量检索->Top-K文档->LLM生成)
代码实现:from langchain.vectorstores import Chroma / from langchain.embeddings import OpenAIEmbeddings / vectorstore = Chroma.from_documents(documents, OpenAIEmbeddings()) / qa = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())
向量数据库对比:Pinecone=全托管易扩展,Weaviate=开源功能丰富,Milvus=大规模高性能,Chroma=轻量本地部署,pgvector=PostgreSQL集成。
Embedding模型:text-embedding-3-small(1536维性价比高),text-embedding-3-large(3072维效果最好),BGE-large-zh(1024维开源中文好)。
高级技术:混合检索(向量+关键词)、重排序(Reranking)、查询转换(Query Transformation)、文档分块优化、索引优化(元数据过滤、MMR)。
最佳实践:数据质量优先、选择合适分块策略、保存元数据、使用混合检索、设计好的提示词、建立评估体系。
RAG 检索增强生成指南
RAG(Retrieval-Augmented Generation)是一种结合检索和生成的技术架构。通过从外部知识库检索相关信息,增强 LLM 的回答质量和时效性,解决模型知识截止和幻觉问题。
大语言模型的固有局限:训练数据有截止日期,无法回答最新信息;可能产生看似合理但错误的幻觉。RAG 通过检索外部知识来解决这些问题。
1. RAG 工作流程
RAG 完整流程:
索引阶段:
1. 文档加载:从各种来源读取文档
2. 文本分块:将长文档分割成小块
3. 生成 Embedding:将文本块转为向量
4. 存储到向量数据库
查询阶段:
1. 用户提问,将问题转为向量
2. 在向量空间中检索相似文档
3. 选取最相关的 K 个文档块
4. 将检索结果注入 Prompt
5. LLM 基于检索内容生成回答
2. 文档分块策略
文档分块是 RAG 的关键步骤,影响检索效果。常见的分块策略包括固定大小分块、语义分块和递归分块。
分块策略对比:
固定大小分块:
- 按字符或 Token 数量固定切分
- 简单高效,但可能切断语义单元
语义分块:
- 按段落、标题等语义单元切分
- 保持语义完整,但实现复杂
递归分块:
- 使用分隔符层次化切分
- 平衡效果和实现复杂度,推荐使用
3. 向量数据库选择
向量数据库是 RAG 系统的核心组件,负责存储和检索向量。主流选择包括开源方案和云服务。
主流向量数据库:
开源方案:
- FAISS:Meta 开源,高性能但需自托管
- Chroma:轻量级,易于使用
- Weaviate:功能丰富,支持 GraphQL
- Qdrant:Rust 开发,高性能
云服务:
- Pinecone:全托管,易于扩展
- Azure Cognitive Search:微软云集成
- AWS OpenSearch:亚马逊云服务
选择建议:小规模用 Chroma,大规模或生产用 Pinecone/Qdrant
4. Embedding 模型选择
Embedding 模型的质量直接影响检索效果。选择时需考虑语言支持、维度和性能。
Embedding 模型推荐:
英文为主:
- text-embedding-ada-002:OpenAI 经典模型
- text-embedding-3-small/large:最新版本
- BGE-M3:开源多语言模型
中文为主:
- BAAI/bge-large-zh:中文效果好
- M3E:开源中文模型
- 阿里通义文本嵌入
选择考虑因素:语言支持、维度大小、API成本、推理速度
5. 检索策略优化
检索质量直接影响最终回答效果。常用的优化策略包括混合检索、重排序和查询改写。
检索优化策略:
1. 混合检索:结合向量相似度和关键词匹配
2. 重排序:初筛后用更精确模型重新排序
3. 查询改写:将用户问题改写为更适合检索的形式
4. 索引多个版本:为同一文档创建不同粒度的索引
5. 元数据过滤:按时间、类型等条件过滤检索结果
6. 相似度阈值:设置最低相似度要求,避免无关结果
6. 代码实现示例
使用 LangChain 实现基础 RAG 流程:
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# 1. 加载文档
loader = TextLoader("knowledge.txt")
docs = loader.load()
# 2. 文档分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(docs)
# 3. 生成 Embedding 并存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
# 4. 创建检索链
llm = ChatOpenAI(model="gpt-4")
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 5. 查询
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
result = qa.invoke({"query": "你的问题"})7. RAG 评估指标
RAG 系统评估通常关注:
检索质量:
- 召回率:相关文档是否被检索到
- 精确率:检索结果中相关文档的比例
- MRR:第一个相关文档的排名位置
生成质量:
- 答案准确性:答案是否正确
- 答案覆盖率:答案是否覆盖所有问题要点
- 引用准确性:引用片段是否支持答案
工具:RAGAS、TrulEval、LangSmith
8. RAG 的优势与局限
优势:
- 获取最新信息,不受训练数据截止日期限制
- 可引入私有数据,提升回答准确性
- 减少幻觉,答案有据可查
- 无需重新训练,成本较低
局限:
- 检索质量依赖文档质量和分块策略
- 增加延迟,每次查询需要检索步骤
- 上下文长度限制,最多只能注入有限内容
- 复杂推理仍可能失败
总结
RAG 是解决 LLM 知识时效性和幻觉问题的有效方案。核心流程包括:文档加载、分块、生成 Embedding、向量检索、结果注入。优化方向包括:选择合适的分块策略、向量数据库、Embedding 模型,以及混合检索、重排序等高级策略。
声明:本文由 AI 生成,可能存在错误或不准确之处。
最后更新:2026-01-29