RAG-02索引召回-Fusion-RAG

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

原理

将多个召回器输出进行分数校准与排序融合(如 RRF),得到更稳健候选集。

关键技术/实现路径

  • RRF(Reciprocal Rank Fusion)。
  • 分数归一化(score calibration)。
  • 异常通道回退。

优缺点

  • 优点:召回稳定性高。
  • 缺点:调参复杂,解释成本增加。

性能与资源

  • 在线开销中等,换来明显召回增益。

应用场景

  • dense 与 sparse 混合检索平台。

统一合成数据示例

输入数据片段

1
{"query":"报销时限","dense_top":[["D01",0.82]],"bm25_top":[["D04",8.8],["D01",7.9]]}

中间结果(融合)

1
{"method":"RRF","fused":[{"rank":1,"doc_id":"D01"},{"rank":2,"doc_id":"D04"}]}

最终生成示例(含引用)

1
{"answer":"报销需在30天内提交,逾期不予报销。","citations":[{"doc_id":"D01","evidence_span":"30天内提交"},{"doc_id":"D04","evidence_span":"逾期不予报销"}]}

原始发表与工程实现

  • 代表性原始发表:RRF (Cormack et al., 2009)。
  • 核心解决问题:解决多通道结果融合稳定性。
  • 成熟实现工具:PyTerrier, ranx, Elasticsearch RRF。

详细原理拆解

  • 跨通道排序融合 + 分数校准,RRF 是最常见稳健融合策略。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
6
def reciprocal_rank_fusion(rank_lists, k: int = 60):
scores = {}
for ranks in rank_lists:
for rank, doc_id in enumerate(ranks, start=1):
scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank)
return sorted(scores.items(), key=lambda x: -x[1])

参数示例

1
2
3
4
channels: [bm25_top50, dense_top50, sparse_top50]
fusion: RRF
rrf_k: 60
score_calibration: minmax_per_channel # 若改用加权融合时需要

常见失败案例

  • 失败模式 1:某通道总把高噪声文档顶到 rank 1,RRF 会持续放大该通道偏见。
  • 失败模式 2:各通道 doc_id 不对齐(版本号不一致),融合相当于在比较不同对象。
  • 失败模式 3:仅用融合不做截断,候选集过大拖慢后续重排与生成。

Demo 数据带入计算示例

1
2
3
4
5
Fusion 与「单通道 top-1」不同:看的是 **跨通道名次之和**。
BM25: D1(rank=1), D2(rank=2);Dense: D2(rank=1), D1(rank=2);k=60
RRF(D1)=1/(60+1)+1/(60+2)=0.03252;RRF(D2) 同理=0.03252(平局)。
再加 ColBERT: D1(rank=1), D2(rank=3):
RRF'(D1)=0.03252+1/61=0.04891;RRF'(D2)=0.03252+1/63=0.04839 → D1 优先。
-------------本文结束感谢您的阅读-------------