把校准会议装上仪表
标注团队本来就在开规范化会议,也一直想知道标注者是怎么想的。多人协作房间用实时一致性指标度量校准会议;Think-Aloud 模式在本地记录出声推理,全程不需要 LLM。
有两件事,每个标注团队都做得不好,因为工具帮不上忙:一是校准会议,它在屏幕共享里发生,不留下任何痕迹;二是弄清标注者为什么选了某个标签,这通常退化成一个没人填的自由文本框。Potato 2.7 给这两件事都装上了仪表:一个带实时一致性指标的规范化协作房间,以及一个在本地跑语音转文字的出声思考记录器。 两者都不需要 LLM。
规范化会议
如果你带过两人以上的标注项目,你就开过规范化会议。所有人标同样的几条数据,然后大家上线开会,就分歧争论一番,最后在标注指南到底是什么意思上达成一致。
这套做法有效,但完全没有仪表。人们在讨论之前持有的判断消失了。谁改变了主意,以及改主意是因为被说服还是因为资深同事先发了言,也都消失了。至于这场会议究竟有没有提升一致性,没人答得上来,因为没人测过。
多人协作房间把这样的会议搬进工具里。
会议进行中的规范化房间
rooms:
enabled: true
who_can_create: any
persist_votes: true
schema: sarcasm打开 /rooms 创建一个房间,它会得到一个六位字母的房间码,你可以在通话里念出来。整个流程是刻意设计的:
- 所有人盲投。 成员能看到谁投过票,但永远看不到投了什么。这一点由服务端强制执行,因此第一印象是真正独立的。
- 主持人揭晓。 这一刻,盲投结果就固定下来,不可更改。
- 大家讨论,在侧边聊天框里或在你们的通话中。
- 任何人都可以改票。 揭晓之后的每一次改动都会记录下来,包括从什么改成什么,以及当时的多数意见是什么。
揭晓之后的改票和一次投票不是同一类事件;它是在已知多数意见的情况下发生的改变。把它记录下来,你就得到了一份逐人的从众记录,也就能注意到某位标注者每一次都会倒向多数。在你把他们的一致性当作独立证据之前,这一点值得知道。
一致性指标
Krippendorff's α 会在已揭晓的数据上实时计算两次:一次基于盲投,一次基于当前投票。两者之间的差距就是这场会议的规范化增益,并且会在会议进行时显示在屏幕上。
如果一小时的讨论把 α 从 0.61 推到 0.78,这一小时买到了东西。如果只从 0.61 挪到 0.62,那么分歧出在标注指南本身而不是理解方式上,再谈下去也解决不了。去把指南重写一遍。
有两种变体值得了解。碰头房间会直接用团队当前存在分歧的数据来填充房间,这些数据是从标注状态实时算出来的,因此它相当于一个同步版的裁定流程。旁观房间让新人实时观摩资深标注者工作,连他们正在高亮哪一段文本都能看到。这是最接近于坐在别人旁边看他们标注的体验。
房间采用事件溯源写入 JSONL 日志,因此一个正在进行的房间能挺过服务器重启,而这份日志同时也是本次会议的审计轨迹。整个过程不涉及 WebSocket;客户端用游标轮询,这意味着房间在任何 WSGI 部署下都能工作。
理由
另一个缺口是理由。多数工具提供一个自由文本框,而多数标注者在里面写"显而易见",或者干脆不写。
把推理写出来比在脑中想一遍要慢得多,而当任务长达 400 条时,理由框是第一个被放弃的东西。
Think-Aloud 模式通过换一种模态来消除这层阻力:标注者一边工作,一边直接说出来。
Think-Aloud,附带检测到的标签
thinkaloud:
enabled: true
schema: politeness
model: tiny.en语音转文字通过 faster-whisper 在本地运行,用 39 MB 的 tiny.en 模型即可在 CPU 上达到实时速度。音频不会离开这台机器,既不需要调用云端接口,也不产生按 token 计费的账单。对很多敏感数据来说,这就是"我们能用"和"法务不批"之间的区别。
早在这一切被计算化之前,出声思考法就已经是研究人如何做决策的标准方法。它一直没有进入标注工具,因为让人对着录音设备叙述、再手工转写,不是任何人能长期坚持的工作流。
逐字转写稿
转写稿完全按说出来的样子保存,并刻意不做摘要,因为对出声思考记录做转述会污染这份材料。那些迟疑、自我更正、"嗯,它可能是讽刺,不过……"——这些正是数据本身。把它整理成一份干净的摘要,得到的是另一种、也远没那么有用的东西。
标注者还可以用语音提交标签,使用一套由规则解析器识别的固定说法:
- "I label this Polite"
- "My answer is impolite"
- "Final answer: neutral"
只有这些说法会触发提交。在思考过程中说的一切都会被忽略,这正是规则解析器足够用的原因。整条流水线里没有任何 LLM,也没有任何模型来判断你是什么意思。之后再说一个新的短语,以最后一次提交为准。
你还会得到确定性的迟疑信号(静音片段计数、填充词计数),它们是用算术算出来的,不依赖模型。在某条数据上停顿很久,是难度的一个不错的代理指标,而采集它不花任何成本。
人与模型的思维链
Think-Aloud 是一个人类思维链记录器。它捕捉的是一个人实际推理到某个标签的过程:不是事后写下的整理版说明,而是推理发生时的样子,连中途走岔的部分都在。
Potato 的过程奖励标注对模型做同样的事:把模型的思维链切分开,并逐步打分。
同一条数据,两条思维链,一条来自人,一条来自模型。你可以把它们并排放在一起,看看推理在哪里分道扬镳。这种配对是构建更好的过程奖励数据的原材料,因为"模型因为错误的理由得出了正确答案"正是只看最终答案的评分看不见的失败。
Potato 提供两种采集界面,但不会替你计算两者之间的差异。那是一个研究问题而不是一项功能,我们宁可把材料交到你手上,也不愿给你一个我们自己编出来的指标。