代码评估 pass@k 是什么
代码任务常用 pass@k 度量:同一道题生成 k 个候选,只要其中有一个通过测试就算通过。k 等于 1 时是首次作答的通过率,最接近单次使用的真实体验;k 较大时反映的是「多试几次能不能用」的概率。它是一个偏宽松的指标,报告时必须带 k、每题采样数 n 与采样设置,否则数字既无法复现,也无法与别的实验比较。
基本信息
| 口径 | pass@1 是首答通过率;k 大于 1 反映多试可用概率 |
|---|---|
| 输入 | 每题采样 n 个候选,其中 c 个通过测试 |
| 判定 | 由单元测试决定,测试覆盖度决定指标含金量 |
| 报告 | 必须同时给出 k、n 与采样参数 |
典型使用场景
- 代码模型能力对比:统一题目、采样数与 k 之后再比较,否则结论不可比
- 生成式补全的回归门禁:pass@1 不得低于基线,退化即拦截合并
- 多候选产品的效果评估:用户可以在多个候选里挑选时看 pass@5
- 测试集质量核对:先看 pass@1 是否被过弱的用例抬高,再决定是否补边界用例
- 采样参数调优:观察温度变化时 pass@1 与 pass@5 的走向差异
pass@k 无偏估计
pass@k 无偏估计
# 每题采样 n 个候选,其中 c 个通过;无偏估计公式:
# pass@k = 1 - C(n-c, k) / C(n, k)
python - <<'PY'
import math
def pass_at_k(n, c, k):
# n=该题候选数,c=通过数,k=报告口径
if n - c < k:
return 1.0 # 通过的候选足够多,必然能凑齐 k 个
return 1.0 - math.comb(n - c, k) / math.comb(n, k)
print(pass_at_k(n=10, c=3, k=1)) # 首答通过率
print(pass_at_k(n=10, c=3, k=5)) # 允许挑 5 个时的通过概率
PY指标口径逐项读法
| 指标 | 含义 | 使用注意 |
|---|---|---|
| pass@1 | 首次作答就通过的比例 | 最贴近单次使用体验,对采样温度敏感 |
| pass@k(k 大于 1) | 多试可用概率 | 随 k 单调上升,不同 k 之间不可直接比较 |
| n(采样数) | 每题生成的候选个数 | n 太小时估计不稳,报告必须给出 |
| c(通过数) | 该题有多少候选通过了测试 | 测试用例越强,c 越接近真实能力 |
| 测试覆盖 | 判定通过的用例强度 | 只测正例会让 pass@k 整体虚高 |
把公开用例全部写进提示,模型会针对性把逻辑写死在这几个输入上,指标很高但换一批输入就不成立。保留一部分隐藏用例,是让 pass@k 有意义的前提。
生成温度对两个口径的影响方向相反:温度升高时候选多样性上升,pass@1 常常下降而 pass@5 上升。所以报告里必须同时给出采样设置,否则读者会把温度变化误读成能力变化。
执行模型生成的代码必须放在隔离沙箱里并限制超时与资源。在宿主机上直接运行候选代码,等于把不受控的代码放进生产环境。