先这样答
多路检索结果可以用 Reciprocal Rank Fusion,也就是 RRF,高效合并。它按文档在各路结果中的排名计算分数,再把各路分数相加。文档得分等于各路排名倒数之和,具体是把每一路的 1 除以排名加常数 k,再对同一个文档累加。
实现时,先让每路检索返回一个 Top-N 排名列表。遍历每路列表,用文档 ID 作为哈希表的键。根据当前文档的排名计算 1 除以排名加 k 的值,并累加到这个文档的总分里。所有结果处理完后,按总分排序,取前 K 个文档作为融合结果。整个过程的复杂度是 O(总文档数)。
k 常取 60。它可以压制头部排名对结果的支配,让不同检索路由的排名更容易合并。RRF 最大的优点是只依赖排名,不要求不同检索路由提供可直接比较的相似度分数。因此不需要做相似度分数归一化,也不需要针对不同量纲反复调参。
面试官会怎么追问
-
「为什么 RRF 不直接把多路相似度分数加起来?」
不同检索路由的相似度分数可能使用不同量纲。直接相加会受到分数范围影响。RRF只使用排名,因此不需要先归一化分数,也不需要调参数对齐不同量纲。 -
「RRF 的具体实现步骤是什么?」
先获取每路的 Top-N 排名列表。再用文档 ID 作为哈希表键,遍历每个列表并累加 1 除以排名加 k 的值。最后按累加后的文档得分排序,取 Top-K。 -
「k 为什么常取 60?它解决什么问题?」
k 常取 60,用来压制头部排名的支配性。这样排名靠前的文档仍然有更高贡献,但单一路由的头部结果不会过度主导融合结果。
回答的坑
- 只说“把多个结果拼起来”而不按文档 ID 聚合,就没有实现 RRF 的核心计算。
- 把不同路由的相似度分数直接相加,会忽略分数归一化和量纲不一致的问题。
同系列的题
—— 本题完 ——