Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (7)--- Policy Serving

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

OpenClawAPIServer是OpenClaw-RL系统中的核心组件,它充当OpenClaw环境与 SGLang推理服务之间的代理服务器,负责收集训练数据、计算奖励并提交样本给强化学习训练流程。当然,也可以认为OpenClawAPIServer即是 Proxy Server,也是 Policy Serving。

0x01 基础
1.1 架构
我们回顾 OpenClaw-RL 的系统架构图如下:

整体架构

1.2 OpenClawAPIServer 的定位
OpenClawAPIServer 这个名字其实不准确,更准确的命名应该是:OpenClawProxyServer 或OpenClawTrainingPipeline—它是连接Policy Serving、Reward Judging 和Policy Training 三个功能层的协调器(Orchestrator),而非其中任何一层的实现体。

职责
以 OpenClawAPIServer 为例,它独自承担了几个职责:

职责 属于哪个组件 具体代码
HTTP 代理(转发用户请求) Policy Serving(接口层) httpx.post(sglang_chat_url)
拦截 response + logprobs Policy Serving(数据采集) _extract_logprobs_from_chat_response()
PRM 评分 Reward Judging _fire_prm_scoring() / _opd_evaluate()
构造训练 Sample 训练数据管道 _submit_turn_sample()
开关控制(503) 训练-服务调度 submission_enabled.is_set()
类比
OpenClawAPIServer = “前台+服务员+数据记录员",不是“厨房"(Policy)本身。

类比 对应组件
餐厅服务员(接单、传菜) OpenClawAPIServer
厨房(真正做菜) SGLang GPU 4-5(Policy 推理)
食品检验员(给菜打分) SGLang GPU 6-7(PRM/Judge)
餐厅管理系统(记录点单数据) output_queue → Slime
1.3 继承关系 & 方法覆盖
OpenClawAPIServer、OpenClawOPDAPIServer 和 OpenClawCombineAPIServer 的关系如下:

OpenClawAPIServer (Binary RL 基类, 独立)
├─ _submit_turn_sample() score->loss_mask, at-least-one
├─ _maybe_submit_ready_samples() 检查 PRM task done
└─ _fire_prm_scoring() 触发 PRM 异步

OpenClawOPDAPIServer (独立类, 不继承 OpenClawAPIServer)
├─ _submit_turn_sample() 独立实现
├─ _maybe_submit_ready_samples() 改用 opd_evaluate task
├─ _opd_evaluate() hint judge + teacher lp 计算
├─ _fire_opd_task() 触发 OPD 异步评估
└─ _compute_teacher_log_probs() / _compute_teacher_topk_logprobs()

OpenClawCombineAPIServer extends OpenClawOPDAPIServer
├─ _submit_turn_sample() ← 覆盖: OPD/OPD+RL 路径
├─ _submit_rl_turn_sample() ← 新增: RL-only 路径 (teacher=rollout)
└─ _maybe_submit_ready_samples() ← 覆盖: 3路分发逻辑
1.4 真实策略服务器
OpenClawAPIServer 的技术栈:

FastAPI:Web框架(异步)
Uvicorn:ASGI 服务器(基于uvloop,高并发)
httpx/aiohttp:异步 HTTP 客户端(调用 SGLang和PRM)
真正的Policy Server是SGLang(GPU4-5)

Policy=Qwen3-4B模型权重 (注: RL server 默认 SERVED_MODEL_NAME=“qwen3-8b”, OPD server 默认=“qwen3-4b”, 实际部署可通过环境变量覆盖)
Policy Server=SGLang推理引擎(监听sglang_router_ip:sglang_router_port)
OpenClawAPIServer不运行模型推理,它只是SGLang前面的一层拦截代理。

用户 → OpenClawAPIServer(FastAPI, Proxy) → SGLang(GPU4-5)← 真正的Policy Server
↓ 拦截
SGLang PRM (GPU 6-7) ← Reward Judge(评分)

output_queue

Slime ← Policy Training的数据入口
请求处理调用链
HTTP 入口:chat_completions()
回合判断:_handle_main_turn()/_handle_side_turn()
SGLang 转发:forward_to_sglang()
PRM 触发:_fire_prm_scoring() →_prm_evaluate()
样本提交:maybe_submit_ready_samples()→output_queue.put()
样本构建调用
数据缓冲:_buffer_record()→存入_pending_records
状态刷新:flush_pending_record()→添加下一状态
样本构建:_submit_turn_sample()→创建Sample 对象
FastAPI Proxy 如何转发到 SGLang
OpenClawAPIServer 通过 FastAPI Proxy 实现了对外的入口,内部通过 SlimeRouter 路由到实际的 SGLang 推理引擎, 实现了接入层与推理层的解耦。完整端口与中间层架构如下图所示。

7-中间层架构

端口关系总结 (run_qwen3_4b_openclaw_rl.sh 配置):

PORT=30000
-> FastAPI Proxy 监听端口 (外部可见, OpenClaw App 连接此处)

args.sglang_router_ip/port
-> Slime 自动分配, 传给 API Server 作为 sglang_chat_url 的目标
-> 指向 SlimeRouter (内部负载均衡层)

args.prm_router_ip/port
-> PRM Engine 的 /generate 地址 (GPU 6-7)
-> API Server 用于发送评分请求

1.5 对比
标准 RL Policy Serving:
rollout时:

SGLang只服务训练系统内部
批量生成→批量打分→批量训练
无外部访问
架构:

[训练系统] ⇆ [SGLang] 内部通信
OpenClaw Policy Serving:
rollout 时,SGLang同时服务:

实用户(通过OpenClawApp)
PRM评分(内部调用)
Teacher forward pass(OPD 时)
架构:

[用户手机] → [FastAPI Proxy] → [SGLang] 外部流量
[PRM judge] → [SGLang] 内部调用
[训练系统] ← [Proxy] 数据管道
工程挑战
这导致了独特的工程挑战:

标准 RL 不需要处理的问题: OpenClaw 需要处理:
───────────────────── ────────────────────────
❌ API 认证 ✅ SGLANG_API_KEY
❌ 并发控制 ✅ semaphore
❌ 503 暂停 ✅ submission_enabled
❌ session 管理 ✅ X-Session-Id
❌ 流式传输 ✅ SSE streaming
❌ 用户体验 ✅ 低延迟响应
❌ 数据筛选 ✅ main vs side turn
❌ 超时处理 ✅ session timeout
总结:OpenClaw 的根本范式转变
标准 RL: 训练系统是 “主人” → 它决定问什么、答几次、怎么评分

OpenClaw: 训练系统是 “寄生者” → 它寄生在真实对话上,被动收集数据

这导致OpenClaw-RL Serving 如下特点:

Rollout = 被动等待(不是主动生成)
Environment = 真实用户(不是模拟器)
PRM = 即用即评(不是预训练 RM)
Policy = 对外服务(不是内部推理)
一切设计选择都源于这个范式转变。

0x02 详细功能梳理
OpenClawAPIServer 本质上是一个智能代理,它不仅转发请求,还负责收集强化学习所需的训练数据,通过PRM评估助手响应质量,并将高质量的数据提交给训练流程。

OpenClawOPDAPIServer 则是OPD模式的专用API服务器。

2.1 OpenClawAPIServer
角色:OpenClaw与SGLang之间的代理服务器

OpenClaw-RL功能
二元奖励机制:使用过程奖励模型(PRM)对助手响应进行+1/-1/0评分
环境反馈利用:将用户回复或工具返回值作为"下一个状态"来评估前一回合质量
多轮对话支持:维护会话状态,支持复杂的多轮交互场景
GRPO 优势估计:使用GRPO进行策略优化
OpenClawAPIServer功能
请求转发和响应处理
会话状态管理
PRM评估触发
训练样本生成和提交
关键特性:

支持流式和非流式响应
认证和授权验证
记录文件管理
OpenClaw-RL业务流程
请求处理流程

接收请求:外部环境发送带有X-Session-Id和x-Turn-Type的请求
认证验证:验证Bearer Token(如果配置)