换个领域还有效吗?一次冻结配置的迁移评测——SciFact 到 NFCorpus
- 系列:从最小复现到可检验的科研问题
- 日期:2026-09-30
- 适合读者:研究生、科研新人、工程型研究者
- 实际范围:NFCorpus 的 BEIR 导出语料全部 3633 篇文档、323 条 test 查询;源域复用 SciFact 809 条开发查询。仅迁移 BM25、MiniLM 与 RRF,不含重排或训练。
复现价值:这次究竟迁移了什么
BEIR 的研究价值在于用不同检索任务检查方法泛化,而不是让一个数据集代表所有检索场景。BEIR 论文提出这一评测框架;本文只取其中两个集合,远少于完整跨域基准。
SciFact 的输入是科学声明,本系列把它处理成文献检索任务。NFCorpus 则来自大众健康与营养内容,查询语言与专业论文用语之间可能存在距离。原论文讨论了这种词汇差异。原始全文数据与 BEIR 导出版本并非同一规模;本次运行的是后者,不能直接拿原论文数字对照。
这里也有边界:两边都包含科学、医学内容,所以这是一次集合与查询任务迁移,尚不能称为充分的远领域验证。语料规模、查询表达、相关文档数量和标签制度同时变化;冻结算法只控制算法侧变量,不能把所有分数变化归因于“领域”。
核心思想:让配置成为可核查的常量
冻结不是“我记得没改参数”,而是把配置、模型文件、数据文件与执行代码一起纳入身份记录。任何一项变化,都应产生新的缓存键。目标集合尚未评测时,我们已在协议中登记两个主要比较:稠密减 BM25、RRF 减 BM25 的方向是否保持。
BM25 沿用 Elasticsearch 7.17.9 的英语分析器、单分片、默认词频饱和与长度归一化参数。标题和摘要保留为独立字段,使用 best_fields,另一字段以 0.5 系数参与合并;其语义来自官方文档。
MiniLM 沿用第083篇的固定权重和分词器,标题加空格再接摘要,最长256个 token,输出384维单位向量,以余弦相似度检索完整语料。token 是分词后的输入单位,不等同汉字或英文单词。固定模型卡与模型文件哈希共同确定版本,不能只写一个可变模型名。
RRF 即倒数排名融合,本次保持第084篇的规则:
s ( d ) = ∑ j ∈ { B , D } 1 [ d ∈ L j ] 60 + r j ( d ) . s(d)=\sum_{j\in\{B,D\}}\frac{\mathbf1[d\in L_j]}{60+r_j(d)}.s(d)=∑j∈{B,D}60+rj(d)1[d∈Lj].
其中,文档为(d),(B,D)分别表示词项与稠密检索,(L_j)是该路最多100篇候选,(r_j)从一开始计数;未进入该路的文档贡献为零。完整并集计分后再取100,分数相同按文档字符串编号降序。公式参考RRF 原论文,执行采用固定 Pyserini 官方实现。
图中共享方框表示两套数据分别执行相同配置,不合并语料;标签只进入审计端。源域结果已在此前产生,本次复用其固定版本。RRF 实际支付两路检索成本,输出同为100并不意味着它与单路具有相同计算预算。第084篇的交替合并强基线没有纳入本次迁移,因此本篇也不能证明 RRF 优于其他同预算融合规则。
官方代码阅读路线:找到会改变结论的接口
阅读从数据加载器开始,确认查询被哪个 qrels 文件筛选。qrels 是查询与文档的相关性标注表。随后看 BEIR 的 BM25Search.search:它如何形成返回字典、过滤编号、调用字段查询。十五条无命中记录正是在这一层没有获得返回键。
稠密路径依次看 SentenceTransformer.encode、掩码均值池化、单位化和 BEIR 全库余弦检索。掩码用于排除补齐位置;本次用两条短文本独立重算,输入形状为[2,8],隐藏状态为[2,8,384],池化向量为[2,384],与官方输出最大差为零。
最后看 Pyserini 的重计分与合并函数。包中两份官方模块保持原字节,外层只统一排名和同分顺序。源码地图给出真实 commit、行号、许可证与本地对应位置。BEIR 全库不重复打包,而由下载器获取固定提交;自写适配和审计模块全部随源码交付。
最小实验:先检查资源,再运行全量
真实试跑使用五条查询、三十二篇文档,只检查入口、形状与资源,缩库分数不作为基准结论。试跑后按时间和内存决定运行全量,没有根据分数修改参数。模型在 CPU、float32、四线程、批量十六条件下执行,随机种子87用于记录可复现执行状态。
正式运行生成[323,384]查询矩阵与[3633,384]文档矩阵。编码检索耗时37.13秒,包含导入、核验、索引和评测的总时为42.65秒;Python 峰值内存约1.04GB。Elasticsearch 另设512MiB堆,只保存结束时堆快照,未测其峰值驻留内存。下载和服务启动不在这个耗时内,也没有重新计量源域推理成本。
共有2864篇文档被截断,查询没有截断。这说明相同长度限制在目标语料上实际影响很广,却不能证明丢掉了关键证据句:本次没有这类人工标注。截断限制仍按冻结协议保留,不因看到结果就改成更长输入。
评测协议:先保留等级,再谈迁移差值
NFCorpus 官方说明,相关性由直接引用、间接链接和主题关系构造,并非逐条人工判定的医学正确性。数据主页说明了构建规则与学术使用范围。本次 BEIR test 实际包含11758条一级、576条二级正标注,不能把原始三级描述机械套成导出文件的取值范围。
主指标 nDCG@10 是按位置折扣、再除以理想排序得分的归一化增益。这里遵循 trec_eval 的线性等级增益:
n D C G @ 10 ( q ) = ∑ i = 1 10 g ( q , d i ) / log 2 ( i + 1 ) I D C G @ 10 ( q ) . \mathrm{nDCG@10}(q)=\frac{\sum_{i=1}^{10}g(q,d_i)/\log_2(i+1)}{\mathrm{IDCG@10}(q)}.nDCG@10(q)=IDCG@10(q)∑i=110g(q,di)/log2(i+1).
(q)是查询,(d_i)是第(i)篇文档,(g)保留标注等级;理想得分将该查询全部已知相关文档按等级排序得到。未标注文档在本协议中计零,不意味着经人工证实不相关。Recall@100 计算已标注正相关文档被找回的比例,MRR@10 则只关心首个正相关文档的位置。
目标查询的已标注正相关文档数从一篇到475篇不等,平均约38.19篇。对相关文档很多的查询,即使前一百位全部相关,Recall@100 也可能到不了一。这是候选截断和标签密度共同规定的量尺,不宜拿两个集合的召回率直接相减并归咎于模型。
源域与目标域分别对查询取宏平均,不把两套不同查询硬配成样本。配对差只在同一查询内计算:同一目标查询用稠密分数减去 BM25 分数,再汇总胜、平、负。原 SciFact 三百条确认查询仍未执行;目标 test 已用于本次迁移与调试,后续不能再称未见确认集。
本次实际结果:均值、覆盖与胜负并不等价
下表全部来自保存的真实输出,不是论文报告或榜单成绩。
| 数据范围 | BM25 nDCG@10 | MiniLM nDCG@10 | RRF nDCG@10 |
|---|---|---|---|
| SciFact,809条已使用开发查询 | 0.69427 | 0.66020 | 0.71222 |
| NFCorpus,323条冻结迁移查询 | 0.32689 | 0.31594 | 0.35311 |
稠密相对 BM25 的均值差从−0.03407变成−0.01095,两边都为负;RRF 的差分别为+0.01795和+0.02622,两边都为正。预先关注的方向得到保持,但差值大小不能解释成在新领域“提升了多少能力”。
目标域稠密检索是109胜、106平、108负:获胜查询略多,平均差仍为负,说明胜负幅度同样重要。它的 Recall@100 为0.31151,高于 BM25 的0.24814,前十位却没有排得更好。RRF 的 Recall@100 为0.32248,配对胜平负为122、136、65;仍有四十三条查询在前一百位没有任何已标注相关文档。
不能把 RRF 的均值改善解释成每条查询都受益。例如自动选择的失败案例 PLAIN-1320,其 nDCG 差约−0.57097;收益案例 PLAIN-924 的差约+0.55778。这些编号用于追踪排名,不是人工错误分类。本次也未提供置信区间,无法据此宣称总体显著。
失败排查:会运行还不够,分母也要守住
首次命令漏传试跑参数,提前启动了全量 BM25;查询完整性断言发现缺项后退出,尚未执行神经编码或聚合评测。失败目录和日志保留。修复后,用相同字段查询直接检查服务,确认十五条确实零命中,再补空候选并让评测计零;没有更改检索打分。
这个修复也使本次存在目标集调试访问,不能包装成完全盲测。若只对返回的308条取均值,丢失的恰好是失败查询,报告就会乐观。另一个容易漏掉的问题是沿用 SciFact 的二值增益公式;在新集合会抹去等级差异。独立审计重算三种方法的969组查询指标和46852条融合分数,最大误差约为三乘十的负十六次方。
这类验收应当先于解释模型优劣。初学者可以先检查一个查询:取出三套排名,逐篇对照标注等级,手算前几位的折扣贡献。工程读者再检查全部查询编号是否齐全、候选是否来自同一语料、分数是否有限。研究读者则进一步询问:未标注文档算零是否影响两个模型的相对评价?如果两种检索器找到的文档类型不同,标注覆盖差异也可能进入分数。本文没有补做人工判定,因此这仍是一条需要新证据的限制。
还应区分参数不变与输入分布不变。同一个分词器遇到更短的查询、更多被截断的摘要,实际处理的信息量仍会变化。协议记录这些量,是为了使下一次实验能够选择一个明确变量;它们本身不构成因果结论,也不是事后替负结果寻找免责理由。
可检验的研究问题:先登记反例,再做改进
作者推断是,稠密路径增加候选覆盖,却可能没有把高等级相关文档优先排到前十;目前只能称一种解释。竞争解释还包括标注密度、短查询歧义以及文档截断。它们都不能由一个平均分独立证实。
后续可在允许探索的数据上登记区分性实验:固定候选集合,只交换排序规则,检查覆盖优势是否仍转化不了前排增益;或者固定模型与候选预算,按预定义的长度区间比较,而不是看完输赢后挑阈值。若要调整长度或融合常数,必须回开发流程,并为新的确认评测另留数据。本次不提前承诺改进会胜出。
源码与复现入口
本篇源码已公开并通过匿名下载核验:固定提交源码目录、README 与运行说明、SOURCE_MAP 源码地图。该版本的83个文件与本地归档逐一相同,公开副本的真实模型试跑也已通过。
按 README 安装固定依赖、准备公开数据并启动本机服务后,最小命令为:
HF_HUB_OFFLINE=1TOKENIZERS_PARALLELISM=false python run.py--cache./cache--outsmoke-new--smoke产物包括三路排名、逐查询指标、阶段状态和张量检查;去掉试跑参数并换新输出目录,即运行本文全量目标实验。审计入口读取原始保存结果与已校验数据缓存。包不含完整数据、模型权重、虚拟环境或密钥;正文所述完整结果与缩库试跑分开保留。
总结
这次迁移保留了既有方法的均值方向,也暴露了“更多覆盖”“前排更准”“更多查询获胜”之间的差别。最有价值的连续研究资产,是冻结协议、完整分母和逐查询记录。它们使下一步问题能够被反驳,而不必靠重新挑配置维持成功故事。
参考资料
检索与实际打开日期:2026-09-30。官方实现永久链接、许可和文件哈希见源码地图。
- Nandan Thakur、Nils Reimers、Andreas Rücklé、Abhishek Srivastava、Iryna Gurevych,2021:BEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Models。
- Vera Boteva、Demian Gholipour、Artem Sokolov、Stefan Riezler,ECIR 2016:A Full-Text Learning to Rank Dataset for Medical Information Retrieval及原始数据说明。
- David Wadden 等,EMNLP 2020:Fact or Fiction: Verifying Scientific Claims。
- Gordon V. Cormack、Charles L. A. Clarke、Stefan Büttcher,SIGIR 2009:Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods。
- Sentence Transformers:all-MiniLM-L6-v2 固定模型卡;Elastic:7.17 multi_match 文档。