混合召回、查询增强与重排
两个检索通道可能分别给出100分和0.82分,直接相加会让大尺度通道主导。RRF先把分数换成名次,每一通道贡献1/(c+rank);c越大,前几名的差距越平缓。它解决分数尺度问题,不自动解决语料偏差。
python
from collections import defaultdict
def rrf(lists, c=60):
scores = defaultdict(float)
for ranking in lists:
for rank, doc in enumerate(dict.fromkeys(ranking), 1):
scores[doc] += 1/(c+rank)
return sorted(scores, key=lambda x: (-scores[x], x))
assert rrf([['a','b'], ['b','c']])[0] == 'b'
assert rrf([['a','a'], ['b']]) == ['a','b']
print(rrf([['a','b'], ['b','c']]))b在两条列表出现而成为首位。单个通道中的重复项只算一次,否则重复片段可以刷分。同分时按ID排序只是稳定输出,不代表业务优先级。
多查询用不同表述扩大候选,但必须保留原查询:改写把“不要含糖”变成“含糖”会完全反转需求。HyDE生成假想文档并编码,适合表述和语料落差较大时试验,假想内容不能作为最终引用。查询路由先选文档域,可以节省成本,也可能误路由;保留无法确定时的多路或澄清分支。
Cross-encoder将query与每个候选联合输入,用交叉注意力细化排序。分数是否为概率取决于模型与激活;不能把任意logit 0.8解释为80%正确。重排前的候选上限控制费用与延迟,正文长度截断也可能丢失关键句。缓存key要包含query、文档版本、重排模型及模板。
MMR在相关性与已选结果的相似性之间权衡,避免选出五个同义片段;但相似的规则和例外不能因“重复”被丢弃。评估需同时看Recall、MRR、nDCG以及最终回答。nDCG适合多级相关性:先按排名折扣累加增益,再除以理想排序增益;没有相关项的问题单独统计。
Sentence Transformers 的检索与重排说明区分独立编码与联合编码。真实模型实验需要下载权重并固定revision,离线RRF运行只能证明融合规则,不能证明模型重排质量。
练习
三个通道分别为[a,b]、[b,c]、[c,a]。求融合结果并说明为什么固定平局规则有意义。
完成后查看本章答案。
下一篇:继续本章完整实验。