心理测量学引擎
把项目反应理论用到标注上。每个标签拿到的不再是一个光秃秃的多数票,而是一个后验概率加一段置信区间,而且模型既不需要黄金标签,也不需要 LLM。
v2.7.0 新增
Potato 可以把你的标注研究当成它本来的样子来对待:一件测量工具。心理测量层会在标注不断进来的过程中实时拟合一个项目反应理论(IRT)模型,同时估计每个条目真实标签的概率、每位标注者带标准误的能力、每个条目的难度,以及一个按条目给出的区分度诊断量,用来标出可能的标注手册问题。
它不需要黄金标签,也不涉及 LLM。这个模型是 GLAD 的多分类推广(Whitehill et al. 2009),全部信息都从一致性的模式本身自举出来,就像一场标准化考试不需要谁来宣布,也能学出哪些题目难。拟合是确定性的,在标注研究这个规模上只需毫秒级时间。

配置
# Adaptive routing is opt-in via the standard assignment strategy key.
# Omit this line to keep your existing strategy and use psychometrics
# as a pure analytics layer.
assignment_strategy: psychometric
# Give items a redundancy target so early-stopped items translate into
# concrete saved judgments on the dashboard.
num_annotators_per_item: 4
psychometrics:
enabled: true
schema: sarcasm # scheme to model; default: first radio/likert scheme
refit_interval: 5 # refit after this many new labels (fits are ~ms)
min_observations: 20 # cold-start gate before adaptive routing engages
min_annotators_per_item: 2 # never early-stop an item below this many annotators
confidence_threshold: 0.95 # posterior at which an item counts as resolved
cost_per_judgment: 0.08 # optional: expresses savings in currency
discrimination_flag_threshold: -0.2 # codebook-bug flag sensitivity支持的方案是单选的分类方案:radio 和 likert(likert 的各档被当作名义类别处理)。多选方案不建模。
带误差棒的标签
导出里写的不再是 sarcastic (2 of 3 votes),而是 sarcastic, p = 0.94 [0.88 – 0.97]。这个概率是模型后验,权衡的是谁投的票,而不只是投了多少票;区间则是在能力估计上做 ±1 标准误的敏感性带。
到了下游,你可以用软标签训练、把评测集筛成高置信度的条目,或者把低概率条目当作真正有歧义的样本而不是噪声。互补的做法是直接从标注者那里收集分布,见软标签标注。
标注者能力,如实呈现
能力 θ 是从一致性模式估计出来的。1.0 是新标注者的先验值,0 表示他们的标签不携带任何信息,负值表示系统性地做错。每个估计值都带标准误:只标了 12 条的标注者,误差线就很宽,仪表板会照实显示。
不要根据一根很宽的误差线做人事决定。这些标准误是近似的(众数处的 Fisher 信息量),并且按其构造方式会略偏乐观。
标注手册问题检测器
条目难度是和能力联合估计出来的,但更有用的信号是区分度:在每个条目上,标注者能力与答案正确性之间的相关。
当区分度明显为负,也就是最好的标注者恰恰是那些不同意多数意见的人,那么在这个条目上出问题的通常是指南本身有错或有歧义,而不是标注者。仪表板会把这些条目集中列在“可能的标注手册问题”下面。先把说明改好,再回头看。团队通常会去多人协作房间里解决它们。
自适应路由
设了 assignment_strategy: psychometric 之后,当标注者来要活儿时,剩余条目会按这位标注者标注这个条目所能带来的一步期望信息增益精确排序。不确定性高的条目优先给能力高的标注者;后验已经超过 confidence_threshold(且至少有 min_annotators_per_item 位标注者)的条目则不再消耗预算。相对于固定的每条目 N 人设计,省下来的判断会被统计到仪表板上,如果设了 cost_per_judgment 还会折算成钱。
两点运行上的注意:
- 冷启动。 在标签数达到
min_observations之前,分配会退回随机,因为模型需要标注者之间有重叠才能把能力和难度分开。这个阶段仪表板上会显示一个预热进度条。 - 批量。 分配发生在用户队列补货的时候。队列越短,排序就越新鲜;每人一次取很大一批会稀释自适应的效果。
花钱之前先做功效分析
每个标注项目都在猜“每个条目要几位标注者”。研究设计器用一次带随机种子的蒙特卡洛模拟来回答:
python -m potato.psychometrics.design --items 500 --accuracy 0.75 \
--classes 3 --target-ci 0.10 --cost 0.08ann/item alpha 95% interval width majority acc judgments cost
2 0.392 [ 0.330, 0.439] 0.109 0.751 1000 80.00
3 0.388 [ 0.338, 0.431] 0.093 0.864 1500 120.00 <- recommended
推荐值是让 Krippendorff's α 的 95% 区间窄于 --target-ci 的最小冗余度,也就是仍能给出一个站得住脚的精确一致性估计的最便宜设计。--accuracy 这个输入最好用一次小规模试标来测。同样的分析也可以在仪表板上做,或者通过管理员 API(GET /psychometrics/api/design)调用。
你也可以用标注功效计算器在浏览器里交互式地跑一遍。
端点
所有端点都需要管理员权限(RBAC VIEW_ADMIN_DASHBOARD;调试模式和共享的管理员 API key 也能通过)。
| 端点 | 用途 |
|---|---|
GET /psychometrics/dashboard | 实时仪表板 |
GET /psychometrics/api/stats | 仪表板聚合数据(会强制重新拟合) |
GET /psychometrics/api/export | 增强导出:后验、区间、能力值 |
GET /psychometrics/api/design | 功效分析 |
它和 MACE 的关系
Potato 同时还提供 MACE,用来在事后分析中估计标注者能力和预测标签。两者是同一支文献里的表亲,但干的活不一样。
| MACE | 心理测量学 | |
|---|---|---|
| 标注者模型 | “知道”还是“猜” 的二元能力 | 带标准误的连续能力值 |
| 条目模型 | 无 | 难度 + 区分度(标注手册问题标记) |
| 何时运行 | 每 N 条标注后的批量分析 | 实时,就在分配循环里 |
| 是否驱动分配 | 否 | 是,通过信息增益路由和提前停止 |
| 标签上的不确定性 | 熵 | 后验概率 + 敏感性区间 |
| 研究开始前的规划 | 无 | 蒙特卡洛功效分析 |
想在任意分类方案上快速看一眼能力,用 MACE(它还支持 multiselect)。想要顾及难度、并且在研究进行当中就发挥作用的测量,用心理测量学。
问题排查
- 仪表板一直显示“预热中”。 模型至少需要两种不同的标签,以及有重叠的标注者。只有一位标注者或标签完全一致时,拟合按定义就是退化的。加标注者,或者调低
min_observations。 - 设了
assignment_strategy: psychometric,但路由看起来是随机的。 那是冷启动时的回退。看一下预热进度条和min_observations。 - 所有能力值都接近 1.0,误差线还很宽。 重叠还不够。随着标注者积累起共同标注的条目,能力值会逐渐分开。
/psychometrics/...返回 404。 配置里缺了psychometrics.enabled: true这个块。
延伸阅读
- Truth Serum —— 同伴预测打分,另一种不需要黄金标签的质量信号
- 任务分配策略
- 标注者间一致性
- 你需要多少位标注者?
- 源代码文档