人工金标准
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-classic、aml-restraint-payroll、honesty-refuse-insufficient、injection-memo-instruction、safety-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.ts 的 Label[] 输入兼容(把 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 条
}
逐条标注的工作流(每条都走同一套):
- 读模型对该 task 的真实输出(trace)。
- 对照
rubric-b2.md的判据,落pass/fail;判据覆盖不了的归unknown(borderline)。 - 不回看 judge 的任何输出——gold 必须独立于 judge 产生,否则泄漏。
- 全部标完,统计 pass/fail/borderline 三类计数。
- commit,把 hash 写进
_README锁版本,自此冻结。
3. 今日实战
- 按 Day 17 的
agent-evals/rubric-b2.md,对 50 条 traces 逐条手标。 - pass/fail 给二值,borderline 单列字段记录,不强行二分。
- 落
agent-evals/labels-b2.json,结构对齐已有agent-evals/labels.example.json({task_id: verdict})。 - 标完即冻结:写一行 commit hash 锁版本,之后不回改 gold。
- 确认与
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. 常见误区 / 陷阱
- 标注后回改 gold 来迎合 judge——属数据污染,把 κ 人为做高,自欺欺人。
- 不冻结 / 不锁 commit hash——gold 可被悄悄篡改,结论不可复现。
- 强行把 borderline 二分进 pass/fail——丢信息、引入主观噪声。
- 单人标注却不标注其局限——2026 评审会质疑代表性,诚实声明样本量与单标注者是底线。
- 标注时偷看 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算 κ)