0x00 概要

本系列的目的是:借着对 OpenClaw-RL 源码的学习,来梳理强化学习的一些相关概念和思想。所以,会有一些扩展和发散,OpenClaw-RL 只是一个切入点。而且,因为整篇系列是一个整体,所以有些概念的解读/学习会在不同的文章中出现,还请大家谅解。

OpenClaw-RL 是一个用于在线强化学习(Online RL)的框架,专门针对智能体工具使用场景。它通过从环境反馈中提取过程奖励信号来训练语言模型,支持三种主要模式:

  • openclaw-rl:基于二元奖励的强化学习(Binary RL / GRPO)
  • openclaw-opd:基于后见之明提示的在线策略蒸馏(On-Policy Distillation, OPD)
  • openclaw-combine:联合方法,在同一 PPO 更新中同时利用 RL reward 和 OPD teacher signal

framework

现有 AI Agent 系统存在一个核心问题:被浪费的"下一状态信号"。每次 Agent 执行动作后收到的下一状态(用户回复、工具输出、终端状态变化、GUI 界面更新等),仅被用作生成下一轮对话的上下文,信息被提取后随即被丢弃,并未转化为实时训练模型的宝贵数据资源。

而 OpenClaw-RL 的核心理念正是将每一次交互都转化为学习机会。通过统一的技术框架和巧妙的方法设计,它把 OPD(On-Policy Distillation)变成一种在线的 next-state 学习机制,让 AI Agent 能够在持续服务用户的同时,从实时交互中自动学习和改进——无需人工标注,也无需停机重训。具体贡献如下:

  • 首次将下一状态信号作为实时在线学习源:识别并系统性地回收了评估性和指导性两类信号,让 Agent 在真实交互中持续进化。
  • 首个统一的异步 Agent RL 基础设施:支持个人对话、终端、GUI、SWE 和工具调用五种场景的统一训练,实现了策略服务、环境托管、PRM 评判和策略训练的完全解耦,确保服务零中断。
  • Token 级方向性监督(OPD):不同于标量奖励将所有 Token 推向同一方向,OPD 提供每个 Token 的独立监督,因此响应内部不同 Token 可能被强化或抑制。
  • 过程奖励与结果奖励的有机结合:借鉴 RLAnything 的洞察,在长视野 Agent 任务中证明过程奖励的不可或缺性。

0x01 背景知识

1.1 Agentic RL 的核心难点

我们回头再看看 Agentic RL 的核心难点。

LLM-RL 架构就是一个"带私教的模拟考试"系统——把 LM 当成一个大 policy,每次行动就是"生成一整个回答",然后根据这次回答的评分整体推一下参数。

而 Agentic RL 则是在"状态→动作→环境反馈"这个闭环上做 RL,LLM 只是这个闭环里实现策略的一部分。对"数据 Agent/工具 Agent"来说,真正重要的是"每一步选的工具和操作是否对任务有贡献"——在这个粒度上,单纯对最终回答打个分再 PPO 一下,是很难学到东西的。

一句话总结:LLM-RL 优化的是"回答好不好";而 Agentic RL 优化的是"整个系统做事情做得好不好"。

难点总览

Agentic RL ≠ Chat RL,原因是:Agent 在真实环境中行动,环境是动态的、不可逆的、部分可观测的。Agentic RL 面对的核心挑战维度如下:

  • 奖励信号:稀疏、延迟、噪声、误导
  • 状态空间:高维、连续、非结构化(屏幕像素、文件系统、代码库)
  • 动作空间:离散但巨大(自然语言 token 序列)
  • 时间跨度:单步 → 多步 → 长程多轮
  • 环境非静态:环境随 agent 的行动改变
  • 安全性:错误动作不可逆(删文件、发邮件)
难点详解
难点1:奖励信号稀疏 & 延迟

问题:很多 Agent 任务只有最终结果可以评分。

  • 写代码:只有代码能运行才是 +1
  • GUI 操作:只有最终界面状态正确才是 +1
  • 中间步骤无法评分 → 梯度无法有效传播

业界解法

方法 代表工作 思路
结果验证 (RLVR) DeepSeek-R1, QwQ 可验证的任务(数学、代码)用 ground truth 打分
LLM-as-Judge Self-Rewarding LLM 用大模型对中间步骤打分(本项目的 PRM 方案)
Process Reward Model Let's Verify, ORM vs PRM 训练专用的步骤评分模型
Hindsight Labeling HER, OpenClaw OPD 用未来信息倒推当前步骤的质量
环境信号 ALFWorld, WebArena 把环境的 success/failure/error 作为自然奖励
难点2:长序列下的 Credit Assignment

问题:100 步任务,第 3 步的错误导致第 97 步失败,如何归因?

  • 传统 RL:Monte Carlo returns(高方差)或 GAE(需要 Critic,贵)
  • LLM RL:GRPO 直接广播 scalar reward → credit assignment 完全忽略 → 模型不知道"是哪个 token/step 导致失败"

业界解法

方法 思路
Step-Wise Reward 对每步动作单独打分,映射到 token 跨度
Advantage Decomposition 把 Q(s,a) 分解为步骤级别
Process Supervision 每步要求模型写出中间推理,单独评分
LLM Critic 让另一个 LLM 估计 V(s)(但训练稳定性差)
OPD/Hindsight (本项目) 用 teacher per-token log-probs 提供密集信号
难点3:探索效率

问题:LLM 的动作空间是整个 token 词表的指数序列,随机探索几乎不可能找到好的轨迹。

典型失败模式:Agent 尝试写代码 → 99% 时间生成语法错误 → reward = -1 → 永远无法采样到正确的轨迹来学习。

业界解法

方法 思路
课程学习 从简单任务开始,逐步增加难度
树搜索 (MCTS + LLM) 显式探索,保留有前景的状态节点
拒绝采样 只用成功轨迹训练(pass@k 筛选)
DAgger / Imitation + RL 先 SFT 专家轨迹,再 RL 微调
OPD (本项目) 教师提供 hindsight hint,引导探索方向
难点4:环境多样性与泛化

问题:在一个环境(VSCode)中训练的 Agent 无法泛化到另一个环境(Vim)。

业界解法

方法 代表工作 思路
大规模多样化环境 WebArena, OSWorld 覆盖大量不同 GUI/Web 场景
环境域随机化 Robotics RL 随机化物理参数
元学习 MAML 快速适应新环境
世界模型 Dreamer V3 学习环境动力学,在模拟中训练
难点5:安全性与不可逆操作

问题:Agent 训练时犯错,可能删库、发邮件、支付费用。

业界解法

方法 思路
沙箱环境 Docker/VM 隔离,训练时用虚拟环境(本项目的 terminal-rl 用沙箱)
人工审批环节 高风险操作需要确认(安全 overhead 大)
保守策略约束 KL 散度约束,限制 policy 偏离 ref model 太远
模拟器优先 先在模拟器中充分训练,再谨慎迁移到真实环境

1.2 本项目难点

如果按照解决难度来排(从易到难),业界图景中的定位大致如下:

数学 RL → 代码 RL  →  工具调用 RL → SWE RL → GUI RL → 真实对话 RL
[✓]       [✓]         [✓]        [◑]       [◑]      ↑ OpenClaw-RL
(有 GT)  (有 GT)      (部分 GT)   (弱 GT)   (环境反馈)  (行为信号)

本项目的独特定位在于

  • 大多数工作在"有 ground truth"的任务上(数学对错、代码跑通/不通);
  • OpenClaw-RL 面对的是"真实用户对话"——没有 ground truth,只有行为信号(用户的下一步操作)。长程多轮真实对话 RL 的难度非常大;
  • OpenClaw-RL 处于难度谱的最困难端,其 Hindsight OPD 方法是对"无 ground truth 的真实任务"的一种创新性应答。
两种范式下的对比

结构上的根本差异如下。

单轮 RL

π : Input (s) —→ Output (a) —→ Reward (r)
    (一次映射)    (一条回复)      (一个分数)

Agentic RL

π : S₀ —a₀—→ S₁ —a₁—→ S₂ —a₂—→  ...  —aₙ—→ r
  (循环映射)    (状态转移由环境决定)    (episode 结束才有分)

核心差异是时间维度:单轮 RL 没有时间,Agentic RL 的每个动作都发生在特定的时刻,其结果塑造了未来的状态。

OpenClaw-RL 特殊定位
  纯单轮 RL              OpenClaw               纯 Agentic RL
(InstructGPT)           (多轮对话)               (Web Agent)
      |                    |                        |
1 轮 = 1 样本       每轮 = 1 样本(中间状态)    T 轮 = 1 样本(episode)
dense reward         dense but noisy            sparse reward
 无时间依赖              弱时间依赖               强时间依赖(状态转移)

OpenClaw 通过 next_state 机制,把多轮对话拆解成多个独立的单轮 RL 问题,从而回避了 Agentic RL 最难的两个问题:稀疏梯度和长 episode off-policy gap。但代价是:失去了 episode 级别的信息——对话整体质量无法被单个 turn 的 reward 完整捕捉。

1.2 胶水代码

看到一个搞 RL Infra 同学的一种说法:RL Infra 是"胶水代码"。我们以 OpenClaw-RL 为例来审视这个说法——确实,大多数开源组件不需要修改,因此在某种程度上,RL Infra 是"胶水代码"。

组件                     来源                        OpenClaw-RL 的工作
─────────────────────────────────────────────────────────────────────────
SGLang 推理服务          开源项目 (SGLang)            ← 直接用,不改
Megatron 训练           开源项目 (Megatron-LM)       ← 直接用,不改
Slime 框架              开源项目 (slime)              ← 直接用,不改
Qwen3 模型              HuggingFace 下载             ← 直接用
OpenClaw App           项目的 TypeScript 侧          ← 已有,不改

真正新写的代码 (openclaw-rl/opd/combine) :
┌──────────────────────────────────────────────────────────┐
│  ~2660 行 Python (精确统计)                                │
│  分布在 8 个 .py 文件中:                                   │
│                                                          │
│  openclaw-rl/openclaw_api_server.py         730 行       │
│  openclaw-rl/openclaw_rollout.py            152 行       │
│  openclaw-opd/openclaw_opd_api_server.py   1001 行       │
│  openclaw-opd/openclaw_opd_rollout.py       158 行       │
│  openclaw-opd/topk_distillation_loss.py     120 行       │
│  openclaw-combine/combine_loss.py           140 行       │
│  openclaw-combine/openclaw_combine_api_      205 行      │
│    server.py                                             │
│  openclaw-combine/openclaw_combine_rollout.py  155 行    │
│                                                          │
│  ─────────────────────────────────────────               │
│  合计: 2661 行                                            │
└──────────────────────────────────────────────────────────┘

然而,胶水是有极高技术含量的。 胶水要处理异步状态管理、跨组件协调协议、框架接口适配这几个非平凡问题——这就是为什么代码量虽然不大,但设计密度相当高。


解决的核心问题

纯粹的"胶水"只是把 A 的输出接到 B 的输入。但 RL infra 要解决的问题更复杂。接下来,我们借助OpenClaw-RL来逐项拆解 RL infra 面对的几个核心问题,看看对“胶水”的高技术要求。

① 异步时序问题

推理发生在 turn t,但 reward 来自 turn t+1(next_state)。这意味着我们无法在 turn t 结束时立刻打分,需要一个有状态的异步状态机来桥接这个时间差。

具体的实现方案是双缓冲设计:

  • _pending_turn_datadict[str, dict[int, dict]] —— 按 session → turn 维度暂存 turn 数据,等待 PRM 评分完成后再提交为 training sample。
  • _pending_recordsdict[str, dict] —— 按 session 维度暂存 JSON 记录,等待 next_state 到达后写入 record file 并触发 PRM 评分。

工作流程是:

turn N 到达 → 数据存入 _pending_turn_data 和 _pending_records → turn N+1 到达 → _flush_pending_record 弹出 _pending_records 中的记录并触发 _fire_prm_scoring→ PRM 异步完成后回调 _maybe_submit_ready_samples → 从 _pending_turn_data 取出数据提交 sample。

这不是简单的 pipeline,而是有状态的双缓冲异步状态机。OPD 服务器使用了相同的双缓冲设计。

② 训练与服务的权重同步问题

Megatron 更新参数后需要同步到 SGLang 推理引擎。同步期间 SGLang 不能服务请求(权重不一致),需要一套协调机制来避免推理出"半新半旧"的权重。

解法是通过 threading.Event 实现暂停/恢复信号:

  • generate_rollout_openclaw 调用 resume_submission() → 收集完 batch 后调用 pause_submission()
  • API 层在处理请求时检查 submission_enabled.is_set(),若为 False 则返回 HTTP 503
  • 这个 503 是一个优雅的"稍后再试"信号,用户无感知,OpenClaw 客户端会自动重试

③ 奖励信号的延迟问题

PRM 打分是异步的——我们需要并行查询 m 次再做多数投票。这意味着训练不能立即可用数据,需要任务编排。

具体实现:

  • asyncio.gather 并行发起 m 次 PRM 查询(_query_prm_once
  • asyncio.create_task 创建后台评分任务
  • task.add_done_callback 注册两个回调:_task_done_cb(错误日志)和 _maybe_submit_ready_samples(就绪检查 → 提交)

这个设计意味着:PRM 评分和用户请求处理是完全并行的,评分延迟不会阻塞用户的下一轮对话。

④ 被动 Rollout 的适配问题

Slime 默认期望一个"主动发 prompt"的 rollout 函数(即训练框架驱动数据生成),但 OpenClaw 的 rollout 是"等用户来驱动"——数据由真实的用户对话产生,而非训练脚本采样。

因此需要 generate_rollout_openclaw实现被动等待语义:

  • 恢复 submission → 从 output_queue 中排空已收集的 sample → 暂停 submission → 返回给 trainer
  • 这个函数是 Slime 框架要求的 --rollout-function-path 自定义入口,属于对框架接口的非标准使用,需要对 Slime 的接口语义有精确理解
OpenClaw-RL vs 标准 RL infra

OpenClaw-RL 又与标准 RL infra 有所不同,我们来对比一下:

  • 标准 RL infra(如 OpenRLHF)

    • prompt_batch → generate → score → train → loop
    • 数据流是单向的,时序是同步的
  • OpenClaw-RL

    • 用户行为驱动 → 异步打分 → 被动收集 → 异步训练
    • 数据流是反向的,时序是异步的。这个反转需要对每个组件的接口语义有深入理解,才能把"被动接收对话"适配进"主动采样"框架

一个直觉上的类比如下:

维度 标准 RL infra OpenClaw-RL
类比 "工厂流水线"——原材料(prompt)进来,产品(trained model)出去,每道工序按顺序推进 "餐厅后厨"——顾客点菜(用户发消息)是随机的、异步的;厨师(推理服务)响应;服务员(API proxy)收集反馈;大厨(训练)在后台利用空隙持续学习
数据驱动方 训练框架主动采样 用户行为驱动
时序特征 同步,单向 异步,反向

胶水代码负责让这个"餐厅"正常运转:确保厨师学到的菜谱及时更新,确保反馈被正确归因到正确的菜品,确保后厨繁忙时前台能优雅地暂停取菜。

0x02 论文基础

论文题目是:OpenClaw-RL: Train Any Agent Simply by Talking

论文主要贡献点分析:

  • 主要创新点:首次提出将所有异构的交互信号(用户聊天、终端报错、GUI 界面变化)统一转化为实时的在线强化学习训练源。
  • 关键技术与方法:设计了 OpenClaw-RL 异步解耦架构(推理、环境、裁判、训练四个循环互不阻塞);提出了两种互补的信号恢复方法,即二元强化学习(Binary RL)用于提取标量奖励,以及后见之明引导的同策略蒸馏(OPD / On-Policy Distillation)用于提取 Token 级别的方向性监督。
  • 显著性结果与意义:不仅让个人专属 Agent 能通过日常聊天不断进化,还证明了这套架构能完美扩展到通用 Agent(如终端、GUI、软件工程、工具调用),在长逻辑链任务中取得了 SOTA 级别的提升。

2.1 核心问题

现有的 AI Agent 系统存在一个问题:每次 Agent 执行动作后收到的"下一状态信号"(用户回复、工具输出、终端状态变化、GUI 界面更新等),仅被用作生成下一轮对话的上下文,信息被提取后随即被丢弃,并未转化为实时训练模型的宝贵数据资源。这种"数据浪费"体现在两个层面:

  • 评估信号浪费:下一状态信号隐含着对前一动作的评价(用户重新提问表示不满,测试通过表示成功,错误日志表示失败),这本是天然的过程奖励,但现有系统要么忽略,要么仅用于离线训练。
  • 指导信号浪费:下一状态信号中往往包含具体的改进方向(如用户说"你应该先检查文件",或详细的 SWE 报错信息),但现有方法要么只能使用"对/错"这样的标量奖励,要么依赖预先准备好的反馈-响应配对,未能利用好实时、具体的指导性反馈。
现有方法的局限性

论文系统梳理了现有方法的不足:传统 RL for LLM 依赖集中式批量训练,需要预先收集数据集,无法个性化、实时优化,具体如下:

  • RLHF/DPO:依赖离线偏好数据或成对比较,需要人工标注,无法从实时交互中学习
  • 标准强化学习:使用标量奖励,无法将文本指导信息转化为策略梯度
  • 蒸馏方法:依赖预策划的反馈-响应配对,而非实时信号
  • 并发工作:虽然尝试在线利用下一状态信息,但纠错提示仍是隐式的
核心洞察

论文的核心观察是:下一状态信号是通用的,策略可以同时从所有类型的信号中学习。 个人对话、终端执行、GUI 交互、SWE 任务和工具调用轨迹不再是各自独立的训练问题,而是可以在同一循环中用于训练同一策略的交互流。基于这一观察,研究团队提出了 OpenClaw-RL——一个让 AI Agent"边用边学"的统一强化学习框架。

接下来,我们思考一个关键问题:为什么过程奖励对智能体任务至关重要?

在长视野的智能体任务中,仅有结果的奖励只在最终步骤提供梯度信号,而绝大多数轮次缺乏监督。PRM 根据下一状态信号为每轮分配奖励,在整个轨迹中提供密集的信用分配。近期的工作为此提供了强有力的实证证据——RLAnything 证明,将逐步的 PRM 信号与结果奖励整合,在 GUI 智能体、文本游戏智能体和编码任务中的表现始终优于仅使用结果的训练。

OpenClaw-RL 直接建立在这一洞察之上:它的 PRM 将实时的下一状态信号作为证据来评判每个轮次,并在实证部分证明这种密集的信号对长视野 RL 设置是有帮助的。

解法核心思想为:把用户日常对话本身变成训练信号,用"下一状态"(next state)作为天然的奖励来源——不需要人工标注,不需要中断使用体验。

2.2 如何解决

OpenClaw-RL 的个性化目标(通过 RL 优化策略权重),在本质上是"把用户偏好/对话经验写入模型权重",这是一种 Memory Consolidation(记忆固化)——推理时无需额外系统,知识被"内化"进参数。

OpenClaw-RL 主要采用三种学习方法。

openclawRL-compare

这三种方法的关系如下:

  • Binary RLopenclaw-rl/):基础方法,PRM ±1 评分 + GRPO
  • OPDopenclaw-opd/):独立实现的 Teacher 模型,通过 hint judge 生成 hint + teacher log-probs 蒸馏
  • Combinedopenclaw-combine/):继承自 OPD(class OpenClawCombineAPIServer(OpenClawOPDAPIServer)),同时使用 RL Reward 和 OPD teacher signal

需要特别指出的是,Binary RL 和 OPD 是两套独立的实现,并非继承关系。从代码中可以清晰看到:

  • OpenClawAPIServer 是独立类
  • OpenClawOPDAPIServer 是独立类
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐