MRR 平均倒数排名
五层读懂一个词。这次拆的是:MRR (Mean Reciprocal Rank)--关心第一个相关文档位置的指标,问答系统的事实标准。
L1 · 一句话点破
MRR = 第一个相关文档排名的倒数的平均。第 1 名贡献 1.0,第 2 名 0.5,第 5 名 0.2。关心"第一个相关文档排第几",是问答和已知项检索的核心指标。
L2 · 通俗类比
学生问老师问题,老师给 5 个候选答案:
- 题 1:正确答案排第 1 -> 这题得分 1/1 = 1.0
- 题 2:正确答案排第 3 -> 这题得分 1/3 = 0.33
- 题 3:正确答案排第 5 -> 这题得分 1/5 = 0.20
- 题 4:5 个都不对 -> 这题得分 0
MRR = (1.0 + 0.33 + 0.20 + 0) / 4 = 0.38
直觉:正确答案越靠前,得分越高。第 1 名满分,越往后衰减。
适用场景:
- 问答系统:用户要 1 个正确答案,排第 1 最好
- 已知项检索:找特定文档(如"RLHF 论文"),排第 1 最好
- 客服:用户要 1 个解决方案,排第 1 最好
不适用场景:
- 多相关文档检索(用 Recall@K / NDCG@K)
- 探索式搜索(用户浏览多个结果)
L3 · 正经定义
MRR (Mean Reciprocal Rank):所有查询中,第一个相关文档排名倒数的平均。
$$ \text{MRR} = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\text{rank}_q^*} $$
其中 $\text{rank}_q^$ 是查询 $q$ 的第一个相关文档的排名(1-indexed)。如果 top-K 内无相关文档,$\text{rank}_q^ = \infty$,贡献为 0。
MRR@K:限制在 top-K 内:
$$ \text{MRR@K} = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\text{rank}_q^} \cdot \mathbb{1}[\text{rank}_q^ \le K] $$
如果第一个相关文档排名 > K,贡献为 0。
性质:
- 范围 [0, 1],越高越好
- 只关心第一个相关文档,忽略后续
- 排名衰减快:第 1 名 1.0,第 10 名 0.1,第 100 名 0.01
伪代码:
def mrr_at_k(results, relevant_docs, k):
"""
results: dict, query_id -> list of retrieved doc_ids (ranked)
relevant_docs: dict, query_id -> set of relevant doc_ids
k: top-K 限制
"""
reciprocal_ranks = []
for q_id, retrieved in results.items():
top_k = retrieved[:k]
rel = relevant_docs[q_id]
rr = 0.0
for rank, doc_id in enumerate(top_k, start=1):
if doc_id in rel:
rr = 1.0 / rank
break
reciprocal_ranks.append(rr)
return sum(reciprocal_ranks) / len(reciprocal_ranks)
# 示例
results = {
"q1": ["d1", "d2", "d3", "d4", "d5"], # d2 相关
"q2": ["d6", "d7", "d8", "d9", "d10"], # 都不相关
"q3": ["d11", "d12", "d13", "d14", "d15"], # d11 相关
}
relevant = {
"q1": {"d2"}, # 第 2 名 -> 1/2 = 0.5
"q2": {"d20"}, # 不在 top-5 -> 0
"q3": {"d11"}, # 第 1 名 -> 1/1 = 1.0
}
print(mrr_at_k(results, relevant, k=5)) # (0.5 + 0 + 1.0) / 3 = 0.5L4 · 原理深挖
4.1 为什么用倒数排名
倒数排名的直觉:
- 第 1 名:1/1 = 1.0(满分)
- 第 2 名:1/2 = 0.5(半分)
- 第 5 名:1/5 = 0.2(五分之一)
- 第 10 名:1/10 = 0.1
- 第 100 名:1/100 = 0.01
衰减特性:
- 衰减快:top 排名差异显著(第 1 vs 第 2 差 0.5)
- 长尾贡献小:第 100 名几乎不贡献
- 鼓励排第 1:第 1 名得分远超其他
与其他衰减函数对比:
| 排名 | 1/rank | 1/rank^2 | 1/log(rank+1) | 指数衰减 |
|---|---|---|---|---|
| 1 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2 | 0.5 | 0.25 | 0.63 | 0.5 |
| 5 | 0.2 | 0.04 | 0.39 | 0.06 |
| 10 | 0.1 | 0.01 | 0.30 | 0.001 |
倒数排名衰减适中,top 重但长尾不忽略。DCG 用 $1/\log_2(\text{rank}+1)$,衰减更平缓。
4.2 MRR 的适用场景
适合用:
- 问答系统:用户要 1 个正确答案,排第 1 最好
- 已知项检索:找特定文档(如"RLHF 论文"),排第 1 最好
- 客服系统:用户要 1 个解决方案
- 导航查询:用户找特定网站(如"GitHub"),排第 1 最好
不适合用:
- 多相关文档检索:如"机器学习书籍",用户要看多个,MRR 只看第一个
- 探索式搜索:用户浏览多个结果
- 排序质量评估:MRR 忽略后续相关文档排序
4.3 MRR vs Hit Rate vs NDCG
| 指标 | 关心 | 公式 | 适用 |
|---|---|---|---|
| Hit Rate@K | 有无命中 | $\mathbb{1}[\text{rank}^* \le K]$ | RAG |
| MRR@K | 第一个位置 | $1/\text{rank}^*$ | 问答、已知项 |
| NDCG@K | 全排序质量 | $\sum \text{DCG} / \text{IDCG}$ | 综合排序 |
示例对比:
查询返回 top-5,相关文档为 [d2, d4](排第 2 和第 4):
- Hit Rate@5 = 1(命中)
- MRR@5 = 1/2 = 0.5(第一个排第 2)
- NDCG@5 = ?(考虑 d2 第 2、d4 第 4 的位置,综合排序质量)
选择建议:
- 单答案场景:MRR@K
- 有无命中:Hit Rate@K
- 综合排序:NDCG@K
4.4 MRR 的局限
局限 1:只看第一个相关文档。
top-5 中第 1 名相关 vs 第 5 名相关,MRR 差异大。但 top-5 中 5 个都相关 vs 1 个相关,MRR 相同(都只看第一个)。
局限 2:不区分后续排序。
第 1 名相关后,第 2~5 名是否相关不影响 MRR。丢失后续排序信息。
局限 3:不反映召回率。
MRR 高不代表召回了所有相关文档,只代表第一个排得前。
局限 4:对无相关文档的查询敏感。
如果某查询无相关文档(top-K 全错),贡献 0,拉低 MRR。评估集质量影响大。
应对:
- 配合 Recall@K(看召回)
- 配合 NDCG@K(看全排序)
- 报告无相关文档的查询比例
4.5 MRR 在问答系统中的应用
问答系统是 MRR 的主战场:
典型评估流程:
- 准备评估集(问题 + 金标准答案所在文档)
- 用检索系统找 top-k 文档
- 找第一个含答案的文档排名
- 计算 MRR@k
MS MARCO 问答:
- 微软 MS MARCO 问答数据集
- 评估指标:MRR@10
- 检索系统在 top-10 中找第一个含答案的段落
Natural Questions (NQ):
- Google NQ 数据集
- 评估指标:Recall@K(多相关段落)或 MRR@K(单答案)
SQuAD:
- Stanford SQuAD 问答数据集
- 评估指标:Exact Match / F1(答案抽取),检索阶段用 MRR
4.6 MRR 的变体
MRR@K with Cutoff:
限制在 top-K 内,超过 K 视为 0:
$$ \text{MRR@K} = \frac{1}{|Q|} \sum_q \frac{\mathbb{1}[\text{rank}_q^* \le K]}{\text{rank}_q^*} $$
几何平均 MRR:
$$ \text{GMRR} = \exp\left(\frac{1}{|Q|} \sum_q \log \frac{1}{\text{rank}_q^*}\right) $$
对低排名查询更敏感。
MRR with Multi-relevant:
多相关文档时,取第一个的排名。等价于标准 MRR。
4.7 MRR 与其他指标的换算
MRR vs Hit Rate@1:
- Hit Rate@1 = 1 当且仅当第 1 名相关
- MRR@1 = 1 当且仅当第 1 名相关
- 两者等价:Hit Rate@1 = MRR@1
MRR vs 平均排名:
- 平均排名:$\frac{1}{|Q|} \sum_q \text{rank}_q^*$
- MRR:$\frac{1}{|Q|} \sum_q 1/\text{rank}_q^*$
MRR 是平均排名的倒数变换,更敏感于 top 排名。
L5 · 沿革与坑
5.1 历史脉络
- 1990s:TREC 问答评测引入 MRR
- 2000s:MRR 成为问答系统标准指标
- 2010s:MS MARCO、NQ 等数据集用 MRR@10 评估检索
- 2020:DPR 论文用 MRR@10 评估稠密检索
- 2023+:RAG 评估中 MRR 用于"第一个相关 chunk 位置"
5.2 使用常见坑
坑 1:用在多相关文档场景。
"机器学习书籍"有 10 本相关,用户要看多个。MRR 只看第一个,丢失信息。用 NDCG@K。
坑 2:K 选错。
MRR@1000 让长尾文档贡献小但非零,可能高估。MRR@1 太严格。问答用 MRR@10。
坑 3:金标准标注不全。
只标 1 个金标准,实际多个相关。MRR 低估(可能漏掉排更前的相关文档)。
坑 4:忽略无相关文档的查询。
无相关文档的查询贡献 0,拉低 MRR。要报告这类查询比例。
坑 5:评估集太小。
100 query 的 MRR 方差大。建议至少 500 query。
坑 6:跨系统比较不公平。
不同系统的检索深度、金标准不同,MRR 直接比不公平。要控制变量。
坑 7:只看 MRR 不看 Recall。
MRR 高但召回率低(第一个排前但漏大量相关)。要配合 Recall@K。
坑 8:MRR 与用户体验脱节。
MRR@10 = 0.5 意味着平均第一个相关排第 2,但用户可能看 top-3 就走。要结合用户行为数据。
坑 9:MRR 不反映排序质量。
第一个排第 1 后,第 2~10 是否相关不影响 MRR。要看 NDCG@K。
坑 10:用 MRR 评估 RAG。
RAG 关心 top-k 是否含答案(Hit Rate@K),不关心第一个排第几(LLM 能从 top-k 中找)。RAG 用 Hit Rate@K 或 Recall@K。
5.3 MRR 的现代应用
问答系统:
- 仍是事实标准
- MS MARCO、NQ 等榜单用 MRR@10
- 检索 + 阅读理解两阶段,MRR 评估检索阶段
RAG 系统:
- 辅助指标(非主指标)
- 评估"第一个相关 chunk 位置"
- 主指标仍是 Hit Rate@K
推荐系统:
- 不常用(推荐多相关,用 Recall@K / NDCG@K)
- 但"第一个点击项"评估可用 MRR
搜索引擎:
- 不常用(搜索多相关,用 NDCG@K)
- 但导航查询(找特定网站)可用 MRR
5.4 MRR 提升策略
提升 MRR@10 的方法:
- 更好排序模型:Cross-encoder 精排提升 top 排序
- 难负样本训练:让模型区分细粒度差异
- 查询重写:消除歧义,让相关文档排前
- 个性化:用户偏好让相关文档排前
- 多路召回 + 融合:互补提升召回,融合后排序更准
典型提升幅度:
- 单 BM25:MRR@10 ≈ 0.20
- 单 Dense:MRR@10 ≈ 0.30
- 混合检索:MRR@10 ≈ 0.35
- 混合 + 精排:MRR@10 ≈ 0.40
5.5 MRR 的替代指标
NDCG@K:
- 考虑所有相关文档排序
- 支持分级相关性
- 综合排序质量
MAP (Mean Average Precision):
- 不同 K 下 Precision 平均
- 考虑所有相关文档
Hit Rate@K:
- 只看有无命中
- RAG 的事实标准
选择建议:
- 问答、已知项:MRR@K
- RAG:Hit Rate@K
- 综合排序:NDCG@K
- 多相关文档:MAP 或 NDCG@K
速记卡
| 维度 | MRR |
|---|---|
| 公式 | $\frac{1}{ |
| 关心 | 第一个相关文档位置 |
| 范围 | [0, 1] |
| 衰减 | 1/rank(第 1 名 1.0,第 10 名 0.1) |
| 适用 | 问答、已知项检索 |
| 不适用 | 多相关文档、RAG |
与其他指标对比:
| 指标 | 关心 | 适用 |
|---|---|---|
| Hit Rate@K | 有无命中 | RAG |
| MRR@K | 第一个位置 | 问答、已知项 |
| Recall@K | 召回比例 | 多相关召回 |
| NDCG@K | 全排序质量 | 综合排序 |
典型数值:
| 排名 | 1/rank |
|---|---|
| 1 | 1.0 |
| 2 | 0.5 |
| 5 | 0.2 |
| 10 | 0.1 |
一句话记忆:MRR = 第一个相关文档排名倒数的平均,第 1 名 1.0,第 10 名 0.1。关心"第一个排第几",是问答和已知项检索的事实标准。RAG 用 Hit Rate@K,综合排序用 NDCG@K。
上一篇:Recall / Precision@K -- 召回率与精确率。下一篇:NDCG 归一化折损累计增益 -- 综合排序质量指标。