代码模型的 pass@k 应该如何计算,为什么不能只看 pass@1?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
先解释 pass@1 与 pass@k 的问题定义,再写出从 n 个样本、c 个通过样本估计 pass@k 的组合数公式。要指出不能简单拿前 k 个结果,因为采样顺序和有限样本会带来偏差。面试官继续问评测可信度时,重点谈测试覆盖、沙箱隔离、超时以及固定温度与采样预算。
可以这样答:
pass@1 衡量一次生成就通过测试的概率,pass@k 衡量给模型 k 次独立机会时至少一份通过的概率。若先采样 n 份,其中 c 份通过,常用无偏估计 \(1-\frac{\binom{n-c}{k}}{\binom{n}{k}}\),而不是随意取前 k 份。这个指标依赖采样温度、测试用例和沙箱规则,测试覆盖不足时,代码即使通过也不代表真实正确。
核心回答
\(\operatorname{pass}@k\) 衡量模型为同一道题生成 \(k\) 个候选时,至少有一个通过全部测试的概率。它适合用户或系统可以采样多个候选再验证的代码生成场景;\(\operatorname{pass}@1\) 只衡量一次生成,因此不能描述多次采样带来的覆盖能力。
若对一道题实际采样 \(n\) 个候选,其中 \(c\) 个正确,且 \(n \ge k\),HumanEval 使用的无偏估计为:
\[\widehat{\mathrm{pass@}k} = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}\]含义是从 \(n\) 个候选中无放回选 \(k\) 个,用 1 减去“全部选到错误候选”的概率。最终通常对多道题的估计取平均。
展开说明
不能只生成 \(k\) 个样本并用“是否至少一条正确”的单次结果稳定估计概率,因为方差很大;通常先生成 \(n\) 个、再估计不同 \(k\)。比较模型时必须固定采样温度、最大长度、提示格式、\(n\) 和测试环境,否则 pass@k 变化可能来自采样预算。
通过测试不等于代码完全正确。测试集可能缺少边界条件,代码也可能依赖网络、消耗过多资源或包含恶意副作用。反过来,环境版本、超时或非确定测试也可能把正确代码判错。
\(\operatorname{pass}@k\) 越大通常越高,所以报告多个 k 时要同时说明总推理和执行成本。一个必须一次返回正确答案的产品不能用高 \(\operatorname{pass}@100\) 掩盖低 \(\operatorname{pass}@1\)。
工程实践
在无网络、低权限容器中编译和运行候选,设置 CPU、内存、进程、文件和时间限制。固定依赖与随机种子,保存编译错误、运行时错误、超时和失败用例。去除候选去重规则带来的口径差异,并检查基准题或测试是否出现在训练数据中。报告 \(\operatorname{pass}@1\)、目标 \(\operatorname{pass}@k\) 以及每题平均生成和验证成本。
常见追问
- \(\operatorname{pass}@k\) 为什么随 k 增大? 候选更多时至少命中一个正确解的机会不会降低,但成本也会上升。
- 为什么要求 \(n \ge k\)? 估计式是在 \(n\) 个已采样候选中选择 \(k\) 个,候选数不足时组合项没有定义。
- 测试全过是否证明程序正确? 不能,只能证明通过当前有限测试;隐藏边界、安全和性能问题仍可能存在。
- 为什么代码执行要沙箱? 模型生成的是不可信程序,可能读取文件、联网、Fork 或消耗资源。
一句话复习
pass@k 是“k 个候选至少一个通过测试”的概率估计,必须连同采样预算、测试覆盖和安全沙箱一起解释。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。