Agentic RL 训练路线图#

slime 的核心定位并不只是跑单轮 RL,而是把高性能训练、SGLang rollout serving、以及可插拔的数据生成接口组合起来,支持 agent 时代常见的多轮工具调用、sandbox 交互、subagent 分支、context compact 和 test-based reward。

这篇文档是一个导航页:当你要把 agent workflow 接进 slime 时,先用它判断该看哪些文档和例子。

从哪里开始#

目标

推荐入口

给每条 sample 跑自定义 agent loop、tool call、RAG、browser/terminal/sandbox 交互

--custom-generate-function-path编写自定义生成函数

做 verifier reward、test-based reward、环境成功判定或外部 reward 服务

--custom-rm-path编写自定义奖励函数

一个 prompt 会产生多个训练样本,例如 subagent、multi-agent、context compact

custom generate 的 fan-out 返回examples/multi_agent

agent rollout 有长尾耗时,希望训练不要被最慢样本卡住

examples/fully_async

agent 需要 sandbox、真实代码修改、测试验证和完整端到端样例

examples/coding_agent_rl

多轮 agent 需要更高 SGLang serving 吞吐

PD 分离SGLang Config

想开启 SGLang 的优化 flag、router 策略或多模型 serving

sglang 使用方法SGLang Config投机采样低精度训练

推荐接入方式#

大多数 agentic RL 任务应该先从 --custom-generate-function-path 开始。这个函数负责把一次 agent 运行转换成 slime 可训练的 Sample:填好 tokensresponse_lengthloss_maskstatus,并在需要时填好 reward 或交给 --custom-rm-path 计算。

agent workflow 本身可以使用字符串、chat messages、tool calls、环境 observation 或框架自己的事件格式。但训练目标仍然应该是 token based:尽量保留模型实际采样得到的 token ids,并用 loss_mask 区分可训练的模型输出和 prompt、template、tool observation、环境文本。

如果一次 prompt rollout 只对应一个训练样本,返回一个 Sample 即可。如果一次 rollout 会拆成多个训练片段,例如 subagent 轨迹、main-agent 轨迹、compact 前后的片段,则返回 list[Sample],并给这些 sibling samples 设置相同的 rollout_id。这样 slime 会在训练 step 切分和 loss 聚合时把它们视作同一次 rollout,而不是重复计数。

只有当你需要替换整个 rollout 编排时,才优先考虑 --rollout-function-path。典型场景包括:自定义数据源调度、跨 rollout 的后台队列、完全异步生成,或者默认 sglang_rollout 的 prompt × sample 结构已经无法表达你的 workflow。

Agent Runtime Adapters#

slime 提供已有 agent runtime 可用的协议 adapter:

  • slime.agent.adapters.AnthropicAdapter:Anthropic Messages API,用于 Claude Code 风格 agent。

  • slime.agent.adapters.OpenAIAdapter:OpenAI Chat Completions 和 Responses API,用于 OpenAI SDK / OpenAI Agents SDK 风格 client。

adapter 是一个便利层,不是单独的 agent framework。它的 contract 是 message history in,sampled tokens out:adapter 会渲染 chat template,用 input_idsreturn_logprob=True 调 SGLang,并把返回的 token ids/logprobs 导出为可训练的 trajectory segments;不会从 response text 重新分词恢复训练目标。

在自定义 generate 函数里实例化对应协议的 adapter,用 aiohttp 跑它的 app,然后通过 adapter 实例管理每次 rollout:

from slime.agent.adapters import AnthropicAdapter

adapter = AnthropicAdapter(
    tokenizer=tokenizer,
    sglang_url=sglang_url,
    tool_parser=tool_parser,
    reasoning_parser=reasoning_parser,
)

adapter.open_session(session_id, sampling_defaults=sampling_params)
# Agent client 向 adapter.app 发送请求。
segments = await adapter.finish_session(session_id)

多轮 agent 应使用稳定的 session_id。adapter 会把它作为 X-SMG-Routing-Key 传给 SGLang,让同一个 session 尽量落到同一个 worker,复用 prefix cache。

Agent Serving 与性能配置#

agentic rollout 往往比普通单轮 generation 更依赖 serving 配置:上下文更长、多轮请求更多、请求时长分布更重尾,并且可能同时需要 actor、reference、reward 或工具侧模型。

  • 常规 SGLang server 参数通过 --sglang-* 传入。例如 --context-length 在 slime 中写作 --sglang-context-length--mem-fraction-static 写作 --sglang-mem-fraction-static

  • router 参数通过 --router-* 传入。多轮 agent 可以考虑 --router-policy consistent_hashing,让同一个 sample.session_id 的多轮请求落到同一个 worker,提高 prefix cache 命中率。详见 多轮 Agent 的会话亲和路由

  • 更复杂的拓扑使用 --sglang-config:它可以描述 PD 分离、多模型 serving、异构 server groups,以及每组不同的 SGLang overrides。

  • 多轮或 agentic RL 通常建议评估 PD 分离。prefill 与 decode 的负载形态不同,拆开后更容易分别扩展资源。

  • 对 rollout 吞吐敏感时,可以继续查看 投机采样低精度训练

参考样例#

完整的 coding-agent 样例见 examples/coding_agent_rl。它展示了一个比较接近真实 agent RL 的端到端形态:每条 sample 启动独立 sandbox,agent 使用工具修改代码,生成 git diff,再在干净 sandbox 里跑测试得到 reward。

这个样例也演示了 agent fan-out 的训练方式:middleware 会把 trajectory 切成 subagentwipe(compact 前被冻结的链)和 final 等片段,generate() 返回 list[Sample],并让这些片段共享同一个 rollout_id

如果你只需要更轻量的入门例子,可以先看 examples/search-r1 的多轮工具调用、examples/retool 的工具增强生成、以及 examples/multi_agent 的多 agent 模式。