关键词搜索给每份文档一个分数,向量搜索又给出另一套分数。两边的数字含义不同,直接相加很难解释。倒数排名融合提供了一个很省事的办法。它不比较原始分数,只看文档在各自列表里排第几,再把多个名次换成统一贡献。
这个方法常写成 RRF,英文是 Reciprocal Rank Fusion。我核对了 2009 年原论文、Elastic 文档和 Azure AI Search 说明。三份材料用的是同一条公式。一份文档在某个列表排第 r 名,就得到 1/(k+r),它在几个列表里出现,就把几次贡献相加,最后按总分重新排序。
名次可以绕开分数尺度
关键词检索可能使用 BM25,向量检索可能返回余弦相似度经过转换后的分数。两个 0.8 未必表达同样强的相关性。RRF 只取名次,省去了先把这些分数校准到同一尺度的工作。某份文档在两路结果中都靠前,累计贡献通常会比只在一路偶然靠前更高。
原论文把 k 固定为 60。作者说明这个值在先导试验中选定,后面的验证没有继续调整。Elastic 当前文档也把 rank_constant 默认值设为 60,并说明数值增大时,较低名次的文档会获得更多影响。60 是常见起点,依然需要结合候选列表长度理解,不能把它当作所有数据都已证明的最佳值。
Azure AI Search 在全文与向量混合查询、以及多个向量查询并行时使用 RRF。它的文档还区分了融合后的第一层排序与后续语义排序。也就是说,RRF 可以先把不同来源的候选合到一起,后面再由更贵的模型细排。两步解决的问题不同。
候选没进列表就没有分数
RRF 只能处理每路检索已经交来的文档。正确资料在关键词和向量列表里都排到窗口之外,它不会凭公式把资料找回来。Elastic 的 rank_window_size 就控制每个子检索器交出多少候选。窗口增大可能改善最终相关性,也会增加处理量,应该与响应时间一起测。
不同列表默认权重也要看实现。Elastic 文档中的子检索器在公式里等权,Azure 提供向量查询权重来调影响。迁移系统时若只记住 RRF 三个字,忽略产品对窗口、权重和后续重排的处理,线上顺序可能与试验不一样。
验收可以准备一组带明确目标文档的问题,分别保存关键词列表、向量列表和融合列表。先看正确资料有没有进入各路候选,再看融合后升了还是降了。若问题出在原始召回,先修查询或索引。两路各有所长时,RRF 才有机会把它们合好。
RRF 的价值就在简单。它不训练新模型,也不要求两套分数可比。简单算法依然有输入边界,候选窗口、列表质量和最终答案引用都要留下记录。