返回 AICAP-180
B4 · Day 39reasoning/planning/multi-agent + 何时不用 agent

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 来源仍是 runTaskEvalsrc/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^kpass@k = 1 − (1 − p)^k
  • 取 p=0.6, k=5:pass^5 = 0.6^5 ≈ 0.078pass@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. 今日实战

  1. 取 Day33 标的脆弱子集(multi-step、易抖的任务),用 runNTimes 跑 n=10。
  2. 按定义算每任务的 pass@1 / pass@5 / pass^5(计算逻辑已离线单测绿)。
  3. 找出 pass^5 < pass@5 的任务标红,并对每个标红任务报其 sd() variance。
  4. 画三指标对比图表(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.tssd() 算 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.tssd/pairedBootstrap)。

衔接

  • 昨天:Day 38 — cost/latency 度量(accuracy + p95 + 单位成本 + variance 三维矩阵)。
  • 今天:实测 pass@5 vs pass^5,用「全过」口径找出不可复现的脆弱任务并标红。
  • 明天:Day 40 — 何时不用 agent gate(把三维矩阵 + 脆弱证据收敛成一张决策 gate,收口 B4)。