约 364 字大约 1 分钟
当知识库同时使用关键词检索和向量检索时,两路各自返回了一份排名,怎么把它们合并成一份最终榜单?
直接把原始分数相加是行不通的。向量检索的分数通常在 0 到 1 之间,而关键词检索的分数没有固定上限,直接相加会让总分被关键词检索主导。
解决办法是 RRF,全称 Reciprocal Rank Fusion,中文叫倒数排名融合。它不看原始分数,只看名次。一篇文档在某一路排第 rank 名,名次从 1 开始算,就拿到 1 除以 k 加 rank 的分数,常数 k 通常取 60;如果这一路没有命中,就记 0 分。
来看一组示例排名。关键词检索的前三名是文档 A、文档 B、文档 C;向量检索的前两名是文档 B、文档 C,文档 A 没有命中。
文档 A 只在关键词检索排第 1 名,得分是 1 除以 61 加 0,约为 0.0164。文档 B 在两路分别排第 2 名和第 1 名,得分是 1 除以 62 加 1 除以 61,约为 0.0325。文档 C 两路相加约为 0.0320。
最终,被两路共同认可的文档 B 和文档 C 升到前两名,单路第一的文档 A 退到第 3 名。不过 RRF 只看名次、不读正文内容,通常用来做多路检索的快速粗排。
