Advanced RAG 详解
概述
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种将外部知识检索与大语言模型生成能力相结合的技术架构。
Advanced RAG(高级 RAG) 是对基础 RAG(也称 Naive RAG)的系统性优化,通过在检索前、检索中、检索后引入多种优化技术,显著提升检索质量和生成准确性。
为什么需要 Advanced RAG?
Naive RAG 存在以下问题:
| 问题类型 |
具体表现 |
| 检索质量差 |
召回的文档与问题不相关 |
| 上下文丢失 |
分块切断了语义完整性 |
| 幻觉问题 |
模型生成与检索内容不符的答案 |
| 效率低下 |
检索大量无关内容浪费 Token |
RAG 演进路线
1 2 3 4 5 6 7
| ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Naive RAG │ ─→ │ Advanced RAG│ ─→ │ Modular RAG │ │ (基础版) │ │ (进阶版) │ │ (模块化版) │ └─────────────┘ └─────────────┘ └─────────────┘ ↓ ↓ ↓ 简单流程 优化流程 灵活组合 问题多 质量提升 高度定制
|
三代 RAG 对比
| 特性 |
Naive RAG |
Advanced RAG |
Modular RAG |
| 检索方式 |
单一向量检索 |
混合检索 + 重排序 |
可插拔检索模块 |
| 查询处理 |
直接使用原始查询 |
查询改写/扩展 |
自适应查询路由 |
| 上下文处理 |
简单拼接 |
压缩/过滤/去重 |
动态上下文管理 |
| 索引策略 |
固定分块 |
多粒度索引 |
自定义索引管道 |
Advanced RAG 核心架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 用户查询 │ ▼ ┌───────────────────────────────────────────────────────┐ │ 预检索阶段 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │查询改写 │ │查询扩展 │ │查询路由 │ │ HyDE │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └───────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────────┐ │ 检索阶段 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │混合检索 │ │多路召回 │ │ 重排序 │ │元数据过滤│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └───────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────────┐ │ 后检索阶段 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │上下文压缩│ │ 去重过滤 │ │相关性校验│ │内容重组 │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └───────────────────────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────────────────────┐ │ 生成阶段 │ │ ┌─────────────────────────────────────────────────┐ │ │ │ LLM 根据优化后的上下文生成高质量答案 │ │ │ └─────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
|
预检索优化技术
预检索阶段的目标是优化用户查询,使其更适合检索系统。
1. 查询改写(Query Rewriting)
将用户的原始查询改写为更适合检索的形式。
为什么需要?
- 用户查询可能口语化、模糊、有歧义
- 检索系统需要精确、明确的查询
示例:
1 2 3 4 5
| 原始查询: "那个东西怎么用啊" 改写后: "请解释该工具的使用方法和操作步骤"
原始查询: "Python 爬虫报错了" 改写后: "Python 爬虫常见错误类型及解决方案"
|
实现方式:
- 使用 LLM 进行查询改写
- 基于规则的改写(去停用词、纠错等)
2. 查询扩展(Query Expansion)
将单个查询扩展为多个相关查询,增加召回覆盖面。
技术方案:
| 方法 |
说明 |
示例 |
| 同义词扩展 |
添加同义词 |
“机器学习” → “ML”、”Machine Learning” |
| 上下位词扩展 |
添加上位/下位概念 |
“Python” → “编程语言”、”Python3” |
| 多角度扩展 |
从不同角度生成查询 |
原因、方法、比较、应用 |
Multi-Query 示例:
1 2 3 4 5 6 7
| 原始: "如何优化 RAG 系统?"
扩展为: 1. "RAG 系统性能优化方法" 2. "提升 RAG 检索准确率的技术" 3. "RAG 系统常见问题及解决方案" 4. "Advanced RAG 最佳实践"
|
3. HyDE(Hypothetical Document Embeddings)
核心思想:先让 LLM 生成一个「假设性答案文档」,再用这个文档去检索。
为什么有效?
- 问题和答案的语义空间不同
- 用「答案」检索比用「问题」检索更精准
流程图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 用户问题 │ ▼ ┌─────────────────┐ │ LLM 生成假设答案 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 对假设答案做嵌入 │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ 用嵌入向量检索 │ └─────────────────┘ │ ▼ 检索结果
|
示例:
1 2 3 4 5 6 7 8
| 问题: "什么是向量数据库?"
假设答案(LLM 生成): "向量数据库是一种专门用于存储和检索高维向量数据的数据库系统。 它支持相似性搜索,常用于推荐系统、图像搜索、语义搜索等场景。 常见的向量数据库包括 Milvus、Pinecone、Weaviate 等。"
→ 用这段文本的嵌入向量去检索,比直接用问题检索效果更好
|
4. 查询路由(Query Routing)
根据查询类型,将其路由到最合适的检索源或处理流程。
1 2 3 4 5 6 7 8 9 10 11 12
| 用户查询 │ ▼ ┌─────────────┐ │ 路由判断器 │ └─────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 向量库 │ │ 知识图谱 │ │ SQL数据库│ └─────────┘ └─────────┘ └─────────┘
|
路由策略:
- 基于关键词:包含特定关键词走特定通道
- 基于 LLM 分类:让 LLM 判断查询类型
- 基于嵌入相似度:与预设类别嵌入比较
检索优化技术
1. 混合检索(Hybrid Search)
结合关键词检索和向量检索的优势。
| 检索方式 |
优势 |
劣势 |
| 关键词检索 (BM25) |
精确匹配、可解释 |
无法理解语义 |
| 向量检索 (Embedding) |
语义理解、模糊匹配 |
可能丢失关键词 |
| 混合检索 |
兼顾精确与语义 |
需要融合策略 |
融合策略示例(RRF - Reciprocal Rank Fusion):
1 2 3 4 5
| RRF_score = Σ 1 / (k + rank_i)
其中: - k 为常数(通常为 60) - rank_i 为文档在第 i 个检索结果中的排名
|
2. 重排序(Reranking)
对初步检索结果进行二次排序,提升相关性。
1 2 3 4 5 6 7 8 9 10
| 检索结果(Top 100) │ ▼ ┌─────────────────┐ │ Reranker 模型 │ │ (Cross-Encoder) │ └─────────────────┘ │ ▼ 重排序结果(Top 10)
|
常用 Reranker 模型:
- Cohere Rerank
- BGE Reranker
- Jina Reranker
- Cross-Encoder 模型
Bi-Encoder vs Cross-Encoder:
1 2 3 4 5 6 7 8
| Bi-Encoder(用于初检索,快但不够精确): Query → [Encoder] → 向量 Doc → [Encoder] → 向量 相似度 = cosine(Query向量, Doc向量)
Cross-Encoder(用于重排序,慢但精确): [Query, Doc] → [Encoder] → 相关性分数 直接输出相关性,更准确
|
3. 多路召回(Multi-way Retrieval)
从多个维度同时检索,扩大召回范围。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 用户查询 │ ┌─────────┼─────────┐ ▼ ▼ ▼ ┌───────┐ ┌───────┐ ┌───────┐ │语义检索│ │关键词 │ │知识图谱│ └───────┘ └───────┘ └───────┘ │ │ │ └─────────┼─────────┘ ▼ ┌─────────┐ │结果融合 │ └─────────┘ │ ▼ 最终结果
|
索引优化技术
1. 分块策略优化
常见分块方法:
| 方法 |
说明 |
适用场景 |
| 固定大小分块 |
按字符/Token 数切分 |
通用场景 |
| 语义分块 |
按语义边界切分 |
文章、报告 |
| 递归分块 |
按标题层级递归切分 |
结构化文档 |
| 句子窗口 |
检索句子 + 返回周围窗口 |
精确定位 |
句子窗口(Sentence Window)示例:
1 2 3 4 5 6 7
| 原始文档: "句子1。句子2。句子3。句子4。句子5。"
索引单位: 句子3 返回内容: 句子2 + 句子3 + 句子4(窗口大小=1)
优势: 索引粒度细,返回上下文完整
|
2. 层次化索引(Hierarchical Indexing)
1 2 3 4 5 6 7 8 9 10 11 12 13
| ┌─────────────┐ │ 文档摘要 │ ← 粗粒度检索 └─────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 章节摘要 │ │ 章节摘要 │ │ 章节摘要 │ ← 中粒度 └─────────┘ └─────────┘ └─────────┘ │ ┌─────┼─────┐ ▼ ▼ ▼ [段落] [段落] [段落] ← 细粒度检索
|
检索流程:
- 先用摘要快速定位相关文档
- 再深入检索具体段落
3. 父子文档索引(Parent-Child Indexing)
1 2 3 4 5 6 7
| 父文档(用于返回,包含完整上下文) ├── 子块1(用于检索,精确匹配) ├── 子块2 └── 子块3
检索时: 匹配子块 返回时: 返回父文档
|
优势:
- 检索精确(小块匹配度高)
- 上下文完整(返回大块内容)
后检索优化技术
1. 上下文压缩(Context Compression)
移除检索结果中与问题无关的内容,节省 Token。
1 2 3 4 5 6 7 8 9
| 原始检索结果(1000 Token): "本文介绍了机器学习的基础知识...(大量背景信息)... 其中,向量数据库是...(相关内容)... 参考文献:..."
压缩后(200 Token): "向量数据库是一种专门存储高维向量的数据库..."
压缩率: 80%
|
实现方式:
- LLM 压缩:让 LLM 提取相关内容
- LLMLingua:基于困惑度的压缩
- Recomp:抽取式/生成式压缩
2. 去重与过滤
- 语义去重:合并语义相似的检索结果
- 相关性过滤:移除相关性低于阈值的结果
- 元数据过滤:按时间、来源等条件过滤
3. 上下文重组
将检索结果按逻辑顺序重组,提升生成质量。
1 2 3 4 5 6 7 8 9
| 检索顺序(按相关性): 1. 结论段落 2. 背景段落 3. 方法段落
重组顺序(按逻辑): 1. 背景段落 2. 方法段落 3. 结论段落
|
高级 RAG 范式
1. Self-RAG(自反思 RAG)
模型在生成过程中自我评估是否需要检索、检索结果是否相关、生成是否符合事实。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ┌─────────────────────────────────────────────────────┐ │ Self-RAG 流程 │ ├─────────────────────────────────────────────────────┤ │ 1. [Retrieve] 是否需要检索? │ │ → Yes/No │ │ │ │ 2. [IsRel] 检索结果是否相关? │ │ → Relevant/Irrelevant │ │ │ │ 3. [IsSup] 生成内容是否有检索支持? │ │ → Fully/Partially/No Support │ │ │ │ 4. [IsUse] 生成内容是否有用? │ │ → 1-5 分 │ └─────────────────────────────────────────────────────┘
|
2. CRAG(Corrective RAG)
带有纠错机制的 RAG,能够识别并修正检索错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 用户查询 │ ▼ ┌─────────────┐ │ 初次检索 │ └─────────────┘ │ ▼ ┌─────────────┐ │ 相关性评估 │ └─────────────┘ │ ├── 相关 → 直接使用 │ ├── 模糊 → 知识精炼(提取关键信息) │ └── 不相关 → 触发网络搜索 │ ▼ ┌─────────────┐ │ 知识重获取 │ └─────────────┘
|
3. RAG Fusion
执行多个改写查询的检索,然后融合结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 原始查询 │ ▼ ┌─────────────┐ │ 生成多个改写 │ └─────────────┘ │ ├── 改写查询 1 → 检索结果 1 ├── 改写查询 2 → 检索结果 2 ├── 改写查询 3 → 检索结果 3 └── 改写查询 4 → 检索结果 4 │ ▼ ┌─────────────┐ │ RRF 融合 │ └─────────────┘ │ ▼ 最终结果
|
评估指标
检索质量评估
| 指标 |
说明 |
公式 |
| Recall@K |
Top-K 中包含正确答案的比例 |
相关文档数 / 总相关文档数 |
| Precision@K |
Top-K 中相关文档的比例 |
相关文档数 / K |
| MRR |
第一个正确结果的排名倒数 |
1 / rank |
| NDCG |
归一化折损累积增益 |
考虑位置的相关性评分 |
生成质量评估
| 指标 |
说明 |
| Faithfulness |
生成内容是否忠于检索结果 |
| Answer Relevancy |
答案与问题的相关性 |
| Context Relevancy |
上下文与问题的相关性 |
| Hallucination Rate |
幻觉比例 |
常用评估框架
- RAGAS:专门用于 RAG 评估的框架
- TruLens:LLM 应用评估工具
- LangSmith:LangChain 的评估追踪工具
技术选型建议
场景对应方案
| 场景 |
推荐技术 |
| 精确匹配重要 |
混合检索(BM25 + Vector) |
| 长文档理解 |
层次化索引 + 父子文档 |
| 多源数据 |
查询路由 + 多路召回 |
| Token 受限 |
上下文压缩 + 重排序 |
| 高准确性要求 |
Self-RAG / CRAG |
技术栈推荐
| 组件 |
推荐工具 |
| 向量数据库 |
Milvus、Qdrant、Weaviate、Chroma |
| Embedding 模型 |
BGE、GTE、Jina、OpenAI Embedding |
| Reranker |
BGE Reranker、Cohere Rerank |
| 框架 |
LangChain、LlamaIndex、Haystack |
总结
Advanced RAG 通过在 RAG 管道的各个阶段引入优化技术,系统性地提升了检索增强生成的效果:
- 预检索:查询改写、扩展、路由、HyDE
- 检索:混合检索、多路召回、重排序
- 索引:分块优化、层次索引、父子文档
- 后检索:上下文压缩、去重、重组
- 高级范式:Self-RAG、CRAG、RAG Fusion
选择合适的技术组合需要根据具体场景权衡准确性、延迟、成本三者的关系。
相关链接
- RAG 基础
- Agent 架构
- Prompt Engineering