Hit@kRecall@kPass@k 是在信息检索(IR) 中常见的排序评估指标(ranking metrics),但它们的定义和使用场景略有不同。下面我将逐一解释它们的含义、公式、区别,并举例说明。

指标 核心问题 答案有 1 个还是多个? 排名重要吗?
Hit@k 前 k 个里“有没有”正确答案? 1 个就够 不关心第几位
Recall@k 前 k 个里“找回了多少”正确答案? 全部正确答案 不关心第几位
Pass@k 只要“任意 1 次”通过即可(可重试 k 次) 1 次就够 无排名概念

1. Hit@k(Hit Rate at k)

✅ 含义:

  • 衡量在前 k 个推荐/检索结果中是否包含至少一个相关项
  • 是一个二值指标:只要前 k 个中有 1 个相关,就算“命中”(1),否则为 0。
  • 常用于推荐系统问答系统中,关注“有没有找到正确答案”。

📌 公式(对单个查询):

[
\text{Hit@k} =
\begin{cases}
1, & \text{if any of top-}k \text{ items is relevant} \
0, & \text{otherwise}
\end{cases}
]

📊 对多个查询取平均:

[
\text{Hit@k} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}(\text{query } i \text{ has a hit in top-}k)
]

💡 举例:

  • 相关答案:["巴黎"]
  • 模型返回 top-3:["伦敦", "纽约", "巴黎"]
  • → Hit@1 = 0(第1个不是)
  • → Hit@3 = 1(前3个中包含“巴黎”)

优点:简单直观,适合“找到就算成功”的任务(如问答、搜索)。
缺点:不关心相关项排第几(第1名和第k名一样)。


2. Recall@k(Recall at k)

✅ 含义:

“全部正确答案里,前 k 个找回了百分之几?”

  • 衡量模型在前 k 个结果中,覆盖了多少比例的真实相关项

  • 假设一个查询有多个相关项(比如 5 个正确答案),Recall@k 看你找出了其中几个。

📌 公式:

[
\text{Recall@k} = \frac{\text{Number of relevant items in top-}k}{\text{Total number of relevant items}}
]

💡 举例:

  • 所有相关项:["A", "B", "C"](共 3 个)
  • 模型返回 top-2:["A", "D"]
  • → Recall@2 = 1/3 ≈ 0.333

优点:考虑了相关项的完整集合,适合多答案场景(如文档检索、标签推荐)。
缺点:如果相关项很多,Recall@k 可能偏低,即使结果质量不错。


3. Pass@k(Pass at k)

✅ 含义:

  • 主要用于代码生成程序合成任务。
  • 衡量:在生成的 k 个候选程序中,至少有一个能通过测试用例(即“正确”)的概率。
  • 本质是 “至少一次成功” 的概率估计。

📌 背景:

  • 由论文《Evaluating Large Language Models Trained on Code》(如 HumanEval 基准)提出。
  • 因为 LLM 生成代码具有随机性,所以通常多次采样(如生成 10 个答案),看有没有“蒙对”的。

📊 估计公式(当生成 n ≥ k 个样本时):

设:

  • ( n ):总共生成的样本数(如 200)
  • ( c ):其中通过测试的样本数
  • 则 Pass@k 的无偏估计为:

[
\text{Pass@k} = 1 - \frac{\binom{n - c}{k}}{\binom{n}{k}} \quad \text{(当 } c < n \text{,否则为 1)}
]

💡 直观理解:从 n 个样本中随机挑 k 个,至少有一个正确的概率

💡 举例:

  • 生成 10 个代码答案,其中 2 个能通过测试(c=2)
  • 计算 Pass@1:相当于“至少第一个就对”的概率 ≈ 2/10 = 0.2
  • 计算 Pass@5:从 10 个中任选 5 个,至少含 1 个正确答案的概率 ≈ 1 − C(8,5)/C(10,5) ≈ 0.778

优点:更真实反映 LLM 在“多次尝试”下的实用能力。
缺点:只适用于可自动验证正确性的任务(如代码、数学题)。


四、三者对比总结

指标 适用场景 是否要求多个相关项? 是否考虑排序位置? 是否允许多次尝试?
Hit@k 问答、搜索、推荐 ❌(只需1个相关项) ❌(只要在 top-k 内) ❌(单次输出)
Recall@k 文档检索、多标签分类 ✅(需知道全部相关项) ❌(只看数量,不看顺序) ❌(单次输出)
Pass@k 代码生成、程序合成 ❌(只需1个正确) ❌(不关心顺序) ✅(生成多个候选)

五、常见误区澄清

  • Hit@k ≠ Recall@k
    如果每个查询只有 1 个正确答案,那么 Hit@k = Recall@k(因为 recall = 1/1 或 0/1)。
    但如果有多答案,两者不同。

  • Pass@k 不是准确率
    它不是“前 k 个中有几个对”,而是“在 k 次机会中是否至少成功一次”。

  • Pass@1 = 单次准确率
    当 k=1 时,Pass@1 就是模型单次生成正确的概率。


六、实际应用场景举例

任务 推荐指标
用户搜索“iPhone”,返回商品列表 Hit@10、Recall@10
推荐系统给用户推 5 部电影,用户喜欢其中 1 部即可 Hit@5
LLM 生成 Python 函数,自动运行测试 Pass@1, Pass@10, Pass@100
多标签图像分类(一张图有多个标签) Recall@3(看前3预测覆盖多少真实标签)

如果你有具体任务(比如做推荐、写代码评估、问答系统),我可以帮你选择最合适的指标并给出计算代码(Python)!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐