概述
taco-agentic-rl 是面向智能体强化学习(Agentic RL)场景的训练框架,与 TI-ONE 平台深度集成,为用户提供开箱即用的 Agentic RL 训练能力。本文档涵盖产品入口、最佳实践操作指南,以及与行业主流框架 VERL 的对比分析。
产品入口
镜像中心 已上架平台预置镜像 taco-agentic-rl-v1.0.0,如下所示:


最佳实践
概述
本最佳实践以 Qwen2.5-7B-Instruct 模型为基础,演示如何在 TI-ONE 平台上使用 taco-agentic-rl 框架完成智能体强化学习训练的完整流程。整体流程如下:
操作步骤 | 说明 |
在 TI-ONE 平台启动开发机(HCCPNV6 × 8 卡),配置镜像、CFS 存储及网络端口,下载基座模型。 | |
根据业务场景选择 Agent 实现(如 zeroclaw),部署独立的 Agent 在线服务并完成配置对接。 | |
在开发机上依次启动 Redis 任务队列、LLM Proxy、训练脚本和 Agent Server 四个组件,协同完成 Agentic RL 训练循环。 | |
使用 Perfetto UI 可视化查看训练过程中的 Agent 交互轨迹,辅助分析和调试。 | |
合并 FSDP 格式的 Checkpoint 为 HuggingFace 格式,使用 vLLM 部署训练后模型,通过 Agent 对话验证训练效果。 |
步骤1:准备环境
启动开发机
本次实践采用 HCCPNV6 × 8 卡,启动开发机作为训练平台。
镜像选择:内置镜像-taco-agentic-rl-v1.0.0
机器资源:8卡 / 256C 2000G
CFS 资源:请把您的 CFS 挂载到 /home/tione/notebook

添加端口:推荐使用 CLB,映射 8001 端口,避免服务重启导致 IP 变更需要重新配置。


注意:
后续非特别标注,所有命令以及操作均在此开发机执行。
模型下载
下载地址
请把模型下载到
/home/tione/notebook/models/Qwen2.5-7B-Instruct,如果路径不一样后续需要修改配置文件以及训练脚本。步骤2:启动 Agent 服务
1. 创建在线服务
这部分为一个独立的在线服务,非“准备环境”步骤中启动的开发机。请新建一个在线服务,或者复用您已有的 zeroclaw 服务。
如果您选择新建在线服务,配置如下:
配置项 | 说明 |
镜像 | ccr.ccs.tencentyun.com/ti-public/notebook-conda-gpu:zeroclaw-ti-dev20260603(可以直接填写该自定义镜像地址拉起 agent 服务) |
端口 | 42617 |
CFS 挂载 | 将修改好的配置文件目录挂载到 /opt/ml/conf |
启动命令 | 需要覆盖原有的启动命令(见下方) |

2. 配置文件
配置文件为 config.toml,需要手动修改以下内容(如果您已有 zeroclaw 服务,则无需使用默认配置文件,直接修改下列内容即可):
# 根据您的配置修改配置文件下列内容# 1. 调用地址:改为 taco-agentic-rl 开发机的 IP 地址default_provider = "custom:http://172.17.64.13:8001/v1"# 2. 模型名:改为您配置的模型default_model = "/home/tione/notebook/models/Qwen2.5-7B-Instruct"
3. 启动命令
cp /opt/ml/conf/config.toml /zeroclaw-data/.zeroclaw/ && zeroclaw daemon
启动结果:

4. 配对获取 Token
这部分可以用“服务调用” tab 的调用地址访问,也可以直接用在线服务对应的 pod ip + 端口访问。示例:
# IP 修改为您 zeroclaw 在线服务的 pod id# Pairing Code 可以从服务日志中看到curl -X POST http://172.17.x.x:42617/pair -H 'X-Pairing-Code: 045162'
调用结果如下图所示:


Tips:上面的 Pairing Code 是一次性的,请及时保存您获取到的 token,同一个服务无法再次使用同一个 Pairing Code 获取新的 token。
步骤3:开发机启动训练
训练代码
此示例的代码路径位于镜像内:/workspace/youtu-agentic-rl/examples/zeroclaw,后续所有脚本均在此目录下执行。
.├── agent_client.py├── agent_handler.py # 包含 agent 调用及奖励函数实现├── agent_server.py├── checkpoint/ # ckpt 默认保存目录├── config.yaml # 配置文件├── run_proxy.sh # 启动 LLM Proxy 的脚本├── run_queue.sh # 启动 redis 任务队列的脚本├── run_server.sh # 启动 agent server 的脚本├── train.sh # 训练脚本└── wandb/
训练过程
按以下顺序分别在新的 shell 中启动各组件:
1. 启动 Redis 任务队列
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_queue.sh

2. 启动 LLM Proxy
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_proxy.sh

3. 启动训练脚本
cd /workspace/youtu-agentic-rl/examples/zeroclaw# 配置环境变量export ZEROCLAW_GATEWAY_URL=http://172.17.X.X/ms-XXXexport ZEROCLAW_BEARER_TOKEN=zc_XXXbash train.sh

4. 启动 Agent Server
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_server.sh

运行日志
zeroclaw:

proxy:

训练进程:

agent_server:

步骤4:查看轨迹

训练轨迹如下:

生成轨迹文件
训练脚本 train.sh 默认会生成 trace.json,默认导出所有 batch 的轨迹。如果您需要手动 dump,请确保 Redis 服务存在,然后执行:
python -m tilearn.agentic_rl --config $CONFIG_PATH \\trace dump \\--batch 1 $total_training_steps \\-o $default_local_dir/trace.json
步骤5:训练后推理
1. 合并 Checkpoint 文件
训练后需要将 FSDP 格式的 ckpt 合并为 HuggingFace 格式才能使用 vLLM 等框架一键部署。在开发机执行:
cd /workspace/youtu-agentic-rl/examples/zeroclaw/checkpoint/youtu-agentic-rl/calc_x_claw_testpython -m verl.model_merger merge --backend fsdp \\--local_dir global_step_10/actor/ --target_dir ./merged_model
2. 部署原版模型(对照组)
使用 vLLM 启动原版 Qwen2.5-7B-Instruct:
vllm serve /home/tione/notebook/models/Qwen2.5-7B-Instruct/ \\--enable-auto-tool-choice --tool-call-parser hermes \\--served-model-name models/Qwen2.5-7B-Instruct --port 8001
然后在 zeroclaw 服务中进入 CLI 模式交互:zeroclaw agent
对话效果如下:

3. 部署训练后模型
使用 vLLM 启动训练后的模型:
cd /workspace/.../calc_x_claw_testvllm serve ./merged_model/ \\--enable-auto-tool-choice --tool-call-parser hermes \\--served-model-name models/Qwen2.5-7B-Instruct --port 8001
对话效果如下:

已知问题
问题描述:异常退出后显存残留
处理方法:目前训练脚本 train.sh 异常退出后,可能存在显存残留,通过 nvidia-smi 命令可确认。遇到此问题时执行以下命令清理:
pkill -9 -f ray::WorkerDict
TACO vs VERL 适配成本分析
对比背景
以论文 ReTool: Reinforcement Learning for Strategic Tool Use in LLMs 作为示例 Agent 场景,对比 TACO 和 VERL 两个框架在 Agentic RL 场景下的适配改造成本。
VERL 的 Agent 接入方式
为了接入 retool,verl 除了 recipe/retool 下的代码外,还在框架内部实现了 tool_agent,用来给 retool 注册:
data = {"data_source": data_source.split("/")[1].lower(), # aime_2024, aime_2025"prompt": [{"role": "user", "content": prompt}],"ability": "MATH","reward_model": {"ground_truth": str(answer)},"agent_name": "tool_agent",}
tool_agent 实现在 verl/experimental/tool_agent_loop.py 下:
@register("tool_agent")class ToolAgentLoop(AgentLoopBase):@classmethoddef init_class(cls, config, tokenizer, processor, **kwargs):...
VERL 把"agent"做成了框架内部的一等公民——必须实现一个继承自 AgentLoopBase 的类,注册到 agent_loop 里,框架来调度这个类的 rollout / generate / call_tool 等方法。所以 VERL 的 retool 例子里需要:
一个 ToolAgentLoop(AgentLoopBase) 类
一组 OpenAIFunctionToolSchema 描述的工具(位于 tool_parser.py 中)
agent_name="tool_agent" 在 dataset 里做路由
tool_config_path 指定工具配置 YAML

ReTool 启动方式:
硬件 | HCCPNV6 单机 8 卡 |
Docker 镜像 | mirror.ccs.tencentyun.com/verlai/verl:app-verl0.5-vllm0.9.1-mcore0.12.2-te2.2 |
模型 | Qwen2.5-7B-Instruct |
数据集 | DAPO-Math-17k、AIME_2024、AIME_2025 |
启动方式 | bash retool/run_qwen2_7b_dapo.sh |
TACO 的 Agent 接入方式
在 TACO 中,框架要求的“agent”只是一个签名为 (ctx, config) -> dict 的回调函数:
class Server:def __init__(self, ..., process_task: Callable[[TaskContext], str] = None, ...)
Server 启动 worker 进程后,每来一个任务就调一次这个函数(server.py:484):
result = await process_task(ctx, self.config)
qapython/agent_handler.py 里就是一个普通函数(没有任何继承):
async def process_task_async(ctx: TaskContext, config) -> Dict[str, Any]:# 1. 从 utu 加载现成的 agentagent_config = ConfigLoader.load_agent_config("examples/rl_train/qa_python_sandbox")qapython_agent = get_agent(config=agent_config)await qapython_agent.build()# 2. 跑多轮result = await qapython_agent.run(input=prompt)# 3. 算 reward 返回return {"answer": ..., "reward": ..., "metadata": ...}
然后在 agent_server.py:41 把它注入框架:
server = Server(config=config, process_task=process_task_async)
没有一个新类被定义,agent 与框架完全解耦。

qapython 启动方式:
硬件 | HCCPNV6 单机 8 卡 |
Docker 镜像 | ccr.ccs.tencentyun.com/ti-platform/ytrl-env:v1 |
模型 | 7B-coldstart |
数据集 | DAPO-Math-17k、AIME_2024、AIME_2025 |
启动方式 | run_queue.sh → run_proxy.sh → run_server.sh → train.sh |
附录
参考资源