面向大模型后训练的 RLHF 与 SFT 数据
后训练数据是写出来的,不是标出来的。一条示范答案、一次在两个模型输出之间做出的偏好判断、一条针对线上行为的红队提示词——每一条都由人撰写,而模型能学到的上限,取决于这个人是否真的会做那件被示范的事,而不是取决于他能把它描述得多流畅。一条由「转述好答案大概长什么样」的人写出来的示范,和一条由真能给出那个答案的人写出来的示范,读起来一模一样——直到用它训练出来的模型,以与数据完全相同的方式出错。我们为这项工作配备的人,首先是会做这项任务的人,其次才是为模型写东西的人。
监督微调示范数据
一条监督微调示范就是一个做过的例题:给定这个输入,这就是我们希望模型模仿的回应。谁都能写出一个「听起来对」的回应——读着顺、语域得当、格式合规。但要写出一个真正正确的回应,前提是你做过底层那件事,或者至少足够接近它,能识破那种只是听起来正确的版本。我们用具备任务所需领域知识的人来做 SFT 工作,而不是让通才写手去生产「好答案大概会是什么样」,因为一条流畅而错误的示范不会显性地失败——它教会模型的是:流畅地、自信地、每次遇到同一模式时都以同样的方式出错。
偏好排序
偏好排序要求一个人在同一提示词的两个模型输出之间做选择,而这个选择只有在每次做出时含义都相同的前提下才有用。标注员未曾言明的个人品味,不是模型能够稳定学习的信号——它在不同标注员之间漂移,同一位标注员在一次工作时段内也会漂移。我们用评分标准来取代品味。
- 两两对比依据书面评分标准打分,而不是标注员当场临时发挥的偏好。
- 评分标准作为一份产出物做版本管理——每一次排序都可追溯到它所依据的确切标准版本,因此标准的变更不会悄无声息地重新解释此前做出的排序。
- 分歧率被追踪并对外报告,因为一份让两位标注员从不产生分歧的标准,通常并没有区分开那些真正重要的情况。
基于评分标准的评测
基于评分标准的评测,问的问题和偏好排序一样,但产出的是分数而非对比:这个具体输出有没有达到既定标准,没达到的话又差多少。我们把评分标准设计成让每位评分者、对每一个条目,都以同样的方式去应用——正是这一点让模型改动变得可度量,而不是停留在印象层面:把评测当作基础设施,而不是一次性的活动。我们在这里补上的是人力:以真实评测集所要求的规模去应用这套标准的人,并且一致到让分数的变动成为证据,而不是噪声。
红队测试
红队测试是对抗性的:由人有意去让线上模型出错,使用的正是一个有动机的用户迟早会用上的那些手法——换个说法重新包装请求、角色扮演、编码技巧、在一段对话中逐步升级。一次只产出「哪里出了问题」口头汇报的红队测试几乎毫无用处,因为没人能复现那次故障,也就无法验证某个修复是否真的堵住了它。
- 对抗性提示词针对模型实际的线上行为来测试,而不是照着一份与你的产品无关的通用越狱清单跑一遍。
- 每一项发现都写成可复现的用例:确切的提示词序列、确切的出错输出、确切违反了哪条行为准则。
- 用例被并入评测集,而不是归档成一份一次性报告,这样修复会对照当初击穿它的那个用例来验证,回归问题也会自动浮现,而不是等着被真实用户重新发现。
越南语与英语
多数双语标注项目栽在翻译上,而不是栽在标注上。规范先用英语写一遍,再翻译成越南语,从那一刻起,两个标注员池所依据的文档读起来就已经不同了——哪怕它们本意是要表达同一件事:某处歧义在英文规范里被这样化解,在越南语译本里却被那样化解,无声无息,直到数据集的两个语种部分彼此矛盾,而没人能把矛盾追溯回某个决定。多数双语项目就是在这里失败的。我们为两种语言配备的都是真正双语的标注员,而不是把翻译过的规范丢给单语标注员池,这样一个关于评分标准的疑问只需被化解一次,由一个能读懂两个版本、并确认它们含义依然一致的人来化解。本页所描述的示范数据、排序、评分标准与红队用例,会直接进入我们「大模型集成」页面上的微调与检索工作——这里产出数据,那里拿它去训练。
常见问题
- 标注员之间产生分歧时你们怎么处理?
- 上报,而不是取平均。由资深复核员依据评分标准裁定,裁定结果连同触发它的那个用例写入下一个版本的标准,好让下一位碰上同样歧义的标注员不必再争论一遍——而分歧率随时间的变化,则显示这份标准是否真的在收敛。
- 你们能找到领域专家吗?
- 能,针对那些「写对示范就必须具备领域知识」的方向——法律、医疗、金融,或是通才写手无法令人信服地伪装的技术任务。把领域和数据量告诉我们;如果我们配不好人手,我们会直说,而不是勉强凑数。
- 这和你们的大模型集成业务是什么关系?
- SFT 示范数据、偏好排序与评测集是输入;微调与检索增强生成则是它们所喂养的对象。实践中,这两者往往是同一个项目的两端——数据在这里构建,系统在那里训练与集成。

