> 重排"有用",是因为它在替目录页擦屁股——调模型之前先清语料
一个本地教材检索库,灌进 12 本扫描版之后重跑评测,指标反而掉了。 第一名错例是一页目录:被 "Gibbs sampling Markov chain Monte Carlo" 召回到第 1 位。
结论先行¶
一个本地教材检索库,灌进 12 本扫描版之后重跑评测,指标反而掉了。 第一名错例是一页目录:被 "Gibbs sampling Markov chain Monte Carlo" 召回到第 1 位。
原因很直白:一页目录里塞着全书所有章节名,关键词密度极高, 对几乎任何查询都能算出不错的余弦相似度。索引页、参考文献同理。 全语料里这类块占 8.4%(索引 2.96% + 参考文献 3.02% + 目录 1.67% + 其余)。
清掉之后重跑四格消融,纯向量在三个指标上全赢,重排反而更差:
| 配置 | Recall@10 | nDCG@10 | MRR |
|---|---|---|---|
| 纯向量 | 1.000 | 0.769 | 0.705 |
| + 重排 | 0.940 | 0.742 | 0.698 |
而单独测重排,它是对的:相关文档 +9.7,无关文档 −11.2,目录页 −5.2。
正是最后那个 −5.2 说明了问题:
重排此前的收益,大部分是在替数据质量擦屁股。 稠密向量被目录页骗到,重排再把目录页压下去。 把目录页从库里删掉之后,重排剩下的就只有它自己引入的排序误差。
如果当初没清噪声就去调模型,得到的结论会是"重排值得留", 然后一直付着 3 倍延迟买一个其实不存在的收益。
为什么¶
一个组件的测得收益 = 它自己的贡献 + 它顺带补掉的上游缺陷。 这两项在只看端到端指标时不可分。而重排这类"把排序再修一遍"的组件 最容易吸收上游缺陷 —— 它的工作就是修正第一级检索的错误, 所以第一级因为脏数据犯的错,它也一并修了。
危险的地方在于:单独测这个组件会给出"它是对的"这个结论, 而这个结论是真的。 它只是回答了"重排能不能把目录页压下去", 而不是"目录页该不该在库里"。孤立测量确认了组件正确, 恰恰因此看不出它是多余的。
所以顺序不能反:
调检索参数之前,先把语料里的噪声清干净 —— 否则调的是噪声,不是模型。
还有一层自我纠正,比上面的结论更要紧。后来把评测集从 50 条扩到 160 条、并且把标签改紧之后,这一节的结论只对了一半:
- "清掉目录页有用"成立(同口径 0.94 → 1.000)。
- "纯向量明显优于重排"不成立 —— 在紧标签的 160 条上两者 nDCG 完全相同、MRR 只差 0.001,是平局。当时那个 1.000 vs 0.940 的差距是旧评测集标签太松造出来的 (见 评测集失效有两个方向,只盯"样本量"会漏掉另一个)。
默认值仍然是纯向量,但理由换成了延迟(32 ms vs 1238 ms),不是质量。 而当时那张表下面写着"但仍然是 n=50 …… 要把默认值当定论, 得先把评测集扩到 150~200 条",后来真的去扩了 —— 一个被声明过的局限 只有被真的消掉,才算一个局限。
怎么用¶
消融之前先做语料体检,而且体检本身要有量。 按小节标题分类统计块数,占比超过几个百分点的"非正文"类别就值得处理。 这个项目的类别表(索引/参考文献/目录/前言/致谢/记号表/图表清单) 是一张可以直接照抄的检查单。
保留项要按用途定,不是按"是不是正文"定。 这个项目踢掉目录/索引/参考文献/致谢/版权,保留前言和记号表 —— "记号约定"是这个工具明确宣传的用途之一,踢了就没了。 清洗规则必须知道下游要什么。
一个组件的收益要在上游干净之后再测一次。 写进流程:数据清洗的每一次改动,都要触发一次组件消融的重跑。 否则"加了 X 之后变好"会在语料改变之后继续被当成定论。
警惕所有"修正上一级"的组件:重排、后处理规则、输出清洗、 重试、回退模型。它们的测得收益天然包含上游缺陷的掩盖量。 判别方法是先修上游,再重测它;收益大幅缩小的,就是在擦屁股。 同 一个语料上总结的根因规则,在下一个语料上可能命中 9 条却解释 0 条失败: 一条在某个语料上总结出的规则,换语料必须重新量它解释了多少失败。
延迟是一个合法的决策理由,质量平局时它就是全部理由。 32 ms 对 1238 ms 是 38 倍。把默认值的理由从"更准"诚实地换成"更快", 比保留一个站不住的质量结论要好 —— 决定不变,依据必须换。
出处¶
~/Tools/booksearch/docs/RAG_PLAN.md §14「前置内容污染:检索质量的
最大单点改进」(14.1 的类别统计、14.4 的四格消融与重排的
+9.7 / −11.2 / −5.2、14.5 的一般教训)与 §15.5 的修正
(160 条紧标签下的平局与 32 ms / 1238 ms)。