一个反直觉的检索难题
有人在社交媒体上发了一条推文:"新研究说大模型在多步推理上的错误率高达 73%,即使思维链也救不回来。"你想找到这篇论文。你手头有一个 7718 篇科学论文的语料库,每篇只有标题和摘要。
听起来不难?试试看。推文用的是口语化的"大模型""多步推理""错误率""思维链",论文标题可能是"Analyzing Failure Modes of Chain-of-Thought Reasoning in Large Language Models"。BM25 搜"大模型"一个字都匹配不上,因为论文里用的是"Large Language Models"。这就是 CheckThat! 2025 Subtask 4b 的核心挑战:从非正式的社交媒体帖子,检索到对应的科学论文。
这个任务的难点有个专门的名字——"词汇鸿沟"(lexical gap)。社交媒体用户用日常语言,学术论文用学术语言,两者之间的词汇和表达方式几乎不重叠。传统的 BM25 搜索完全失效,因为它依赖词项精确匹配。
Deep Retrieval 团队(来自德国美因茨大学)在 CheckThat! 2025 比赛中拿下了开发集第一名(MRR@5 76.46%)、测试集第三名(66.43%,31 支队伍)的成绩。他们的方案是一个三段式混合检索管线:BM25 + 稠密检索 + LLM 重排。听起来不新鲜,但每个环节都有值得拆解的工程细节。
三段式管线的逻辑
第一段:BM25 的"微整形"
BM25 是最古老的检索方法之一,基于词项频率和文档长度归一化。在学术检索场景下,它有一个致命弱点:推文里的"73%"和论文里的"73%"能匹配,但推文里的"大模型"和论文里的"Large Language Models"匹配不了。
团队没有放弃 BM25,而是给它做了三步"微整形":
1. 小写化 + 标点去除:基础清理,减少噪音 2. BPE 子词分词:这是最关键的一步。不用词干提取(lemmatization),而用 Byte Pair Encoding 把词拆成子词。"reasoning" 会被拆成 "reason" + "ing","models" 会被拆成 "model" + "s"。这样"reason"能匹配到"reasoning","model"能匹配到"models" 3. 保留科学符号:百分比(%)、数字、化学式都保留,因为它们在科学语境中携带关键信息
为什么选 BPE 而不是词干提取?团队的解释很务实:BPE 最大化 n-gram 重叠,而且不需要语言模型支持(词干提取需要知道词性)。在跨域场景下,BPE 的鲁棒性更好。
BM25 返回 top 30 篇候选论文。实验发现增加到 30 以上没有收益,但会显著增加重排阶段的计算成本。
第二段:稠密检索的领域适配
稠密检索用神经网络把文本编码成向量,通过余弦相似度匹配。它的优势是能捕捉语义相似性——"大模型"和"Large Language Models"在向量空间里是接近的。
团队选了 INF-Retriever-v1 作为基础编码器,这是 gte-Qwen2-7B-instruct 的微调变体。但直接用预训练模型效果有限,因为学术语言和社交媒体语言之间的语义距离太大。团队用 CheckThat! 训练集做了进一步微调:
- 损失函数:Multiple Negatives Ranking Loss(MNR)。对每个正例对(推文,论文),随机采样负例论文,训练模型让正例对的相似度高于负例对
- 输入长度:8192 token,覆盖长摘要不截断
- 池化策略:last-token pooling(取最后一个 token 的向量作为句子表示)
- LoRA 微调:只调最后 8 层 transformer,用 LoRA adapter 减少显存占用
第三段:LLM 重排的精筛
重排器是整个管线的"最后一道关卡"。它不是独立编码再算相似度,而是把(推文,论文)对作为输入,直接输出一个相关性分数。这种 cross-encoder 架构的计算成本远高于双塔模型,但精度也高得多。
团队选了 BAAI/bge-reranker-v2-gemma,一个基于 Google Gemma 的 LLM cross-encoder。重排的候选池是稠密检索的 top 100 + BM25 的 top 30(去重后约 100-130 篇),重排后返回 top 5 作为最终结果。
为什么重排只取 top 5?因为评测指标是 MRR@5(Mean Reciprocal Rank at 5),只看前 5 名中正确论文的排名。这个指标的设计逻辑是:用户不会翻到第 6 条结果以后,所以前 5 名必须精准。
消融实验:每个环节值多少分
论文的消融实验清晰地展示了每个环节的贡献(测试集 MRR@5):
| 配置 | MRR@5 | 相比基线提升 |
|---|---|---|
| 官方 BM25 基线 | 37.2% | — |
| + BPE 预处理 | 45.6% | +8.4 |
| INF-Retriever-v1(未微调) | 57.1% | +19.9 |
| + MNR 微调 | 56.7% | +19.5* |
| + LLM 重排(完整管线) | 66.4% | +29.2 |
几个值得注意的细节:
1. 稠密检索是最大赢家:从 BM25 到稠密检索,MRR@5 涨了近 20 分。这说明语义匹配在跨域场景下的价值远超词项匹配 2. BPE 预处理对 BM25 的提升显著:8.4 分的提升说明子词分词是处理词汇鸿沟的有效手段 3. LLM 重排贡献约 10 分:从 56.7 到 66.4,重排器纠正了检索阶段的排序错误 4. 微调的提升在测试集上缩水:开发集 +2.0 分,测试集 +2.2 分,但 Precision@100 的提升更稳定。这说明微调主要改善了排序质量而非召回质量
为什么不用更大的 LLM 重排
一个自然的问题是:为什么不用 GPT-4 或 Claude 来重排?团队有两个考虑:
1. 比赛规则:CheckThat! 2025 要求不使用闭源模型和外部数据,确保方案可复现 2. 成本效益:bge-reranker-v2-gemma 是开源的 7B 模型,在单卡 A100 上就能跑。对 130 篇候选重排,推理时间在可接受范围内
这个约束反而让方案更有价值:它证明了一个完全开源、可复现的管线就能达到竞赛级性能。团队特别强调,他们的方案"不使用任何外部训练数据、元数据、外部知识源或闭源模型",这意味着它可以被直接迁移到其他跨域检索场景。
工程启示
Deep Retrieval 的方案没有理论创新,但工程上有很多值得学习的细节:
1. 候选数量的分配要匹配各环节的精度。 BM25 返回 30 篇(精度低,少取),稠密检索返回 100 篇(精度高,多取),重排器处理 130 篇(精度最高,全处理)。这个"漏斗"设计让每个环节的算力都花在刀刃上。
2. BPE 不是分词的默认选择,但在跨域场景下值得尝试。 传统 IR 用词干提取或词形还原,但在社交媒体 vs 学术论文这种极端域差异下,BPE 的子词粒度反而更灵活。
3. LoRA 微调最后几层就够了。 只调最后 8 层 transformer,用 LoRA adapter,既节省显存又避免过拟合。这个配置在 7B 模型上是经过验证的甜点。
4. 重排器的选择要平衡精度和成本。 bge-reranker-v2-gemma 不是最强的重排器,但在开源模型中性价比最高。团队在附录中尝试了其他重排器,但效果提升不大而成本显著增加。
对更广泛场景的启示
CheckThat! 的场景是"推文找论文",但这个管线的适用范围远不止于此:
- 客服对话找知识库条目:用户用口语描述问题,知识库用规范语言记录解决方案
- 代码注释找 API 文档:注释是开发者自然语言,文档是技术写作
- 病历找临床指南:医生用缩写和口语,指南用规范医学术语
开源资源
- 比赛官网:https://checkthat.gitlab.io/clef2025/task4/
- 论文 arXiv:https://arxiv.org/abs/2505.23250
- INF-Retriever 模型:https://huggingface.co/infgrad/INF-Retriever-v1-1.5B
- bge-reranker-v2-gemma:https://huggingface.co/BAAI/bge-reranker-v2-gemma