封面

  • 日期:2026-10-24
  • 读者:研究生、科研新人和工程型研究者
  • 范围:一百条已观察开发查询、每条五十个固定候选;不训练,不评测三百条确认查询。

摘要:先让改进接受同一张账单

如果一个检索改进多看了文档、多跑了模型,最后分数更高,我们究竟验证了方法,还是预算?本篇把问题缩小到一个可以清楚记账的实验:保持候选与交叉编码器计分不变,只改变最终排序规则。

本次实际验证中,固定排名融合的 nDCG@10 为0.702521,纯交叉编码重排为0.669133,原始混合检索为0.670906。融合没有增加神经模型计分次数,但并非没有代价:相对交叉编码器,二十条查询改善、六十六条持平、十四条下降。这是一项值得继续检验的开发集结果,不是确认集上的研究成功声明。

复现价值:强基线要能反驳自己的解释

此前的失败分析发现,重排有时覆盖了原本有用的顺序;证据移位探针又提示,完整看到证据并不保证名次改善。因此,本篇没有继续修改文本,而是测试一个简单修复:保留原有排名信息,再与模型排名融合。新增变量只有排序决策,查询、文档内容、权重和候选集合全部冻结。

这里的“强基线”是与问题直接相关且已经可靠运行的比较对象,不意味着穷尽当前最强系统。原始RRF排名已经结合词项检索与稠密检索,不是刻意挑选的弱对手;纯CE则代表完全交给重排模型。候选融合必须同时面对这两者。若只优于CE却不如更便宜的原始排序,就不能把加一层模型包装成无条件进步。

SciFact论文介绍的是科学主张核验与证据定位任务;本项目使用其公开数据评测文档相关性。[1] 支持或反驳主张的证据文档都可能相关,检索指标不是科学判断正确率。沿用的这一百条开发查询已经参与过前序分析,不能因为换了实验编号就重新称为未见测试集。

核心思想与公式:把分数尺度换成排名

RRF即倒数排名融合,将不同系统给出的名次转换为可相加的分数。Cormack、Clarke与Büttcher在2009年论文中给出这一方法,并报告常数六十在先导实验后保持固定。[2] 论文的既有集合结果不能保证本篇有效;本次只借用公式,不复刻其全部系统或训练实验。

对查询 qq 的固定候选文档 dd,本次融合分数为:

Fq(d)=160+rqR(d)+160+rqC(d).F_q(d)=\frac{1}{60+r_q^{R}(d)}+\frac{1}{60+r_q^{C}(d)}.

rqRr_q^{R} 是已有RRF排序中的名次,rqCr_q^{C} 是CE排序中的名次,均从一开始,在同一五十文档集合内取值。CE是交叉编码器的简称,它联合读取查询与文档,输出用于排序的标量。这里融合的是“已有混合检索排名”和“重排排名”,不是再次直接混合BM25与稠密向量分数。

两项等权相加,不训练权重,不在本篇搜索常数。这样避开了原始检索分数与CE输出尺度不同的问题,却丢掉了分数间隔:两个名次只差一位,无法告诉融合器模型究竟犹豫还是笃定。它是一种有明确偏好的折中,不是自动纠错器。

一个直观例子是:某文档在两张表中都排第十,往往会胜过一张表排第一、另一张表排第五十的文档。融合偏好共同认可,因而能压住单一系统的激进提升,也可能把真正有价值的新发现拉回去。这个例子只解释公式的行为,不是本次另选的实验样本。研究问题因此应写成“这种折中在固定范围内是否划算”,而不是“融合是否总比单模型聪明”。

排序按融合分数降序,完全相同的分数按字符串文档编号降序。这个细节也属于协议:倒数求和会产生并列,若不同脚本随意采用输入顺序,逐查询结果可能改变。本次以实际浮点求和定义操作顺序,另用有理数独立复核数值,不悄悄改变并列规则。

官方代码阅读路线:从候选编号追到输出

先读BEIR固定提交中的 Rerank.rerank:它选择候选、拼接标题和摘要、调用模型,再把每个分数放回对应文档编号。[3] 本篇原样保留该文件,外部编排代码复用上一实验的固定公开版本,避免为新想法同时重写输入管线。

再读Sentence Transformers的联合分词与 CrossEncoder.predict。[4] 冻结模型是 cross-encoder/ms-marco-MiniLM-L6-v2,模型和分词器修订为 233902d25c440f23af6f7d6e94d2946bac0bee0a。模型卡说明它在MS MARCO段落排序任务上训练;这并不构成科学文献领域效果保证。[5] 本次使用原始标量输出,不把它解释成相关概率。

最后读本篇的 blend_report 与独立审计器:前者只读取本次模型输出并构造两张名次表,后者从逐对CSV重建排序、折损与预算。源码地图列出官方函数行号、固定提交、许可证及本地对应;官方文件已重新下载核对,安装的CrossEncoder源码经换行标准化后完全一致。

最小实验:冻结什么,新增什么

语料仍为5183篇文档,使用原有一百条开发查询及其RRF前五十候选。输入是标题、一个空格与摘要;联合长度上限512个token,包含查询和特殊符号。token是模型处理的子词单位,不能把这个上限理解为摘要独享五百一十二个词。

环境为Python 3.12.14、PyTorch 2.6.0、Sentence Transformers 3.4.1、CPU单精度、四线程、批量十六,随机种子一百零八。先运行五查询乘十候选的真实试跑,再按预定规则扩大到五千对。没有训练、候选扩张、文本改写或新标注,融合参数也未随着结果调整。

正式计分仅执行一次,CE和融合共享这些输出。输入审计实际记录1761679个非填充token;两者相同,融合额外模型计分为零。纯RRF则不需要这次CE前向,所以“等预算”仅指CE与融合的神经计分对照,不能宣称三个方法总成本一致。BM25、稠密检索和初始RRF的历史计算成本未在本篇重测。

正式CE推理用时129.90秒,基础运行含导入、加载和评测共134.72秒,峰值进程内存855687168字节,约0.80 GiB。融合的名次表构造、求和、排序及轨迹生成另计约2.96毫秒,不含指标计算和写文件;单次微小计时不能外推服务吞吐。形状核对额外执行四个查询文档对,独立于正式五千对账本。

固定候选与共享计分流程

图中的条形是评测图标,不代表测量数值。三条评测路径共享候选,确认集与本次流程断开。实际输入、末层表示与输出形状分别为 [2,512][2,512]、[2,512,384][2,512,384]、[2,1][2,1],依次对应批量、联合长度、隐藏维度与单分数;模型保持评估模式。

实际验证:均值提高,局部损失仍在

nDCG@10衡量前十位相关文档的排序质量,按名次折损并以理想排序归一化。Recall@50是前五十候选覆盖的相关文档比例,本表采用逐查询宏平均;“前十无命中”则是完全没有相关文档进入前十的查询数,二者不是同一个统计量。

方法 nDCG@10 Recall@50 前十无命中查询
原始RRF 0.670906 0.905000 21
纯CE 0.669133 0.905000 17
固定排名融合 0.702521 0.905000 14

融合相对CE平均增加0.033388,相对RRF增加0.031614。后一个比较的胜、平、负为十八、七十二、十。候选覆盖不变,因此这些变化来自排序而非找到了更多文档;但候选中缺失的证据也不可能被融合凭空补回。

把结果放回前序失败,能看见更具体的交换。原来CE相对RRF退步的十八条中,十七条经融合改善,但只有九条恢复到RRF水平或更好。原来CE获益的二十条中,十三条的收益被融合削弱;在原本未退步的查询中,还出现一条相对RRF的新损失。只展示“修复十七条”会隐去相当一部分代价。

按融合减CE差值查看极端样本,查询309的相关文档从CE第六回到第一,nDCG增加0.643793;查询242的第一篇相关文档却从CE第一落到融合第七,nDCG减少0.408765。后者有多篇相关文档,不能仅凭第一篇的名次还原完整指标。这些是事后定位的说明案例,不是另一次挑选后得出的总体证据。

评测协议与失败排查

主比较提前固定为逐查询的融合减CE差值均值,同时报告融合减RRF。研究登记中的0.01门槛留给最后的确认评测;本篇开发均值超过它,也不能提前宣布假设成立。这里的比较单位是查询,不是五千个查询文档对。把每个候选当成一次独立成功,会把同一查询内的相关排序约束拆散,并夸大证据量。相同均值也可能由少数大幅改善或很多微小改善构成,所以完整配对表与平均值同样重要。查询之间可能共享证据文档,本次没有把一百条视为独立样本来计算显著性,后续需先明确分组与不确定性估计方案。

第一次试跑在导入PyTorch时失败,旧临时环境缺少依赖,尚未进入推理。恢复完整固定版本环境后,真实试跑和正式运行通过;失败日志保留。模型卡的网页读取失败,则通过匿名固定版本下载继续核验,未用猜测补全来源。

独立检查重建全部五千对的排名、融合分数、逐查询指标、均值、胜负与预算;原始CE分数与前序记录完全一致。七类损坏测试拒绝了改分数、漏候选、改均值、额外计分、冒用确认集、改名次轨迹和错误分类计数。检查保证账本能复算,不保证历史开发数据没有选择偏差,也不证明提高源于某种唯一的模型机制。

研究问题与总结

本次支持的局部观察是:相同候选与CE计分下,保留原始排名可以改善这批开发查询的平均结果,同时牺牲部分CE独有收益。作者推断是两种排序信息存在互补,但仅凭均值不能断言模型发生领域错配,更不能把一个成熟融合公式命名为新算法。

下一步应拆分上下文处理与排名融合的独立贡献及交互,而不是继续调整常数直到结果更漂亮。原先保留的三百条确认查询仍未评测,待方案与报告冻结后才使用。一个可信的改进,需要同时交代改善了多少、伤害了谁、用了什么预算,以及哪些问题这次仍未回答。

源码与复现入口

本篇完整配套源码已公开发布,共74个文件:固定版本源码目录、README与运行说明、SOURCE_MAP与官方实现对应。该提交已匿名下载,全部文件与本地归档逐项一致,并从下载版本重新执行真实模型试跑。

按README安装固定依赖并执行数据准备后,最小真实命令为:

HF_HUB_OFFLINE=1 TOKENIZERS_PARALLELISM=false python run.py --cache ./cache --out replay-smoke --smoke

预期输出五十对分数、三方案逐查询指标、融合名次轨迹和预算账本;去掉试跑参数可运行一百查询乘五十候选。随后用 python audit.py --out replay-smoke 独立复算。本次实际执行了试跑与正式范围,配套源码包含全部自写模块;大资源按固定修订与文件哈希获取,不依赖作者机器路径。

参考资料

检索与固定源码核验日期:2026-10-24。论文报告、本次实测和作者推断已在对应段落区分。

  1. David Wadden等,2020,Fact or Fiction: Verifying Scientific Claims,EMNLP,会议页面。
  2. G. V. Cormack、C. L. A. Clarke、Stefan Büttcher,2009,Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods,SIGIR,作者保存的论文。
  3. BEIR作者,固定提交的Rerank实现。
  4. Sentence Transformers维护者,固定提交的CrossEncoder实现。
  5. Sentence Transformers,本次权重版本模型卡。

作者作品推广

以下是作者自有产品推广。除了写技术博客,我也在做一些让日常更有条理的小工具,欢迎了解我独立开发的两款 App:

  • 日常收支小记:记下收支,也给每一笔钱安排好去处。记录日常账目,安排预算与储蓄目标。在 App Store 了解。
  • 一事微光:从一件小事开始,让今天多一点微光。按当下的时间和精力选择行动,记录完成后的感受与发现。在 App Store 了解。

更多技术文章和个人作品,欢迎来我的网站:zffjzz.top。也欢迎把使用感受告诉我,让这些小工具慢慢变得更好。