主题
消融实验:每次只改一个变量
本章要回答的问题:改了切分、换了 embedding、加了重排,效果提升到底是谁带来的?
第五部分每节都在改一个东西:5.3 换切分,5.4 换维度,5.6 加融合,5.7 加重排。但那些数字来自不同的题量、不同的 k、不同的基线,不能直接相减。这一节把它们放到同一把尺子上:v2 test 的同一批 105 道题(和 6.2 一样排除了 8 道索引缺块题),同一个相关性口径,配对比较。
结论先放这里:这批数据上,切分是最大的杠杆;融合买的是排序;重排没有可测量的收益。
消融的单位是「一次只改一个变量」
基线不是「什么都不做」,而是上一个已经能跑的方案。本书的链是:
- BM25:只有关键词检索;
- RRF:BM25 + 稠密检索,排名融合;
- RRF + 重排:在 RRF 的 top-20 上用交叉编码器重排,取 top-5。
然后单独换两个变量,看它们各自值多少:
- 固定切分:把按结构切换成按 400 字窗口切(其余不变);
- RRF + 512 维:在 RRF 上把稠密一路的 embedding 从 1024 维截到 512 维(BM25 与融合不变)。
这些方案在第五部分就定下来了,没有在 test 上调过;所以这里只报一次 test,不再分 dev。dev 上选参数的故事在 5.3–5.7,6.1 已经说明为什么 test 只放新题。
| 变体 | Recall@5 | MRR@10 | nDCG@10 | joint Recall@5 |
|---|---|---|---|---|
| BM25 | 0.943 | 0.767 | 0.652 | 0.471 |
| 稠密 | 0.981 | 0.809 | 0.700 | 0.559 |
| RRF | 0.990 | 0.865 | 0.737 | 0.618 |
| RRF + 重排 | 0.981 | 0.859 | 0.733 | 0.647 |
| 固定切分 | 0.886 | 0.673 | 0.576 | 0.500 |
| RRF + 512 维 | 0.981 | 0.854 | 0.731 | 0.618 |
(实测,见 benchmarks/evaluation/ablation-retrieval.csv;105 道题,answer 口径;joint Recall 只在 34 道跨段题上算。)
融合买的是排序,不是召回
稠密 → RRF:Recall@5 从 0.981 到 0.990(+1.0 个百分点,95% CI [−1.9, 3.8],McNemar p=1.0),MRR 从 0.809 到 0.865(+5.6,CI [0.3, 11.0]),nDCG 从 0.700 到 0.737(+3.7,CI [0.5, 6.9])。
读法:召回没变,排序变好了。 稠密已经把该找的都找到了(Recall@10 = 1.000),RRF 再多召回一条很难;它真正做的是把 BM25 命中、稠密排在后面的那些块往前推。只看 Recall,会得出「融合没用」的结论;5.6 里融合在语义题上不如纯向量、在标识符题上才反超,平均分看不出这种分工。
BM25 比 RRF 低 4.8 个百分点召回(CI [−8.6, −1.0])、9.8 个百分点 MRR(CI [−15.0, −4.9])。关键词检索能进前 5,但第一条经常不是最相关的。
重排没有可测量的收益
RRF + 重排 vs RRF:
- Recall@5:−1.0 个百分点(CI [−2.9, 0.0],p=1.0);
- MRR:−0.6(CI [−5.8, 4.5]);
- nDCG:−0.4(CI [−2.8, 1.9]);
- joint Recall@5:+2.9(CI [−8.8, 17.6])。
所有区间都跨过 0。这不是「重排无效」,是「在这批数据上分辨不出收益」。 5.7 在 v1 上看到 Recall@5 +5 个百分点、MRR −2.3;换到 v2 test 就不复现了。原因有三个:
- 基线不同:5.7 的基线是 BM25 + 稠密的 top-20,裁剪前 Recall@5 0.917;这里的基线是 RRF,Recall@5 已经 0.990,没有多少可捡的;
- 题不同:v2 test 的跨段题来自新的条款组合,且基线已经贴顶;重排能改的空间更小;
- 样本小:34 道跨段题,2.9 个百分点就是 1 道题的差别,区间宽到 −8.8 到 +17.6。
切分是最大的杠杆
固定切分 vs RRF:Recall@5 −10.5 个百分点(CI [−17.1, −4.8],p=0.003),MRR −19.2(CI [−25.4, −13.1]),nDCG −16.1。固定切分没有条款号,相关性只能按答案原文重算;这里用 0.5 阈值。换成 5.3 用的 0.35,固定切分的 Recall@5 是 0.924(−6.6),MRR 0.714(−15.1)——量级变了,方向没变(见 ablation-fixed-threshold.csv)。
无论用哪个阈值,切分的 MRR 损失(−15 到 −19)都是整组实验里最大的;5.3 的结论——法规按条款切,734 块保住了条款边界——在这批新题上依然成立。切分错了,后面的融合、重排都补不回来。
RRF + 512 维 vs RRF:Recall@5 −1.0(CI [−2.9, 0.0],p=1.0),MRR −1.1(CI [−2.5, −0.2]),nDCG −0.6(CI [−1.7, 0.3])。召回没变,MRR 只掉 1 个百分点;512 维能省一半索引体积(5.4 的 1.5 MB → 0.75 MB),这笔交易比想象中划算。
消融报告的规矩
固定 test、固定口径、一次只改一个变量。 切分一变,块数、BM25 的文档长度统计、可召回的候选都变了;维度一变,只有稠密一路受影响。把两个变量一起改,数字就解释不了。
报绝对值和配对区间,不只报 delta。 105 道题上,2–3 个百分点的差异很常见;区间跨过 0 就写「未证明有收益」,不要写「提升了 3%」。小样本上的小差异很容易被噪声吞掉(引用 [1]);只报最好的一次运行,会系统性高估(引用 [2])。
把成本放进同一张表。 重排的收益区间跨过 0,但成本是每次查询多一次交叉编码器前向(5.7 在本机测得 p50 1.04 秒)。质量没涨、延迟涨了,这个组件就不该上线。
消融结果是有条件的。 基线贴顶时,组件没有发挥空间;换测试集、换基线、换 k,结论都可能变。5.7 的 v1 收益在 v2 不复现,不是谁错了,是条件变了(引用 [3])。
跨段题单独看。 单段 Recall 会把「只找到一半」藏起来;本组实验里只有 joint Recall 对重排有一点正向信号(+2.9,区间仍很宽),单段指标完全看不出来。
局限
- 105 道题只够分辨 5 个百分点左右;「重排没有收益」严格说是「未证明有收益」,不是「证明无效」。
- 固定切分的对比同时换了块集与相关性集合,不是纯粹的参数开关;正文给了 0.35/0.5 两个阈值的敏感性。
- 只到检索指标:没有用重排/不重排各跑一遍生成,排序差异是否传到最终正确率,本节没有验证。
- 单机单模型:延迟与内存结论只对 M4 / 24GB + Qwen3-Embedding-0.6B + bge-reranker 这一套成立。
工程含义
先修切分,再谈融合,最后才轮到重排。 这三件事的收益差一个量级;把工程时间花在切分和元数据上,比换一个更贵的重排模型划算。
融合的收益看 MRR,不要看 Recall。 当召回已经 0.98 以上,融合的主要价值是「把第一条排对」;用 Recall 评估会低估它。
重排要按场景决定。 如果下游只取 top-1,MRR 没涨就不值得;如果下游要 top-5 全塞给模型,joint recall 才是判据,而本组数据的区间太宽,不足以支持上线。
Ablation 不是一次性工作。 换了测试集、换了基线、换了候选数,都要重跑;把脚本和 CSV 留在仓库里,比记住结论可靠。
动手实验
动手实验:把重排的候选数从 20 加到 50
假设:候选数增加后,重排的 joint Recall@5 会涨,但 p95 延迟翻倍;单段 Recall 仍然贴顶。
做法:改 labs/06-evaluation/ablation.py 里 RRF 的候选截断(当前 rrf_rank 取 20),把重排的输入改成 50,重跑;记录 joint Recall、MRR、p50/p95 重排延迟。
记录:四个指标、重排延迟、以及 105 道题上的配对区间。注意:候选数一变,重排的成本和收益一起变;不要只报收益。
参考资料
- Bouthillier, X. et al. Accounting for Variance in Machine Learning Benchmarks(小样本差异、方差与置信区间,MLSys 2021). https://arxiv.org/abs/2103.03098
- Sculley, D. et al. Winner's Curse? On Pace, Progress, and Empirical Rigor(只报最好结果与比较偏差). https://arxiv.org/abs/1802.02271
- Dodge, J. et al. Show Your Work: Improved Reporting of Experimental Results(报告均值、区间与预算,EMNLP 2019). https://arxiv.org/abs/1909.03004