一句话定义:pass@k 指让模型对同一道题独立生成 k 个答案,只要有任意一个答案通过(比如跑通测试用例、判为正确),这道题就算模型过关。它是代码生成评测里最常用的指标。
原理:像老师允许学生做 k 遍
想象一道数学题。学生做一遍很可能错,但如果让他换几种思路做十遍,只要有一次做对,我们大概会说"他其实有这个能力,只是不稳定"。pass@k 就是这个逻辑:k=1 时等于普通的"做一次就对不对";k 越大,容错机会越多,分数自然越高。
实现上有个细节:为了省算力,通常只采样 n 次(n 大于等于 k),再用组合数算无偏估计——把 n 次里有 c 次正确的情况,折算成"随机抽 k 次至少中一次"的概率,公式是 1 减去 C(n−c, k)/C(n, k) 这个比值。这样不用真的把 k 种组合都跑一遍。
和相邻概念的区别
| 指标 | 含义 | 回答的问题 |
|---|---|---|
| pass@1 | 只给一次机会 | 模型的"默认手感" |
| pass@k | k 次里至少一次对 | 模型的"能力上限" |
| 多数投票 / 自洽性 | k 个答案里取多数派 | 实际部署时怎么用 |
| 平均准确率 | k 个答案全部或平均计分 | 模型稳不稳 |
关键差别在于:pass@k 衡量的是潜力,不是可靠性。greedy(贪心解码,每步只取概率最高的词)和随机采样(temperature、top-p 调高)会得到完全不同的结果——采样越随机,pass@k 通常越高,pass@1 可能反而下降,因为模型开始"乱试"。
对从业者的实际意义
第一,比较必须对齐 k。看到两个模型分数差很多,先问一句"k 是多少"。pass@10 对 pass@1,等于拿十次机会比一次机会,结论不成立。
第二,pass@k 高但 pass@1 低,说明模型"会做,但选不出对的"。这类问题的工程解法不是换更大的模型,而是加验证环节:跑单元测试、用另一个模型打分重排、多数投票。这也是为什么代码场景里 pass@k 特别有参考价值——对错可以由编译器直接判决,不用人肉标注。
第三,别让指标好看掩盖真实体验。线上用户往往只给一次机会,pass@1 和响应延迟才是他们感受到的东西。pass@k 适合回答"这个方向值不值得继续投入",不适合直接当作产品承诺。
最后提醒一句:具体评测脚本怎么采样、k 取多少、超时与判题规则如何,各家实现不同,做横向对比时以官方页面和开源评测代码为准。
