Hit@k、Recall@k、pass@k
指标适用场景是否要求多个相关项?是否考虑排序位置?是否允许多次尝试?Hit@k问答、搜索、推荐❌(只需1个相关项)❌(只要在 top-k 内)❌(单次输出)Recall@k文档检索、多标签分类✅(需知道全部相关项)❌(只看数量,不看顺序)❌(单次输出)Pass@k代码生成、程序合成❌(只需1个正确)❌(不关心顺序)✅(生成多个候选)
Hit@k、Recall@k 和 Pass@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)!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)