RAG-02索引召回-Advanced-RAG

本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Advanced RAG」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

。Naive 基础上加入“检索前后处理”:Query Transform、Hybrid Recall、Rerank、Compression。

1
2
3
4
5
6
7
8
9
flowchart TD
Q[用户问题] --> T[查询改写/扩展]
T --> R1[Dense 检索]
T --> R2[BM25 检索]
R1 --> M[候选集合合并]
R2 --> M
M --> RR[Reranker]
RR --> S[上下文压缩]
S --> LLM[生成]

关键技。

  • Multi-query、HyDE、query decomposition。
  • Dense + Sparse 混合召回。
  • Cross-encoder 重排。
  • Contextual compression。

优缺。

  • 优点:准确率、引用相关性显著提升。
  • 缺点:链路长,调参与监控复杂。

性能/资源

  • 在线时延:中到高(多路检。重排)。
  • 算力成本:重排器是主要增量开销。

应用场景

  • 金融、法律、医疗等“答错成本高”的问答系统。
  • 多语种、多文档格式知识库。

统一合成数据示例

输入数据片段

1
2
3
4
{
"query": "差旅机票报销有什么限制?",
"query_rewrites": ["机票报销上限", "差旅报销提交时限", "机票报销规则"]
}

中间结果(多路召回+重排)

1
2
3
4
5
6
7
8
9
10
{
"hybrid_candidates": [
{"doc_id": "D01", "source": "dense", "score": 0.79},
{"doc_id": "D03", "source": "bm25", "score": 11.2}
],
"rerank_top": [
{"rank": 1, "doc_id": "D01", "score": 0.92},
{"rank": 2, "doc_id": "D03", "score": 0.63}
]
}

最终生成示例(含引用)

1
2
3
4
5
6
7
{
"answer": "机票报销上限 2000 元,且需在出差结束后 30 天内提交。",
"citations": [
{"doc_id": "D01", "evidence_span": "机票报销上限 2000 元"},
{"doc_id": "D01", "evidence_span": "30 天内提交"}
]
}

原始发表与工程实现

  • 代表性原始发表:HyDE (Gao et al., 2023), Self-RAG (Asai et al., 2024)。
  • 核心解决问题:解决复杂查询下召回不足与生成不稳。
  • 成熟实现工具:LangChain, LlamaIndex, Haystack。

详细原理拆解

  • 多查询改写 + 多路召回 + 重排 + 压缩,核心在召回增益是否覆盖链路时延开销。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
6
7
def advanced_rag(query, retrievers, rewriter, reranker, compressor, llm):
queries = rewriter.expand(query) # 多查询/HyDE 等
pools = [retrievers.hybrid(q) for q in queries] # 每路多通道召回
merged = dedupe_union(pools)
ranked = reranker.score(query, merged) # Cross-encoder 精排
ctx = compressor.compress(query, ranked) # 证据压缩
return llm.generate_with_citation(query, ctx)

参数示例

1
2
3
4
5
rewrite_variants: 3
hybrid_channels: [dense, bm25]
candidate_pool: 60
rerank_top_n: 12
compress_token_budget: 900

常见失败案例

  • 失败模式 1:改写分支过多,时延与成本线性涨,收益被运维抵消。
  • 失败模式 2:压缩器过度删句,删掉否定词/数字,faithfulness 反降。
  • 失败模式 3:重排很强但上游召回池仍偏,精排无米下锅。

Demo 数据带入计算示例

1
2
3
原查询 q0 单路 recall@10=0.62;改写 {q1,q2,q3} 三路检索后合并去重 recall@10=0.81。
重排仅对合并池前 60 条生效:若合并池未覆盖 gold doc,rerank 再强也无法召回——
说明 Advanced 的增益来自「改写 × 多通道 × 精排 × 压缩」的串联,短板在任一环节都会暴露。
-------------本文结束感谢您的阅读-------------