文章摘要
文章围绕OpenClaw - RL框架中Combine模式展开。该模式结合RL与OPD信号训练,架构上继承复用组件并新增方法,并行评估提升效率。其执行分四阶段,联合损失计算先合并优势值,避免梯度冲突。该模式节省资源、梯度信号互补,但增加调用次数。还可依场景调参,能缓解OPD级联错误,但仅在OPD+RL路径有效。

一、概述

本系列文章以OpenClaw-RL的源码学习为切入点,系统梳理强化学习相关的核心概念与技术思路。由于整个系列内容连贯,部分基础概念会在不同篇章中重复出现,方便读者逐步理解完整的技术体系。

OpenClaw-RL是一款专为智能体工具使用场景设计的在线强化学习框架,它通过从环境交互反馈中提取过程奖励信号来训练大语言模型。该框架支持三种核心训练模式:

  • Binary RL / GRPO:基于二元奖励的强化学习模式
  • OPD(On-Policy Distillation):基于后见之明提示的在线策略蒸馏模式
  • Combine模式:在同一次PPO更新中同时融合RL奖励信号与OPD教师提示信号的联合训练模式

Combine模式的核心价值在于实现两种信号的优势互补:OPD可以提供细粒度的方向性指导,帮助模型优化每个token的生成;而RL则负责全局的质量评估,为模型提供整体的奖惩信号。这种设计既保留了框架的灵活性,又统一了架构接口与数据流规范,可以适配多种不同的训练需求。

二、架构设计:继承而非重写

OpenClawCombineAPIServer类通过继承OpenClawOPDAPIServer来复用大部分核心基础设施,仅新增和重写少量关键方法,大幅减少了重复代码:

该类直接复用的父类核心组件包括:

  • _opd_evaluate():负责提取提示信息并计算教师模型的log概率
  • query_judge_once():调用评判大模型完成指定任务
  • fire_opd_task():触发异步评估任务的核心函数

同时,该子类新增并重写了两个核心方法:override_submit_turn_sample和_maybe_submit_ready_samples,使其支持同时执行评估评分操作,复用OPD模式下的eval_mode功能。以下是简化的类定义示例:

class OpenClawCombineAPIServer(OpenClawOPDAPIServer):
    # 继承OPD的全部基础设施:
    # - 对话拦截、记录、状态等待
    # - 提示评判机制
    # - 教师log概率计算
    # - Top-K蒸馏逻辑
    # 新增功能:支持同时执行评估评分
    # 重写了_submit_turn_sample()和_maybe_submit_ready_samples()
    # 其余核心逻辑完全复用父类

2.1 并行评估流水线:双任务合并执行

在Combine模式下,当新的对话轮次到达时,会自动触发对上一轮对话的评估流程:

当第N+1轮对话到达后,首先调用继承自父类的_fire_opd_task()函数,随后执行_opd_evaluate(),该函数会同时启动两个并发的评估任务:

  • 提示评判任务:通过asyncio.gather并发执行m次hint-judge调用,完成提示有效性判断、最优提示提取、教师log概率计算等操作,并通过多数投票选择最优提示
  • 质量评估任务:同样通过asyncio.gather并发执行m次eval调用(开启eval_mode),完成回复质量评分,并通过多数投票得出最终的eval_score

需要注意的是,虽然代码中是按顺序调用两个任务,但两者都是并发执行的,整体的大模型调用并发数为2m次,有效提升了评估效率。

2.2 三种模式对比总结

对比维度 Binary RL 纯OPD模式 Combine模式
样本覆盖率 所有评分对话 仅接受提示的对话 覆盖四种场景,最大化样本收集
信号粒度 token统一粒度 per-token细粒度 混合粒度
支持隐式反馈 ✅ 支持 ❌ 不支持 ✅ 支持
支持显式纠正 ❌ 仅支持±1打分 ✅ 支持文本精准纠正 ✅ 全部支持
单轮最大样本数 1 1 1
可调权重 N/A N/A w_rl, w_opd(默认均为1.0)
API Server类 OpenClawAPIServer OpenClawOPDAPIServer OpenClawCombineAPIServer
Judge调用次数/轮 m=3 (PRM) m=3 (Hint Judge) + 1次 Teacher LP m=3 (Hint) + m=3 (Eval) + 1次Teacher LP
loss_mask控制 0或1(按score) 始终1 始终1
reward字段 ±1 / 0 固定0 ±1 / 0(来自eval judge)
Advantage类型 REINFORCE-like (scalar) per-token (teacher-studentdiff) 两者加权求和
Drop条件 score=0且无at-least-one hint被拒绝 accepted=F且eval=0
丢弃率
at-least-one guarantee × ×
teacher_log_probs 真实 teacher LP 真实(OPD路径)/ rollout LP(RL路径)

三、完整执行流程

Combine模式的完整执行流程可以分为四个核心阶段,我们将按顺序展开介绍:

3.1 阶段一:对话触发与初步评估

当新的对话轮次到达时,系统会自动触发对上一轮对话的评估流程,完成提示评判与质量评估的并行执行,具体逻辑在架构设计部分已经详细说明。

3.2 阶段二:三路分发逻辑

评估完成后,系统会根据提示接受状态与eval评分结果,将样本分为四种不同的处理路径:

  • OPD+RL路径:当提示被接受且eval评分有效时,提交合并样本,同时使用两种信号进行训练
  • 纯OPD路径:当提示被接受但eval评分为0时,仅使用OPD信号进行训练,将reward置0
  • 纯RL路径:当提示被拒绝但eval评分有效时,仅使用RL信号进行训练,将教师log概率设为rollout的log概率
  • 丢弃路径:当提示被拒绝且eval评分为0时,丢弃该样本,不参与训练

具体的分发代码逻辑如下:

# _maybe_submit_ready_samples() 中的分发逻辑
opd_accepted = opd_result.get("accepted") # hint是否被接受
has_valid_rl = self._is_valid_rl_score(eval_score) # eval评分是否有效

if opd_accepted and has_valid_rl:
# 提交合并样本,使用两种信号
_submit_turn_sample(reward=eval_score)
elif opd_accepted:
# 仅使用OPD信号,reward置0
_submit_turn_sample(reward=0.0)
elif has_valid_rl:
# 仅使用RL信号
_submit_rl_turn_sample(eval_score)
else:
# 丢弃无有效信号的样本
pass

3.3 阶段三:样本处理与梯度计算

不同路径的样本会被分别处理,生成对应的优势值信号:

  • 纯RL样本:教师log概率被设为rollout的log概率,因此OPD优势值为0,仅保留GRPO优势值
  • 纯OPD样本:reward被置0,因此GRPO优势值为0,仅保留OPD优势值
  • 合并样本:同时保留两种优势值,进行加权求和

3.4 阶段四:PPO联合损失计算

Combine模式的损失计算核心在于将两种优势值在进入PPO裁剪之前进行加权合并,而非对两个独立的损失函数进行加权求和。以下是核心的损失计算代码:

def combine_loss_function(args, batch, logits, sum_of_sample_mean):
    # 读取预计算的GRPO优势值
    grpo_advantages = torch.cat(batch["advantages"], dim=0)
    # 计算OPD教师优势值
    teacher_advantages = torch.cat([
        t.to(device) - o.to(device) 
        for t, o in zip(teacher_log_probs_list, old_log_probs_list)
    ], dim=0)
    # 读取权重参数
    w_opd = float(os.getenv("OPENCLAW_COMBINE_W_OPD", "1.0"))
    w_rl = float(os.getenv("OPENCLAW_COMBINE_W_RL", "1.0"))
    # 合并优势值
    combined_advantages = w_opd * teacher_advantages + w_rl * grpo_advantages
    # 执行标准PPO裁剪损失计算
    ppo_kl = old_log_probs - new_log_probs
    pg_loss = compute_policy_loss(ppo_kl, combined_advantages, eps_clip, eps_clip_high)
    loss = pg_loss - entropy_coef * entropy_loss
    return loss

四、联合损失函数细节

Combine模式的损失计算遵循特定的数学公式,针对每个token t的计算过程如下:

  1. GRPO优势值:$A_t^{grpo} = R$,将标量奖励广播到所有token
  2. OPD教师优势值:$A_t^{opd} = \log \pi_{teacher}(a_t|s_t) - \log \pi_{old}(a_t|s_t)$
  3. 合并优势值:$A_t^{combined} = w_{rl} \cdot A_t^{grpo} + w_{opd} \cdot A_t^{opd}$
  4. PPO比率:$r_t = \exp(\log \pi_{new}(a_t|s_t) - \log \pi_{old}(a_t|s_t))$
  5. 裁剪代理损失:$L_t = -\min(r_t \cdot A_t^{combined}, \text{clip}(r_t, 1-\varepsilon, 1+\varepsilon_{high}) \cdot A_t^{combined})$
  6. 总损失:$L = \text{mean_over_tokens}(L_t)$

与直接对两个损失函数进行加权求和的方案不同,Combine模式先合并优势值再计算单一PPO损失,这样可以避免梯度方向冲突,保证训练过程的稳定性。

4.1 不同样本类型的优势值表现

三种不同样本类型的优势值表现存在显著差异:

  • OPD+RL样本:两种优势值均非零,最终结果为两者的加权和
  • 纯OPD样本:GRPO优势值为0,仅保留OPD优势值
  • 纯RL样本:OPD优势值为0,仅保留GRPO优势值

我们可以通过一个具体的token序列示例来展示不同样本的优势值计算结果,例如response为["None", "check", "is", "added"]的情况:

  • 纯RL样本:所有token的优势值均为±1,实现全局均匀强化
  • 纯OPD样本:每个token的优势值根据教师模型与旧模型的log概率差计算,实现细粒度的差异化强化
  • 合并样本:结合两种优势值,既实现全局强化又实现细粒度调整

五、Combine模式的优势与代价

5.1 核心优势

Combine模式相比独立运行两种训练方法具有以下优势:

  • 节省样本容量:每轮对话最多仅提交1个样本,避免不必要的资源浪费
  • 节省计算资源:复用一次教师模型的前向传播结果,同时支持两种训练目标
  • 互补的梯度信号:结合序列级的全局评估与token级的方向性指导,提升训练效果

5.2 潜在代价

同时,Combine模式也存在一定的训练代价:

  • 增加模型调用次数:需要同时执行OPD评判与质量评估,共2m次大模型调用(默认m=1)
  • 额外的eval调用:即使提示接受率较低,仍需要执行eval评分操作

六、权重调参策略

Combine模式中的两个权重参数$w_{rl}$和$w_{opd}$可以根据实际场景进行调整,以达到最优的训练效果:

  • 当用户反馈较为简短隐式时,建议设置$w_{rl}=1.5, w_{opd}=0.5$,此时RL信号更可靠
  • 当用户反馈详细明确时,建议设置$w_{rl}=0.5, w_{opd}=1.5$,此时OPD信号更丰富
  • 平衡场景下默认使用$w_{rl}=1.0, w_{opd}=1.0$,是实验验证的最优配置

由于两种信号的尺度天然存在差异,实际应用中可能需要通过方差匹配、梯度范数匹配或课程调参等方式进一步优化权重比例,以确保两种信号的影响力均衡。

七、级联错误缓解分析

OPD模式存在一个常见的问题:当生成的回复存在级联错误时,教师模型的提示可能会强化错误的token序列。而Combine模式可以通过GRPO的全局信号来缓解这一问题:

当最终的eval评分为负时,GRPO的均匀惩罚会抵消OPD信号中的错误强化部分,从而降低级联错误对模型的影响。例如,当回复中存在一个明显的计算错误,但OPD信号强化了后续的token时,GRPO的负向奖励会整体降低所有token的强化强度,从而抑制错误的级联传播。

不过这种缓解效果仅在OPD+RL路径下有效,对于纯OPD样本,由于没有GRPO信号的约束,级联错误问题仍然存在。

八、参考资料

本文涉及的核心技术参考了OpenClaw-RL框架的官方源码实现,以及相关的强化学习与策略蒸馏技术文档。

以上内容不代表本平台立场,仅供读者参考