13.12 RAG 高级技术
五代进化讲的是 RAG 的宏观演变路径。但在每一代内部,还有大量”高级技术”可以提升效果。这些技术不是独立的一代,而是可以在任何一代上叠加的优化手段。
13.12.1 HyDE(假设文档嵌入)
2023 年提出的反直觉但有效的技术。核心思路:用生成来增强检索。
传统 RAG 的问题是:用户的问题和文档的语言风格可能差异很大。用户问”怎么让电脑快一点”,但文档里写的是”系统性能优化方法”。即使用 Embedding 做语义检索,这种风格差异也可能导致检索不到相关的文档。
HyDE 的解决办法:先让 LLM 根据用户问题生成一篇”假设的答案文档”(Hypothetical Document),然后用这篇假设文档的 Embedding 去检索真正的文档。因为 LLM 生成的答案风格更接近知识库文档的语言风格,所以检索效果更好。
用户问题 → LLM 生成假设答案 → Embedding 假设答案 → 向量检索 → 找到真文档
效果:在一些评测中,HyDE 能提升 Recall@10 约 5-15%。代价:多了一次 LLM 调用(生成假设文档),增加了延迟和成本。适用场景:用户问题口语化、风格与文档差异大的场景(如客服、内部知识库)。
13.12.2 Multi-Query RAG(多查询检索)
一个问题,从多个角度搜索。比如用户问”如何提高团队效率”,系统自动生成多个查询变体:
- “团队效率提升方法”
- “团队协作最佳实践”
- “如何减少团队内耗”
- “敏捷开发提高效率”
每个变体独立检索,把所有结果合并去重后再做重排序。这样能从不同角度覆盖相关信息,提升召回率。
效果:Recall@K 通常能提升 10-20%。代价:N 次检索 + N 次 Embedding 调用,成本线性增长。适用场景:开放性问题、需要多角度信息的问题。
13.12.3 RAPTOR(层次化索引)
2024 年提出的技术。核心思路:对文档做层次化的摘要树。
传统 RAG 把所有文档块平铺在一层,检索时只能在这一层搜索。但有些问题需要”宏观”信息(“这篇论文的核心贡献是什么”),有些需要”微观”信息(“实验中的学习率是多少”),单一层次的检索无法同时满足。
RAPTOR 的做法:
- 把文档分块(底层叶子节点)
- 用 LLM 对相邻的块做摘要,生成上一层节点
- 对摘要再做摘要,生成更高层节点
- 递归直到顶层只有几个节点
- 所有层的节点都做 Embedding 存入向量数据库
检索时,在树的所有层同时搜索,既能找到细粒度的原文片段,也能找到宏观的摘要信息。
效果:在需要跨文档综合信息的问题上,RAPTOR 明显优于传统 RAG。代价:索引成本高(需要大量 LLM 调用做摘要),存储成本高(节点数量膨胀)。适用场景:大型文档集合、需要多粒度信息的问题。
13.12.4 查询改写(Query Rewriting)
用户的问题往往不是最优的检索查询。查询改写把用户的口语化问题转换成更利于检索的形式。
常见的改写操作:
- 去除冗余:“我想问一下,就是那个,RAG 到底是啥” → “RAG 是什么”
- 补充上下文:如果用户之前问了”Transformer 是什么”,现在问”它的训练需要多少数据”,改写为”Transformer 的训练需要多少数据”(把”它”替换为”Transformer”)
- 分解复杂问题:“比较 GPT-4 和 Claude 在代码和写作上的表现” → 分解为 4 个子查询
- 翻译:用户用中文问,但知识库是英文的 → 改写为英文查询
查询改写通常由一个轻量级的 LLM 调用完成(不需要最强的模型,GPT-4o-mini 或 Claude Haiku 就够用)。
13.12.5 上下文压缩(Context Compression)
检索到的文档可能很长,但只有一小部分与问题相关。把整个长文档塞进 Prompt 是浪费。上下文压缩的目标是:保留相关部分,丢弃无关部分。
做法:
- 基于 LLM 的压缩:让 LLM 读取文档,只提取与问题相关的信息。效果最好,但需要额外的 LLM 调用。
- 基于 Embedding 的压缩:把文档按句子切分,计算每句话与问题的相似度,只保留相似度高的句子。速度快,但可能丢失上下文。
- 基于摘要的压缩:用一个小模型对文档做摘要,把摘要而不是原文塞进 Prompt。
2026 年建议:对于大多数场景,混合检索 + 重排序已经能有效控制上下文长度。如果文档确实很长(如法律合同、学术论文),推荐基于 LLM 的压缩——虽然多一次调用,但信息保留最完整。
← 上一节:13.10 第五代:知识图谱辅助(Graph RAG) | 下一节:13.13 RAG 评估 →