🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx skills add https://skills.sh/aradotso/trending-skills/openclaw-rl-training

💡 提示:需要 Node.js 和 NPM

OpenClaw-RL 训练框架

技能由 ara.so 提供 — Daily 2026 Skills 系列。

OpenClaw-RL 是一个完全异步的强化学习框架,可将实时多轮对话转换为训练信号,用于个性化 AI 智能体。它通过 OpenClaw 将自托管模型封装为 OpenAI 兼容的 API,拦截对话,并在后台持续优化策略而不中断使用。它还支持终端、图形界面、软件工程和工具调用智能体的可扩展强化学习。

架构概述

四个独立的异步循环,彼此永不阻塞:

  1. 智能体服务 — OpenClaw 兼容的 API,提供推理服务
  2. 轨迹收集 — 将多轮对话捕获为训练轨迹
  3. PRM/评判器评估 — 使用下一状态反馈对每一轮进行评分(可选多数投票)
  4. 策略训练 — 通过 slimeTinker 进行 GRPO/OPD/组合训练

安装

git clone https://github.com/Gen-Verse/OpenClaw-RL
cd OpenClaw-RL

# 安装核心依赖
pip install -r requirements.txt

# 安装 slime(训练后端)
cd slime && pip install -e . && cd ..

# 可选:安装 SGLang 用于快速推理
pip install sglang

项目结构

OpenClaw-RL/
├── openclaw-rl/          # 二元 RL (GRPO) 方法
├── openclaw-opd/         # 在策略蒸馏方法
├── openclaw-combine/     # 二元 RL + OPD 组合
├── openclaw-test/        # 评估工具
├── terminal-rl/          # 第2赛道:终端智能体 RL
├── gui-rl/               # 第2赛道:GUI 智能体 RL
├── swe-rl/               # 第2赛道:软件工程智能体 RL
├── toolcall-rl/          # 第2赛道:工具调用智能体 RL
├── slime/                # 核心训练框架
└── openclaw/             # 运行时 / API 服务器

三种学习范式

1. 二元 RL (GRPO)

过程奖励模型根据下一状态反馈对每一轮进行评分。使用 GRPO 优势估计和 PPO 风格的裁剪替代损失。

2. 在策略蒸馏 (OPD)

当下一状态揭示有用的后见之明时,评判器提取文本提示以增强原始提示,创建增强教师。词元级别的对数概率差成为方向性优势信号。

3. 组合方法(推荐)

融合二元 RL 的标量监督与 OPD 的词元级方向性信号。最强且最稳健的优化方法。

快速开始 — 个人智能体(第1赛道)

二元 RL 启动脚本

# openclaw-rl/run_qwen3_7b_openclaw_rl.sh
export MODEL_PATH=/path/to/qwen3-7b
export DATA_PATH=/path/to/conversation/data
export CKPT_SAVE_DIR=/path/to/checkpoints

bash openclaw-rl/run_qwen3_7b_openclaw_rl.sh

OPD 启动脚本

export MODEL_PATH=/path/to/qwen3-7b
export JUDGE_MODEL_PATH=/path/to/judge-model
export DATA_PATH=/path/to/conversation/data

bash openclaw-opd/run_qwen3_7b_openclaw_opd.sh

组合方法(一行命令)

# 启动组合二元 RL + OPD
bash openclaw-combine/run_qwen3_7b_openclaw_combine.sh

配置 — 关键环境变量

# 模型配置
export MODEL_PATH=/path/to/base/model
export JUDGE_MODEL_PATH=/path/to/judge/model   # 用于 OPD
export PRM_MODEL_PATH=/path/to/prm/model       # 用于二元 RL

# 训练配置
export CKPT_SAVE_DIR=./checkpoints
export CKPT_ARGS="--save-interval 100 --save-dir $CKPT_SAVE_DIR"

# 推理配置
export ROLLOUT_ARGS="--rollout-batch-size 64 --num-rollouts-per-prompt 4"

# 优化器配置
export OPTIMIZER_ARGS="--lr 1e-6 --weight-decay 0.01 --adam-beta1 0.9 --adam-beta2 0.999"

# GPU 划分(例如,8 张 GPU:4 张用于训练,4 张用于推理)
export TRAIN_GPUS="0,1,2,3"
export ROLLOUT_GPUS="4,5,6,7"

# LoRA(可选,减少 GPU 内存占用)
export LORA_ARGS="--lora-rank 64 --lora-alpha 128 --lora-dropout 0.05"

LoRA 训练

# 在任何启动脚本中添加 LoRA 参数
export LORA_ARGS="--use-lora --lora-rank 64 --lora-alpha 128"

# 示例:LoRA 二元 RL
bash openclaw-rl/run_qwen3_7b_lora_openclaw_rl.sh

自定义损失 / 推理函数(插件 API)

slime 框架提供了扩展点,无需修改核心代码:

# 自定义损失函数
--custom-loss-function-path ./my_method/custom_loss.py

# 自定义推理函数
--rollout-function-path ./my_method/custom_rollout.py

# 自定义生成函数
--custom-generate-function-path ./my_method/custom_generate.py

# 自定义奖励模型
--custom-rm-path ./my_method/custom_rm.py

自定义损失函数示例

# my_method/custom_loss.py
import torch
from typing import Dict, Any

def compute_loss(
    policy_logits: torch.Tensor,
    reference_logits: torch.Tensor,
    rewards: torch.Tensor,
    advantages: torch.Tensor,
    config: Dict[str, Any]
) -> torch.Tensor:
    """
    自定义 GRPO 风格损失,带裁剪替代目标。
    """
    # 策略与参考模型的对数比
    log_ratio = policy_logits - reference_logits
    ratio = torch.exp(log_ratio)
    
    clip_range = config.get("clip_range", 0.2)
    
    # PPO 风格裁剪目标
    clipped = torch.clamp(ratio, 1 - clip_range, 1 + clip_range)
    loss = -torch.min(ratio * advantages, clipped * advantages).mean()
    
    # KL 惩罚项
    kl_coeff = config.get("kl_coeff", 0.01)
    kl_penalty = kl_coeff * log_ratio.mean()
    
    return loss + kl_penalty

自定义奖励模型示例

# my_method/custom_rm.py
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch

class CustomPRM:
    def __init__(self, model_path: str):
        self.tokenizer = AutoTokenizer.from_pretrained(model_path)
        self.model = AutoModelForSequenceClassification.from_pretrained(
            model_path, torch_dtype=torch.bfloat16
        )
        self.model.eval()

    def score(self, prompt: str, response: str, next_state: str) -> float:
        """
        给定提示、回复和下一状态反馈,对一轮对话进行评分。
        """
        combined = f"提示:{prompt}\n回复:{response}\n结果:{next_state}"
        inputs = self.tokenizer(combined, return_tensors="pt", truncation=True, max_length=2048)
        
        with torch.no_grad():
            logits = self.model(**inputs).logits
        
        # 二元奖励:正类概率
        return torch.softmax(logits, dim=-1)[0, 1].item()


def get_reward_model(config):
    return CustomPRM(config["prm_model_path"])

在 Tinker 上部署(云端)

# 一行命令部署到云端 — 支持混合 RL、OPD、二元 RL
export TINKER_API_KEY=$TINKER_API_KEY
export TINKER_ENDPOINT=$TINKER_ENDPOINT

# 通过 Ray 提交作业
ray job submit --address $TINKER_ENDPOINT \
  --working-dir . \
  -- bash openclaw-combine/run_qwen3_7b_openclaw_combine.sh

第2赛道 — 通用智能体 RL

终端智能体 RL

export ENV_TYPE=terminal
export MAX_STEPS=20
export PARALLEL_ENVS=32   # 并行环境实例数量

bash terminal-rl/run_terminal_rl.sh

GUI 智能体 RL

export ENV_TYPE=gui
export SCREENSHOT_BACKEND=playwright   # 或 selenium
export PARALLEL_ENVS=16

bash gui-rl/run_gui_rl.sh

工具调用智能体 RL

export ENV_TYPE=toolcall
export TOOLS_CONFIG=./toolcall-rl/tools_config.json
export PARALLEL_ENVS=64

bash toolcall-rl/run_toolcall_rl.sh

软件工程智能体 RL

export ENV_TYPE=swe
export SWE_BENCH_PATH=/path/to/swe-bench
export PARALLEL_ENVS=8   # 软件工程环境更消耗资源

bash swe-rl/run_swe_rl.sh

数据格式 — 对话轨迹

OpenClaw-RL 自动分类 API 消息。自定义数据的格式:

{
  "session_id": "user_session_abc123",
  "turns": [
    {
      "type": "main",
      "prompt": "帮我将此函数重构为使用 async/await",
      "response": "这是重构后的版本:...",
      "next_state": "用户接受了更改并说'完美,谢谢!'",
      "trainable": true
    },
    {
      "type": "side", 
      "prompt": "2+2 等于多少?",
      "response": "4",
      "trainable": false
    }
  ]
}
  • main 轮次:形成训练轨迹的多轮交互
  • side 轮次:从训练中排除的不可训练的系统/工具轮次

OpenClaw API 服务器设置

# 启动包装您模型的 OpenClaw 兼容 API 服务器
export BASE_MODEL_PATH=/path/to/your/model
export OPENCLAW_PORT=8000
export OPENCLAW_HOST=0.0.0.0

# 使用 SGLang 后端(推荐,速度更快)
python -m openclaw.server \
  --model-path $BASE_MODEL_PATH \
  --port $OPENCLAW_PORT \
  --backend sglang \
  --enable-rl-intercept          # 启用 RL 对话捕获
  --rl-buffer-dir ./rl_buffer    # 存储捕获轨迹的目录
// 在 TypeScript 中将服务器用作 OpenAI 兼容 API
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "http://localhost:8000/v1",
  apiKey: process.env.OPENCLAW_API_KEY ?? "local",
});

const response = await client.chat.completions.create({
  model: "your-model-name",
  messages: [
    { role: "user", content: "帮我写一个排序算法" }
  ],
  stream: true,
});

for await (const chunk of response) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

用于稳健 PRM 评分的多数投票

# 启用多数投票以获得更稳健的奖励估计
export MAJORITY_VOTE_N=5   # 每轮评判器调用次数
export MAJORITY_VOTE_THRESHOLD=0.6

# 添加到启动脚本参数:
--majority-vote-n $MAJORITY_VOTE_N \
--majority-vote-threshold $MAJORITY_VOTE_THRESHOLD

添加新方法(贡献模式)

# 1. 创建新的顶级文件夹
mkdir my-new-method
cd my-new-method

# 2. 必需文件
touch README.md                           # 记录内容、方式、环境变量
touch run_qwen3_7b_my_method.sh          # 启动脚本
touch custom_loss.py                      # 如需自定义损失
touch custom_rollout.py                   # 如需自定义推理
# run_qwen3_7b_my_method.sh — 遵循现有约定
#!/bin/bash
set -e

MODEL_SIZE="7b"
MODEL_PATH=${MODEL_PATH:-/path/to/qwen3-7b}
CKPT_SAVE_DIR=${CKPT_SAVE_DIR:-./checkpoints/my-method}

CKPT_ARGS="--save-interval 50 --save-dir $CKPT_SAVE_DIR"
ROLLOUT_ARGS="--rollout-batch-size 32 --num-rollouts-per-prompt 4"
OPTIMIZER_ARGS="--lr 1e-6 --weight-decay 0.01"

ray job submit --working-dir .. -- \
  python slime/train.py \
    --model-path $MODEL_PATH \
    --custom-loss-function-path my-new-method/custom_loss.py \
    $CKPT_ARGS $ROLLOUT_ARGS $OPTIMIZER_ARGS

常见模式

监控训练进度

# 查看 Ray 仪表板
ray dashboard  # 在 http://localhost:8265 打开

# 监控检查点保存
watch -n 10 ls -la $CKPT_SAVE_DIR

# 流式查看训练日志
tail -f ./logs/training.log

从检查点恢复

export RESUME_CKPT=$CKPT_SAVE_DIR/checkpoint-500
# 添加到启动脚本:
--resume-from-checkpoint $RESUME_CKPT

评估训练好的检查点

bash openclaw-test/run_eval.sh \
  --model-path $CKPT_SAVE_DIR/checkpoint-latest \
  --eval-tasks "conversation,coding,tool-use"

故障排除

推理和训练时 GPU 内存不足:

# 使用 LoRA 减少内存占用
export LORA_ARGS="--use-lora --lora-rank 32"
# 或减少并行环境数量
export PARALLEL_ENVS=8
# 或使用卸载优化
--offload-optimizer-state

异步循环落后(缓冲区溢出):

# 减小推理批次大小或增加评判器吞吐量
export ROLLOUT_ARGS="--rollout-batch-size 16"
# 或增加更多评判器工作进程
--num-judge-workers 4

PRM 评分全部接近 0.5(奖励崩溃):

  • 验证 next_state 字段是否包含有意义的反馈信号
  • 检查评判器提示模板是否符合预期格式
  • 尝试增加多数投票的 N 值:--majority-vote-n 7

SGLang 服务器无法启动:

# 检查 SGLang 版本兼容性
pip install sglang==0.4.x  # 检查 slime/requirements.txt 中的固定版本
# 回退到 vLLM 后端
--backend vllm

Ray 作业提交失败:

# 先启动 Ray 集群
ray start --head --num-gpus=$(nvidia-smi -L | wc -l)
# 然后提交作业
ray job submit --address auto -- bash run.sh

关键参考

📄 原始文档

完整文档(英文):

https://skills.sh/aradotso/trending-skills/openclaw-rl-training

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。