MS MARCO — 1 千万 Bing 真实查询喂饱神经检索的标准评测集
是什么
MS MARCO(Microsoft MAchine Reading COmprehension)是微软 2016 年公开的大规模阅读理解 + 段落排序数据集。
日常类比:像驾校的标准考场。以前每家公司练自己造的车(神经检索模型),在自家小区路口测,没法跟别家比。MS MARCO 把全国驾校的考场统一成一个——同样的题目、同样的路线、同样的打分规则。
它的体量在 2016 年是空前的:
- 101 万 真实查询(从 Bing 搜索日志采样)
- 18 万 由人工写的标准答案
- 884 万 段落(来自 356 万个网页)
- 3 个任务:可答性判断、答案生成、段落排序
之后近十年,几乎所有神经检索 / RAG retriever 的论文都要在 MS MARCO 上跑一遍才有发表资格。
为什么重要
不理解 MS MARCO,下面这些事都没法解释:
- 为什么 2018 年之后 dense retrieval(DPR、ANCE、ColBERT)忽然爆发——之前没有这么大的训练集
- 为什么 Hugging Face 上一半 sentence-transformers 模型描述都写着「trained on MS MARCO」
- 为什么 BEIR 把 MS MARCO 当成「域内训练集」,再测 18 个域外任务的零样本能力
- 为什么 TREC Deep Learning Track 从 2019 年起干脆直接用 MS MARCO 做评测
一句话:MS MARCO 是把神经检索从论文搬进工业的那一节梯子。
核心要点
1. 查询来自真实用户,不是众包工人
之前的 SQuAD(2016 年同年)是这样造的:先给众包工人一段维基段落,让他们看着段落写问题。问题天然「贴着段落」,模型只要会找关键词重叠就能拿高分。
MS MARCO 反过来——查询先存在(Bing 用户真的输入过的搜索词),再让人去 Bing 的检索结果里找能回答它的段落,再写答案。
后果:
- 查询语言更口语化(“how tall is the eiffel tower” 这种)
- 查询和段落用词差异大,关键词匹配不够用,必须语义匹配 → 神经模型才有发挥空间
2. 三个任务,难度递增
| 任务 | 输入 | 输出 | 谁在做 |
|---|---|---|---|
| Q&A | 问题 + 候选段落 | 抽取式短答案 | BERT-QA、T5 |
| Natural Language Generation | 问题 + 段落 | 通顺的自然语言答案 | 早期 seq2seq、后来 T5、LLM |
| Passage Ranking | 问题 + 候选池 | 段落相关性排序 | BM25、DPR、ColBERT |
Passage Ranking 是后来最火的子任务。规模:880 万段落池 / 训练查询 50 万 / dev 7K / eval 7K(eval 标签不公开,提交 leaderboard 才能打分)。
3. 评测指标:MRR@10 + Recall@1000
- MRR@10:前 10 名里第一个相关段落排在第几位的倒数。BM25 基线约 0.18,2024 年 SOTA 约 0.45
- Recall@1000:相关段落是否进入前 1000——衡量召回能力,配合 reranker 时关键
实践案例
案例 1:BM25 基线长什么样
# 用 pyserini(Anserini 的 Python 包装)跑一行 BM25 基线from pyserini.search.lucene import LuceneSearcher
searcher = LuceneSearcher.from_prebuilt_index('msmarco-v1-passage')hits = searcher.search('how tall is mount everest', k=10)for i, h in enumerate(hits): print(i + 1, h.docid, h.score)跑完 dev set 7K 查询,MRR@10 约 0.187。这是 2018 年之前所有论文的「打不过 BM25」噩梦的起点。
案例 2:DPR 怎么用 MS MARCO 训练
DPR(Karpukhin 2020)的训练循环简化到极致:
- 取一条 (query, positive_passage) 正样本
- 同 batch 里其他查询的正样本就当 negative(in-batch negatives 技巧)
- 用对比损失,把 query 和 positive 推近、和 negatives 推开
为什么这招在 MS MARCO 上能跑:880 万段落 + 50 万训练对,足够 64 GPU 训练 40 小时跑出 0.31 MRR@10——比 BM25 高 12 个点。
案例 3:从 Passage Ranking 到 RAG retriever
现代 RAG 系统的 retriever 几乎都是这个流水线:
- 用 MS MARCO Passage Ranking 训练一个 dual encoder(query encoder + passage encoder)
- 把它当 backbone,在自己业务数据上再微调几千步
- 部署:query 实时编码、passage 离线编码 + ANN 索引(FAISS / HNSW)
第 1 步几乎免费——开源 checkpoint 直接下。这就是 MS MARCO 真正改变了行业的地方:预训练的检索 backbone 标准化了。
踩过的坑
-
MRR@10 不报 Recall@1000 是耍流氓:MRR@10 只看前 10,召回再差也看不出。reranker 上线后没召回支撑,最终业务指标会崩。
-
v1 vs v2 段落集不一样:2016 年发的是 v1(880 万段落),2021 年微软扩到 v2(1.38 亿段落)。论文比较时要看清版本号,混着比是错的。
-
dev set 公开但 eval set 不公开:调参只能在 dev 上做,eval 要提交 leaderboard。新人常把 dev 当 test 用,过拟合 dev 不自知。
-
标注稀疏导致召回低估:880 万段落池里,每个查询通常只标了 1 条相关段落。模型可能召回了语义同样相关但没被标的段落,被算「错」。所以 Recall@1000 数值整体偏低,跨数据集不能直接比。
-
License 不能商用瞎用:MS-MARCO 协议要求商用走微软授权。把 retriever 模型权重直接卖给客户的初创公司容易踩坑——上游训练数据有授权约束。
适用 vs 不适用场景
适用:
- 训练 / 评测英文段落级检索模型
- 给 RAG retriever 找 backbone 预训练
- 比较 BM25 / dense / sparse / late interaction(ColBERT 那种)三家方案
不适用:
- 中文 / 多语言场景(要换 mMARCO / Mr. TyDi)
- 多跳问答(要换 HotpotQA / MuSiQue)
- 长文档(段落最长几百词,长文档要换 LongBench)
- 对话式检索(要换 OR-QuAC / TopiOCQA)
历史小故事(可跳过)
- 2016 年 11 月:MS MARCO v1 发布,目标是「比 SQuAD 大 10 倍 + 用真实查询」
- 2018 年:Passage Ranking 子任务和 leaderboard 上线,神经模型开始爆发
- 2019 年:TREC Deep Learning Track 把 MS MARCO 收编为官方评测集
- 2020 年:DPR / ANCE / ColBERT 三件套全用 MS MARCO 训练,dense retrieval 元年
- 2021 年:v2 数据集发布,规模扩到 1.38 亿段落
- 2023 年起:LLM 时代,MS MARCO 的「检索 + 生成」分工被 RAG 完整继承
学到什么
- 数据集决定研究方向:神经检索能爆发,是因为先有 MS MARCO 这种规模的训练集,不是因为模型变强了
- 真实查询 vs 合成查询有本质差距:查询和段落用词不重叠的真实场景,才能逼出语义匹配模型
- 评测指标要配套用:MRR 看精度、Recall 看召回,单看一个会被误导
- 基础设施先于模型:BM25 跑不过的「baseline」其实是工程实现(Anserini)+ 数据集(MS MARCO)共同建的台子
延伸阅读
- 论文 PDF:MS MARCO arXiv 1611.09268
- 官方网站 + leaderboard:microsoft.github.io/msmarco
- 评测综述:BEIR — Heterogeneous Benchmark for IR(把 MS MARCO 当训练集,测 18 个域外任务)
- anserini-2017 —— Lucene 上做学术 IR 实验的标准工具
- bm25-okapi —— 神经模型必须打的传统基线
关联
- bm25-okapi —— BM25 是 MS MARCO Passage Ranking 的传统基线,一切神经模型都要先跨过它
- okapi-bm25-1994 —— BM25 的原始论文,理解评测基线先看它
- anserini-2017 —— 跑 MS MARCO BM25 / 复现实验最常用的工具链
- dpr-2020 —— Dense Passage Retrieval,第一个在 MS MARCO 上稳定打过 BM25 的 dense 模型
- ance-2020 —— ANCE,硬负采样,把 MS MARCO 上的 dense retrieval 推到新高度
- colbert-2020 —— ColBERT,late interaction 范式,MS MARCO 上效率 / 精度折中代表作
- colbert-v2 —— ColBERT v2,量化 + 蒸馏,进一步把 late interaction 工程化
反向链接
- anserini-2017 —— Anserini — 把工业搜索引擎 Lucene 改造成学术 IR 实验台
- colbert-2020 —— ColBERT — 让 BERT 检索既准又能扛大规模
- colbert-v2 —— ColBERTv2 — 让向量检索既精又能扛百万文档
- doc2query-2019 —— doc2query — 让模型替文档预想”会被怎么搜”再写进倒排表
- dpr-2020 —— DPR — 用 BERT 双塔把检索从 BM25 时代拉进稠密向量时代
- splade-2021 —— SPLADE — 让神经网络学出稀疏向量,直接复用倒排索引