返回 AICAP-180
B13 · Day 126FATF typologies + BSA grader + 用户研究

Qwen3 对照与模型间一致性

B13 这一个 block 的主线是「杀死循环自评、建立外部裁判」。Day 124 把 LLM 立成 typology 分类器,Day 125 用 Cohen's κ 把单个 LLM 裁判(DeepSeek-V4)对齐到 AMLSim 真值。但单模型裁判有它自己的系统偏差——它可能在某一类上稳定地错。今天往前推一步:引入第二个模型(Qwen3)做对照裁判,用两模型之间的 κ 衡量裁判间稳定性(in

阶段: B13 · FATF typologies + BSA grader + 用户研究(Day 121-130) 标签: #inter-rater #cohens-kappa #llm-judge #grpo

今日导引(由浅入深)

B13 这一个 block 的主线是「杀死循环自评、建立外部裁判」。Day 124 把 LLM 立成 typology 分类器,Day 125 用 Cohen's κ 把单个 LLM 裁判(DeepSeek-V4)对齐到 AMLSim 真值。但单模型裁判有它自己的系统偏差——它可能在某一类上稳定地错。今天往前推一步:引入第二个模型(Qwen3)做对照裁判,用两模型之间的 κ 衡量裁判间稳定性(inter-rater reliability)。这是从「一个声音」到「多个独立声音」的跃迁,为 B14 接外部 ground-truth 之前先把裁判层做扎实。

一句话点出今天的位置:B13 的裁判层正在从「单点」走向「ensemble」,而真正的外部金标要到 B14 才接入——所以今天的 κ 仍是「裁判间」的内部信度,不是对外效果。今天的最小可判定产出是:Qwen3 跑出第二套 5×5 混淆矩阵 + 一个 DeepSeek-V4 vs Qwen3 的模型间 κ 数字。

1. 机理精读

为什么单裁判不够。 一个 LLM 裁判给出的标签,混入了三种东西:

  • 真实类型学信号——我们想要的,可控;
  • prompt 引导的偏好——也想要的,可控(改 prompt 即可调);
  • 模型自身训练语料带来的「口味」——噪声,不可控。

当你只有一个裁判,无法把模型特异性误判(model-specific misclassification)从「这道题本来就难」里分离出来——两者在单裁判视角下长得一模一样。引入第二个独立模型相当于做一次方差分解:两个不同架构 / 不同训练数据的模型在同一条流水上分歧,说明该条 / 该类的判定本身模糊;两个模型一致地错,才可能是 prompt 或数据的系统性问题。这条「分歧 → 数据模糊、一致错 → 系统性问题」的判读规则,是今天引入 Qwen3 的全部价值所在。

模型间 κ 衡量什么。 Day 125 算的是「LLM vs 真值」的 κ——那是效度(validity,裁判准不准)。今天算的「DeepSeek-V4 vs Qwen3」的 κ 是另一个维度:信度 / 裁判间一致性(reliability)。两者可以背离:两个模型可能高度一致(κ 高)却一起偏离真值(都被 prompt 带偏);也可能各自接近真值但彼此分歧(不同错法)。把这两个 κ 并排看,才能判断「裁判层」是否可信。κ>0.6 才算实质一致这个经验阈仍然适用。

为什么是 Qwen3 而非再跑一遍 DeepSeek。 对照裁判必须是独立来源——换 temperature 再跑同一模型不算独立,因为系统偏差不变。选 Qwen3(经 OpenRouter)是因为它与 DeepSeek-V4 来自不同的训练管线,能暴露 DeepSeek 特有的盲区。这与 Day 124 选独立 LLM 而非「规则自当裁判」是同一条逻辑链的延伸:每加一层独立性,外部效度就更高一档。

GRPO 的类比(仅借思路,不做训练)。 seed 引的 GRPO(group-relative advantage,无 critic,arXiv:2402.03300)本是推理模型的 RL 训练方法。它的机制是:对每个 prompt 采样一组(group)答案,把每个答案的 reward 减去组内均值作为优势(advantage),用这个组内相对量替代单独的 critic 网络估值——省掉了 critic,又用「同一题多个采样的相对位置」来稳定梯度信号。

这里借的不是训练,而是它「用一组样本的相对位置来稳定信号」的思想:单个裁判像没有 critic 的单点估值,引入一组裁判(多模型)相当于用组内相对一致性给「这条判定有多可信」做一次无 critic 的方差估计。真实 GRPO 训练 = 待 GPU,本日不做训练,只做裁判稳定性类比。

推理模型(如 DeepSeek-V4-Pro 这类带 reasoning 的)在 layering 这种多跳推断上可能比纯快模型(V4-Flash)更稳——因为多跳过账的判定需要在交易序列上做链式推理,恰是 reasoning 模型的强项。这也是为什么把模型间分歧按 typology 拆开看很重要:全局一个 κ 会把「快模型在硬阈值类很稳」和「快模型在 layering 类抖」平均掉,掩盖真正需要换 Pro 模型的那一类。

三个 κ 的层级,必须分清。 这是 B13 最容易被绕晕的地方,列清楚:

  1. 模型间 κ(DeepSeek-V4 vs Qwen3,今天)——信度 / reliability:两裁判彼此多一致。高 ≠ 对。
  2. 模型 vs 真值 κ(Day 125)——效度 / validity:裁判对不对(真值来自 AMLSim 注入标签)。
  3. judge-human κ(≥50 手标)——裁判 vs 人类金标,是最终校准。这在 B13 里始终是 gated 的——需人工标注,本 block 不产出。

不要把「两个 LLM 一致」当成「裁判对了」的证据,那只是 reliability 不是 validity。一个反直觉但常见的情形:两模型 κ 很高(彼此一致),但它们都被同一个有偏 prompt 带偏,模型 vs 真值 κ 反而低——此时「裁判层」内部稳定却整体错位,只有同时看两个 κ 才能识破。

按 typology 拆分歧的意义。 不要只报一个全局模型间 κ,要逐 typology 看两模型在哪一类上分歧最大。预期:structuring(硬阈值类)两模型高度一致;layering / TBML(多跳/语义类)分歧大——后者正是 Day 127 要做 recall delta 归因的重点对象。某 typology 两模型分歧大,本身就是「该类判定规则模糊、真值可能有歧义」的早期信号,比等到 delta 表出来更早暴露问题。

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

src/aml/confusionMatrix.tssrc/agent/eval/cohensKappa.ts 已 BUILT+tested,今天复用它们处理 Qwen3 输出。代码走读要点:

  • confusionMatrix(items: Array<{label, predicted}>)(confusionMatrix.ts:28)是预测来源无关的:它只吃 {label, predicted} 对,不关心 predicted 来自规则、DeepSeek 还是 Qwen3。所以把 Qwen3 的 200 条预测喂进去,逻辑与 Day 123/126 第一套完全一致,这正是「解耦被测与裁判」在代码层的体现(文件头注释明确写了这点)。
  • labelsitems.flatMap([label, predicted]) 去重排序得到(confusionMatrix.ts:29)——所以即便 Qwen3 把某条判成了 typed.csv 里本不存在的标签,矩阵也会自动新增该列,不会静默吞掉错判。这对发现「模型幻觉出第六个 typology」很关键。
  • 每类的 recall = tp/supportprecision = tp/predictedAs(confusionMatrix.ts:44-45);support 是行和(真值=该类),predictedAs 是列和(被判为该类)。模型间对照时,两套矩阵的 support 必须相同(同 200 抽样、同真值),否则 recall 不可比。
  • cohensKappa(a, b)(cohensKappa.ts:22)吃两个等长标签数组。今天 a = DeepSeek-V4 的 200 条预测,b = Qwen3 的 200 条预测——注意两者都是预测,没有真值,算出的就是模型间 κ。函数对退化边距(两裁判都只用了同一个标签导致 pe==1)做了约定处理(cohensKappa.ts:48):完美一致返回 1,否则 0。
  • 若要带 CI,用 cohensKappaWithCI(cohensKappa.ts:53),它对 N 条配对做 B=2000 次 percentile bootstrap(cohensKappa.ts:64-75:每轮有放回重采样 N 条,重算 κ,最后取 2.5/97.5 分位)。N=200 时 CI 会比 Day 125 的小样本窄,但仍要报,避免对单次抽样过度解读。
  • bootstrap 的 RNG 可注入(opts.rng,cohensKappa.ts:56)——传固定种子的 RNG,CI 就完全可复现,这是把「带随机的统计量」写进可复现报告(Day 130)的关键。
  • percentile(cohensKappa.ts:85)对已排序数组做线性插值取分位,N=200、B=2000 时 CI 端点稳定,不会因单次 bootstrap 抖动。

手算一个 toy 例子说明模型间 κ,逐步写出 cohensKappa 的内部计算(对应 cohensKappa.ts:29-49):

  1. 设 200 条里两模型在 170 条标签一致 → 观测一致率 po = agree/n = 170/200 = 0.85
  2. 算边际分布。设 DeepSeek-V4(rater a)判出 120 条 normal、80 条某 typology;Qwen3(rater b)判出 130 条 normal、70 条 typology。
  3. 期望一致率 pe = Σ_c (c1[c]/n)·(c2[c]/n):normal 项 = (120/200)·(130/200) = 0.60·0.65 = 0.39;typology 项 = (80/200)·(70/200) = 0.40·0.35 = 0.14;pe = 0.39 + 0.14 = 0.53
  4. κ = (po − pe)/(1 − pe) = (0.85 − 0.53)/(1 − 0.53) = 0.32/0.47 ≈ 0.68 —— 实质一致(>0.6)。

对照反例:若两模型都重度偏向 normal(各判 180 条 normal),pe 会被推高到约 (180/200)² + (20/200)² = 0.81 + 0.01 = 0.82。同样 po = 0.85 时,κ = (0.85 − 0.82)/(1 − 0.82) = 0.03/0.18 ≈ 0.17,只算微弱一致。同样的裸一致率 0.85,κ 因边际基率不同从 0.68 跌到 0.17——这就是为什么不能只报 po。极不平衡(normal 占绝大多数)时,高一致率几乎全来自「都猜多数类」的偶然,κ 把这部分扣掉后才暴露真实裁判间分歧。

退化边距要小心:若某次抽样里两模型都只用了同一个标签(比如都判全 normal),pe 会等于 1,κ 的分母 1−pe=0 退化。函数对此的约定(cohensKappa.ts:48)是:完美一致返回 1,否则返回 0——这不是 bug,是 κ 在退化边距下的惯例处理,但它提示该次抽样信息量为零,应换更大/更均衡的样本。

按 typology 的两模型一致性预期表(先写假设,再用实测证伪/证实):

typology签名结构两模型预期一致性若分歧大说明
structuring贴线小额(硬阈值)prompt rubric 边界没说清
layering多跳过账图(推断)该类判定本身模糊 / 真值有歧义
mule_network扇入扇出(半图半阈值)看签名是否被阈值化
TBML贸易语义(强语义)两模型语义读法不同
normal无可疑签名一致大多来自「都猜多数类」

注意最后一行的陷阱:normal 类两模型高度一致,大部分是「都把没信号的判成 normal」的偶然一致,这正是 κ 要在全局层面扣掉的部分。

3. 今日实战

完整流水(pipeline)四步:

  1. 复用 Day 124 的 provider-agnostic runner,把 provider 切到 Qwen3(OpenRouter),对 agent-evals/amlsim/typed.csv同 200 抽样(与 DeepSeek-V4 用同一组 case_id,保证可配对)跑 typology 分类,落盘 {case_id, predicted_typology, reason} JSON。
  2. 把 Qwen3 输出整理成 {label, predicted} 对(label 取 typed.csv 真值列),喂 confusionMatrix() 出第二套 5×5 矩阵 + per-class recall/precision/F1。
  3. 把 DeepSeek-V4 的 200 条预测与 Qwen3 的 200 条预测按 case_id 对齐成两个等长数组,喂 cohensKappa()(或 cohensKappaWithCI())算模型间 κ。
  4. 按 typology 拆开看分歧最大的类——预期 layering/TBML 这类语义/图推断类分歧大,structuring 这类硬阈值类一致性高;对照上面的预期表,标出与预期相反的类作为 Day 127 归因的重点。

成本与模型 id 纪律:DeepSeek 侧用 deepseek-v4-pro / deepseek-v4-flash(参照 Day 124 真实成本基准 V4-Flash $0.0139/run;legacy deepseek-chat / deepseek-reasoner 2026-07-24 退役);Qwen3 经 OpenRouter,按其在架定价计;两轮跑批前先用 1-2 条 smoke 验 prompt 与解析无误,再放全量,避免 200 条跑废重花。

4. 今日实测 / 产出

  • src/aml/confusionMatrix.tssrc/agent/eval/cohensKappa.ts 工具均 BUILT+tested
  • LLM 5×5 矩阵 + 模型间 κ = 待跑(需 key 跑 Qwen3 + DeepSeek-V4 两轮),将产出第二套 5×5 混淆矩阵 + 1 个模型间 κ 数字。
  • 真实 GRPO 训练 = 待 GPU,本日仅借其 reward 稳定性思路类比裁判稳定,不做训练。
  • judge-human κ(≥50 手标)依旧 待跑(gated),本 block 不产出。

5. 常见误区 / 陷阱

  • 把模型间一致当成「对了」:两模型一致(高 reliability)只说明它们口味接近,可能一起偏离真值。validity 要看「模型 vs 真值」κ(Day 125),别混。
  • 两套矩阵抽样不同:Qwen3 必须跑与 DeepSeek 完全相同的 case_id 集,否则 recall 不可比、κ 无法配对。
  • 只报裸一致率 po 不报 κ:极不平衡下 po 几乎全来自「都猜 normal」,会把 0.17 的弱一致粉饰成 0.85 的高一致(见本日手算)。
  • 借 GRPO 借成了「跑了 GRPO 训练」:本日只做类比,不训练;任何 GRPO 训练数字都是臆造,真实 GRPO 训练待 GPU。
  • 对单次 200 抽样的 κ 过度解读:报 κ 时带 CI,N=200 不算大,typology 极不平衡下某些类的逐类 κ 仍可能很抖。
  • 退化边距误读:若某次抽样两模型只用了一个标签导致 κ 返回 0/1(cohensKappa.ts:48),那是退化处理而非真实一致性,应换更均衡样本。

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

按「方法论(Anthropic)→ 类比来源(GRPO)→ κ 经典 → 模型在架状态」四层组织:

  • Anthropic《Demystifying evals》(2026-01) — rubric + 枚举输出 + 裁判校准方法论,B13 主线。
  • DeepSeekMath / GRPO 论文 (arXiv:2402.03300, 2024-02) — group-relative advantage、无 critic 的 reward 稳定化思路(本日仅借类比)。
  • Jacob Cohen, "A Coefficient of Agreement for Nominal Scales" (1960) — Cohen's κ 原始定义,经典打底。
  • J. R. Landis & G. G. Koch, "The Measurement of Observer Agreement for Categorical Data" (1977) — κ 的强度分级经验阈(>0.6 实质一致)来源。
  • OpenRouter model catalog (2026-06 执行日查在架状态) — Qwen3 可用性与版本号需执行当周复查。

SOTA检查 (2026-06 更新)

  • 当前主流:Cohen's κ 衡量两裁判一致性、混淆矩阵给 per-class recall 仍是稳定经典度量,无替代;多裁判可进一步升级到 Fleiss' κ(≥3 裁判)。
  • 是否仍 SOTA:是。多模型对照裁判(model-as-judge ensemble)是 2026 主流去偏手段。
  • 过时黑名单:避免把单模型自评、或「同一模型换 temperature 再跑」当独立对照——系统偏差不变,不构成 inter-rater 检验。GRPO(2402.03300)训练机制仍现行,但不要把类比写成已训练
  • 模型 id 纪律:Qwen3 经 OpenRouter,执行日复查在架状态与具体版本号;DeepSeek 侧用 deepseek-v4-pro / deepseek-v4-flash(legacy deepseek-chat / deepseek-reasoner 2026-07-24 退役)。
  • 下次复查点:执行 Qwen3 跑批当周(需 key)重验 OpenRouter 在架模型 + DeepSeek-V4 模型 id;judge-human κ 待人工标注资源到位再开。

衔接

  • 昨天:Day 125 — LLM grader 接入 eval harness(单裁判对齐真值,算 LLM-vs-真值 κ)。
  • 今天:引入 Qwen3 第二裁判,用模型间 κ 衡量裁判间稳定性,把 reliability 与 validity 分离。
  • 明天:Day 127 — 规则 vs LLM 召回缺口分析(合并规则矩阵与 LLM 矩阵,逐 typology 算 recall delta)。