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:先冻结假设、指标、样本,再看结果,防止"先看结果再编指标"。

三、金标怎么建:五步

先区分两类金标,别混在一起:

  1. 标签金标:人检查"这条样本有没有这个标签、字段对不对";
  2. 链条金标:人判断"这条组合是否真实、是否值得复核",或者用运行时轨迹作为行为真值。

先做第一类。下面以"从 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 与代码感知改进提供基线。