RAG 检索增强生成指南

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