3、奖励模型设计:单轮 vs 多轮奖励建模、序列级奖励、片段级奖励
奖励模型,说白了就是给AI的回复打分。
单轮对话里,打分很简单——你问一句,它答一句,好就是好,坏就是坏。但到了多轮对话,事情就复杂了。我刚开始做多轮对齐时,踩过一个坑:把每一轮回复单独打分,结果模型学会了「每轮都讨好用户」,反而忽略了对话的整体走向。
为什么会这样?因为多轮对话的「好」,不是每一句都好,而是整段对话下来,用户觉得舒服、问题被解决了。所以奖励模型的设计,必须从单轮思维跳出来。
3.1 单轮奖励建模:基础但不够用
单轮奖励模型,输入是(query, response),输出一个标量分数。这是最经典的做法,也是RLHF论文里最早用的方案。
核心公式:
reward = R(query, response)
其中R是一个神经网络(通常是Transformer),在人类偏好数据上训练。
我在项目中遇到过一个问题:单轮模型在客服场景下表现还行,但一旦进入多轮任务(比如订机票、故障排查),它就「失忆」了。模型会重复问已经确认过的信息,因为每一轮它只看到当前的问题和回答。
我的建议:单轮奖励模型适合「一问一答」的简单场景,比如知识问答、翻译。但别指望它能处理多轮上下文。
3.2 多轮奖励建模:上下文是关键
多轮奖励模型,输入是整个对话历史(query_1, response_1, query_2, response_2, ..., query_t, response_t),输出当前轮的奖励分数。
嗯,这里要注意:多轮模型不是简单地把历史拼起来。我见过有人直接把所有轮次拼接成一个长序列,结果模型在长文本上表现很差。正确的做法是:
- 使用位置编码:让模型知道每一轮的顺序
- 轮次分隔符:比如用
[SEP]或<turn>标记 - 注意力掩码:限制模型只关注相关轮次
我曾经踩过一个坑:没有做注意力掩码,结果模型把第1轮的用户情绪和第5轮的回复关联起来,完全不合理。
避坑指南:多轮奖励模型的训练数据,必须包含完整的对话历史。如果只给当前轮和上一轮,模型学不到长期依赖。
3.3 序列级奖励 vs 片段级奖励
这是多轮奖励建模里最核心的区分。我花了不少时间才搞明白两者的区别。
| 类型 | 输入 | 输出 | 适用场景 |
|---|---|---|---|
| 序列级奖励 | 整段对话 | 一个总分 | 任务完成型(订票、客服) |
| 片段级奖励 | 对话中的子序列 | 每个片段一个分 | 长对话、阶段性反馈 |
序列级奖励,说白了就是给整段对话打一个分。比如用户说「帮我订一张去北京的机票」,经过5轮对话后成功订到,那么整段对话得高分。如果中途用户生气了,整段对话得低分。
我建议在任务完成型场景下优先使用序列级奖励。原因很简单:用户只关心最终结果,中间过程再漂亮,没完成任务就是0分。
片段级奖励,是把长对话切成若干片段,每个片段单独打分。比如一段10轮的对话,可以切成3个片段:需求确认、方案推荐、订单确认。每个片段都有独立的奖励。
你想想看,片段级奖励的好处是什么?它能给模型更细粒度的反馈。比如需求确认阶段做得好,但方案推荐阶段推荐错了,模型能知道具体错在哪一步。
核心区别:
- 序列级奖励:只看结果,不管过程
- 片段级奖励:既看结果,也看过程
3.4 我的实践经验:如何选择
说实话,没有银弹。我做过几个项目,总结出几条经验:
- 对话轮次少于5轮:直接用序列级奖励,简单有效
- 对话轮次5-15轮:用片段级奖励,切成2-3个片段
- 对话轮次超过15轮:必须用片段级奖励,否则模型会「迷失」在长对话里
我记得有一次做金融客服的对齐,对话平均20轮。一开始用序列级奖励,模型训练了3天都不收敛。后来改成片段级奖励,把对话切成「身份验证」「问题描述」「方案推荐」「确认执行」四个片段,模型第二天就收敛了。
小技巧:片段划分不要靠直觉。我建议先用聚类算法对对话历史做自动分段,再人工校验。这样比纯手工划分准确得多。
3.5 知识体系图
下面这张图,是我自己整理的多轮奖励模型设计框架。你一看就明白了。
这张图的核心逻辑是:先区分单轮和多轮,再在多轮里区分序列级和片段级。我个人习惯用这个框架来快速判断项目该用哪种方案。
最后提醒一句:奖励模型的设计,直接决定了RLHF的效果。模型学歪了,往往不是PPO的问题,而是奖励信号给错了。我曾经因为奖励模型没设计好,白训了两周——那种感觉,你懂的。