Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

配对实验手册——让同一道题回答两次

评测第 6 篇回答了「为什么必须对照」,这一篇回答「具体怎么跑」——从 fixture 冻结、顺序平衡、分歧对统计,到无效台账和预注册合同,目标是读完能照着开出一次配对实验。

一、为什么独立两组经常不够用

agent 任务有两个讨厌的性质。

任务难度高度异质。 一批 30 道题里,有 5 道闭着眼都能过、5 道神仙也难救,真正区分方案的是中间 20 道。独立两组各跑一批,组间差异里混着「题不一样难」的噪声,30 个样本量被任务方差吃掉一大半。

单次行为是概率化的。 同一道题同一模型跑三遍,25%、75%、100% 都见过(评测系列《给 skill 建门禁》里 skill-up 触发现象的原话),judge 的心情也在抖。

配对设计的想法只有一句话:让每个任务自己跟自己比。同一道题、同一个模型版本,只改 treatment,跑两次——一次开、一次关。两次结果的差,把任务难度这个最大的噪声项从分母里消掉了。这不是什么新发明,医学临床试验里同卵双胞胎/自体前后对照干的就是这件事,区别只是我们的「双胞胎」是同一道冻结的题。

二、配对实验的最小结构

一次站得住的配对实验,五个部件缺一不可。

1. fixture 冻结。 题面、被测仓库 commit、scorer 版本全部钉死。题在两臂之间不许有一个字的差别——连题面里的换行都不行,换行就是 prompt 差异。我的 dsh harness 用 overlay 注入 session 落盘根而不是环境变量,原因之一就是环境变量会泄漏进工具调用,变成两臂之外的第三个变量。

2. 每臂全新隔离环境。 HOME、工作区、记忆库、session 落盘根全部 per 臂重建。评测第 7 篇收编过的重跑卫生在这里全部适用:残留文件让假通过有地方生长,残留 git history 能被 agent 翻出来作弊,残留的长期记忆更狠——它让两臂共享了一个你完全没在实验设计里声明的「第三臂」。记忆类实验的隔离要求见评测第 10 篇,那里有完整污染清单。

3. 顺序平衡(AB/BA)。 一半任务先跑 treatment 再跑对照,另一半反过来。不做平衡,时间会冒充 treatment:provider 的负载随时段波动、模型可能在实验期间被热更新、判官服务自己在漂移。我做截断矩阵时坚持三跑而不是一锤定音,处理的是同一类时间风险,只是配对设计把它从「多跑几次平均」升级成了显式的交叉表。

4. 确定性参数写明,不确定的也写明。 温度、top-p、seed 能固定就固定;固定不了的(平台不给 seed 的)在报告里如实写「此项不可复现」。把不可复现项藏起来,配对就退化成了配对形式的独立两组。

5. 唯一主指标。 一次配对实验只允许有一个主指标。你当然可以记录十个次要指标,但 go/no-go 只看预注册的那一个——否则十张彩票里挑中奖号码,统计检验全部白做(多重比较的坑,评测第 7 篇的校准纪律里讲过它的近亲)。

三、信息只在分歧对里

配对结果画成 2×2 表:

对照成功对照失败
treatment 成功a(都成)b(treatment 赢)
treatment 失败c(对照赢)d(都败)

关键直觉:a 和 d 对「两臂有没有差异」不提供任何信息。 两个都成、两个都败,无论 treatment 有没有用,结果都一样。真正的信号只在 b 和 c 里——两臂产生分歧的对子。如果 b≈c,分歧是随机的,没差异;b 显著多于 c,treatment 在起作用。

小样本时不用背公式:在「两臂其实没差别」的零假设下,每个分歧对各有一半概率落到 b 或 c,所以 b/(b+c) 应该接近抛硬币。直接对 b+c 次抛硬币里出现 b 次正面做精确二项检验(exact McNemar)就够了,不需要正态近似,b+c 只有十几也能判。

样本量因此要按预期分歧率估,不是按总样本量估。这是新手最常踩的坑:计划跑 200 对觉得样本很大,但如果两臂成功率都很高(比如都在 90% 上下),预期分歧对可能只有二十对不到——你的检验实际是个二十个样本级别的小实验。预算和题量要按「能攒出多少个分歧对」倒推。

统计工具的分工顺手交代清楚:Wilson 区间管单比例(这个臂成功率多高,评测系列《从 trace 到 eval》给过单侧 Wilson 上界的口径),McNemar 管配对差(两臂差不差),一个回答水平、一个回答差异,别混用。

四、无效台账:invalid 永远不是 fail

配对实验的每个 rollout 有三种结局,不是两种:成功、失败、无效。

无效指的是基础设施原因导致这次运行什么都没测到:provider 503 零 token、配额耗尽、被测工具链缺失、超时且无产物。处理纪律只有一条但必须焊死:

  • 无效永不允许改判成失败——失败是 agent 的,无效是我们的;
  • 未评分(unscored)永不允许改判成通过——没有证据不能发奖。

M 项目的外部 benchmark 梯子上有个标注为 Blocked 的阶段:三次尝试全部撞上 provider 503、零 token,他们在文档里写明「这一轮的 scorer 输出是基线噪声,永远不得作为 agent 结果报告」。我特别欣赏「永远」这两个字——它防的不是当时的误判,是三个月后有人翻出旧表格做汇总 PPT。

评测系列《从 trace 到 eval》里写过镜像的一面:基础设施 bug 修好后基准分从 50 跳到 73 那次事故——infra 问题伪装成推理失败,是「假失败」;无效台账是它在配对实验里的制度化形态。判定前永远先问评测第 7 篇那句:这次失败真的是 agent 的失败吗?

五、先定规则,后看数:预注册合同

无效规则、停止规则、预算、主指标——这些东西如果在看到数据之后再定,实验就退化成了讲故事。解法是把规则写进一份事前合同。本章附录 A 给了一页纸模板,九个字段。

两个字段值得展开说。

停止规则。 跑到什么程度停,必须在开跑前写死:固定对数(攒够 60 个分歧对即停)、固定预算(评测第 8 篇的美元门槛),或二者先到者。禁止「看一眼中间结果,显著了就停、不显著就再追加」——这和选择性报告是同一类作弊。顺序平衡的执行表也在开跑前生成,不许跑一对抽一次签。

无效行规则。 什么情况算无效、无效对要不要补跑、补跑的配额从哪来,全部事前定义。这个字段不是走形式——下一节的病例里,它就是整个实验的生死线。

六、病例:一百三十九行里八十八行判无效之后

这是我见过对「规则先于数据」最狠的一次压力测试,仍然来自 M 项目的一次记忆排序试点(2026-10 观察)。

实验设计见评测第 10 篇,这里只讲事故。treatment 是对检索结果行的顺序做置换——不增行、不删行、不改行,只是排序。而实验的完整性校验器有一条旧假设:两臂的回执行顺序应当一致。于是 139 个处理行里 88 行因为「回执顺序不一致」被判无效——校验器把 treatment 本身当成了数据损坏。

团队面前有两条路:

  1. 当场放宽校验器,把 88 行捞回来,实验继续;
  2. 按预注册合同判这 88 行无效,实验结论标注「不可解释、不推广」。

他们选了第二条。然后另起一轮探索性分析——用放宽后的校验器重评了 125 对,并在所有材料上明确标注这是 post hoc exploratory(事后探索),不享受确认性实验的结论地位。探索性结果是 null:金标核实 53→56(分歧 14:17,p=0.72),最终答对 68→67(15:14,p=1.0)。

这个病例里有三层教训,一层比一层通用。

第一层,测量仪器的假设可以和 treatment 正面冲突。 校验器假设顺序不变,而干预就是改顺序。这和评测第 3 篇的「对测量仪器做消融」是同一个识别模式——当被测系统的变化在测量层表现为「异常」时,先怀疑仪器。

第二层,规则先于数据时,判无效不需要勇气。 88/139 无效是个肉疼的结果,等于大头预算白花了。但因为合同写在前面,「不推广」是执行而不是抉择。如果规则允许当场修改,没人能抵抗「再看一眼」的诱惑——而「再看一眼」在统计上永远偏向你想看到的结果。

第三层,事后分析可以做,但必须穿探索性的衣服。 他们没有假装那 125 对的重评不存在,也没有把它包装成正式结论——它作为「下一轮实验该修什么」的输入活着:修校验器、重新注册、再跑确认性实验。确认性实验回答「是不是」,探索性实验回答「下一轮怎么设计」,两者的产物不许混用。

七、两次显著的断层:代理指标的消费假设

同一个试点还有另一半事故,这一半更值得做 eval 的人刻在墙上。

排序方案在离线评估里信号极强:金标记忆排第一的比例从 258/288 升到 272/288,配对分歧 15:1,p=0.0005。按常规剧本,这已经是可以写发布通告的数字。但端到端配对实验(真实模型、真实会话)结果是上面的 null。

离线到端到端之间隔着一条代理链:

金标排第一 → 结果被注入 → 模型打开第一条 → 模型核实到金标内容 → 最终答对

每一个箭头都是一个消费假设:下游真的按上游的设计消费它吗?这条链在「排第一 → 被打开」处断了——模型并不总是先点开第一条结果,它可能直接看第三条。你把金标从第二行挪到第一行,对一个不按顺序读的消费者毫无作用。而且离线基线已经很强(90% 的金标本来就排第一),留给排序的天花板本来就薄。

我自己的工作里有同构的教训,而且是同一组三因子(评测第 5 篇):「检出」是「挡路」的代理。agent 报了截断不等于它会停下来,6/30 的检出率与挡路率必须分开报;截断检出矩阵里 L0(无察觉)占六成,讲的就是「中间指标很好看,终点什么都没发生」。M 项目这个病例把它抽象成了通则:

  1. 每设一个代理指标,书面回答一句「下游凭什么消费它」;
  2. 离线显著只批准进入下一轮实验,不批准上线——显著的代理指标和端到端行为之间,永远隔着至少一次确认性配对;
  3. 代理链要逐环可测:注入集合有记录、打开行为有 trace、采信有核实标记,哪一环断的要能定位,不能只看链顶的答对率然后互相甩锅。

八、treatment 的纪律:改一句措辞就是换药

最后一条操作规程,容易被当作文字洁癖:给模型看的任何文字——judge 的提问、criteria、系统提示里的劝告——都是 treatment 的一部分。改一句措辞,实验就换了药,旧数据不能和新数据合并。

M 项目的判官服务有组实测:同一批 18 道判断题,问题里不写判定标准时答对 6/18,把「什么叫相关」的标准写清楚后 17/18。这不是个例,我在 skill 红线上撞到过同型现象:同一条用例,约束写在 description 的「不管」声明里 vs 写进正文的行为指令,FAIL 率 66.7% 对 100%(评测第 2 篇)。措辞差异的效果比很多模型差异都大——所以措辞要像代码一样 pin 版本,改措辞要像改 treatment 一样重新注册。

九、收口

配对不是目的,可归因才是。这份手册的全部部件——冻结、隔离、平衡、分歧对、无效台账、预注册、代理链——干的都是同一件事:让实验结束时,你能指着 Δ 说出「这是它干的」,并且这句话扛得住「真的吗」的追问。

本章的操作性清单连同前八篇长出的机制,统一归档到评测第 7 篇末尾的「错误 → 机制化」总单。

附录 A · 配对实验合同模板(一页纸)

experiment: <实验名,含版本,如 recall-order-2026q4-v1>
hypothesis:
  direction: treatment_better | two_sided   # 方向事前选定
  primary_metric: <唯一主指标,如「核实到金标的会话比例」>
  secondary_metrics: [<可记录但不参与裁决的指标>]
arms:
  control: <对照臂的完整定义,含所有显式关闭的默认项>
  treatment: <与对照臂的差异,逐字列出;除此外两臂必须逐字节对齐>
fixture:
  task_set: <题集 id + commit/哈希>
  repo_commit: <被测仓库 commit>
  scorer_version: <判分器版本>
  holdout: <封存集 id、开封条件>
sampling:
  pairs_planned: <计划配对数>
  discordants_needed: <预期需要的分歧对数(按此倒推题量)>
  order_schedule: <AB/BA 顺序表,开跑前生成并冻结>
  model: <模型 + 精确版本>
  temperature_seed: <固定值;平台不支持时写「不可复现」>
stopping_rules:
  fixed_pairs: <对数门槛>
  budget_usd: <累计授权美元,先到先停,禁止边跑边追加>
  overrun_sample: <超支单样本:invalid | counted,二选一事前定>
invalid_rules:
  conditions: [provider_5xx_zero_token, quota, toolchain_missing, timeout_no_artifact]
  rerun_policy: <是否补跑、补跑配额来源>
statistics:
  method: exact_mcnemar
  two_sided_p_threshold: 0.05
  interval: wilson_95
preregistered_at: <开跑前的日期与合同 commit>

填好的迷你样例建议用自家 fixture 练手:从 skill-quake 或截断矩阵里挑 10 道题,对照臂关掉所有注入、treatment 臂开一个你确信有效的机制,跑一轮 10 对的配对——重点不是出结论,是把合同的每个字段都填疼一次。

本章外部病例来自我持续在看的那个单人维护开源 agent 内核项目(M 项目,首次出场于评测第 8 篇)的公开试点合同、PR 与评测规范文档(观察窗口 2026-10,含排序方案退役那次变更与试点目录;项目名从略,链接登记在写作简报),精确二项检验与 Wilson 口径属统计学通识;自家病例出自 dsh-eval-harness、skill-quake 与截断检出矩阵(2026-09)。成书前由我凭链接复核全部外部数字。