← 返回题目列表

代码大模型的 pass@k 如何计算?为什么不等于上线成功率?

中等 第 11 / 26 题 更新于 2026/09/07
大模型评估pass@k代码生成采样

简化版

pass@k 衡量同一道题生成 k 个候选时,至少一个通过测试的概率。它评价候选集合里有没有正确答案,不保证系统能选出正确答案;计算时还要固定采样配置、测试环境和预算。

详细版

  1. 每道题生成 n 个候选,记录通过测试的数量 c,并要求 n ≥ k。
  2. 1 - C(n-c,k) / C(n,k) 估计该题的 pass@k,再对题目求平均。
  3. 分子是“选出的 k 个全错”的组合数,用补事件得到“至少一个正确”。
  4. pass@1 反映单次采样表现,pass@k 反映多次尝试的覆盖能力;温度等配置变化时不能直接混比。
  5. best-of-k 还需要选择器,最终交付成功率取决于候选生成和选择两部分。
  6. 测试通过只说明满足已有测试,应同时关注测试完整性、执行隔离、超时、成本和数据泄漏。

完整版教学

一、为什么代码评估需要多次采样

同一个函数题,模型可能生成不同的边界处理方式。 一次生成写错空数组分支,不代表模型的所有候选都不懂这个分支。 因此,评估既可以问“交付一次有多可靠”,也可以问“允许尝试多次能覆盖多少题”。 这两个问题对应不同产品预算,不能只挑更大的指标对外报告。

例如一个离线编程系统可以生成 10 份实现,再运行测试筛选;即时补全系统可能只允许一次生成。 前者关心候选覆盖和筛选质量,后者更关心单次成功率与延迟。 如果把前者的 pass@10 当成后者的成功率,就隐藏了额外计算和选择条件。

二、从补事件推导估计式

设某题实际采样 n 次,其中 c 次通过同一套测试。 从这 n 个观测候选中等概率选 k 个,共有 C(n,k) 种选法。 全错的选法只能来自 n-c 个失败候选,因此有 C(n-c,k) 种。 正确事件是全错事件的补集,于是得到下式。

C(a,b) = a! / (b! × (a-b)!)
pass@k 的估计值 = 1 - C(n-c,k) / C(n,k)
约束:0 ≤ c ≤ n,1 ≤ k ≤ n
若 n-c < k,则全错的组合数为 0,估计值为 1

在固定采样策略、独立同分布采样等假设下,这给出目标概率的无偏估计。 这里的“无放回选取”发生在观测样本集合上,不要求模型生成时禁止重复答案。 把重复候选去掉会改变统计对象,不能去重后仍声称是在评估原始采样分布。 该估计方式可核对 HumanEval 的评估实现

三、用一个小样本算清楚

假设一题生成 5 个候选,2 个正确、3 个错误。 抽 2 个候选共有 10 种组合,全错的组合只有 3 种,所以估计的 pass@2 是 0.7。 同一批候选的 pass@1 是 2/5,即 0.4。 这些是教学用观测数据,不是任何模型的实测成绩。

n = 5,c = 2,k = 2
C(5,2) = 10
C(3,2) = 3
pass@2 = 1 - 3/10 = 0.7
直接代入经验单次成功率:1 - (1 - 0.4)^2 = 0.64

0.64 与 0.7 不同,是因为把估计的单次概率代入非线性函数,不等于上述组合估计。 若已知真实单次成功概率 p,且各次独立,理论概率才是 1-(1-p)^k。 此外,必须先逐题算再平均:题目难度不同,把所有候选混起来会掩盖这种差异。

四、pass@k 和选择器各自负责什么

候选集合里有正确答案,系统仍可能选错。 例如 100 道题中有 80 道的候选集合包含正确解,但选择器只在这 80 道里选对 60 道,最终成功率就是 60%。 剩余 20 道没有正确候选,单纯重排无法补救。 这个例子帮助定位该改生成器,还是该改验证和选择逻辑。

指标或流程回答的问题额外条件
pass@1单次采样能否通过固定生成和测试配置
pass@kk 个候选中是否存在通过者允许多次生成
best-of-k 交付成功率选择器最后交付的答案是否通过需要可用的选择信号
贪心解码准确率固定解码结果能否通过不等同于另一温度下的 pass@1

线上选择器不能偷看本应保密的最终评测答案。 可以用公开测试或独立验证器筛选,再用保留测试评分。 否则评估测到的是“利用答案选答案”的能力,而非真实交付流程。

五、怎样设计可复现的评测流程

先冻结题集、提示模板、模型版本、采样参数和输出上限,再执行生成。 每个候选保留题目 ID、采样编号和测试结果,使失败能追溯到具体产物。 测试必须在受限环境运行,限制时间、内存、网络和文件权限,因为生成代码不能视为可信程序。 超时、语法错误和测试失败应分别记录,但按预先约定统一纳入评分。

冻结题目与生成配置
  -> 每题生成 n 个候选
  -> 隔离执行测试并保留失败原因
  -> 每题统计 c、计算 pass@k
  -> 题目级平均并报告成本与不确定性

若 100 道题各生成 20 个候选,就要执行 2000 次测试,预算不能只报一次生成的耗时。 比较两个模型时应保持题目与预算口径一致,并对同一题的结果做配对分析。 置信区间可以按题目重采样;若还关心采样随机性,可增加独立重复实验。 不能把同一道题的 20 个候选当成 20 道独立题,夸大证据量。

六、常见误区与追问

  • 误区:pass@10 是连续答对十次的概率。 它要求十个候选中至少一个通过,与全部通过的事件不同。
  • 误区:pass@k 高就能直接上线。 真实系统还需要选出正确候选,并承担生成、验证及等待成本。
  • 追问:只有五个候选能报告 pass@10 吗? 不能使用该组合估计式,应增加采样或降低 k,不能无依据外推。
  • 误区:测试通过就证明程序完全正确。 测试可能遗漏边界或性能约束,需要更强的保留测试以及针对任务的人工审核。
  • 追问:把重复答案去重后再算是否更公平? 去重会改变原采样分布;可以单独报告多样性,但标准采样指标应保留重复结果。
  • 追问:多轮失败后修改代码也算普通 pass@k 吗? 反馈修复使后续候选依赖前面结果,应单独定义交互协议与预算,不能直接套独立采样口径。

七、加强记忆

把 pass@k 记成“篮子里有没有好答案”,把选择器记成“能不能拿到那个好答案”。先数每题的 n 和 c,再用全错事件的补集算覆盖,最后在题目间平均。交付时还要把筛选正确率、测试盲区和计算预算接上,才能从离线分数解释实际可靠性。

记忆钩子:先看有没有,再看选没选对;k 是尝试预算,不是连续成功次数。