您已成功实现向量搜索和关键词搜索,针对给定查询获得了两个不同的排名文档列表。如何将这些列表组合成一个统一、连贯的排名,使其既能发挥语义关联(来自向量)的优势,又能发挥词项匹配(来自关键词)的优势?这就是结果融合算法旨在处理的问题。简单地连接或交替排列结果通常会产生次优的排名。有效的融合需要一种规范方法,以合并各个排名列表中的信息。
存在多种方法,从简单的启发式方法到更复杂的方法都有。一个普遍的困难是,不同系统生成的相关性分数(例如,向量的余弦相似度,关键词的BM25分数)通常无法直接比较。向量相似度可能在-1到1或0到1之间,而BM25分数可以是无上限的正数。直接依赖这些分数的融合方法通常需要仔细的归一化,这很难做得恰当。
倒数排序融合(RRF)
倒数排序融合(RRF)提供了一种巧妙的解决方案,它通过仅关注每个文档在各个结果列表中的排名来避开分数归一化的问题。它的运行依据的原则是:在多个系统中持续排名较高的文档可能更具相关性。
文档 d 的RRF分数是通过求其在每个列表中的排名倒数之和计算的,并由常数 k 进行调整:
RRF_Score(d)=i=1∑Nk+ranki(d)1
其中:
- N 是正在融合的结果列表数量(例如,向量 + 关键词搜索时 N=2)。
- ranki(d) 是文档 d 在结果列表 i 中的排名。排名通常从1开始,1代表最佳结果。如果文档未出现在列表 i 中,则其在该列表中的贡献实际为零(其排名为无限大)。
- k 是一个常数,用于减缓高排名(例如,排名1与2)与低排名(例如,排名50与51)之间影响的差异。k 的一个常见值是60,这基于实证研究,但它可以进行调整。增加 k 会降低排名差异的影响,使融合对靠前位置的敏感度降低。
RRF工作原理
假设您拥有来自向量搜索(列表V)和关键词搜索(列表K)的结果:
- 列表 V: 文档A(排名1),文档B(排名2),文档C(排名3)
- 列表 K: 文档B(排名1),文档D(排名2),文档A(排名3)
让我们使用 k=60 计算RRF分数:
| 文档 |
排名 (列表 V) |
排名 (列表 K) |
贡献 V (1/(60+排名)) |
贡献 K (1/(60+排名)) |
RRF 分数 (总和) |
| DocA |
1 |
3 |
1/61 ≈ 0.01639 |
1/63 ≈ 0.01587 |
0.03226 |
| DocB |
2 |
1 |
1/62 ≈ 0.01613 |
1/61 ≈ 0.01639 |
0.03252 |
| DocC |
3 |
未出现 |
1/63 ≈ 0.01587 |
0 |
0.01587 |
| DocD |
未出现 |
2 |
0 |
1/62 ≈ 0.01613 |
0.01613 |
最终的融合列表按RRF分数降序排列:文档B、文档A、文档D、文档C。
示例文档的RRF计算结果显示,文档B的得分略高于文档A,原因是在一个列表中其排名更靠前,尽管文档A在两个列表中均有出现。
RRF的优点:
- 简便性: 易于理解和实现。
- 无需分数归一化: 忽略绝对分数,仅依赖排名。
- 稳定性: 通常在各种任务中表现良好,无需大量调整。
- 处理缺失文档: 自然地包含只存在于部分列表中的文档。
RRF的注意事项:
- 忽略分数信息: 丢弃了原始相关性分数中可能有的用处的信息。排名1和2的两个文档可能实际相关性分数差异很大,但RRF对排名差异的处理方式是相同的。
- k 的选择: 尽管通常默认值为60,但最佳 k 值可能因结果列表和应用程序的特点而异。较低的 k 会给予靠前项更多权重。
其他融合算法
尽管RRF是一种常用且有效的方法,但也存在其他融合方法:
-
基于分数的组合(CombSUM, CombMNZ): 这些方法尝试组合原始的相关性分数。
- CombSUM: 简单地将每个文档在所有列表中的分数相加:CombSUM_Score(d)=∑i=1Nnormalized_scorei(d)。这要求分数事先归一化到一个可比较的范围(例如,0到1)。
- CombMNZ: 计算分数之和(与CombSUM类似),并乘以文档出现的列表数量:CombMNZ_Score(d)=(∑i=1Nnormalized_scorei(d))×∣{i∣scorei(d)>0}∣。这有助于提升被多个系统找到的文档。
- 难点: CombSUM和CombMNZ的有效性在很大程度上取决于分数归一化的质量。糟糕的归一化可能导致一个系统的分数在融合中占据主导地位。
-
基于排名的组合(Borda计数): 类似于RRF,Borda计数也使用排名。对于大小为 M 的列表,它根据排名分配分数:排名1得 M 分,排名2得 M−1 分,...,排名 M 得1分。对于每个文档,分数在各个列表中相加。像RRF一样,它避免了分数归一化,但使用了一种基于排名位置的不同加权方案。
-
加权融合: 一种直接的方法是为每个搜索系统分配权重,并计算(归一化)分数或排名的加权和。
WeightedScore(d)=i=1∑Nwi×normalized_scorei(d)
或使用排名(类似于加权RRF):
WeightedRankScore(d)=i=1∑Nwi×k+ranki(d)1
难点在于确定最佳权重(wi)。这些可以启发式设置,或者更系统地,使用机器学习技术学习(通常称为“学习排序”或LTR),其中模型在标注数据上训练以预测最佳组合。LTR功能强大,但实现和维护要复杂得多。
融合方法的选择与实现
对于许多混合搜索应用,RRF提供了一个可靠的基准,因为其简便性和稳定性。它通常是推荐的起点。
- 从RRF开始(例如,k=60)。
- 评估它在您的特定任务和数据集上的表现。
- 如果分数归一化对您的检索系统可靠且可行,可以尝试CombSUM或CombMNZ。
- 如果您有充分理由认为某个系统始终比另一个系统更可靠,可以考虑加权融合,但要准备好调整权重。
- 如果获得最高可能相关性很重要,并且您有资源和标注数据来训练融合模型,可以研究学习排序。
实现融合时:
- 获取结果: 从每个底层搜索系统(向量、关键词等)获取前 K 个结果(包括文档ID和排名/分数)。
- 收集唯一文档: 识别所有已获取列表中的所有唯一文档ID。
- 计算融合分数: 对于每个唯一文档,应用选择的融合逻辑(RRF、CombSUM等)。请记住适当处理在某些列表中缺失的文档(例如,排名 = ∞ 或分数 = 0)。
- 排序并返回: 根据最终融合分数按降序对文档进行排序,并返回最靠前的结果。
融合在从单个系统获取结果后增加了计算步骤。尽管与搜索本身相比通常很快,但要确保实现高效,尤其是对于对延迟敏感的应用。通过深思熟虑地使用RRF等方法组合结果,您可以构建混合搜索系统,这些系统将显著优于任何单一检索方法。