返回 AICAP-180
B2 · Day 18attention/decoder/KV + judge 校准

人工金标准

Day 17 我们认定「judge 不校准就不可信」,并备好了 rubric 与 50 条待标清单。今天动手把那 50 条标成人工金标准(gold label)。

阶段: B2 · attention/decoder/KV + judge 校准(Day 11-20) 标签: #gold-labels #annotation #data-hygiene #eval-discipline

今日导引(由浅入深)

Day 17 我们认定「judge 不校准就不可信」,并备好了 rubric 与 50 条待标清单。今天动手把那 50 条标成人工金标准(gold label)。

这是整个评测体系的地基:没有冻结的 gold,Day 19 的 judge-human κ 就无从算起,Day 20 的 bootstrap CI 也无对象。

这是 B1→B18 能力曲线里「会怀疑 eval → 会亲手造可信参照」的落地动作。在 judge 校准三连里,Day 17 定义判据、Day 18 产出标签、Day 19 用标签校准——今天是中间那块承重墙。今天的纪律比手速更重要:先校准、显式归档 borderline、标完即冻结。

今日最小可判定产出labels-b2.json,≥50 条 gold labels(含 borderline 计数),结构对齐仓库现成示例。

1. 机理精读

gold label 是评测的地基——一切 judge 分数、κ、CI 都是相对这套人工标签来度量的。如果地基本身松动,上层数字全是幻觉。所以标注不是「随手打标」,而是一套有纪律的流程。三条要点:

标注前先校准标注者一致性:在开标前对齐对 rubric 的理解(哪怕单人标注,也要先小批试标、回看判据),否则标准漂移会把噪声混进 gold。漂移的典型表现是「前 10 条的 pass 门槛和后 10 条不一样」——这会让 gold 内部自相矛盾,κ 失去参照价值。

borderline 案例显式归档,不强行二分:模糊样本单列字段,不硬塞进 pass/fail。强行二分会引入标注者主观噪声,且掩盖任务本身的判据空白。borderline 的计数本身就是一个有价值的信号——它衡量任务定义有多清晰:borderline 占比高,说明 rubric 还不够锋利,需要回炉,而不是硬判。

标注完成后冻结 gold label,不再回改:冻结是为了防数据泄漏与事后调参。一旦允许「跑完 judge 再回头改 gold 来迎合 judge」,κ 就被人为做高,等于自欺——这是评测里最隐蔽也最致命的污染。冻结后用一行 commit hash 锁版本,让 gold 可追溯、不可悄悄篡改。这条纪律的本质是把 gold 当作「实验前就固定的对照组」,而非「可以随结果微调的活变量」。

设计权衡:单人标注成本低但代表性弱;2026 趋势是多标注者 + 仲裁,能在标注阶段就量化标注者间一致性、用仲裁消解分歧。但本块在资源约束下用单人标注,必须诚实标注其局限(样本量、单标注者、无仲裁)。这与本套笔记一贯的诚信底线一致——不把局限藏起来包装成「权威 gold」。本日延续 Anthropic《Demystifying evals》(2026-01) 的 gold-set 纪律。

与相邻概念的边界:Day 17 定义「判据」(rubric),Day 18 应用判据产出「标签」(gold),Day 19 才拿 gold 去校准 judge。三者是流水线,顺序不能乱——尤其 gold 必须先于任何 judge 跑分冻结,否则泄漏。把顺序记牢:定义 → 标注 → 冻结 → 校准。

三条纪律对应的失败模式速查:

纪律            | 违反后果                    | 检测信号
----------------+-----------------------------+------------------------
先校准          | gold 内部自相矛盾           | 前后段 pass 门槛不一致
borderline 单列 | 模糊样本被强判,引噪声      | borderline 计数=0 却任务模糊
标完即冻结      | 事后改 gold 迎合 judge      | gold 文件晚于 judge 跑分被改

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

本日是人工标注日,无新算法。走读仓库现成结构 agent-evals/labels.example.json(真实文件,已 Read 确认),它定义了 gold label 的落盘格式:

  • 顶层是一个 JSON 对象,KEY = task id(对应 src/agent/eval/tasks.ts 里的任务标识,如 aml-structuring-classicaml-restraint-payrollhonesty-refuse-insufficientinjection-memo-instructionsafety-hitl-sar)。
  • VALUE = 人工对该任务模型输出的判决,取值 'pass' | 'fail' | 'unknown'
  • _README 字段说明用法:复制此文件为 agent-evals/labels.json(由 pnpm eval:agent 加载),跑一次 eval、逐条读输出、再记录人工结论;目标 ≥50 条让 κ 的 CI 收紧;不匹配 task id 的键(如 _README)被忽略。

也就是说,labels-b2.json 沿用这套 {task_id: verdict} 结构即可,与 src/agent/eval/cohensKappa.tsLabel[] 输入兼容(把 50 条按固定顺序取 value 排成数组喂入 cohensKappa/cohensKappaWithCI)。borderline 在二值 pass/fail 之外单列——示例里的 unknown 即可承载此语义,既不污染二值标签,又把模糊样本显式记下来。

为什么目标是 ≥50 条?因为 κ 的 bootstrap CI 宽度大致随 1/√N 收窄(Day 20 详述):N 太小,CI 宽到「差」与「很好」并存,根本下不了结论。50 是经验门槛——这就是 _README 里「Aim for >=50 labels so the Cohen's kappa CI is tight」的统计动机。

labels-b2.json 的目标结构示意(沿用 example 的 {task_id: verdict} 形态):

{
  "_README": "B2 frozen gold labels — DO NOT edit after commit <hash>",
  "aml-structuring-classic": "pass",
  "aml-restraint-payroll": "pass",
  "honesty-refuse-insufficient": "fail",
  "injection-memo-instruction": "pass",
  "safety-hitl-sar": "unknown"   // borderline 用 unknown 单列,不强行二分
  // ... ≥50 条
}

逐条标注的工作流(每条都走同一套):

  1. 读模型对该 task 的真实输出(trace)。
  2. 对照 rubric-b2.md 的判据,落 pass / fail;判据覆盖不了的归 unknown(borderline)。
  3. 不回看 judge 的任何输出——gold 必须独立于 judge 产生,否则泄漏。
  4. 全部标完,统计 pass/fail/borderline 三类计数。
  5. commit,把 hash 写进 _README 锁版本,自此冻结。

3. 今日实战

  1. 按 Day 17 的 agent-evals/rubric-b2.md,对 50 条 traces 逐条手标。
  2. pass/fail 给二值,borderline 单列字段记录,不强行二分。
  3. agent-evals/labels-b2.json结构对齐已有 agent-evals/labels.example.json{task_id: verdict})。
  4. 标完即冻结:写一行 commit hash 锁版本,之后不回改 gold。
  5. 确认与 src/agent/eval/cohensKappa.ts 输入格式兼容,为 Day 19 算 κ 直接接入。

4. 今日实测 / 产出

  • 状态:待建(人工标注)
  • 产出:agent-evals/labels-b2.json≥50 条 gold labels(含 borderline 计数)。
  • 结构沿用仓库现成 agent-evals/labels.example.json,与 src/agent/eval/cohensKappa.ts 输入格式兼容。
  • 本日不产生 κ 数值(κ 在 Day 19 跑出)。

冻结后的 labels-b2.json 是 Day 19/20 唯一的「真值锚点」:judge 跑出的机器标签好不好,全靠和这套 gold 比 κ。所以本日的产出质量直接决定后两天结论的可信度——gold 标得草率,再漂亮的 κ 也是建在流沙上。这也是为什么本日纪律(校准/borderline/冻结)比标注速度更重要。

5. 常见误区 / 陷阱

  1. 标注后回改 gold 来迎合 judge——属数据污染,把 κ 人为做高,自欺欺人。
  2. 不冻结 / 不锁 commit hash——gold 可被悄悄篡改,结论不可复现。
  3. 强行把 borderline 二分进 pass/fail——丢信息、引入主观噪声。
  4. 单人标注却不标注其局限——2026 评审会质疑代表性,诚实声明样本量与单标注者是底线。
  5. 标注时偷看 judge 输出——gold 失去独立性,等于把 judge 的偏差抄进 gold,κ 虚高。

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

  • Anthropic, Demystifying Evals (2026-01) — gold-set 纪律的权威来源:校准、冻结、防泄漏。
  • 仓库文件 agent-evals/labels.example.json — 本日 gold label 落盘的真实结构模板。
  • Krippendorff, K., Content Analysis: An Introduction to Its Methodology(经典,多标注者一致性方法论)— 2026 趋势:多标注者 + 仲裁的理论基础。
  • 仓库文件 src/agent/eval/tasks.ts(task id 来源,与 gold label 的 KEY 对接)— 标注对象的任务定义。

SOTA检查 (2026-06 更新)

  • 当前主流方案:人工 gold + 冻结纪律是 eval 永恒地基,不过时。
  • 是否仍 SOTA:是;2026 趋势在其上叠加多标注者 + 仲裁,单人标注需诚实标注其局限。
  • 过时黑名单:避免标注后回改 gold 来迎合 judge(数据污染);避免不冻结/不锁版本;避免把单人标注包装成权威 gold 而不声明局限。
  • 下次复查点:2026-Q3 评估是否引入第二标注者 + 仲裁流程,以及 Krippendorff's α 作为多标注者一致性指标的采纳情况。

一句话收束

gold label 是评测里唯一不能「用模型生成」的东西——它必须由人对照明确判据产出、并在任何 judge 跑分之前冻结。本日没有 κ、没有 CI,只有一份诚实标注、锁了版本的 50 条人工判决,但这正是后面所有数字得以成立的承重墙。

衔接

  • 昨天:Day 17 — LLM-as-a-Judge 偏差(三类系统性偏差 + rubric 备好)
  • 今天:手标 ≥50 条 gold,遵守校准/borderline 归档/冻结防泄漏三纪律。
  • 明天:Day 19 — judge-human κ(用 Qwen3 当 judge 跑同 50 条,喂 cohensKappaWithCI 算 κ)