2026-10-17
Benchmark 与金标:术语地图和一套可执行的标注方案
这篇解决什么问题
做抽取类任务(从文档、代码里抽结构化标签)时,有两件事最容易被含糊带过:**"金标"到底指什么,以及一个 benchmark 究竟由哪些部件组成**。含糊的后果很具体——报告里的 precision 和 recall 其实是在拿模型输出跟另一份模型输出比(循环论证),或者用测试集调完 prompt 再报测试集分数(数据泄漏)。
这篇先把术语钉死,再给一套能直接执行的标注方案:分层抽样、双标盲标、算一致性、仲裁、逐字段算指标、冻结测试集。
一、什么叫"金标"
"金标"是 gold standard 的中文叫法,最早来自医学:有一种被公认最可靠的检查,作为判断其他检查准不准的参照。
在 NLP 和 benchmark 语境里,它通常指:
由人按明确规范标注、并对分歧做过仲裁的一批参考标签,用来评价模型输出,而不是由模型自己生成。
更严谨的称呼是 reference standard(参考标准)或 adjudicated labels(仲裁后标签),而不是 ground truth。原因很简单:人的标注也不是绝对真理,只是当前可复核的参考。写论文时用"ground truth"容易被审稿人抓——你凭什么说它是 truth?
三个层次要分清:
| 类型 | 谁产的 | 能用来干什么 | 不能用来干什么 |
|---|---|---|---|
| 模型标签 | LLM 或规则抽取 | 发现、建图、召回、预筛 | 当评测真值 |
| 银标(silver labels) | 模型 + 启发式自动生成 | 预训练、弱监督、扩充候选 | 当评测真值(会循环论证) |
| 金标(gold labels) | 人逐条判定 + 分歧仲裁 | 算 precision/recall、比较 prompt 与模型、报论文 | 声称是绝对真理 |
二、术语地图
1)数据与集合
| 名词 | 含义 | 落到具体任务上 |
|---|---|---|
| task | 要模型做的事 | 从 SKILL.md 与代码里抽访问效果 |
| dataset | 一批样本 + 标签 | 几百个 Skill 的抽取结果 |
| train / dev / test | 训练 / 开发 / 测试划分 | 不训练模型时,dev 调 prompt,test 只报结果 |
| held-out / frozen test set | 留出 / 冻结测试集 | 先冻结 60 个样本,调 prompt 期间不许看 |
| data leakage | 测试信息泄漏进调参 | 用 test 改完 prompt 再报 test 分数 |
| sampling frame | 抽样框:从哪个总体抽 | 全部 Skill,或某个主题的候选池 |
2)标注与质量
| 名词 | 含义 |
|---|---|
| annotation | 人给样本打标签 |
| annotator | 做标注的人 |
| annotation guideline / codebook | 标注规范:字段定义、边界案例、正反例 |
| annotation unit | 标注单元:一条样本标什么(一条记录?一个文件?一条边?) |
| double annotation | 两个人独立标同一批样本 |
| adjudication | 两人不一致时讨论,或由第三人定最终标签 |
| inter-annotator agreement | 标注者一致性 |
| Cohen's κ | 两个标注者、类别标签的一致性,扣掉随机一致的部分 |
| Krippendorff's α | 多标注者、多标签、缺失值场景下更通用的一致性指标 |
| adjudicated gold | 分歧解决后的最终标签 |
| silver labels | 模型或规则生成的标签,不是金标 |
关于 κ 的两个实操提醒:
- 经验分档(Landis & Koch):0.41–0.60 中等,0.61–0.80 较好,0.81 以上几乎完全一致。低于 0.6 通常说明规范写得不够清楚,而不是标注者不行。
- 别只报一个总体 κ。对"字段抽取"这类任务,逐字段算 κ 才有诊断价值:整体 0.8 可能掩盖了
target字段只有 0.45 的事实。
3)评价指标
| 名词 | 含义 |
|---|---|
| positive / negative | 正例 / 负例,例如"确有该访问" vs "没有" |
| TP / FP / FN / TN | 真阳 / 假阳 / 假阴 / 真阴 |
| precision | 模型说有的里面有多少是真的:TP/(TP+FP) |
| recall | 真的里面模型找到了多少:TP/(TP+FN) |
| F1 | precision 与 recall 的调和平均 |
| confusion matrix | 每类判对判错的分布 |
| micro / macro | micro 按样本汇总;macro 先按类算再平均 |
| precision@k / recall@k | 排序任务里前 k 个的精确率 / 召回率 |
| field-level / exact match | 逐字段比对:资源类型、操作、细节、对象分别算 |
| evidence faithfulness | 引用的原文是否真的支持该标签(不是"存在"就算) |
| coverage | 覆盖了多少样本 / 文件;空标签和缺失要单列 |
| calibration | 模型置信度与真实正确率是否匹配(ECE、Brier) |
这里有两个容易被忽略的口径问题:
- **空标签不是"没有标签"**。模型输出空集,可能是"确实没有效果",也可能是"漏标了"。这两者在指标上完全不同,必须让标注者显式区分,否则 recall 会算错。
- evidence faithfulness 要单独报。标签抽对了但引文不支持,说明模型在编理由;这类错误在只看 F1 时完全看不见。
4)Benchmark 的组成
一个 benchmark 不只是一个数据集,通常包括:
- 任务定义:输入什么、输出什么、允许什么、禁止什么;
- 数据集 + 划分:dev / test、冻结版本、版本号;
- 评价指标:precision / recall / F1、κ、faithfulness 等;
- 评测协议:怎么跑、跑几次、怎么报置信区间;
- baseline:简单规则、旧版本、论文方法;
- ablation:去掉某个模块看指标变化;
- oracle / human ceiling:理论上限或人工水平,用来解释差距;
- leaderboard / SOTA:排行榜与当前最好结果(学术场景)。
缺了"评测协议"和"baseline"的,通常只能叫数据集,不能叫 benchmark。
5)统计与实验
- random sampling:随机抽样;
- stratified sampling:分层抽样(按空标签 / 非空、含代码 / 纯文档、资源类型分层);
- sample size:样本量,太小则结论不稳;
- confidence interval:置信区间,例如 precision 的 95% CI;
- bootstrap:重采样估计 CI,适合非正态指标,也是小样本下最省事的做法;
- significance test:显著性检验,判断两个 prompt / 模型是否真的不同;
- pre-registration:先冻结假设、指标、样本,再看结果,防止"先看结果再编指标"。
三、金标怎么建:五步
先区分两类金标,别混在一起:
- 标签金标:人检查"这条样本有没有这个标签、字段对不对";
- 链条金标:人判断"这条组合是否真实、是否值得复核",或者用运行时轨迹作为行为真值。
先做第一类。下面以"从 Skill 文档与代码里抽访问效果(edge)"为例,这是最近在做的任务。
第 1 步:定义标注单元与字段
以一条 edge 为单元,人逐条判断:
- 是否存在这个效果:是 / 否 / 证据不足;
resource_type是否正确;operation_type与operation_detail是否正确;target是否准确;evidence是否真的支持这个效果;- 是否漏掉了明显效果(漏标)。
"证据不足"必须单列——把它硬塞进"否"会让 recall 虚高。
第 2 步:分层抽样
从总体里分层抽 60 个 Skill:
- 20 个空标签;
- 20 个含代码 / 脚本;
- 20 个纯文档且非空标签;
- 覆盖不同资源类型(FILE / NETWORK / DATASTORE / MESSAGE / PROCESS 等)。
这样每个分层都有自己的样本量,能分别报指标;否则一个 90% 都是"空标签"的集合,accuracy 会好看得没有意义。
第 3 步:双标 + 仲裁
- 两个人独立、盲标:不先看模型标签,避免确认偏误;
- 先共同标 5 个样本做校准,把规范里含糊的地方补进 codebook;
- 全量双标后,逐字段算 Cohen's κ;
- 不一致的样本讨论,必要时第三人仲裁,形成最终金标。
只有一个人标,就无法估计一致性,也无法知道金标本身有多 noisy。
第 4 步:评模型
- 按 skill + edge 把模型标签与金标对齐;
- 报每个字段的 precision / recall / F1(micro 为主,macro 作参考);
- 单列 evidence faithfulness、空标签准确率、漏标率;
- 用 bootstrap 报 95% CI;
- 做错误分类:漏访问、操作错、对象错、引文不支持、过度标注。
错误分类比总分有用得多:它能直接告诉你下一版 prompt 该改哪里。
第 5 步:冻结与使用
- 把金标 JSONL、标注规范、抽样清单、版本号一起冻结;
- test 集只用于最终报告,不允许拿它调 prompt;
- 以后比较模型、prompt 版本、代码感知抽取,都用同一个 test 集。
四、九个常见坑
- 只标容易的样本:高估模型;
- 标注者先看模型输出:被带偏,一致性虚高;
- 只有一个人标:无法估一致性,金标噪声不可知;
- 只算 accuracy:类别不平衡时会骗人;
- 把模型标签当金标:循环论证;
- 用 test 调 prompt:数据泄漏;
- 没有仲裁:金标本身就是噪声源;
- 样本太小、不报 CI:结论不稳;
- 把标签金标和链条金标混在一起:指标口径混乱,数字没法解释。
五、一句话总结
金标 = 人按规范、双标、仲裁后得到的参考标签集;benchmark = 任务 + 数据划分 + 指标 + 评测协议 + 基线。
第一步不需要很大的 benchmark:60 个样本的分层金标 + 双标 κ + 逐字段 P/R/F1 + evidence faithfulness,就足以判断当前抽取方式靠不靠谱,并给后续 prompt 与代码感知改进提供基线。