第 8 / 21 篇

第7章 用 RRF 合并可解释的召回通道

词面检索擅长精确术语,模型向量可能补回同义改写。直接相加原始分数却很危险:FTS5 的 BM25 越小越靠前,余弦越大越靠前,两者数值范围与含义都不同。混合检索需要明确融合规则,而不是给两列数字随便配权重。

只使用名次的融合

随书实现采用 Reciprocal Rank Fusion,简称 RRF。对于候选片段,分别查找它在词面和向量列表中的名次,每个出现的通道贡献 1 / (60 + rank),再把贡献相加。名次从一开始,不在某个通道中出现就不获得该通道贡献。

如果一个片段在两个通道都排名第一,融合分数为 2 / 61;另一个片段只在一个通道排名第一,得到 1 / 61。这个例子解释了融合偏好多个通道支持的候选,也提醒我们:两个通道若高度相似,重复支持并不等于增加了独立证据。

常数六十沿用 Cormack 等人的 RRF 论文 中的参数。论文在自己的实验条件下选择并验证它,本书没有重新证明六十最适合中文企业知识库,也没有把论文的提升幅度移植到本书结果中。

保留每个通道的痕迹

每条命中保存 channels,其中包含通道名、原始名次与原始分数,还保留总 rrf。读者可以从 JSON 直接重算融合值。测试 test_hybrid_exposes_channels_and_rrf_arithmetic 就用实际搜索结果验证这个等式,而不只检查出现了名为 RRF 的函数。

这种可观察性对排错很关键。若退款文档被排到后面,先看它是否进入过候选池,再看各通道名次,最后检查重排特征。一个未召回的文档不可能被重排拯救;一个召回后被标题规则降下去的文档,也不能归咎于向量模型。

每个通道最多保留一百个候选,最终返回数量由调用者设置,范围一到一百。这个上限控制教学实现的候选规模,也形成召回边界。如果相关文档位于通道第一百零一名,融合看不到它。评估候选深度时应同时记录权限后的候选数量,而不只记录最终答案数。

混合不承诺总会更好

使用词项向量时,词面、向量与混合三个模式在当前数据上都是零点九。使用真实 BGE 时,向量与混合都为一点零,混合没有超越表现最好的单一通道。三个负例的空结果行为也相同。

因此,本书没有“混合一定优于向量”的实验结论。融合提供结构上可解释的组合方式,实际效果取决于通道的互补性、候选深度与后续排序。若新通道不断引入噪声,RRF 也可能改变原本正确的顺序。

把词面、向量和混合三份报告同时保存,比只公布最好的数字更有用。下一章继续检查融合后的重排,并区分排序收益、证据重复和真正的相关性判断。