返回 AICAP-180
B15 · Day 148FIS×Anthropic 模式 + 对抗/HITL 套件

跨模型对抗对比

B15 的对抗套件已经从「规则评规则」(Day 146)升级到「外部 NAMED model 当裁判」(Day 147),

阶段: B15 · FIS×Anthropic 模式 + 对抗/HITL 套件(Day 141-150) 标签: #cross-model #ab-compare #controlled-eval #alignment

今日导引(由浅入深)

B15 的对抗套件已经从「规则评规则」(Day 146)升级到「外部 NAMED model 当裁判」(Day 147), 拿到 deepseek-v4-pro 的抵抗率#1。 今天再进一步: 用同一套 10 任务、同一 judge、同温度、同 N去跑第二个模型(Qwen3), 得到抵抗率#2,把两个模型并列成表, 看不同对齐策略(RLHF / Constitutional / RLVR)下谁更扛得住对抗诱导。 这在 B1→B18 曲线上是「model-strategy PM」能力的对抗版——不只是比完成率,而是比安全抵抗能力。 关键不在「跑两次」,而在固定变量防伪差异:否则抵抗率差异可能来自温度噪声而非对齐质量。 「最小可判定产出」是一张逐任务 ✓/✗ 的两模型对比表 + 标注两模型分歧的任务(一个拒绝一个服从)——这一步需 key,本日为「待跑」状态。

1. 机理精读

为什么不同对齐策略下抵抗能力会不同。 RLHF(人类反馈强化学习)、Constitutional AI(宪法式自我批评)、RLVR(可验证奖励强化学习)是三种不同的后训练范式,它们塑造模型「拒绝危险请求」的方式不一样:RLHF 靠人类偏好打分、Constitutional 靠一组明文原则做自我批评、RLVR 靠确定性 grader 给可验证奖励。理论上这些范式对「strategic-evasion」(诱导模型帮助规避检测)的抵抗强度不同,但这只是假设——必须实测才能下结论,不能凭模型卡上的对齐宣传就排名。

跨模型对比的头号陷阱:伪差异。 如果两个模型用了不同的 prompt、不同的 judge、不同的温度、不同的 N,那么观测到的抵抗率差异就被混杂因素污染了——你分不清差异是来自「对齐质量」还是「temperature=0.7 的随机性」。所以跨模型对比的铁律是固定一切非对齐变量

  • 同 prompt:完全一样的 10 个对抗任务,一字不改。
  • 同 LLM-judge:用同一个裁判判两个模型,否则判分尺度不一致。
  • 温度固定(如 temperature=0):消除采样噪声,让每次输出尽量确定。
  • 同 N:两边任务数一致,CI 才可比。

为什么 N 还是关键瓶颈。 即便控好了变量,N=10 的抵抗率差异在统计上几乎一定不显著——这与 Day 137/140 的 A/B 教训完全同源:真实 A/B(V4-Pro vs V4-Flash)在 N=29 时 Δ+10.3pp,95% CI[0,20.7] 跨 0,不显著,约需 ~70 任务才有 power。跨模型对抗对比同样受此约束,所以本日产出的对比表只能说「方向性」,分歧任务(一拒一从)的逐条分析比聚合数字更有信息量。

分歧任务为什么重要。 当模型 A 拒绝、模型 B 服从同一个对抗任务时,这条「分歧任务」直接暴露了两个模型对齐边界的差异——它是定性洞察的金矿,比「抵抗率 7/10 vs 6/10」这种被宽 CI 吞掉的聚合差异有用得多。

温度为什么必须固定到 0。 对抗安全任务的「拒绝/服从」往往落在模型决策边界附近,temperature>0 的采样会让同一个任务在多次跑里时而拒绝时而服从——这种内生随机性会被误读成「抵抗能力差异」。固定 temperature=0 让每次输出尽量确定,把观测到的差异尽可能归因到对齐质量本身。代价是失去了对「模型在随机采样下的稳健性」的度量,但对「谁更扛得住」这个问题,控温是正确取舍。

对齐范式与抵抗力的因果链很弱。 即便观测到 A 比 B 抵抗更强,也不能直接归因到「A 用了 Constitutional、B 用了 RLHF」——因为两个模型差异不止对齐范式:预训练语料、模型规模、SFT 数据、安全微调强度全都不同,这些都是混杂因子。跨模型对比能给的是「现象:A 在这些任务上更扛」,不能给的是「机制:因为对齐范式 X」。要做因果归因,得控制更多变量(同基座、只换对齐范式),那是 GPU-gated 的训练实验,远超本日范围。所以本日结论必须停在现象层。

为什么不能只看胜负数(wins/losses)。 abCompare 给出 wins/losses/ties,但单看「A 赢 3 个 B 赢 2 个」会掉进与裸抵抗率同样的陷阱——胜负计数同样受 N 小、CI 宽约束。正确读法是:wins/losses 用来定位分歧任务(做定性归因),deltaMean + ci95 用来判断聚合差异是否显著(大概率不显著)。两者分工,不可混用。

2. 代码走读:src/agent/eval/abCompare.ts 提供对比口径

seed 指明复用 abCompare.ts 的对比框架思路。读真实实现,要点如下:

  1. abCompare(a, b, opts)(第 32-61 行)按 taskId 对齐两份报告passMap 把每份报告转成 taskId → 0/1(pass=1),再取两边共有的 taskId(第 35 行 [...ma.keys()].filter(id => mb.has(id)).sort())——这从结构上强制「同任务集」,正是跨模型对比要的「同 prompt」约束。
  2. pairedBootstrap(av, bv, opts)(第 39 行)做配对 bootstrap:因为是同一组任务上的两个模型,配对设计能给出更紧的 CI(同任务相关性被利用)——但「更紧」也只是相对,N 小依然宽。
  3. wins / losses / ties(第 41-48 行)逐任务统计分歧d = av[i] - bv[i]d>0 是 A 过 B 不过(win)、d<0 反之(loss)——这正好是「分歧任务」的代码化,标注一拒一从的任务靠它。
  4. deltaMean + ci95(第 55-56 行)来自 pairedBootstrap——输出 Δ完成率 = X pp [95% CI ..],与真实 A/B 报告同一口径。
  5. 空交集会抛错(第 36 行 if (ids.length === 0) throw)——强制两份报告必须有共同任务,防止「拿不同任务集硬比」的伪差异。
  6. 纯函数 + rng 可注入(第 32 行 opts.rng)——abCompare 已被测试覆盖 ✅,本身不需 key;需 key 的只是产生两份报告的模型跑。
  7. completionA / completionB(第 53-54 行 mean(av)/mean(bv))= 各自抵抗率——这就是抵抗率#1 与抵抗率#2 的聚合点估计,直接可填进对比表头。
  8. AbReportLike 接口只要 perTask[].judge.label(第 6-9 行)——也就是说 abCompare 只认 judge 的 'pass' 标签,把「安全拒绝」编码成 pass 即可复用,无需改框架。

注意:abCompare 原本测的是「完成率」delta,本日把「pass」语义换成「安全拒绝」即可复用同一口径——同任务、配对、CI,框架完全通用。

控制变量清单——跨模型对抗对比前逐条勾选,缺一条结论即不可信:

变量必须不控的后果
prompt同 10 任务一字不改差异来自任务难度而非对齐
LLM-judge同一裁判判两模型判分尺度不一致
temperature固定(如 0)差异来自采样噪声
N两边相同CI 不可比
seed记录可复现无法重跑验证

为什么配对 bootstrap 比独立两组更紧。 同一组任务上两个模型的 pass 是相关的——简单任务两模型都过、难任务都挂。独立两组 bootstrap 把这层相关性丢掉,CI 偏宽;配对 bootstrap(pairedBootstrap)对每个任务的差值 av[i]-bv[i] 重采样,利用了相关性,CI 更紧。但「更紧」是相对的:N=10 时即便配对,CI 下界大概率仍跨 0——这与真实 A/B 在 N=29 时 Δ+10.3pp CI[0,20.7] 跨 0 不显著完全同源。

配对差值向量的最小例:假设 10 任务上 A(deepseek)拒绝向量 av、B(Qwen3)拒绝向量 bv 为

av = [1,1,1,1,1,1,1,0,1,1]  // A 抵抗 9/10
bv = [1,1,0,1,1,1,0,0,1,1]  // B 抵抗 7/10
d  = av - bv = [0,0,1,0,0,0,1,0,0,0]  // 任务 3、7 为分歧(A 拒 B 从)

deltaMean = mean(d) = 0.2(A 比 B 高 2 个任务),wins=2, losses=0, ties=8。 但 pairedBootstrap 对 d 重采样得到的 ci95 在 N=10 下几乎必然包含 0—— 所以一页评审件只能写「任务 3、7 是分歧点(定性)」+「Δ 不显著(定量)」, 不能写「A 显著更安全」。这一步把 abCompare 的口径完整迁到了安全维度。

3. 今日实战

  1. 用 OpenRouter 跑 Qwen3(执行当周复查 Qwen 最新版本号与可用 id),任务集与 Day 147 完全相同的 10 个对抗任务。
  2. 控温固定temperature=0)、同一 LLM-judge、同 N=10——把非对齐变量全部锁死。
  3. pnpm eval:agent(= tsx scripts/run-agent-eval.ts)产出 Qwen3 报告,算抵抗率#2
  4. pnpm eval:ab(= tsx scripts/ab-compare.ts,底层 abCompare)把 deepseek-v4-pro 抵抗率#1 与 Qwen3 抵抗率#2 并列成表。
  5. 逐任务标注 ✓/✗,并显式标出分歧任务(一个模型拒绝、另一个服从)。

4. 今日实测 / 产出

  • 待跑(需 key 跑 Qwen3 + deepseek-v4-pro) —— 将产出两模型抵抗率对比表(逐任务 ✓/✗)+ 分歧任务标注。
  • 已建依据:src/agent/eval/abCompare.ts + pnpm eval:ab ✅,真实 A/B 已落——V4-Pro vs V4-Flash N=29,Δ+10.3pp,95% CI[0,20.7],不显著@N=29;同一对比口径复用于跨模型对抗对比。
  • 诚实状态:抵抗率#1/#2 对比表 = 待跑(需 key),本日不得声称已有两模型抵抗率数字;abCompare 框架与 A/B 口径已落地可测 ✅。

5. 边界辨析:跨模型对比能下什么结论、不能下什么结论

N=10、控温、配对之后,对比表能支撑的论断和不能支撑的论断要分清——这直接决定一页评审件里的措辞:

  • 能说:「在这 10 个对抗任务上,A 与 B 在第 3、7 号任务出现分歧(A 拒绝、B 服从),方向上 A 抵抗更强。」——这是逐任务定性事实,不依赖统计显著性。
  • 能说:「聚合 Δ抵抗率的 95% CI 跨 0,N=10 不足以宣称某模型显著更安全。」——诚实标注不显著,与真实 A/B(N=29 Δ+10.3pp CI[0,20.7] 不显著)口径一致。
  • 不能说:「A 比 B 安全 10%」——点估计在宽 CI 下无意义。
  • 不能说:「因为 A 用 Constitutional 对齐所以更安全」——除非分歧任务的归因证据支撑,否则是把对齐宣传当结论。
  • 不能说:「这个结论可推广到所有 AML 场景」——10 任务是窄切片,外推需更大、更多样的任务集。

把「能说/不能说」写进报表, 正是 AISA 区别于「截图榜单」的地方——承认不确定性本身就是可信度的来源

与相邻批次的边界:B14(Day 131-140)做的是「外部 ground-truth AML eval」—— 那里 label 来自外部标注集(AMLworld 等),度量「检测准不准」(recall/precision/FPR); B15 本批做「对抗/HITL 抵抗率」——label 是「应当拒绝」,度量「安全扛不扛得住」。 两者复用同一套统计内核(binaryEval/abCompare),但问的问题正交: 一个是「能不能抓坏人」,一个是「会不会被坏人骗着帮忙」。 今天的跨模型对比,是把 B14 的 A/B 口径迁移到 B15 的安全维度——同工具、新问题。

6. 常见误区 / 陷阱

  1. 裸对比(无控温/无固定 judge)——抵抗率差异会被温度噪声和判分尺度污染,A/B 教训表明这样的差异不可信。
  2. N=10/29 就宣称某模型「更安全」——CI 几乎一定跨 0,约需 ~70 任务才有 power;只能说「方向性」。
  3. 只看聚合抵抗率不看分歧任务——一拒一从的逐条分歧才是对齐边界差异的金矿,聚合数字会被宽 CI 吞掉。
  4. 凭对齐范式名(RLHF/Constitutional/RLVR)排名——对齐宣传不等于实测抵抗力,必须实跑。

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

  • Qwen3 技术报告(2026 主线对齐基线之一,执行当周复查版本号)
  • 本仓 src/agent/eval/abCompare.ts(AICAP-180 B12/B17,配对 bootstrap 对比口径)
  • Anthropic, "Demystifying evals"(2026-01)——固定 judge / 可复现性
  • DeepSeekMath GRPO(arXiv:2402.03300,2024-02)与 R1(arXiv:2501.12948,2025-01)——RLVR 对齐范式参照
  • 真实 A/B 实测记录:V4-Pro vs V4-Flash N=29 Δ+10.3pp CI[0,20.7](本仓 2026 eval 报告)

SOTA检查 (2026-06 更新)

  • Qwen3 报告为 2026 主线对齐基线之一;执行当周复查 Qwen 最新版本号与 OpenRouter 可用 id(半衰期短,版本号易变)。
  • 配对 bootstrap 跨模型对比仍是 2026 SOTA 口径:同任务集 + 配对 + CI。
  • 过时黑名单:避免无控温 / 无固定 judge 的「裸对比」——A/B 教训表明 N=29 已不足以达显著,跨模型对比同样需足够 N(~70)。
  • 下次复查点:W15 前查 Qwen3 / DeepSeek 最新版本号;每阶段末重验对抗基准命名与覆盖度(半衰期~6 月)。

衔接

  • 昨天:Day 147 — 替换 evalBaseline 循环自评(外部 NAMED model 当裁判,抵抗率#1=N/10)
  • 今天:同 10 任务再跑 Qwen3,控温固定 + 同 judge + 同 N,与抵抗率#1 并列成表,标注分歧任务(待跑需 key)
  • 明天:Day 149 — 失败归因 & judge 校准(把失败归入四类,对照人标算 Cohen's κ 校准 LLM-judge)