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

bootstrap 置信区间

Day 34 跑出了 single-shot vs k=5 的 Δaccuracy 点估计。但 8 任务的小样本下,一个看着「+几个点」的 Δ 可能纯属噪声。今天补上 B4 实测的显著性裁决器:bootstrap 置信区间——用有放回重采样给 Δ 配一个 95% CI,CI 跨 0 则差异不显著。这是整个 B4 选型论证的收口工具:Day 40 的「何时不用 agent gate」里「Δaccur

阶段: B4 · reasoning/planning/multi-agent + 何时不用 agent(Day 31-40) 标签: #bootstrap #confidence-interval #significance #paired-test

今日导引(由浅入深)

Day 34 跑出了 single-shot vs k=5 的 Δaccuracy 点估计。但 8 任务的小样本下,一个看着「+几个点」的 Δ 可能纯属噪声。今天补上 B4 实测的显著性裁决器:bootstrap 置信区间——用有放回重采样给 Δ 配一个 95% CI,CI 跨 0 则差异不显著。这是整个 B4 选型论证的收口工具:Day 40 的「何时不用 agent gate」里「Δaccuracy CI 跨 0 ⇒ 选更便宜的 workflow」这条阈值,就是今天的产物。最小可判定产出:对 Day 34 两组结果调 stats.tspairedBootstrap 算 95% CI(数字待 key)。

1. 机理精读

小样本点估计不可信,需要置信区间。 eval 只有 8 任务时,Δaccuracy = accuracy_k5 − accuracy_single 是一个由 8 个配对差值算出的均值。这个均值本身是随机的——换一批任务、换一次采样,它就变了。只报点估计(「+5pp」)而不报不确定性,是评审强制要打回的(Day 38/40 把它列为强制项)。

bootstrap 的核心思想:用样本自身模拟抽样分布。 既然拿不到无穷多次重新实验,就把手里的 8 个配对差值当作总体,有放回地重采样 8 个,算一次 Δ;重复 B 次(本仓 pairedBootstrap 默认 iters=2000,本日按 seed 跑 1000×),得到 Δ 的经验分布。取这个分布的 2.5 / 97.5 分位即 95% CI。这是 Efron 的经典非参数 bootstrap,不假设正态、对小样本稳健。

配对(paired)为什么关键。 本仓 stats.ts 顶注解释得很清楚:在同一批任务上比 single vs k=5,可以消去任务难度方差——难任务对两个方案都难,配对作差把这部分共同难度抵消掉,于是 Δ 的 CI 更紧、更易检出真实差异。这正是 B4 一直在「同 8 任务集」上做对比的统计理由。

CI 跨 0 的判读。 若 95% CI 包含 0,说明「Δ=0(两方案无差异)」是数据无法排除的假设——差异不显著,此时按「能简单就别复杂」选更便宜的方案(single-shot / workflow)。若 CI 完全在 0 一侧(如 [2, 18] 全正),才有统计依据说 k=5 真的更好。

与既有真实数据的对照。 这套 CI 管线不是空谈:FRONTIER 计划里首个真实 DeepSeek-V4 A/B 已经跑出过 Δ+10.3pp,95% CI[0,20.7](Flash 79.3% vs Pro 89.7%,N=29)——CI 下界正好压在 0 上,结论是 N=29 下不显著。这是 bootstrap CI 判读的真实样例:点估计 +10.3pp 看着大,但下界贴 0 ⇒ 不能下「Pro 显著更强」的结论,需要更大任务集。

关键权衡与边界。 bootstrap 是 eval 的标准做法,无过时风险。边界:CI 宽度由样本量与 per-task 方差共同决定,8 任务必然给出宽 CI;想收窄 CI 要么加任务(N↑),要么降 per-task 方差(self-consistency 等)。stats.ts 还提供 requiredNForDelta(delta, sdDiff)(正态近似,α=.05、power=.8)来反推「检出这个 Δ 需要多少配对任务」——这是把「CI 太宽」转成「该加到多少 N」的可执行答案。

为什么这一步对 AISA 重要。 这是整个 B4 选型论证的「裁判」。前面 Day 31-34 产出的所有 Δ(self-consistency 收益、agent vs workflow 的准确率差)都是点估计,而点估计在小样本下随时可能翻盘。bootstrap CI 给每个 Δ 配上「这个差异是不是噪声」的判决,让 build-vs-buy 论证从「我测出来 A 比 B 高 5 个点」升级为「Δ 的 95% CI 是 [x, y],含/不含 0,所以(不)该选 A」。真实 DeepSeek-V4 A/B 的 Δ+10.3pp, CI[0,20.7] 就是反例教材:一个看着很大的点估计,CI 下界贴 0 ⇒ 诚实结论是「N=29 还不够,别急着说 Pro 赢」。能在评审里说出这句话,比报一个漂亮但无 CI 的点估计专业得多。

2. 推导 / 手算 / 代码走读

手算 bootstrap 一次重采样(设 4 个配对差值 diffs=[+0.2, 0.0, +0.4, -0.1],点估计 Δ=mean=0.125):

  • 一次有放回重采样可能抽到索引 [0,0,2,3] → 取值 [+0.2,+0.2,+0.4,-0.1] → 均值=0.175。
  • 另一次抽 [1,1,3,3][0,0,-0.1,-0.1] → 均值=-0.05。
  • 重复 1000 次得 1000 个均值,排序后取第 25 与第 975 个(2.5/97.5 分位)= 95% CI。若该区间含 0 → 不显著。

再手算一次 requiredNForDelta(设想检出 Δ=0.10、配对差 sd=0.30):

  • n = ((z_{α/2}+z_{β})·sd/|Δ|)² = ((1.95996+0.84162)·0.30/0.10)²
  • = (2.80158·3)² = (8.40474)² ≈ 70.6 → 向上取整 71
  • 解读:在 sd=0.30 的抖动下,要以 80% power、α=.05 检出 0.10 的差异,需约 71 个配对任务——远超 8。这量化了「为什么 8 任务的 CI 必然宽、为什么真实 A/B 的 N=29 仍嫌小」。stats.ts 对 delta=0 返回 ∞、sd≤0 返回 2、整体下限 2,覆盖退化情形。

代码走读 src/agent/eval/stats.ts

  • pairedBootstrap(a, b, {iters, rng}):先 diffs = a[i] - b[i](长度须相等,否则抛错;n=0 抛错),然后 iters 次(默认 2000)对 diffs 有放回采样求均值,sort 后返回 {deltaMean, ci95:[percentile(means,2.5), percentile(means,97.5)], n, iters}rng 可注入 → 测试确定性、无网络。
  • percentile(sorted, p):线性插值分位(与 cohensKappa.ts 内同名函数风格一致)。
  • mean/sd:样本均值/标准差(sdn<2 返回 0)。
  • requiredNForDelta(delta, sdDiff)n = ((z_{α/2}+z_{β})·sd/|delta|)²z_{α/2}=1.95996z_{β}=0.84162,下限 2;delta=0 返回 ∞。把「CI 太宽」翻译成「需多少任务」。
  • 风格对齐 src/agent/eval/cohensKappa.tscohensKappaWithCI(a,b,{bootstrap,rng}):同样的百分位 bootstrap 套路(B 默认 2000,resample N 对、求 κ、取 2.5/97.5 分位)。两者证明同一 CI 模式在 repo 里既用于 Δaccuracy 也用于 judge-human κ。
  • 现状pairedBootstrap + 95%CI 与 cohensKappaWithCI 均已在 repo 实现且测试随全套绿(B3 stats 测试绿,全套 378 tests passing、tsc clean)。

CI 判读速查表

CI 形态含义行动
[2, 18] 全正k=5/方案 B 显著更好有依据选更优方案
[-18, -2] 全负方案 A 显著更好选 A
[0, 20.7] 含 0(贴边)证据不足,不显著按「能简单就别复杂」选更便宜方案;或加 N
[-15, 15] 宽跨 0N 太小,几乎无信息requiredNForDelta 反推该加多少任务

关键:CI 含 0 ≠ 证明无差异,而是「数据无法排除 0」=证据不足。这是 Day 40 gate「Δaccuracy CI 跨 0 ⇒ 选更便宜的 workflow」阈值的判读基础。

3. 今日实战

  1. 取 Day 34 两组结果(single vs k=5 的 per-task accuracy/通过指标),作为 ab 两个等长数组。
  2. stats.tspairedBootstrap(a, b, {iters:1000}) 算 Δaccuracy 的 95% CI。
  3. 风格对齐 src/agent/eval/cohensKappa.ts 的 bootstrap CI(注入固定 rng 保证可复现)。
  4. 加测试到 src/agent/__tests__/eval/,跑 pnpm test
  5. 判读:CI 跨 0 ⇒ 差异不显著 ⇒ 选更便宜方案;CI 全正 ⇒ k=5 有显著收益。
  6. 若 CI 跨 0,调 requiredNForDelta(deltaMean, sd(diffs)) 反推「要检出这个 Δ 需多少任务」,作为「该把任务集扩到多大」的下一步行动项。
  7. 离线先用固定 rng + fixture 两组数验证 pairedBootstrap 输出可复现(同 seed 同 CI);真实 Δ 的 CI 留待 key。

4. 今日实测 / 产出

  • stats.tspairedBootstrap+95%CI 与 cohensKappa bootstrap 已在 repo 实现且测试绿(B3 stats 测试绿,全套 378 tests passing, tsc clean)。
  • 但 Day 34 真实两组数据 「待跑(需 key)」,故 Δ 的具体 95% CI 上下界待 key 后产出;CI 计算管线本身离线已验。
  • 真实样例锚点(FRONTIER 已落):DeepSeek-V4 A/B Δ+10.3pp,95% CI[0,20.7](Flash 79.3% / Pro 89.7%,N=29)——CI 下界压 0、N=29 下不显著,作为判读范例(非本日 8 任务的数字)。
  • 状态:CI 管线已完成且测试绿;本日 8 任务 Δ 的具体 CI 上下界待跑(需 key),不臆造。

收口 B4 统计三件套

到 Day 35,B4 的统计基础设施已齐:

  1. 复跑(Day 33)runNTimes 把非确定输出变成可统计的 per-task 样本(pass 计数 + std)。
  2. 降方差(Day 34):self-consistency 用 token×k 换更低方差,按 std 定向开。
  3. 显著性(Day 35)pairedBootstrap 给 Δ 配 95% CI,CI 跨 0 ⇒ 不显著 ⇒ 选更便宜方案。

这三件套加上 cohensKappaWithCI(judge 校准)就是 Day 38(多维度量)与 Day 40(gate)能给出带 CI 的 build-vs-buy 结论的全部底座——也是 AISA 区别于「拍脑袋选型」的硬证据来源。

5. 常见误区 / 陷阱

  1. 只报单点 Δ 不报 CI:评审强制项,必被打回。+10.3pp 这种点估计若 CI 下界贴 0 就不能下结论。
  2. 不配对就作差:在不同任务集上比两方案,任务难度方差会淹没真实 Δ,CI 失真;必须同任务集配对。
  3. 把宽 CI 当「方案无效」:宽 CI 常是 N 太小所致,应用 requiredNForDelta 反推该加到多少任务,而非直接否定。
  4. 混淆 CI 含 0 与「无差异」:CI 含 0 只是「数据无法排除 0」,不等于证明无差异——是「证据不足」,需更大 N。
  5. bootstrap 迭代次数太少:iters 取几十次时 CI 端点本身抖动大,应取 1000~2000(本仓默认 2000);同时固定 rng 才能让 CI 可复现。
  6. 拿全套 N 当配对数:N=29 是全任务集,但 self-consistency 的 single vs k=5 配对数取决于参与对比的子集大小;别把分母搞错导致 CI/required-N 失真。

自测题(面试演练)

  • Q:为什么用配对 bootstrap 而不是独立两样本检验? A:同一批任务上比两方案能消去任务难度方差——难任务对两方都难,配对作差把共同难度抵消,Δ 的 CI 更紧、更易检出真实差异。这是 B4 始终在同 8 任务集上做对比的统计理由。
  • Q:CI=[0, 20.7]、点估计 +10.3pp,能下「Pro 显著更强」的结论吗? A:不能。CI 下界压在 0 上,N=29 下不显著——点估计再大,只要下界贴 0 就不能排除「无差异」。结论是「证据不足,需更大 N」,这正是真实 DeepSeek-V4 A/B 的判读。
  • Q:CI 太宽怎么办? A:CI 宽多由 N 小所致,用 requiredNForDelta(delta, sdDiff) 反推「检出这个 Δ 需多少配对任务」,把「CI 太宽」转成「该加到多少 N」的可执行答案,而非直接否定方案。
  • Q:bootstrap 假设正态吗? A:不。它是非参数法,直接用样本自身有放回重采样近似抽样分布,对小样本/非正态稳健——这正是 8 任务这种小样本选它的原因。

6. 学习资源(每条带 YYYY-MM)

  • Efron & Tibshirani《An Introduction to the Bootstrap》(1993) — 非参数 bootstrap 经典(打底,原理稳定)。
  • 本仓代码 src/agent/eval/stats.tspairedBootstrap/percentile/requiredNForDelta)— Δaccuracy 95% CI 实现。
  • 本仓代码 src/agent/eval/cohensKappa.tscohensKappaWithCI)— 同款百分位 bootstrap,judge-human κ 的 CI。
  • Anthropic《Demystifying evals》(2026-01) — 报告需带 CI、judge 需 κ 校准的方法论强制项。
  • 本仓 FRONTIER 进度锚点(2026-06):首个真实 DeepSeek-V4 A/B Δ+10.3pp, 95% CI[0,20.7](Flash 79.3% / Pro 89.7%, N=29)— CI 判读的真实样例(非本日 8 任务数字)。

SOTA检查 (2026-06 更新)

  • 当前主流:bootstrap CI 是 eval 标准做法,现行有效,无过时风险
  • 过时黑名单:避免只报单点 Δ 不报 CI——评审强制项;避免把「CI 含 0」误读成「证明等价」。
  • 方法升级候选:BCa(偏差校正加速)bootstrap 在小样本下覆盖率优于纯百分位法,是可选的精度升级(但实现更重,本仓先用百分位法)。
  • 下次复查点:是否需对 Δaccuracy 用 BCa 替代百分位法以改善小样本覆盖率;DeepSeek-V4 后续 A/B 在更大 N 下 CI 是否离 0(若仍跨 0 则说明两档差异确实小)。

衔接

  • 昨天:Day 34 — self-consistency 机制(single-shot vs k=5 的 Δaccuracy 点估计 + 成本曲线)。
  • 今天:bootstrap 95% CI 给 Δ 配不确定性,CI 跨 0 判不显著(管线已测试绿,8 任务数字待 key)。
  • 明天:Day 36 — supervisor/worker 模式(B4 转入多 agent:orchestrator 拆任务路由给隔离 context 的 worker)。