多路召回融合的核心思路就是给每一路中的每一个文档d进行打分,然后选出得分最高的K(例如k=200)个文档,作为最终融合的结果。我们在这里使用经典的RRF算法(Reciprocal Rank Fusion)对文档进行打分,直接上公式:

\[RRFscore(d \in D) = \sum_{r \in R} \frac{1}{k + r(d)}\]

这个公式中,假设有有一个文档的集合D,其中每一个文档d参与了多个排序P,我们需要将这个排序的结合P合并成一个单一的排序q,办法就是为每一个文档d进行打分,这个文档存在于一个或者多个排序中;文档d在一个排序中的排位(rank,简称为r(.))即r(d)表示文档在一个排序p中的排位,例如,有如下的排序

d2, d1, d3

那么我们有:

r(d1) = 2
r(d2) = 1
r(d3) = 3

在上述公式中,k按照论文中经验取值为60,k值主要是为了将一些高排位但是本身劣质(即在多个排序中的排位的方差比较大,例如d1在有的排序中排位是2,有的排序中的排位是20; 2和20之间具有很大的差距, 60这个基础值的加入,使得另外一个文档d2较为稳定的排序(例如分别排位为5,6))的结果避免排到前面。我们可以计算一下,我们给出的例子

RRFscore(d1) = 1/(60+2) + 1/(60 + 20) = 0.028629032258064516
RRFscore(d2) = 1/(60+5) + 1/(60 + 6) = 0.030536130536130537

显然在这种情况下,通过参数k=60的调整,实现了RRFscore(d2) > RRFscore(d1),即具有更加稳定的排序结果的d2的得分要高于d1;所以d2更应该在最终结果中胜出;

如果k=0, 那么我们会发现:

RRFscore(d1) = 1/(0+2) + 1/(0 + 20) = 0.55
RRFscore(d2) = 1/(0+5) + 1/(0 + 6) = 0.3666666666666667

这种情况下RRFscore(d1) > RRFscore(d2),导致了最终d1胜出,但其实d1在多个排序中的位置很不稳定。

参考文献

  • 原始论文:https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
  • https://medium.com/@sowmiyajaganathan/hybrid-search-with-re-ranking-ff120c8a426d