固定候选与重排实验装置

  • 日期:2026-09-28
  • 读者:研究生、科研新人和工程型研究者
  • 范围:完整 5,183 篇语料的既有检索结果;抽取 100 条开发查询,每条重排 50 个候选;不代表完整基准。

摘要:先问文档在哪里,再问模型强不强

上一篇观察倒数排名融合(RRF)如何改变词项与向量检索的结果。本篇只增加一个变量:把冻结候选交给交叉编码器重新打分。实际运行后,主要指标没有提高,但我们获得了更具体的失败地图:哪些查询在进入模型前就失去了相关文档,哪些查询仍有排序空间。

这是一项诊断性复现。目标不是证明重排器必然有效,而是让“它为什么没赢”成为可以检查的命题。全部结果来自真实公开数据、冻结模型和官方推理模块;理想排序属于使用标签计算的诊断参照,后续解释属于待验证假设。

一、复现价值:把一个总分拆成两个问题

重排器(reranker)接收检索器已经选出的文档,改变其顺序。若相关论文未进入候选集合,再强的排序函数也无法凭空补回。若它已经进入候选,只是排在第十三名,则模型有机会把它推到前十。两类情况需要不同实验,混在一个均值里会误导改进方向。

【论文报告】Nogueira 与 Cho 的《Passage Re-ranking with BERT》把查询和候选段落联合输入 BERT,再按相关性得分排序;论文研究的是检索后的第二阶段。原文使用 BERT-LARGE 并进行训练。本篇采用公开 MiniLM 检查点推理,不声称复现原论文训练或成绩。[1]

【本次实际验证】沿用 SciFact 与 BEIR 的版本和划分:809 条 BEIR train 查询作为开发资源,300 条 BEIR test 查询继续保留。082 已核对后者对应原始 SciFact 开发划分;这是一份本项目未用于调参的确认资源,不是外部密封盲测。检索相关性也不等于支持、反驳或事实核验正确率。[2][3]

二、核心思想:联合读一对文本,而非比较两个向量

双编码器分别计算查询和文档向量;交叉编码器把两段文本放入同一次前向计算,使查询中的词可以与候选正文交互。这里的打分可简写为:

sθ(q,d)=fθ(tokens⁡(q,title(d)∥text(d)))∈R.s_\theta(q,d)=f_\theta(\operatorname{tokens}(q,\mathrm{title}(d)\Vert\mathrm{text}(d)))\in\mathbb R.

其中,qq 是查询,dd 是候选文档,∥\Vert 表示用单个空格拼接,fθf_\theta 包括冻结的编码器与分类头。输出是一个实数 logit,即未做概率归一化的模型得分;数值较大排在前面,不把它当作“相关概率”。本模型固定配置使用 Identity 激活,直接保留原始得分。[4]

本次形状检查实际得到输入编号张量 [2,512]、末层隐藏状态 [2,512,384]、分类头输出 [2,1],官方预测接口再展平成 [2]。两个样例的直接前向 logit 与接口输出最大差为零。这里的二表示两对查询文档,五百一十二是含特殊符号的联合长度上限;它不是分别允许查询与摘要各五百一十二个 token。

冻结候选与标签隔离的重排协议

三、官方代码阅读路线:最需要检查的是边界

从源码地图先读 BEIR 的 Rerank.rerank:它遍历候选,构造查询与“标题 空格 摘要”文本对,同时保存查询、文档编号;调用预测接口后,再把得分放回对应编号。若这一步错位,指标可能正常输出,实验却已经失效。[5]

随后读 Sentence Transformers 的 smart_batching_collate_text_only,确认去除首尾空白、动态补齐与 longest_first 截断;再读 predict,核对关闭训练模式、关闭梯度、激活函数和批次输出顺序。正文的张量检查对应这条实际链路,不是另写一个相似网络代替官方实现。[6]

源码包原样保留 BEIR 重排模块及 Apache 2.0 许可,未改其打分或编号映射。模型加载使用已安装的官方依赖;本地新增的是协议、哈希核验、指标复算和错误诊断。源码地图给出实际核验的提交、文件与行号,并区分复制代码与独立教学实现。

四、最小实验:只让排序变化

运行前登记规则:将 809 个开发查询编号按 SHA256("85:" + query_id) 排序,取前 100 个;每条保留上一篇固定 RRF 参数六十所得的前五十候选。不根据相关标签、重排得分或失败案例挑样本。原始检索覆盖完整语料,本次缩小的是查询数量与候选预算,不能与上一篇的全量均值直接比较。

冻结模型为 cross-encoder/ms-marco-MiniLM-L6-v2,权重和分词器 revision 均为 233902d25c440f23af6f7d6e94d2946bac0bee0a。数据归档没有独立 Git revision,沿用已校验下载地址、归档哈希与文件哈希作为版本身份。CPU、四线程、批量十六、联合长度五百一十二、单精度、随机种子八十五;没有提示词、训练或解码过程。[4]

先执行五条查询、每条十候选的试跑。五十对真实文本推理耗时 1.30 秒,峰值进程内存约 0.90 GB,线性估计低于预登记的九百秒预算,才进入五千对主实验。试跑得分不用于改模型或改协议。正式重排耗时 135.33 秒,含导入、校验、加载与审计的总运行耗时 141.98 秒,峰值进程内存约 1.11 GB;这些是本机测量,不包含此前检索与网络下载。

缓存身份记录模型、分词器、数据、文本规则、候选、配置和源码哈希。下载、预处理、模型加载、推理、评测分别留状态;逐对结果保存原名次、新名次、logit、相关标签和截断情况。模型权重留在显式缓存中,源码归档不携带环境或权重。

五、评测协议:理想候选顺序给出什么上限

主指标 nDCG@10 是“归一化折损累计增益”:相关文档排得越靠前贡献越大,再除以全体已标注相关文档的理想得分。分母不能只用已召回文档,否则漏召回会被掩盖。辅助报告前十召回率、前五十召回率,以及首个相关结果倒数排名的均值 MRR@10。

令 CqC_q 为冻结候选集,RqR_q 为已标注相关集,候选内最优 nDCG 为:

Uq=∑i=1min⁡(10,∣Cq∩Rq∣)1/log⁡2(i+1)∑i=1min⁡(10,∣Rq∣)1/log⁡2(i+1).U_q=\frac{\sum_{i=1}^{\min(10,|C_q\cap R_q|)}1/\log_2(i+1)}{\sum_{i=1}^{\min(10,|R_q|)}1/\log_2(i+1)}.

这里二元相关标签决定哪些文档可以贡献一分;把所有已召回相关文档排到最前即可达到这个 oracle,即知道标签的理想参照。它使用答案计算,不能作为可部署系统,也没有参与模型输入或方案选择。

若模型实际得到 MqM_q,则 1−Mq=(1−Uq)+(Uq−Mq)1-M_q=(1-U_q)+(U_q-M_q)。右边依次表示候选集合造成的指标缺口与当前排序相对候选上限的缺口。它是固定标注、固定候选和固定指标下的算术分解,不证明后一项全能由换模型消除。数据偏差、截断与标签遗漏也可能影响它。

六、实际结果:召回更多,不一定排得更好

同一百条查询 nDCG@10 Recall@10 Recall@50 MRR@10
原 RRF 顺序 0.6709 0.7775 0.9050 0.6374
交叉编码器重排 0.6691 0.8175 0.9050 0.6267
候选内理想顺序 0.9061 0.9050 0.9050 0.9100

主指标差值为 −0.001774,逐查询为二十胜、六十二平、十八负。前十召回率提高,但主要指标与首个相关结果位置均值略降,说明“进入前十”和“排到最前”是不同目标。未估计置信区间,不能据此宣称模型显著更差,更不能推广到完整 SciFact 或其他重排器。

保存结果生成的均值与逐查询差值

五十候选成员完全一致,因此前五十召回率必然不变;独立审计逐条验证了这一点。九条查询没有任何相关候选;八条存在相关候选但重排后前十未命中;八十三条前十至少命中一次。另外一条只召回部分相关文档,不能用“命中过”代替完整覆盖。平均候选缺口为 0.09387,平均排序缺口为 0.23700,二者共同组成剩余误差。

七、失败排查:先检查记录,再提出解释

自动选取差值最小与最大的各三条,不声称人工标注。查询 817 的首个相关文档由第二名降到第十五名,是明确的候选内排序失败;查询 764 则由第十三名升到第二名。查询 309 从第一名降到第六名,前十仍命中,却损失大量折损收益。这解释了为什么胜的查询略多,总均值仍可下降。

排查顺序应从编号对应、候选集合和评价分母开始,再检查 token 与内容。本次五千对中有 569 对发生截断,原始合计 1,834,958 个 token,截断后保留 1,761,679 个;这是文本对累计量,同一查询被重复计算,且不含动态补齐的额外计算。不能直接与双编码器一次性文档编码的 token 量比较。

所有指标由标准评测器产生,再由独立代码复算;同时检查每对分数与排名、理想上限闭式公式及误差分解。未标注文档按评测协议记为不相关,不代表其科学内容真的无关。只看高分错误样例就推断模型“不懂科学”,证据仍然不足。

还应区分零召回与部分缺失:一条查询有多篇相关文档时,只找回其中一篇也可能命中前十,但其理想候选得分仍低于完整标注下的理想值。本篇直接使用全部相关标注计算分母,保留这种差异。这个上限依赖现有标注是否完整;未来补充判定可能改变相关集合和误差分解,所以它是当前协议下的可检查边界,不是对真实科学相关性的最终裁决。

八、可检验问题:给失败保留竞争解释

【作者推断】第一种解释是截断损失了决定相关性的片段;第二种解释是 MS MARCO 训练所得排序偏好与科学声明检索不匹配。当前运行同时含有这两种可能性,不能把任意一项写成已确认原因。

下一篇可固定这批查询、候选、模型和评测,预登记标题拼接与长度的对照。如果增加可见文本后,被截断相关文档的恢复明显不同于未截断组,才增加对第一种解释的支持。还要报告额外 token 与耗时;只延长输入并得到提升,不能排除计算预算的影响。若恢复没有出现,也应保留这个负结果。所有选择仍限开发资源,确认集继续隔离。

源码与复现入口

源码已公开并完成匿名拉取核验:固定版本目录、README 与运行说明、SOURCE_MAP 源码地图、运行入口。远端五十一个文件与本地归档逐文件哈希一致;压缩包解压后完整重跑,关键结果逐字节一致。

按 README 安装依赖并下载固定资源后,最小命令为 python run.py --cache ./cache --out results/smoke --smoke,预期生成五十对得分、逐查询指标、形状和分阶段状态。本次实际执行了试跑与完整的一百查询、五千文本对实验;省略 --smoke 可复跑该范围。源码提供数据下载、离线审计和绘图入口,不需要作者机器上的隐含路径。

总结

本次重排没有改善主要指标,但已经回答了更具体的问题:哪些误差在固定候选下不可恢复,哪些文档被模型重新排坏。下一步研究应围绕可以冻结和改变的变量展开,用可复算的失败记录约束解释,而不是先为一个方法预留胜利结论。

参考资料

检索与实际访问日期:2026-09-28。固定源码的浏览缓存失效时,已通过官方原始地址下载并核验;不引用动态榜单数值。

  1. Rodrigo Nogueira、Kyunghyun Cho,2019 初版、2020 v5:Passage Re-ranking with BERT。
  2. David Wadden 等,EMNLP 2020:Fact or Fiction: Verifying Scientific Claims。
  3. Nandan Thakur 等,2021:BEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Models。
  4. Sentence Transformers:MiniLM-L6-v2 固定模型卡与配置。
  5. BEIR:固定版本 Rerank 实现。
  6. Sentence Transformers:固定版本 CrossEncoder。