RAG 完全指南
"RAG 是让 LLM 从'通才'变为'专家'的关键技术。"
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种将信息检索与大语言模型结合的技术架构,通过在生成响应前检索相关的外部知识,显著提升 LLM 回答的准确性、时效性和可靠性。
市场趋势
RAG 市场预计在 2024 年达到 18.5 亿美元,年复合增长率 49%,企业正加速将 RAG 从实验阶段推向生产部署。
一、RAG 基础原理
1.1 RAG 解决的核心问题
| 问题 | 传统 LLM | RAG 解决方案 |
|---|---|---|
| 知识截止 | 训练数据有截止日期 | 实时检索最新信息 |
| 幻觉 | 可能编造错误信息 | 基于检索的证据生成 |
| 领域知识 | 缺乏专业领域深度 | 接入专业知识库 |
| 可追溯性 | 无法追溯信息来源 | 提供引用来源 |
| 隐私数据 | 无法访问私有数据 | 安全检索内部文档 |
1.2 RAG 工作流程
1.3 RAG vs Fine-tuning
| 方面 | RAG | Fine-tuning |
|---|---|---|
| 数据更新 | 实时更新,无需重训 | 需要重新训练 |
| 成本 | 基础设施成本 | 高昂训练成本 |
| 可解释性 | 可追溯信息来源 | 黑盒 |
| 适用场景 | 知识密集型任务 | 行为/风格调整 |
| 部署复杂度 | 需要向量数据库 | 模型部署 |
| 组合使用 | ✅ 两者可以组合使用,RAG + Fine-tuned LLM |
二、RAG 架构模式
2.1 架构演进:Naive → Advanced → Modular
2.2 主流架构模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Simple RAG | 基础检索+生成,无额外优化 | 静态知识库、简单问答 |
| Conversational RAG | 融入对话历史,支持多轮对话 | 客服、聊天机器人 |
| Branched RAG | 分类后路由到不同数据源 | 多领域知识库(法律/技术/财务) |
| HyDE | 先生成假设答案,再检索相似文档 | 抽象查询、概念性问题 |
| Adaptive RAG | 根据查询复杂度动态调整策略 | 混合复杂度场景 |
| Corrective RAG (CRAG) | 评估检索结果后再生成 | 高准确性要求场景 |
| Self-RAG | 自主评估和修正生成结果 | 需要自我验证的场景 |
| Agentic RAG | Agent 编排多工具和知识源 | 复杂推理任务 |
| Graph RAG | 结合知识图谱增强关系理解 | 实体关系密集的领域 |
| Multimodal RAG | 支持文本、图像、音频、视频 | 多模态知识库 |
2.3 Agentic RAG 详解
2025 趋势
Agentic RAG 是当前最受关注的架构模式,它将 RAG 与 Agent 能力结合,实现更复杂的推理和动态探索。
三、数据处理与 Chunking
3.1 Chunking 策略对比
| 策略 | 说明 | 优势 | 劣势 |
|---|---|---|---|
| 固定大小 | 按字符/Token 数量切分 | 简单快速 | 破坏语义,切断句子 |
| 递归字符分割 | 按段落→句子→词层级分割 | 保留更多上下文 | 可能不均匀 |
| 句子分割 | 以句子为基本单位 | 保留完整语义 | 块大小不一 |
| Token 分割 | 按 Token 数量(考虑 LLM 限制) | 精确控制 | 可能切断语义 |
| 语义分割 | 基于 Embedding 相似度识别主题边界 | 最佳语义完整性 | 计算成本高 |
| 页面级分割 | 按文档页面分割 | 适合结构化文档 | 依赖文档格式 |
| LLM 分割 | 使用 LLM 识别逻辑边界 | 最高质量 | 成本最高 |
| 混合分割 | 组合多种策略 | 灵活适应 | 实现复杂 |
3.2 推荐的 Chunking 配置
2025 最佳实践
- 块大小: 256-512 tokens(平衡精确性和上下文)
- 重叠率: 10-20%(约 50-100 tokens)
- 保留结构: 保留标题、章节信息作为元数据
python
# 语义分割示例(使用 LangChain)
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", ".", " ", ""],
length_function=len
)
chunks = splitter.split_documents(documents)3.3 Small-to-Large 策略
一种高级策略:使用小块检索,返回大块上下文。
检索阶段:使用 256 token 小块进行精确匹配
↓
返回阶段:返回包含该小块的 1024 token 父块给 LLM
↓
效果:既有检索精确性,又有充足上下文四、Embedding 模型选择
4.1 主流 Embedding 模型对比(2025)
| 模型 | 提供商 | MTEB 分数 | 维度 | 最大 Token | 特点 |
|---|---|---|---|---|---|
| Qwen3-Embedding-8B | Alibaba | 70.58 | 1024 | 32K | #1 多语言榜单 |
| Gemini Embedding | 68.32 | 3072 | 2K | 多语言领先 | |
| text-embedding-3-large | OpenAI | 64.6 | 3072 | 8K | Matryoshka 支持 |
| text-embedding-3-small | OpenAI | 62.3 | 1536 | 8K | 高性价比 |
| Cohere Embed v4 | Cohere | 65.2 | 1536 | 128K | 多模态+超长上下文 |
| Voyage-3-large | Voyage | - | 1024 | 32K | 顶级检索质量 |
| BGE-M3 | BAAI | 63.0 | 1024 | 8K | 开源,多功能 |
| NV-Embed-v2 | NVIDIA | 69.32 | 4096 | 32K | 高性能(非商用) |
4.2 模型选择指南
4.3 Embedding 最佳实践
| 实践 | 说明 |
|---|---|
| 领域微调 | 在特定领域数据上微调可显著提升检索质量 |
| Matryoshka 维度 | 使用可变维度降低存储成本(如 3072→256) |
| 批量处理 | 批量 Embedding 提高吞吐量 |
| 缓存策略 | 缓存常用查询的 Embedding |
| 定期更新 | 使用最新模型版本 |
五、向量数据库选择
5.1 主流向量数据库对比
| 数据库 | 类型 | 特点 | 最佳场景 |
|---|---|---|---|
| Pinecone | 托管服务 | Serverless、免运维、高可用 | 企业生产环境 |
| Weaviate | 开源+托管 | 内置向量化、GraphQL、混合搜索 | AI 应用+结构化数据 |
| Qdrant | 开源+托管 | Rust 高性能、强过滤能力 | 高性能搜索、边缘部署 |
| Chroma | 开源 | 极简 API、Python 友好 | 开发原型、小规模应用 |
| Milvus | 开源 | 大规模、分布式、云原生 | 十亿级向量 |
| pgvector | 扩展 | PostgreSQL 原生支持 | 已有 PG 基础设施 |
| FAISS | 库 | Meta 开发、内存索引 | 研究、本地测试 |
5.2 选择决策树
5.3 向量数据库配置要点
| 配置项 | 说明 | 推荐值 |
|---|---|---|
| 索引类型 | HNSW 平衡速度和准确性 | HNSW |
| 相似度度量 | 余弦相似度适合大多数场景 | Cosine |
| ef_construction | 索引构建质量 | 128-256 |
| ef_search | 搜索精度(更高=更准但更慢) | 64-128 |
| Top-K | 初始检索数量 | 20-50 |
六、检索优化策略
6.1 Hybrid Search(混合搜索)
结合语义搜索(向量)和关键词搜索(BM25)的优势:
| 场景 | 向量搜索 | 关键词搜索 | 混合搜索 |
|---|---|---|---|
| "AI 如何工作" | ✅ 语义理解 | ❌ | ✅ |
| 专有名词 "GPT-4o" | ❌ 可能混淆 | ✅ 精确匹配 | ✅ |
| 复杂问题 | ✅ | 部分 | ✅✅ |
6.2 Query Enhancement(查询增强)
| 技术 | 说明 | 示例 |
|---|---|---|
| Query Rewriting | LLM 重写查询更适合检索 | "今天天气" → "2026年1月2日北京天气预报" |
| Query Expansion | 扩展同义词和相关概念 | "ML" → "ML, machine learning, 机器学习" |
| HyDE | 生成假设答案再检索 | 先生成"理想答案",再找相似文档 |
| Multi-Query | 生成多个查询版本 | 从不同角度提问 |
6.3 Re-ranking(重排序)
两阶段检索架构:
第一阶段:快速召回(Bi-Encoder / BM25)
↓ Top 50-100 候选文档
第二阶段:精准重排(Cross-Encoder)
↓ Top 3-10 最相关文档
第三阶段:送入 LLM 生成答案| 重排器类型 | 说明 | 性能 | 成本 |
|---|---|---|---|
| Cross-Encoder | 同时编码查询和文档 | 高精度 | 中 |
| LLM as Judge | 用 LLM 评估相关性 | 最高 | 高 |
| Cohere Rerank | 托管服务 | 高 | 按调用计费 |
| BGE Reranker | 开源 | 高 | 自托管 |
研究数据
重排序可将检索质量提升高达 48%,减少 LLM 幻觉 35%。
七、生成优化
7.1 Prompt 构建策略
xml
<system>
你是一个基于检索知识回答问题的助手。
请严格基于提供的上下文回答问题。如果上下文中没有相关信息,请明确说明。
</system>
<context>
{retrieved_documents}
</context>
<question>
{user_question}
</question>
<instructions>
1. 仅使用上下文中的信息回答
2. 引用相关来源
3. 如果信息不足,承认不确定性
</instructions>7.2 上下文压缩
| 技术 | 说明 | 效果 |
|---|---|---|
| LLM 压缩 | 用 LLM 提取关键信息 | 减少 50-70% Token |
| 句子窗口 | 只保留关键句子周围内容 | 保留上下文完整性 |
| 摘要压缩 | 对长文档生成摘要 | 适合超长文档 |
| 去重过滤 | 移除重复或高度相似的块 | 提高信息密度 |
7.3 引用与归因
python
# 在回答中添加引用
answer = """
根据公司政策文档,年假天数为 15 天 [1]。
参考来源:
[1] 《员工手册》第 5.2 节 - 休假政策
"""八、评估与监控
8.1 RAGAS 评估框架
RAGAS(Retrieval-Augmented Generation Assessment Suite)是专门为 RAG 设计的评估框架。
| 指标 | 说明 | 计算方式 |
|---|---|---|
| Faithfulness | 答案是否忠实于检索上下文 | 检查答案中每个声明是否可从上下文推断 |
| Answer Relevancy | 答案与问题的相关性 | 从答案反向生成问题,比较相似度 |
| Context Precision | 检索上下文的精确度 | 相关块在结果中的排名位置 |
| Context Recall | 检索上下文的召回率 | 答案所需信息在上下文中的覆盖度 |
| Answer Correctness | 答案与标准答案的一致性 | 语义相似度 + 事实重叠 |
8.2 评估代码示例
python
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall
)
# 准备评估数据
eval_data = {
"question": ["什么是 RAG?"],
"answer": ["RAG 是检索增强生成技术..."],
"contexts": [["RAG 即 Retrieval-Augmented Generation..."]],
"ground_truth": ["RAG(检索增强生成)是一种结合检索和生成的技术..."]
}
# 运行评估
result = evaluate(
eval_data,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
print(result)
# {'faithfulness': 0.92, 'answer_relevancy': 0.88, ...}8.3 生产环境监控指标
| 指标类型 | 具体指标 | 目标值 |
|---|---|---|
| 延迟 | 检索延迟 | < 200ms |
| 端到端延迟 | < 2s | |
| 质量 | 响应准确率 | > 95% |
| Faithfulness | > 0.9 | |
| 成本 | 每次查询成本 | 根据业务定义 |
| Token 使用量 | 优化至最小 | |
| 可用性 | 服务可用率 | > 99.9% |
| 错误率 | < 0.1% |
九、生产部署最佳实践
9.1 架构设计原则
| 原则 | 说明 |
|---|---|
| 模块化 | 检索器、生成器、编排器分离,便于独立更新 |
| 可观测性 | 完整的日志、指标、追踪 |
| 可扩展性 | 支持水平扩展,应对负载变化 |
| 容错性 | 降级策略、重试机制 |
| 安全性 | 访问控制、数据加密 |
9.2 缓存策略
| 缓存层 | 适用内容 | 效果 |
|---|---|---|
| 查询级缓存 | 完全相同的查询 | 最大节省 |
| 语义缓存 | 语义相似的查询 | 高命中率 |
| Embedding 缓存 | 文档/查询的 Embedding | 减少 API 调用 |
| KV 缓存 | LLM 推理中间状态 | 加速生成 |
9.3 成本优化
| 策略 | 节省幅度 | 实施难度 |
|---|---|---|
| Embedding 维度降低 | 50-80% 存储成本 | 低 |
| 智能路由 | 简单查询跳过检索 | 中 |
| 缓存复用 | 30-50% API 成本 | 低 |
| 小模型预处理 | 减少大模型调用 | 中 |
| 批量处理 | 提高吞吐量 | 低 |
十、工具与框架
10.1 RAG 开发框架
| 框架 | 特点 | 适用场景 |
|---|---|---|
| LangChain | 模块丰富、社区活跃 | 通用 RAG 开发 |
| LlamaIndex | 数据处理强大、索引灵活 | 复杂数据源 |
| Haystack | 生产就绪、管道化 | 企业搜索 |
| Flowise | 低代码、可视化 | 快速原型 |
| Dify | 全栈平台、开箱即用 | LLMOps |
10.2 实用工具
| 工具 | 用途 |
|---|---|
| Unstructured | 多格式文档解析 |
| Docling | PDF/文档智能提取 |
| RAGAS | RAG 评估 |
| LangSmith | 调试与监控 |
| Weights & Biases | 实验追踪 |
10.3 快速开始示例
python
# 使用 LangChain 构建简单 RAG
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()
# 2. 分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_documents(documents)
# 3. 向量化并存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. 创建 RAG 链
llm = ChatOpenAI(model="gpt-4o")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True
)
# 5. 查询
result = qa_chain({"query": "公司的年假政策是什么?"})
print(result["result"])十一、常见问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 检索结果不相关 | Chunking 不当、Embedding 不匹配 | 优化分块策略、微调 Embedding |
| 答案包含幻觉 | 检索质量低、Prompt 不当 | 添加重排序、明确指示仅用上下文 |
| 延迟过高 | 索引配置不当、模型过大 | 优化索引参数、使用小模型 |
| 成本过高 | 过度调用 API | 实施缓存、降低维度 |
| 多语言效果差 | 模型不支持多语言 | 使用多语言 Embedding(BGE-M3, Cohere) |
| 长文档处理困难 | 超出上下文限制 | 使用 Map-Reduce、层次摘要 |
十二、2025-2026 趋势
| 趋势 | 说明 |
|---|---|
| Agentic RAG | RAG 与 Agent 深度融合,实现动态多工具编排 |
| Graph RAG | 知识图谱增强,理解复杂实体关系 |
| Multimodal RAG | 统一检索文本、图像、音频、视频 |
| Long-Context 替代 | 超长上下文模型(1M+ tokens)部分场景替代 RAG |
| 本地部署 | 隐私敏感场景的完全本地化方案 |
| 自动优化 | AI 自动调优 Chunking、检索策略 |
| 实时 RAG | 流式数据源的实时更新和检索 |
十三、学习资源
13.1 官方文档
| 资源 | 链接 |
|---|---|
| LangChain RAG | docs.langchain.com |
| LlamaIndex | docs.llamaindex.ai |
| RAGAS | docs.ragas.io |
| Pinecone Learning | pinecone.io/learn |
13.2 经典论文
| 论文 | 贡献 |
|---|---|
| RAG 原始论文 (2020) | RAG 架构奠基 |
| Self-RAG (2023) | 自反思 RAG |
| Contextual Retrieval (2024) | Anthropic 上下文检索 |
核心建议
- 从简单开始:先用 Naive RAG 验证可行性,再逐步优化
- 重视数据质量:Chunking 和 Embedding 质量决定上限
- 持续评估:建立评估基准,数据驱动优化
- 生产化思维:从第一天就考虑监控、成本、安全