Pass@k 到底测什么:为什么“采样十次至少成功一次”不能当成单次成功率
在代码生成和推理 benchmark 里,经常会看到 pass@1、pass@10、pass@100。它们回答的是不同问题。假设一道编程题让模型独立生成 10 个候选,其中只有第 7 个通过全部测试,那么这道题的 pass@10 可以记为成功,但这并不意味着模型有接近 100% 的把握答对这道题。pass@k 测的是:给模型 k 次尝试机会,至少得到一个正确答案的概率。OpenAI 在早期 Codex/HumanEval 工作中系统使用了这一指标,并给出了从有限采样结果估计 pass@k 的无偏估计方法。
Codex / HumanEval 论文
为什么需要它?生成模型不是确定性程序,同一个 prompt 在 temperature 大于零时会产生不同候选。如果产品允许一次生成 20 个程序,再由测试或 verifier 自动筛掉错误答案,那么 pass@20 很有现实意义;它衡量的是“搜索预算增加以后,正确解是否存在于候选集合中”。但用户只会得到一次回答的聊天产品,更接近 pass@1。于是两个模型可能出现这样的情况:A 的 pass@1 更高,说明第一次更可靠;B 的 pass@100 更高,说明它的采样分布里包含更多可被搜索出来的正确路径。两者对应不同的部署方式。
计算时还有一个容易踩的坑。假设研究者实际从一道题采样 n=200 次,其中 c=20 次正确,想估计 pass@10,不能简单随机挑 10 次跑一次然后报告结果,因为这样方差很大。HumanEval 使用组合数计算“10 个候选全部来自错误样本”的概率,再用 1 减去它,从已有 n 次采样中估计 pass@k。这也是为什么阅读论文里的 pass@k 时,要同时查看实际采样数 n、temperature、是否允许 verifier/test 选择候选,以及 k 到底是多少。
对 Agent benchmark,pass@k 还要更谨慎。一条 trajectory 可能昂贵、持续几十分钟,而且多次运行的环境状态未必完全一致。此时 pass@8 很可能是在测“八次重试最终能不能撞出一次成功”,与生产系统的一次任务可靠性相距很远。如果 leaderboard 把 best-of-N、majority vote、reranking 或 verifier selection 混进结果,却只留下一个最终百分比,模型本身的能力和推理时搜索预算就被合并了。阅读这类成绩时,把 pass@1 与带搜索预算的 pass@k 分开,是一个很实用的第一步。