什么是倒数排名融合(Reciprocal Rank Fusion)?一种合并多路检索结果的重排算法
倒数排名融合(Reciprocal Rank Fusion,RRF)是一种把多路已排序检索结果合并成单一结果集的算法。它不看各路查询的原始分数,只按文档在各自列表中的名次计算 1/(rank + k) 并求和,从而避免不同打分体系量纲不一致的问题。微软 Azure AI Search 官方文档说明,该服务在混合查询与多向量查询并行执行时使用 RRF 完成结果融合。
倒数排名融合(Reciprocal Rank Fusion,RRF)是一种把多路已经排好序的检索结果合并为单一结果集的算法。它不直接比较各路查询给出的原始相关性分数,而是根据文档在每一个结果列表中的名次计算倒数排名分,再把同一文档在各列表中的分数相加,按总分重新排序。它主要解决的是:当全文检索、向量检索等多种检索方式并行执行、各自产出分数量纲完全不同的结果时,如何得到一个统一、可比较的最终排名。
为什么重要
在只有一种检索方式的场景里,排序问题相对简单:系统内部用同一套打分函数给文档打分,按分数从高到低返回即可。但现代检索系统往往同时运行多种检索方式。以混合检索为例,一次请求可能既包含全文(关键词)查询,也包含向量(语义)查询;多向量查询还可能针对多个向量字段分别执行。每一路查询都会产出一个独立的排序列表。
问题在于,这些列表的分数不可直接相加。不同排序算法各有自己的取值范围和数量级,同一个数值在全文检索里和在向量检索里代表的含义并不相同。如果简单地把原始分数相加或取平均,某一路分数天然偏大的检索方式就会主导最终结果,融合反而损害相关性。此外,不同检索方式对同一文档的判断也可能不一致:关键词匹配强的文档语义未必贴近,语义贴近的文档未必包含查询词。
RRF 的思路是绕开分数本身,只使用名次这一在各路结果中含义一致的信息。名次是相对的、有界的,因此可以在不同检索方式之间直接比较和累加。按照微软 Azure AI Search 官方文档的说法,这种做法有助于提升最终排名的整体质量与可靠性,使融合多个有序检索结果的结果更适合实际任务。
工作机制
根据微软 Azure AI Search 官方文档的描述,RRF 的流程可以拆成以下几个步骤:
- 并行获取多路排序结果。多个查询并行执行,每个查询各自返回一个已排序的结果集。文档指出,只要存在多于一次查询执行,就会用到 RRF。
- 为每路结果中的文档计算倒数排名分。引擎针对每个结果集中的每条匹配生成新的
@search.score。对列表中的每个文档,按其在该列表中的位置计算分数,公式为1/(rank + k),其中rank是文档在列表中的名次,k是一个常数。 - 关于常数 k。文档称实验表明,把
k设为较小的值(例如 60)时算法表现最佳。文档同时强调,这个k是 RRF 算法内部的常数,与控制最近邻数量的那个k完全无关,两者不应混淆。 - 合并分数。对每个文档,引擎把它在各路检索系统中得到的倒数排名分相加,得到一个合并分数。
- 按合并分数重新排序。引擎依据合并分数对文档排序,得到的列表就是融合后的排名。
这一机制背后的直觉是:在多个检索方式中都排在靠前位置的文档,很可能确实更相关,理应在合并结果中获得更高名次;而只在某一路中靠前、在其他路中靠后的文档,累计得分会被拉低。由于分数只取决于名次,某一路检索给出的原始分数是 0.9 还是 90 都不影响融合结果,这从根本上消除了量纲不一致的问题。
文档还说明了参与计算与返回的字段范围:只有索引中标记为可搜索(searchable)的字段,或查询中通过 searchFields 指定的字段,才用于打分;只有标记为可检索(retrievable)的字段,或查询中通过 select 指定的字段,才会连同其搜索分数一起出现在返回结果中。
典型例子
微软 Azure AI Search 官方文档给出了几种会触发并行查询执行、从而使用 RRF 的查询形态:
- 一个全文查询加一个向量查询,即简单的混合检索场景,共两次查询执行。
- 一个全文查询加一个针对两个向量字段的向量查询,共三次查询执行。
- 一个全文查询加两个向量查询、共针对五个向量字段,共十一次查询执行。
这些例子说明,RRF 的输入路数并不固定,可以随查询结构变化而增加。文档还指出,在 Azure AI Search 中,RRF 用于两个或更多查询并行执行的场合,例如混合查询和多向量查询;每个单独查询产出各自的排序结果集,RRF 再把这些排名合并、同质化为查询响应中的单一结果集。
关于分数的呈现,文档说明:只要结果经过排序,@search.score 属性就包含用于排序结果的值;这些分数由各不相同的排序算法生成,每种算法都有自己的取值范围和数量级。这也正是需要 RRF 这类基于名次的融合方法的原因。
边界与常见误解
它不是一种新的相关性模型。RRF 本身不判断文档与查询的语义相关程度,它只是对已有排序结果做合并。文档能否被召回、在某一路中排第几,取决于上游的全文检索或向量检索。因此,如果所有上游检索都没有召回某篇文档,RRF 也无法把它找回来。
它丢弃了原始分数的信息。只使用名次意味着两篇在同一列表中分列第 1 与第 2 的文档,在 RRF 看来差距很小;而实际上它们的原始分数可能相差悬殊。这是用名次换取跨检索方式可比性的代价,文档并未声称 RRF 在所有场景下都优于基于分数的融合方式。
常数 k 容易被误解。文档特别提醒,RRF 公式中的 k 与向量检索中控制最近邻数量的 k 是两回事。文档给出的「k 取 60 左右表现最佳」来自其所述的实验,属于该文档的表述,不应被推广为所有系统、所有数据集上的通用结论。
字段设置会影响结果。由于只有可搜索字段参与打分、只有可检索字段随分数返回,索引与查询中的字段配置会直接影响 RRF 能看到什么、返回什么。这一点常被忽略。
适用范围。上述机制描述来自微软 Azure AI Search 的官方文档,描述的是该服务中的实现与行为;其他检索系统即使同样采用倒数排名融合,其常数取值、字段规则和分数呈现方式也可能不同,需以其各自的文档为准。