【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (4)--- 架构 📅 2026/6/28 2:55:56 概要本系列的目的是借着对 OpenClaw-RL 源码的学习来梳理强化学习的一些相关概念和思想。所以会有一些基础知识、扩展和发散OpenClaw-RL 只是一个切入点。而且因为整篇系列是一个整体所以有些概念的解读/学习会在不同的文章中出现还请大家谅解。OpenClaw-RL 是一个用于在线强化学习Online RL的框架专门针对智能体工具使用场景。它通过从环境反馈中提取过程奖励信号来训练语言模型支持三种主要模式openclaw-rl基于二元奖励的强化学习Binary RL / GRPOopenclaw-opd基于后见之明提示的在线策略蒸馏On-Policy Distillation, OPDopenclaw-combine联合方法在同一 PPO 更新中同时利用 RL reward 和 OPD teacher signal0x01 架构OpenClaw 的 RL 训练 一套统一的 PPO 框架 三种不同的 advantage 注入方式┌────────────┬──────────────────────────────┬─────────────────────────────────────┐ │ 方法 │ Advantage 来源 │ 适用场景 │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ Binary RL │ A R (raw broadcast) │ 简单场景只有 ±1 reward │ │ │ reward 标量广播到全序列 │ │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ OPD │ A_t teacher_lp_t - old_lp_t│ 有 teacher model 提供 per-token 信号 │ │ │ teacher 的 per-token log-probs │ 需要精细引导如 hint 机制 │ ├────────────┼──────────────────────────────┼─────────────────────────────────────┤ │ Combine │ A_t w_rl·R w_opd·(teacher│ 同时需要 reward 和 teacher 信号 │ │ │ _lp_t - old_lp_t) │ 最灵活可调权重 │ └────────────┴──────────────────────────────┴─────────────────────────────────────┘关键设计原则统一 PPO clip 框架三种方法共享同一套 ratio-based clipped loss数据驱动分流Combine 通过设置 teacher_lprollout_lp 或 reward0 自动区分 OPD/RL 样本无额外模型GRPO 替代 Criticteacher 只做 forward pass不训练异步架构Proxy 实时拦截用户对话Trainer 后台持续更新1.1 架构图OpenClaw-RL 的系统架构图如下1.2 File StructureOpenClaw-RL 的的文件结构如下。OpenClaw-RL-main/ │ ├── 核心 RL 框架 │ ├── slime/ # Ray Megatron-LM 分布式训练 │ └── Megatron-LM/ # NVIDIA 模型并行后端 │ ├── 个性化 Agent 优化 (Track 1) │ ├── openclaw-rl/ # Binary RL (GRPO) │ ├── openclaw-opd/ # On-Policy Distillation │ ├── openclaw-combine/ # RL OPD 联合方法 │ └── openclaw-tinker/ # Tinker 云端零 GPU 方案 │ ├── 通用 Agent RL (Track 2) │ ├── gui-rl/ # GUI Agent (OSWorld) │ ├── swe-rl/ # SWE Agent (mini-swe-agent) │ ├── terminal-rl/ # Terminal Agent (SETA) │ └── toolcall-rl/ # Tool-Call Agent (ReTool) │ ├── 评估 │ └── openclaw-test/ # GSM8K 多轮对话评估 │ ├── 前端 │ └── openclaw/ # OpenClaw 聊天应用 (TS/Node) │ └── 配置 ├── requirements.txt # 301 个 Python 依赖 └── instructions/ # 环境搭建指南模块职责划分如下。OpenClaw-RL/ ├─ openclaw-rl/ │ ├─ openclaw_api_server.py ← FastAPI 代理 PRM 评分 样本提交 │ └─ openclaw_rollout.py ← AsyncRolloutWorker: 桥接 API Server ↔ Slime ├─ openclaw-opd/ ← OPD 变体(hint 提取 teacher log-probs) ├─ openclaw-combine/ ← Combined 变体(RL OPD 并行) ├─ openclaw-tinker/ ← 无 GPU 云端版(Tinker API) ├─ slime/ │ └─ train_async.py ← 基础 RL 框架(Megatron SGLang) │ ← 入口异步训练主循环 ├─ terminal-rl/ gui-rl/ │ swe-rl/ toolcall-rl/ ← Track 2通用智能体 RL └─ openclaw/ └─ src/ ← OpenClaw TypeScript 应用1.3 四大组件OpenClaw-RL 的系统设计是四个异步解耦的循环——policy serving、environment hosting、reward judging、policy training 同时运行、互不阻塞因此模型可以一边持续服务一边从刚刚发生的真实交互中在线学习。在这种模块化设计中各组件既保持功能独立性又实现数据互通。OpenClaw-RL四大组件 vs 标准RL的区别四个阶段的模块归属Policy Serving定义运行策略模型、生成response、提供推理能力。功能定位用户交互入口接收外部环境的请求并返回响应模型推理服务转发请求至SGLang推理引擎获取模型响应会话状态管理维护多轮对话的上下文状态技术实现Web 框架基于 FastAPI 实现OpenAI 兼容的 /v1/chat/completions接口核心文件openclaw_api_server.py/ openclaw_opd_api_server.py具体如下模块角色位置SGLang Rollout Engine真正的 PolicyLLM 推理GPU 4-5Slime 启动Ray PlacementGroup 管理OpenClawAPIServer._handle_request()HTTP 转发代理openclaw_api_server.pyhttpx.post(sglang_chat_url)向 SGLang 发送推理请求_handle_request() 内_extract_logprobs_from_chat_response()采集 rollout log-probsopenclaw_api_server.pyFastAPI /v1/chat/completions对外暴露的推理接口PORT30000_build_app()Megatron ActorGPU 0-3保存最新策略权重定期同步给 SGLangSlime 内部Environment定义产生观测next_state、定义任务边界。环境托管模块Environment Hosting Subsystem构建智能体操作的真实/模拟环境个人智能体场景集成用户终端设备手机/电脑的会话系统通用智能体场景支持云端并行终端、图形界面交互、软件工程开发环境及工具调用沙盒环境模块通过事件驱动机制实时反馈状态变化包括用户追问、代码执行结果stdout/stderr或界面元素变更等信号。具体如下模块角色位置真实用户发消息动作 看 response观测外部无代码HTTP 请求中的 messages用户发出的 observation sequenceFastAPI 请求体messages[-1]新消息next_state上一轮 turn 的环境反馈_handle_request() 第 504 行X-Session-Id header标识同一个 environment episode会话FastAPI headerX-Turn-Type: main/side区分训练轨迹与非训练交互FastAPI headerX-Session-Done headerepisode 终止信号FastAPI headerEnvironment在OpenClaw中没有代码实体它就是“真实用户HTTP协议“本身。Reward Judging定义评估当前response的质量产生reward 信号 Binary RL 的 Reward Judge。效果评估模块Reward Judging Component采用双轨制评估机制量化评估层PRM Judge基于预设指标体系生成即时评分1/-1等质性指导层OPD Hint Extractor通过自然语言理解技术提取改进建议。该模块将评估结果与指导信号整合为结构化反馈构建教师上下文用于模型微调。评估过程采用异步批处理模式支持每秒千级交互的评估吞吐量。功能定位质量评估对代理响应进行质量评分评估逻辑基于下一状态判断助手响应质量评分规则1(好)/-1(差)/0(中性)多数投票多次独立评估取多数结果奖励信号生成生成用于策略优化的奖励信号过程监督提供细粒度的过程反馈而非仅结果反馈技术实现过程奖励模型通过下一状态评估当前响应质量多数投票机制执行多次独立评估取多数结果提高可靠性异步评估在后台线程中执行耗时的LLM评估核心文件集成在openclaw_api_server.py中的PRM相关逻辑具体如下模块角色位置_fire_prm_scoring()触发 PRM 评分任务异步openclaw_api_server.py_prm_evaluate()PRM 评估主逻辑m3 并行openclaw_api_server.py_query_prm_once()单次调用 Judge LLMGPU 6-7openclaw_api_server.py_majority_vote()多数投票 → final scoreopenclaw_api_server.py_build_prm_judge_prompt()构造 judge promptopenclaw_api_server.pySGLang PRM EngineGPU 6-7运行 Judge LLM 推理Slime 启动OPD / Combine 额外的 Reward Judge如下模块角色位置_fire_opd_task()触发 OPD 评估任务异步openclaw_opd_api_server.py_opd_evaluate()Hint Judge Teacher LP Evalopenclaw_opd_api_server.py_query_judge_once()Hint Judge 单次调用GPU 6-7openclaw_opd_api_server.py_select_best_hint()选最优 hintopenclaw_opd_api_server.py_compute_teacher_log_probs()教师前向传播max_new_tokens0openclaw_opd_api_server.py_query_prm_eval_once()Eval Judge仅 Combineopenclaw_opd_api_server.py_prm_eval_majority_vote()Eval 多数投票仅 Combineopenclaw_opd_api_server.pyPolicy Training定义利用reward信号更新策略参数策略训练模块Policy Training Pipeline基于Megatron等分布式训练框架构建采用PPO等强化学习算法实现模型优化。其创新点在于独立数据队列机制隔离在线服务与训练数据流增量学习架构支持动态权重更新而不中断服务功能定位模型优化基于收集的样本和奖励信号更新策略模型分布式训练支持多GPU和多节点分布式训练技术实现训练框架基于Slime和Megatron-LM实现算法支持GRPO、PPO、KL正则化等多种RL算法核心文件slime/train_async.py及相关训练脚本具体如下模块角色位置_maybe_submit_ready_samples()等 PRM 完成后触发 sample 提交各 api_server.py_submit_turn_sample()构造 Sample 对象loss_mask, reward各 api_server.py_submit_rl_turn_sample()RL-only 样本Combineopenclaw_combine_api_server.pyoutput_queue.put(...)跨线程传递 Sample各 api_server.pySlime训练主循环模块角色位置generate_rollout_openclaw()Slime rollout 入口被动收集openclaw_rollout.py_drain_output_queue()等待 N 个样本积累openclaw_rollout.pyAsyncRolloutWorker.pause/resume_submission()控制 API 开关weight sync 期间暂停openclaw_rollout.pycompute_advantages_and_returns()计算 GRPO/OPD advantageslime/.../loss.pyget_grpo_returns()GRPO advantagereward 标量广播ppo_utils.pycompute_policy_loss()PPO clip 损失ppo_utils.pycombine_loss_function()Combine 自定义损失w_opd w_rlcombine_loss.pyMegatron ActorGPU 0-3执行梯度更新、weight syncSlime / Megatron-LMRolloutFnTrainOutputrollout 输出格式返回给 Slimeopenclaw_rollout.pyGPU分配4组件架构各自运行在哪些GPU上具体如下组件GPU实际进程核心代码Policy TrainingGPU 0-3Megatron ActorTP4slime/ openclaw_rollout.pyPolicy ServingGPU 4-5SGLang Rollout FastAPI Proxyopenclaw_api_server.pyReward JudgingGPU 6-7SGLang PRM/Judge同一个 openclaw_api_server.py 中的评分逻辑Environment无GPUOpenClawApp用户openclaw/ (TS app)即GPU 分配 (8卡节点, run_qwen3_4b_openclaw_rl.sh): GPU 0-3: Megatron Actor (ACTOR_GPUS4, TP4) - Policy Training GPU 4-5: SGLang Rollout (ROLLOUT_GPUS2, TP2) - Policy Serving GPU 6-7: SGLang PRM/Judge (PRM_GPUS2, TP2) - Reward Judging1.4 模型OpenClaw-RL 优化的是 Qwen3-4B Actor它同时也是serve用户的模型通过SGLang 推理引l擎的权重副本。三个角色Actor/Rollout/Judge用的都是同一个模型但只有 Actor 被训练更新。模型详情具体如下① Actor Model (GPU 0-3, Megatron TP4) 被优化的 Student模型 做 forward/backward/optimizer step 的那个 → 就是OpenClaw-RL 正在训练的模型 ② Rollout Mode1. (GPU 4-5,SGLang TP2 为用户服务的推理引擎 Actor的权重副本定期同步 → 不直接训练只是Actor 的“镜像“ ③ PRM Judge / Teacher (GPU 6-7,·SGLang) 评分生成hint计算teacher_log_probs 可以是同一模型的另一个实例OpenClawOPD → 不被训练只是工具被优化的只有 ① ActorModel② 和 ① 是同一个模型的不同副本权重周期性同步③ 是judge/teacher固定不变具体配置# run_qwen3_4b_openclaw_rl.sh 中: MODEL_PATHQwen/Qwen3-4B #所有角色都用同—个模型 # Actor训练Qwen3-4BMegatron格式做梯度更新 # Rollout推理Qwen3-4BSGLang 格式serve 用户 # PRM/Teacher 评估Qwen3-4BSGLang 格式评分/hint/teacher scoring)训练循环训练循环如下User → Rollout Qwen3-4B 生成 response → PRM JudgeQwen3-4B评分/生成hint → Teacher Qwen3-4Bhint 计算 teacher_log_probs → ActorQwen3-4B做梯度更新 ◄─── 这一步优化模型 → 权重同步回Rollout → 下次用户得到更好的response0x02 Slime 的作用Slime 在 OpenClaw-RL 中是核心的 RL 后训练框架负责高效地组织 rollout、trainer和data buffer等模块实现异步、解耦的RL训练流程。它连接了模型推理如SGLang、训练如 Megatron和数据流转支撑了 OpenClaw-RL 的所有 RL 训练范式OPDBinary RLCombine。2.1 集成机制Slime 通过以下机制与OpenClaw组件集成插件化架构通过命令行参数注入自定义函数异步数据流OpenClawAPIServer异步生产数据Slime异步消费训练资源隔离不同组件使用独立的GPU资源避免相互干扰统一接口所有OpenClaw变体(RL/OPD/Combine)都遵循相同的集成模式Slime 启动 SGLang 引擎 └── Slime 启动 SlimeRouter (分配动态端口) └── Slime 将 ip/port 写入 args └── OpenClawAPIServer 读取 args └── 对外暴露 PORT30000 给 OpenClaw App (用户流量入口) ✓ SGLang 的启动、GPU 分配、端口分配、Router 注册 全部由 Slime 控制 ① 分配 GPU (Ray Placement Group) ② 动态启动 SGLang 推理引擎 SlimeRouter (port动态分配 - args.sglang_router_port) ③ 动态启动 PRM Engine PRM Router (port动态分配 - args.prm_router_port) ④ 启动 Megatron Actor (GPU 0-3, TP4) ✓ OpenClawAPIServer 只是寄生在 Slime 的基础设施上 ◄───────────────────── 此处是关键 ✓ PORT30000 是外部可见端口, sglang_router_port 是 Slime 内部动态分配的这种设计使得 OpenClaw-RL能够充分利用 Slime强大的分布式训练能力同时保持 OpenClaw组件的灵活性和可扩展性。2.2 Slime 扩展我们来看看 Slime 扩展的机制。Slime 设计了插件化的钩子系统OpenClaw-RL 通过 shell 脚本中的参数注入不修改 Slime 核心即可完整接管整个训练流程。插件化架构RolloutManager是Slime中负责管理rollout数据收集的核心类它通过以下方式扩展点集成OpenClaw组件自定义生成函数通过--custom-generate-function-path指定自定义奖励函数通过--custom-rm-path指定自定义损失函数通过--custom-loss-function-path指定自定义 rollout 函数通过 --rollout-function-path 指定具体如下# run_qwen3_4b_openclaw_rl.sh 中的关键参数