返回
创建于
状态
公开

倒数排名融合(Reciprocal Rank Fusion, 简称 RRF) 是混合检索(Hybrid Search)中的“黄金准则”。它的核心魅力在于:不需要复杂的权重调优,就能把完全不同维度的评分(比如全文检索的 BM25 分数和向量检索的余弦相似度)公正地合并在一起。


1. 核心公式

RRF 的计算逻辑非常简单直观:

Score(dD)=rR1k+r(d)Score(d \in D) = \sum_{r \in R} \frac{1}{k + r(d)}

  • DD:待排序的所有文档。
  • RR:排序列表的集合(比如一个是全文检索给出的排名,一个是向量检索给出的排名)。
  • r(d)r(d):文档 dd 在列表 rr 中的排名索引(通常从 1 开始)。
  • kk:一个常数(超参数),通常默认为 60

为什么要加 kk 为了防止排名第一的文档(1/11/1)对结果产生压倒性的影响,平滑掉排名靠前的权重波动。


2. 直观理解:它如何解决你的问题?

假设你用“几个字”去搜:

  1. 全文检索(BM25):关键词匹配很准,给出了排名:文档 A (1), 文档 B (2), 文档 C (3)。
  2. 向量检索(Dense):语义比较模糊,给出了排名:文档 C (1), 文档 D (2), 文档 A (3)。

RRF 计算(假设 k=60k=60):

  • 文档 A1/(60+1)+1/(60+3)0.01639+0.01587=0.032261/(60+1) + 1/(60+3) \approx 0.01639 + 0.01587 = 0.03226
  • 文档 C1/(60+3)+1/(60+1)0.01587+0.01639=0.032261/(60+3) + 1/(60+1) \approx 0.01587 + 0.01639 = 0.03226
  • 文档 B1/(60+2)+00.016121/(60+2) + 0 \approx 0.01612

最后,文档 A 和 C 因为在两套系统中表现都稳健,会排在最前面。即使单项冠军(比如向量检索里的文档 D)在另一项中表现很差,也会被过滤掉。


3. RRF 的三大优势

  • 抹平分值差异:全文检索的分数可能是 15.215.2(无上限),向量检索的分数是 0.850.85010 \sim 1 之间)。RRF 只看名次,不看分数值,强制把它们拉到同一个起跑线上。
  • 无需专家经验:传统的权重加权需要你手动设置 0.7×Vector+0.3×BM250.7 \times \text{Vector} + 0.3 \times \text{BM25}。这个权重很难调,而 RRF 默认 k=60k=60 在大多数场景下都是最优解。
  • 奖励“双优生”:如果一个文档在两个列表里都在前 100 名,它的总分会远高于只在某一个列表中排第一、而在另一个列表里查无此人的文档。

4. 落地建议

如果你正准备实现它,请注意以下几点:

  1. 深度(Limit):通常从每个检索源取出前 50 到 100 个结果进行 RRF 合并即可,没必要对全量数据做 RRF。
  2. 与 Re-ranker 配合
  • 第一阶段:向量检索 + 全文检索 \rightarrow RRF 合并 \rightarrow 选出 Top 30。
  • 第二阶段:将 Top 30 送入 BGE-Reranker(重排序模型)进行深度打分。 这是目前性价比最高、准确度最强的链路。
  1. BGE-M3 的特殊性: 既然你在用 BGE-M3,它产生的 lexical_weights(Sparse Vector)其实已经自带了类似 BM25 的属性。如果你使用的是 Milvus 或 Qdrant 这类数据库,它们原生支持 RRF 算法,你只需要通过一个简单的配置开关就能启用。