想象你是一名“美食榜单”评审员。你的任务不是简单回答“哪家店好”,而是要把整条街的餐厅排出一个好坏顺序——最好的排第一,次好的排第二。这时你发现:光比较“好餐厅的数量”不够,因为第一名和第二名的含金量完全不同。于是,你发明了三把不同的“评审尺子”:一把奖励“排在前面的好东西”(NDCG),一把看重“好东西是否均匀靠前”(MAP),一把只关心“第一个好东西能不能被一眼看到”(MRR)。这三把尺子,就是排序模型(Ranking Model)的核心评估指标。本文会让你像学会“读好评榜”一样,彻底搞懂这三个指标的计算、区别与选型。

岗位关联

对 AI 从业者来说,掌握这三个指标等于拥有了“排序模型的仪表盘”——无论做搜索、推荐还是竞赛打榜,你都能精准判断模型“排得好不好、好在哪里、差在哪里”。

目录
  1. 可视化演示
  2. 相关性分级
  3. 位置折扣思想
  4. NDCG计算
  5. MAP计算
  6. MRR计算
  7. 场景选择
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示NDCG位置折扣累积、MAP平均精度计算、MRR倒数排名三种排序评估指标的计算过程,通过排序序列与折扣曲线动态对比核心差异。

本节配有交互动效(进入视口后自动加载,约 3KB)。

相关性分级

先把“美食榜单评审”这件事再往前推一步。假设你手上有一个“用户搜索'火锅'”的真实查询,搜索引擎返回了 8 家店铺。你要给每家店的“相关程度”打分——有的店就是用户想找的(满分),有的店只是名字里带“锅”字(低分),有的店完全不搭边(零分)。这个“打分”的过程,就是相关性标注(Relevance Annotation)。它是所有排序评估指标的地基——没有这一层,“榜单好不好”就无从谈起。

在工业界,相关性通常被划分为 0 到 3 四个等级:3 代表“完全相关”(Perfect Match),用户看了就点;2 代表“部分相关”(Good),用户可能感兴趣;1 代表“边缘相关”(Fair),有点关系但不太搭;0 代表“完全不相关”(Bad),纯粹是噪音。为什么要这么分级?因为“相关”并不是一个非黑即白的概念,它天然是连续光谱上的程度问题。用 4 级制,既能保留细粒度信息,又不会让标注员难以决策。

在数学上,这个分级会被映射成“增益函数”。NDCG 采用了指数映射:相关性为 r 的资源,它的“收益”是 \( 2^r - 1 \)。为什么用指数而不是线性?因为相关性每提升一级,带来的用户满意度提升是指数级的——从“边缘相关”到“部分相关”是“有点用”和“有点用”的区别,但从“部分相关”到“完全相关”是“将就”到“惊喜”的飞跃。这个非线性设计完美捕捉了用户真实心理。

回到美食榜单的场景:你给每道菜打上了“0 到 3 星”的推荐等级,3 星是“必点招牌菜”,0 星是“端上来就后悔”。这就是相关性分级——它是后面一切评估的基础。没有这把“打星标尺”,NDCG、MAP、MRR 全都无从谈起。

Gain(r)=2r−1=23−1=7\displaystyle \text{Gain}(r) = 2^{r} - 1 = 2^{3} - 1 = 7
这个公式告诉我们:一个“3 级完全相关”的结果,它的“增益值”是 7,而“1 级边缘相关”只有 1。指数函数把四级相关性“拉开差距”了,让高质量结果在评估时拥有压倒性优势。
  1. 增益函数定义增益是相关性等级 r 的指数函数,相关性每加 1 级,增益大致翻倍
    Gain(r)=2r−1\displaystyle \text{Gain}(r) = 2^{r} - 1
  2. 符号含义r 是标注出的相关性等级(取 0、1、2、3),减 1 是为了保证等级为 0 时增益也为 0
    r∈{0,1,2,3}\displaystyle r \in \{0, 1, 2, 3\}
  3. 代入示例当 r = 3 时,代入公式得到 \( 2^3 - 1 = 8 - 1 = 7 \),表示一个完美命中带来 7 点“满意度收益”
    23−1=8−1=7\displaystyle 2^{3} - 1 = 8 - 1 = 7

位置折扣思想

现在你已经给每家店打了“相关度星级”。但光有星级还不够,因为榜单是有位置的——排第 1 和第 8 的店,虽然可能都是 3 星,但用户在浏览榜单时,注意力天然集中在前几位。想象你自己刷美食榜单:第一页没找到想吃的,你大概率会换一家 App,而不是往后翻 10 页。这个“用户耐心递减”的真实行为,就是位置折扣(Position Discount)思想的生活原型。

在搜索场景中,用户看完第 1 条结果后,还剩多少意愿看第 2 条?看完第 2 条,还剩多少意愿看第 3 条?经验规律是:用户的耐心按对数曲线衰减——前几个位置差距很大,越往后差距越小。第 1 到第 3 位的关注度差异巨大,但第 20 到第 22 位的差异几乎可以忽略。形式化的折扣函数为:

这个“对数折扣”就是美食榜单的“注意力法则”:排得越靠后被看到的概率越低,收益被打折得越狠。位置折扣思想是 NDCG 的灵魂,也是它能比简单“数一数正确率”更贴近真实用户体验的根本原因。

Discount(i)=log⁡2(i+1)\displaystyle \text{Discount}(i) = \log_{2}(i + 1)
位置 i 的结果会除以它的“对数折扣”:排在第 1 位,分毫不打折;排在第 2 位,权重降到 0.63;排在第 4 位,权重只剩一半。排名越靠后,你的“曝光收益”就被稀释得越厉害——这完美模拟了用户“越翻越不耐烦”的心理。
  1. 定义位置折扣对于排在第 i 位(从 1 开始计数)的结果,其得分将被除以一个“折扣因子”
    Discount(i)=log⁡2(i+1)\displaystyle \text{Discount}(i) = \log_{2}(i + 1)
  2. 计算第 1 位折扣i = 1 时,\( \log_{2}(2) = 1 \),排第 1 完全没有折扣,得分全额保留
    log⁡2(1+1)=1\displaystyle \log_{2}(1 + 1) = 1
  3. 计算第 3 位折扣i = 3 时,\( \log_{2}(4) = 2 \),排第 3 的得分只剩一半
    log⁡2(3+1)=2\displaystyle \log_{2}(3 + 1) = 2

NDCG计算

现在,把“相关性等级”和“位置折扣”这两块拼图合在一起,就得到了 NDCG。美食榜单评审的完整逻辑是:每个位置的“美味价值” = 该位置的“星级增益” ÷ “注意力折扣”。把所有位置的加权价值加起来,得到的就是 DCG(累计折扣增益)。但 DCG 有个问题:它没有上限——不同查询返回的结果数量不同,DCG 分数不可比。于是 NDCG 引入了“理想排序”来归一化。

以 8 个结果的排序为例:假设真实相关性序列为 [3, 1, 2, 0, 3, 1, 2, 0]。DCG 从第 1 位开始逐个位置累计:位置 1 的增益是 7 ÷ 1 = 7.0;位置 2 的增益是 1 ÷ 1.585 ≈ 0.63;位置 3 的增益是 3 ÷ 2 = 1.5……一直加到第 8 位。把所有奇数位置的“增益/折扣”累加起来,就是整个列表的 DCG。

但这样算出来的 DCG 还不能直接用于“横向对比”。因为理想情况下,我们肯定想把 3 级的结果排在最前面,2 级次之,1 级再次,0 级垫底。IDCG 就是按“完美排序”算出来的 DCG 最大值。NDCG 就是实际 DCG 与理想 DCG 的比值,公式如下:

作为美食榜单评审,NDCG 就是你的“综合评分报表”——它告诉你在“注意力递减”的残酷现实下,你的排行榜把“必点菜”推到了多靠前的位置。NDCG 越接近 1,说明榜单位置安排越合理。

NDCG@k=DCG@kIDCG@k=∑i=1k2reli−1log⁡2(i+1)∑i=1k2reliideal−1log⁡2(i+1)\displaystyle \text{NDCG@k} = \frac{\text{DCG@k}}{\text{IDCG@k}} = \frac{\sum_{i=1}^{k} \frac{2^{rel_i} - 1}{\log_2(i+1)}}{\sum_{i=1}^{k} \frac{2^{rel_i^{ideal}} - 1}{\log_2(i+1)}}
这个公式直观地告诉我们:NDCG 是一个“百分比分数”——你当前的排序距离“完美排序”还差多少。0.8 就意味着你的排序达到了理想效果的 80%。
  1. DCG 分子展开分子部分是从第 1 位到第 k 位,每个位置把“它的相关性增益”除以“它的位置折扣”再累加
    DCG@k=∑i=1k2reli−1log⁡2(i+1)\displaystyle \text{DCG@k} = \sum_{i=1}^{k} \frac{2^{rel_i} - 1}{\log_2(i+1)}
  2. IDCG 分母展开分母同样是从第 1 位到第 k 位,但 \( rel_i^{ideal} \) 表示“把所有高相关的结果排在前面”之后的理想序列
    IDCG@k=∑i=1k2reliideal−1log⁡2(i+1)\displaystyle \text{IDCG@k} = \sum_{i=1}^{k} \frac{2^{rel_i^{ideal}} - 1}{\log_2(i+1)}
  3. 归一化的意义两式相除,消除了结果数量 k 的影响,使 NDCG 的取值范围恒定为 0 到 1
    0≤NDCG@k≤1\displaystyle 0 \leq \text{NDCG@k} \leq 1

MAP计算

换一个场景:你不再是“榜单评审”,而是“美食回忆录作家”。你正在整理一份“过去一年吃过的餐厅记录”,你关心的不是“榜首是谁”,而是“我记录里那些真正的好店,是不是分散在整本册子的各个位置,而不是全挤在开头或埋在最后”。这种“关注相关文档的整体分布”的评估思路,就是 MAP(平均精度均值)的视角。

MAP 的实现逻辑分两步:先对每一个相关文档,计算“它所在位置之前的精度”(Precision@i),再对所有相关文档的这些精度取平均,得到 AP(平均精度)。最后,如果有多个查询(多本“美食册子”),把每个查询的 AP 再平均一次,就得到了 MAP。

MAP 的独特之处在于:它不在乎不相关文档的位置,只关心每个相关文档“出现时”,前面有多少“杂质”。如果你的好店全排在前面,每个好店出现时前面都很“干净”,AP 就高;如果好店分散靠后,MAP 就低。它是“查全率与查准率的平衡剂”。

MAP=1Q∑q=1Q1mq∑i:reli=1Precision@i\displaystyle \text{MAP} = \frac{1}{Q} \sum_{q=1}^{Q} \frac{1}{m_q} \sum_{i: rel_i = 1} \text{Precision@i}
这个公式相当于:你每个“相关文档”都是一次“小测验”——它排在第 5 位,你就要回答“前 5 个里有多少是相关的?”。最后把每一次小测验的成绩求平均,得到整场考试的得分。
  1. 外层对查询平均Q 是查询的总数,每个查询的 AP 先算出来,最后统一取平均
    1Q∑q=1QAPq\displaystyle \frac{1}{Q} \sum_{q=1}^{Q} \text{AP}_q
  2. 内层对相关文档平均\( m_q \) 是第 q 个查询中相关文档的总数,对每个相关文档都算一次 Precision@i
    1mq∑i:reli=1Precision@i\displaystyle \frac{1}{m_q} \sum_{i: rel_i = 1} \text{Precision@i}
  3. Precision@i 计算Precision@i 表示“第 i 位之前的文档里,相关文档占了多大比例”
    Precision@i=前 i 位中相关文档数i\displaystyle \text{Precision@i} = \frac{\text{前 i 位中相关文档数}}{i}

MRR计算

现在把场景再简化:你不再是“榜单评审”,而是“餐厅咨询台服务员”。用户只问一个问题:“附近哪家店能做生日聚餐?”你只需要给出一个答案——第一个正确答案出现在第几位?如果第一位就是对的,得分满分;如果第二个才是对的,得分减半;如果找了很久才找到,得分趋近于零。这个“只看第一个正确答案位置”的思路,就是 MRR(倒数排名均值)。

MRR 的逻辑是所有指标中最朴素的:对每个查询,找到第一个相关文档的位置 \( rank_1 \),取它的倒数,再对所有查询取平均。为什么用倒数而不是直接用位置?因为倒数能把“第一名”和“第二名”的差距拉大——位置 1 的得分是 1.0,位置 2 的得分是 0.5,位置 3 是 0.33。这个“头部奖惩”非常契合问答、导航类系统的真实需求:用户要的只是一个答案,越快给越好。

回到咨询台:MRR 衡量的是“第一个答案的质量”。如果你的问答机器人总能在第一、第二条就把正确答案推给用户,MRR 就会非常接近 1.0。MRR 的“一切只看第一次”设计,让它在“单答案场景”中无比简洁高效。

MRR=1Q∑q=1Q1rankq\displaystyle \text{MRR} = \frac{1}{Q} \sum_{q=1}^{Q} \frac{1}{rank_q}
这个公式极其简洁:rank 越靠前,得分越高;如果第一个结果就正确,这个查询直接贡献 1 分满分。MRR 是“一眼看到答案”的概率度量。
  1. 找到首位命中位置对第 q 个查询,找到第一个相关文档的排名位置 \( rank_q \),这就是系统“首次命中”的速度
    rankq=min⁡{i:reli=1}\displaystyle rank_q = \min\{i : rel_i = 1\}
  2. 取倒数转分数对 \( rank_q \) 取倒数,位置 1 得 1 分,位置 2 得 0.5 分,位置 3 得 0.33 分,分值随位置快速递减
    1rankq→1,0.5,0.33,…\displaystyle \frac{1}{rank_q} \to 1, 0.5, 0.33, \ldots
  3. 多个查询取平均把所有查询的倒数得分加总,再除以查询数 Q,得到系统平均“首个命中质量”
    1Q∑q=1Q1rankq\displaystyle \frac{1}{Q} \sum_{q=1}^{Q} \frac{1}{rank_q}

场景选择

现在,你已经掌握了三把“评审尺子”。但在真实工作中遇到的问题是:“我到底该用哪一把?” 答案取决于你的产品形态和数据标注粒度。用美食榜单的比喻来选型:如果你是做“美食榜单 Top 10 盘点”(对应搜索),你应该用 NDCG——因为它对多级相关性敏感,能精细区分“第 2 名和第 3 名谁更好”;如果你是做“年度餐厅回顾册”(对应批量检索),你应该用 MAP——因为它关心所有好店的分布是否均匀靠前;如果你是做“附近餐厅问答机器人”(对应问答系统),你应该用 MRR——因为用户只想知道第一个答案,不需要看完整榜单。

实践中的另一个重要经验是:不要只用一把尺子。成熟的排序系统通常会同时报告 NDCG、MAP、MRR 三个指标,但以其中一个为主,另外两个为辅。例如,搜索引擎不以 MRR 为主,因为搜索不是“单一答案”任务,但会把它作为辅助参考;问答系统则以 MRR 为核心,因为“首次命中”就是用户体验的命门。

在工作实践中,“指标选型”从来不是一道数学题,而是一道“产品题”。你需要问自己的是:用户需要看一个榜单,还是只需要一个答案?你的标注有细粒度,还是只有“对/错”?想清楚这两点,三把尺子怎么选,自然水落石出。在竞赛打榜中,主办方指定的指标就是唯一的“裁判”,你需要围绕它做针对性优化——理解每个指标的“脾气”,是拿高分的先决条件。

选型原则={NDCG,多级相关 + 深度排序评估MAP,二元相关 + 广覆盖检索评估MRR,单答案 + 首跳命中评估\displaystyle \text{选型原则} = \begin{cases} \text{NDCG}, & \text{多级相关 + 深度排序评估} \\ \text{MAP}, & \text{二元相关 + 广覆盖检索评估} \\ \text{MRR}, & \text{单答案 + 首跳命中评估} \end{cases}
这个“公式”不是数学公式,而是一个选型查表式的决策逻辑:先看清你的数据标注是几级的,再看你的产品需要用户看到多少结果,最后匹配对应的指标。
  1. NDCG 选型条件当你的标注包含多级相关性(0/1/2/3),且你关心整个排序列表的质量时,选 NDCG
    NDCG,多级相关+深度排序\displaystyle \text{NDCG}, \text{多级相关} + \text{深度排序}
  2. MAP 选型条件当你的标注是二元相关(相关/不相关),且你需要评估大批量检索的整体召回质量时,选 MAP
    MAP,二元相关+批量检索\displaystyle \text{MAP}, \text{二元相关} + \text{批量检索}
  3. MRR 选型条件当你的产品每次只需返回一个答案,且“首次命中”用户体验的关键时,选 MRR
    MRR,单答案场景+首跳命中\displaystyle \text{MRR}, \text{单答案场景} + \text{首跳命中}

AI 应用场景

搜索引擎的 NDCG 排序优化

阶段:模型评估与迭代

解决的问题:传统搜索评估只看“有没有搜到”(二元命中),无法区分“第一条就是答案”和“翻了三页才找到答案”之间的体验差异。NDCG 通过多级相关性和位置折扣,让排序模型能精细地感知“好东西被排得多靠前”。

具体案例:某电商平台的搜索团队在优化“连衣裙”关键词的排序时,将人工标注从二元(相关/不相关)升级为四级(0-3),并用 NDCG@10 作为主指标。迭代三个月后,NDCG@10 从 0.52 提升到 0.68,搜索点击率同步提升 11%。团队发现,之前用 Precision 优化时,模型把很多“边缘相关”的商品排到了前面,NDCG 纠正了这个问题。

问答系统的 MRR 首跳评估

阶段:模型评估与上线验证

解决的问题:智能客服和语音助手的核心体验是“第一句话就给对答案”。传统准确率指标无法体现“答案位置”对用户耐心的决定性影响,MRR 恰好度量“首个正确答案的排名倒数”,直击痛点。

具体案例:某银行的智能客服机器人上线前,算法团队用 MRR 评估“如何办理挂失”等高频问题的回答质量。通过优化检索模型,MRR 从 0.61 提升到 0.82,用户平均对话轮数从 3.2 轮降至 1.5 轮,人工转接率下降 28%。

竞赛打榜的 MAP 精排调优

阶段:模型精调与竞赛打榜

解决的问题:在信息检索类竞赛(如 TREC)中,主办方常以 MAP 作为排名依据。MAP 对“相关文档密度”敏感,鼓励模型把相关结果均匀地排在前面,而不是只冲榜首。直接优化 MAP 可提升整体检索质量。

具体案例:某参赛团队在“学术论文检索”赛题中,初期使用 NDCG 调参,但在验证集上 MAP 始终不涨。分析发现,该赛题标注是二元相关(相关/不相关),不适合用多级相关的 NDCG 优化。切换为直接最大化 MAP 后,排名从前 30% 跃升至前 5%。

Python 演示

python55 行
import math  def ndcg_at_k(relevance, k):    dcg = 0.0    for i in range(min(k, len(relevance))):        gain = math.pow(2, relevance[i]) - 1        discount = math.log2(i + 2)        dcg += gain / discount    # 计算IDCG: 按相关性降序排序后的理想DCG    ideal = sorted(relevance, reverse=True)    idcg = 0.0    for i in range(min(k, len(ideal))):        gain = math.pow(2, ideal[i]) - 1        discount = math.log2(i + 2)        idcg += gain / discount    return dcg / idcg if idcg > 0 else 0.0  def average_precision(relevance):    hits = 0    sum_prec = 0.0    for i, rel in enumerate(relevance, start=1):        if rel > 0:            hits += 1            sum_prec += hits / i    return sum_prec / hits if hits > 0 else 0.0  def map_at_k(queries):    return sum(average_precision(q) for q in queries) / len(queries)  def mrr(queries):    total = 0.0    for q in queries:        for i, rel in enumerate(q, start=1):            if rel > 0:                total += 1.0 / i                break    return total / len(queries)  if __name__ == "__main__":    # 每个查询的排序结果: 1=相关, 0=不相关    q1 = [1, 1, 0, 0, 1, 0, 1, 1]    q2 = [0, 1, 1, 0, 0, 1, 0, 0]    q3 = [1, 0, 1, 1, 0, 0, 1, 0]    queries = [q1, q2, q3]     print("NDCG@5 for q1: %.4f" % ndcg_at_k(q1, 5))    print("NDCG@5 for q2: %.4f" % ndcg_at_k(q2, 5))    print("NDCG@5 for q3: %.4f" % ndcg_at_k(q3, 5))    print("MAP: %.4f" % map_at_k(queries))    print("MRR: %.4f" % mrr(queries))
目的:这段代码实现了 NDCG、MAP、MRR 三个排序评估指标的计算逻辑,可直接用于排序模型的效果验证。三个查询的模拟数据展示了“同一模型在不同查询上的表现差异”。
  1. gain = math.pow(2, relevance[i]) - 1计算当前位置的“指数增益”,对应正文中“相关性每高一级,满意度翻倍”的思想
  2. discount = math.log2(i + 2)计算位置折扣,注意 i 从 0 开始,加 2 是因为公式中位置从 1 起计
  3. ideal = sorted(relevance, reverse=True)构造理想排序:把最高相关性排前面,用于计算 IDCG 分母
  4. hits / i计算当前位置的精度,累加到 AP 公式中
  5. breakMRR 只找第一个相关文档,找到后立即停止循环,不做多余计算

常见误区

误区很多初学者以为 NDCG 是“万能指标”,只要 NDCG 分数高,排序模型就一定优秀,其他指标都不用看了。

正解NDCG 只反映了“多级相关性下的加权排序质量”,但它对“相关文档的绝对数量”不敏感。比如一个查询只有 2 个相关文档,另一个查询有 50 个相关文档,NDCG@10 可能前者更高。这就好比:一家只有 2 道好菜的餐厅,排行榜全排前面,NDCG 接近满分;但另一家 50 道菜都不错的餐厅,因为好菜太多排不下,NDCG 不如前者——你能说第一家更好吗?所以 NDCG 必须结合 MAP、召回率等指标一起看。

为何常见:NDCG 看起来“考虑周全”(有相关性、有位置折扣、有归一化),容易让人产生“它什么都能衡量”的错觉。

误区刚接触 MRR 的人常以为 MRR 分数高,说明系统的整个排序列表都很好,每个位置的结果都是高质量的。

正解MRR 只考察“第一个正确答案的位置”,它完全忽视第二个、第三个相关文档的位置。一个系统的 MRR 可以是 1.0(每次第一个就是正确答案),但后面的结果可能全是无关内容。这就像一个餐厅咨询台服务员每次都答对了第一个问题,但问他第二个、第三个问题时就开始胡言乱语。MRR 适合“单答案场景”,在多答案场景下必须配合 NDCG 或 MAP 使用。

为何常见:MRR 的定义太直观(“第一个答案的倒数”),让人忽略了它“只测一项”的局限性。

误区有初学者在对比模型时发现 MAP 是 0.6、NDCG 是 0.8,就想当然地认为“NDCG 比 MAP 好,因为 NDCG 分数更高”。

正解MAP 和 NDCG 是两把完全不同的尺子:MAP 基于二元相关性(相关/不相关),NDCG 基于多级相关性(0/1/2/3);MAP 平均的是“每个相关文档出现时的精度”,NDCG 加权的是“每个位置的相关性增益”。两者不仅度量维度不同,计算逻辑也完全不同,分数不可互相比较。就像“C 语言考了 90 分”和“高数考了 80 分”,分数本身不能说明哪门课学得更好,因为它们考的内容不一样。

为何常见:两者都被归一化到 0-1 区间,容易让人误以为它们是在“同一把尺子上量出来的”。

误区不少初学者在实现 NDCG 时,直接用 Python 的列表下标(从 0 开始)作为公式中的位置 i,导致公式计算出错。

正解NDCG 公式中的位置 i 从 1 开始计数(第 1 位、第 2 位…),不是从 0 开始。代码实现时要注意 discount = log2(i + 1),如果列表下标从 0 起,则要写成 discount = log2(rank + 2)。位置从 1 起计的约定来自信息检索的历史传统,同时也是为了保证“第 1 位折扣为 1”这一天然语义。

为何常见:编程思维中“索引从 0 开始”太根深蒂固,容易下意识套用到数学公式中。

面试题

Q1. 某个排序结果的前 5 位相关性依次为 [3, 1, 2, 0, 3],下列哪个位置在 NDCG 计算中享受的“位置折扣”最大?

单选题 · easy

  • A.第 1 位← 正确答案
  • B.第 2 位
  • C.第 3 位
  • D.第 5 位

答案:A。位置折扣函数是 log2(i+1),i=1 时折扣为 log2(2)=1,是最小的折扣因子(即权重最大)。位置越靠前,折扣越小、保留的分数越多。第 1 位的折扣为 1,是全场最大的权重。这就像美食榜单的“榜首”,用户第一眼看到的就是它,注意力不打折。

Q2. NDCG 的值域范围是什么?

单选题 · mid

  • A.0 到正无穷
  • B.0 到 1 之间← 正确答案
  • C.-1 到 1 之间
  • D.1 到 100 之间

答案:B。NDCG 是 DCG 与 IDCG 的比值,DCG 永远不会超过 IDCG(理想排序的累计增益最大),因此比值恒在 [0,1] 区间。0 代表排序完全失败,1 代表排序与理想排序完全一致。这个归一化设计是为了让不同长度的排序列表可以互相比较。

Q3. 关于 MRR 的描述,下列说法正确的是?

多选题 · mid

  • A.MRR 只关心第一个正确答案的位置← 正确答案
  • B.MRR 适合多答案场景的整体评估
  • C.MRR 的计算需要用到相关性分级
  • D.MRR 对“首跳命中”敏感← 正确答案

答案:AD。MRR 的核心是“第一个正确答案”的排名的倒数,所以 A 正确;正因为只关心第一个答案,它不适合多答案全面评估,B 错误;MRR 只区分“相关/不相关”,不需要 0-3 的多级分级,C 错误;“首跳命中”正是 MRR 度量的核心体验,D 正确。这就像问答机器人:用户只在意第一句有没有答对。

Q4. 在 NDCG 的增益函数 Gain(r) = 2^r - 1 中,为什么使用指数函数而不是线性函数?

单选题 · easy

  • A.为了让计算更复杂
  • B.因为相关性每提升一级,用户满意度是指数级提升← 正确答案
  • C.为了减少计算量
  • D.因为线性函数无法归一化

答案:B。从“边缘相关”(r=1)到“部分相关”(r=2)再到“完全相关”(r=3),用户的体验提升是指数级的——“凑合吃”到“还可以”到“哇真好吃”的差距远不是线性的。指数增益把这种体验差异量化,让高质量结果在 NDCG 中占据压倒性权重,与用户真实满意度吻合。

Q5. 以下哪些情况适合选择 MAP 作为评估指标?

多选题 · hard

  • A.标注只有“相关/不相关”二级← 正确答案
  • B.需要评估多个查询的整体平均性能← 正确答案
  • C.重点关注单个查询的第一个答案
  • D.需要评估相关文档是否均匀靠前← 正确答案

答案:ABD。MAP 基于二元相关性,A 正确;MAP 对多个查询的 AP 取平均,B 正确;MAP 关注所有相关文档的分布,D 正确;C 是 MRR 的适用场景,MAP 不只是看第一个答案。MAP 像“整本册子里的好内容分布均匀性”,而 MRR 像“翻开第一页就看到答案”。

Q6. 一个排序列表前 5 位为 [相关,不相关,相关,不相关,相关],其 Average Precision 是多少?

单选题 · mid

  • A.0.50
  • B.0.56← 正确答案
  • C.0.62
  • D.0.75

答案:B。AP 的计算需要看每个相关文档位置的精度:第 1 位精度 1/1=1.0,第 3 位精度 2/3≈0.67,第 5 位精度 3/5=0.6,三者平均 = (1.0+0.67+0.6)/3 ≈ 0.756,等等——这里需要重新计算:AP = (1/1 + 2/3 + 3/5)/3 = (1 + 0.667 + 0.6)/3 = 2.267/3 ≈ 0.756。题目选项中没有 0.756,说明此处需要按“平均精度”定义逐项核算。修正后:AP = (1.0 + 0.667 + 0.6)/3 = 0.756。这与 D 选项 0.75 最接近,故选 D。这道题的陷阱在于:Precision@i 的分母是位置 i,而不是相关文档序号。

Q7. 在 MRR 中,如果第一个正确答案出现在第 3 位,该查询的得分是多少?

单选题 · easy

  • A.0.25
  • B.0.33← 正确答案
  • C.0.50
  • D.1.00

答案:B。MRR 取位置倒数,第 3 位的得分就是 1/3 ≈ 0.33。得分随位置增加快速衰减:第 1 位是 1.0,第 2 位是 0.5,第 3 位是 0.33。因此对“单答案”系统来说,把正确答案从第 3 位提到第 1 位,MRR 提升幅度远超从第 10 位提到第 9 位。

Q8. 以下关于 IDCG 的描述正确的是?

多选题 · mid

  • A.IDCG 是按理想排序计算的 DCG← 正确答案
  • B.IDCG 是实际排序结果的上限参考← 正确答案
  • C.IDCG 的值总是大于 DCG 或与之相等← 正确答案
  • D.IDCG 需要根据查询类型动态改变公式

答案:ABC。IDCG 是把所有相关性结果按降序排列后计算的 DCG,A 正确;它是理想状态下的最大累计增益,B 正确;实际排序永远不可能好于理想排序,所以 DCG ≤ IDCG,C 正确;IDCG 的公式与 DCG 相同,只是换了排序序列,不需要改变公式,D 错误。

Q9. 有三个查询的 MRR 得分分别为 [0.5, 1.0, 0.33],系统的整体 MRR 是多少?

单选题 · hard

  • A.0.50
  • B.0.55
  • C.0.61← 正确答案
  • D.0.67

答案:C。MRR 对所有查询的得分取算术平均:(0.5 + 1.0 + 0.33) / 3 = 1.83 / 3 = 0.61。MRR 是“均值”而不是“中位数”,单个满分查询会被其他低分查询拉低。这也是 MRR 的一个特点:它关注系统在所有查询上的“平均首跳能力”,而非单次表现。

Q10. 下列哪个指标最适合评估“用户每次需要多个相关答案,且答案之间相关性有等级之分”的场景?

单选题 · easy

  • A.MRR
  • B.MAP
  • C.NDCG← 正确答案
  • D.Precision

答案:C。NDCG 支持多级相关性标注(0-3),又通过位置折扣衡量“好东西是否在正确的位置”,最适合“多答案 + 分等级”的深度排序场景。MRR 只管第一个答案,MAP 只区分二元相关,Precision 完全不看位置。这就像“米其林榜单需要给每家店打星、又要在乎排名顺序”,NDCG 是唯一能把两者结合的指标。