第8章 重排先从可检查的规则开始
“加入重排模型”不是一个完整设计。需要先回答:候选是什么,重排使用哪些信息,输出如何影响证据,以及失败时怎么定位。本书采用一个故意简单的规则,让这些问题在没有额外模型的条件下仍能被看见。
标题重合是一项特征
实现先计算去重查询词项与文档标题词项的交集,除以查询词项数量,得到 title_overlap。开启重排时,按标题重合降序,再按 RRF 降序,最后用片段主键稳定打破平局。关闭时,标题特征不参与优先级,主要依据 RRF。
这不是把两个数加权平均,而是字典序排序。一个标题重合更高的候选,即使融合分数稍低,也会排到前面。这个选择简单直观,也可能过度偏好通用标题。例如“报销说明”标题很相关,但正文只有流程,真正的金额表可能在标题较弱的附件中。
因此,书中的 rerank=True 明确表示标题规则重排,不是交叉编码器、学习排序或 LLM 判断。代码没有加载重排权重,报告也没有把规则特征说成模型推理。将来引入实际重排模型,应分别版本化权重、输入模板、长度截断和排序策略。
把顺序变化与命中变化分开
评估一个重排器,至少需要看重排前的候选覆盖和重排后的首个相关位置。若相关文档已经在候选池里但顺序靠后,重排可能改善 MRR;若从未进入候选池,重排没有机会补救。只比较最终答案是否“看起来更好”,会把召回与排序混为一谈。
随书评估默认开启这条规则,JSON 明确记录 rerank: true。当前报告没有单独设计足够丰富的重排困难集,因此不能据此宣称标题规则获得了普遍提升。evaluate(index, mode, rerank=False) 保留了做对照的入口,读者扩充标签以后可以再比较,而不是从本书的小样例推导收益。
去重发生在不同粒度
候选池以片段为单位;评估先按文档去重;摘录则跳过同文档同版本的重叠区间。这三个操作目的不同。候选去重避免完全重复对象,文档去重避免排名指标被相邻片段灌满,区间去重避免回答反复输出同一段文字。
单纯按 doc_id 只保留一个片段,可能丢掉一篇制度中分别解释申请资格和金额上限的两段必要证据。因此回答实现允许同篇文档中不重叠的片段进入结果,但仍不能把它们描述为两个独立来源。若业务要求多来源交叉核查,需要额外的源对象身份与独立性规则。
还要注意摘录数量上限。默认两条证据限制输出长度,不保证两条足够覆盖复杂问题。返回两段原文只是一个可核查的检索产物,距离自然语言的完整答案仍有业务判断距离。
好的重排设计会留下可反查的名次、特征和版本。发生错误时,工程师应能指出哪条规则把哪份文档提前了,而不是只说“系统认为它相关”。下一章把这些候选变成可以复核的引用。