pass@k + pass^k 实测
Day33 我们建立了 pass@k / pass^k 的定义与 runNTimes 复跑封装,Day35 建了 bootstrap CI,Day38 把可靠性扩成三维。今天是 B4 里把可靠性口径落到实测的一天:
阶段: B4 · reasoning/planning/multi-agent + 何时不用 agent(Day 31-40) 标签: #pass-at-k #pass-pow-k #fragility #reproducibility
今日导引(由浅入深)
Day33 我们建立了 pass@k / pass^k 的定义与 runNTimes 复跑封装,Day35 建了 bootstrap CI,Day38 把可靠性扩成三维。今天是 B4 里把可靠性口径落到实测的一天:
- 对脆弱子集真跑 n=10;
- 算 pass@1 / pass@5 / pass^5;
- 找出
pass^5 < pass@5的任务并标红。
这是整个 B4 的关键证据——脆弱任务(偶尔做对但不可复现)正是「agent 不该独立负责」的铁证,直接喂给明天的 Day40 决策 gate。最小可判定产出:≥1 个脆弱任务的 pass^5 数字,且明确 < 其 pass@5。
1. 机理精读
两种口径,方向相反。对同一任务复跑 k 次:
- pass@k:k 次中有 1 次过即算过。乐观口径,衡量能力上界——「这模型理论上能不能做对」。
- pass^k:k 次全过才算过。悲观口径,衡量生产可靠性——「每次都做对吗,能稳定交付吗」。
数学上 pass^k ≤ pass@k 恒成立(全过是「有一次过」的子集)。两者的差距 pass@k − pass^k 就是脆弱度的度量。
脆弱任务的诊断意义。当某任务 pass^5 ≪ pass@5(比如 pass@5=1.0 但 pass^5=0.2):
- 含义是「5 次里能蒙对至少 1 次,但远做不到 5 次全对」= 该任务偶尔能做对但不可复现。
- 生产系统要的是可复现,不是偶尔灵光。
- 所以这类任务正是 agent 不该独立负责的——要么加 HITL(人工签核),要么降级为 workflow,要么收紧到确定性规则。
参考《Don't Pass@k》(2025-10):批评只报 pass@k 掩盖脆弱性,主张报 pass^k + variance。
为什么这是 B4 的高潮。
- 前面 Day32 讲 agent vs workflow 的判定四条,其中「失败成本 / 可回滚性」一条很抽象;
- pass^5 把它量化了——pass^5 低的任务,就是失败成本高、不可复现的任务,gate 应判「不用 agent」。
- 这条证据是 block 里程碑明确要求的(≥1 个 pass^5 < pass@5 的脆弱证据)。
与 self-consistency 的关系。Day34 的 self-consistency(多采样投票)正是用来救脆弱任务的——把 pass@5 的「能力上界」通过投票兑现成更高的实际准确率。所以 pass^5 低的任务,是 self-consistency 收益最大的候选;但投票要花 token×k(Day38 的成本维度),是否值得仍要回到 gate 判。
2. 推导 / 手算 / 代码走读
今天是实测日,核心是按定义从 n-run 结果算三个指标。
手算最小例子(设某脆弱任务 n=5 的逐次 pass 序列 = [1,0,1,0,1]):
- pass@1 ≈ 单次成功率 = 3/5 = 0.6(取首次或平均,按定义)。
- pass@5 =「5 次有 1 过」= 序列里有 1 ⇒ 1.0。
- pass^5 =「5 次全过」= 序列里有 0 ⇒ 0.0。
- 诊断:pass@5=1.0 ≫ pass^5=0.0 ⇒ 脆弱,标红,判「不该独立交给 agent」。
对比一个稳健任务序列 [1,1,1,1,1]:
- pass@5=1.0、pass^5=1.0,差距为 0 ⇒ 不脆弱,可交给 agent。
代码侧复用:
runNTimes(Day33 加在agentEval复跑封装):对脆弱子集跑 n=10,聚合 per-task pass 计数 + std。- pass@k / pass^k 的计算逻辑离线单测绿(Day33 已加测试到
src/agent/__tests__/eval/)。 - variance:
sd()(src/agent/eval/stats.ts:10)对每任务的逐次 pass 序列算 std,与 pass^5 并列报(《Don't Pass@k》要求 pass^k + variance 一起)。 - accuracy 来源仍是
runTaskEval(src/agent/eval/agentEval.ts:77)的 judge 标签,每次跑产出一个 pass/fail/unknown(agentEval.ts:95)。
口径换算备注:pass^5 与 pass@5 都从同一组逐次 pass 序列派生,所以二者天然 paired——可直接对 (pass@5 − pass^5) 这一脆弱度差值做 bootstrap(Day35 的 pairedBootstrap),给脆弱度本身配 CI。
单次成功率 p 与两口径的闭式关系(理想 i.i.d. 假设,用于直觉校准):
- 若某任务每次独立成功率为 p,则理论上
pass^k = p^k、pass@k = 1 − (1 − p)^k。 - 取 p=0.6, k=5:
pass^5 = 0.6^5 ≈ 0.078、pass@5 = 1 − 0.4^5 ≈ 0.99——脆弱度差距 ≈ 0.91,巨大。 - 这说明:中等单次成功率的任务,pass@k 几乎必然漂亮、pass^k 几乎必然惨——所以只报 pass@k 是系统性误导。
- 注意真实 agent 各次并非严格 i.i.d.(共享 prompt/温度),闭式只作直觉锚,实测仍以
runNTimes经验值为准。
脆弱性如何喂给 Day40 的 gate:
- pass^5 高(如 ≥0.8)→ 任务可复现 → gate 允许「不用 agent / 用 workflow」候选;
- pass^5 低且 pass@5 高 → 脆弱 → gate 判「若必须做此任务,需 agent + self-consistency / HITL 兜底」,不能交给裸 workflow;
- 这条把抽象的「失败成本/可回滚性」(Day32 判定四条之一)变成一个可读数字,是整张决策表里最难造假、最有说服力的一列。
3. 今日实战
- 取 Day33 标的脆弱子集(multi-step、易抖的任务),用
runNTimes跑 n=10。 - 按定义算每任务的 pass@1 / pass@5 / pass^5(计算逻辑已离线单测绿)。
- 找出
pass^5 < pass@5的任务标红,并对每个标红任务报其sd()variance。 - 画三指标对比图表(pass@1 / pass@5 / pass^5 三条),落
docs/aipa/day39-passk.md。
4. 今日实测 / 产出
- 「待跑(需 OPENROUTER_API_KEY);可先用离线 fixture 跑通出三指标 + commit」。
- 将产出:脆弱任务的 pass^5 数字(且 < 其 pass@5,即 block 里程碑要求的脆弱证据)。
- pass@k / pass^k 计算逻辑离线单测绿。
5. 常见误区 / 陷阱
- 只报 pass@k 充门面:这正是《Don't Pass@k》批评的失真口径——掩盖了不可复现性。
- n 太小下结论:n=2、3 时 pass^k 噪声极大,至少 n=5/10 才有意义。
- 忽略 variance:pass^k 要配 std 一起报,否则看不出抖动幅度。
- 把 pass@5 高当能上生产:能力上界高 ≠ 可复现,生产看 pass^k。
- 脆弱子集选偏:只挑已知难任务跑 pass^k 会高估全集脆弱度;脆弱子集应有明确入选规则(如 Day31 标的 multi-step 任务),并在报告里写清抽样口径。
6. 学习资源(每条带 YYYY-MM)
- 《Don't Pass@k》(2025-10)——批评 pass@k、主张 pass^k + variance 的主引用。
- 本仓
src/agent/eval/agentEval.ts+runNTimes复跑封装(n-run 聚合 pass 计数 + std)。 - 本仓
src/agent/eval/stats.ts(sd()算 per-task variance;pairedBootstrap可给脆弱度配 CI)。 - Anthropic《Demystifying evals》(2026-01)——可靠性多维度量(脆弱性是其中一维)。
SOTA检查 (2026-06 更新)
《Don't Pass@k》(2025-10) 为近 12 个月主线,现行有效。
- 避免:只报 pass@k 充门面——这正是该论文批评的失真口径;n 太小就下脆弱结论。
- 下次复查点:是否出现新的可靠性口径(如带成本权重的 pass^k 变体);OpenRouter 上被测模型 slug 执行当周复验。
本日交叉引用
- 上游依赖:Day33(pass@k/pass^k 定义 +
runNTimes)、Day34(self-consistency 救脆弱)、Day35(bootstrap 给脆弱度配 CI)。 - 下游被用:Day40(pass^5 作 gate 的「脆弱性」判据列)。
- 代码资产:
src/agent/eval/agentEval.ts(n-run 复跑)、src/agent/eval/stats.ts(sd/pairedBootstrap)。
衔接
- 昨天:Day 38 — cost/latency 度量(accuracy + p95 + 单位成本 + variance 三维矩阵)。
- 今天:实测 pass@5 vs pass^5,用「全过」口径找出不可复现的脆弱任务并标红。
- 明天:Day 40 — 何时不用 agent gate(把三维矩阵 + 脆弱证据收敛成一张决策 gate,收口 B4)。