AgentEvolver 深度研究:自顶向下跑通第一版训练
一句话先说清楚:AgentEvolver 把'训练智能体'从「人喂题、人评卷」扭成了「智能体自己出题、自己记经验、自己复盘归因」的自进化闭环。AppWorld 是它最顺手的一块入门沙盒——Python 能跑、457 个 API
目录
- 0. 为什么值得花时间读这篇
- 1. 三大核心机制:各自在治什么病
- 1.1 普通 Agent RL 的三道坎
- 1.2 机制一:自我任务生成(Self-Questioning,自动生成任务)
- 1.3 机制二:自我经验导航(Self-Navigating,失败经验学习)
- 1.4 机制三:自我反思归因(Self-Attributing,步骤级奖励归因)
- 1.5 三者合起来什么样
- 2. AppWorld 是什么,为什么拿它当入门环境
- 3. 最小化训练示例:只用内置数据集跑基础 GRPO
- 4. 环境服务怎么起、怎么用 curl 验活
- 5. basic.yaml 关键点:自顶向下看懂训练入口
- 6. 跑通清单 & 下一步
- 附:性能数字一览(Qwen2.5,AppWorld + BFCL v3,单位 %)
- 参考真本出处
文本版 · 供搜索与朗读
AgentEvolver 深度研究:自顶向下跑通第一版训练
一句话先说清楚:AgentEvolver 把'训练智能体'从「人喂题、人评卷」扭成了「智能体自己出题、自己记经验、自己复盘归因」的自进化闭环。AppWorld 是它最顺手的一块入门沙盒——Python 能跑、457 个 API
随手调、任务天然多步骤。本文只做一件事:先把基础 GRPO 流程用环境内置数据集跑通,ReMe 经验管理、ADCA-GRPO 归因这两块暂且关掉,循序渐进。
0. 为什么值得花时间读这篇
市面上的 Agent RL 教程,大多卡在'环境怎么接、奖励怎么给、任务哪来'。AgentEvolver 的巧,是它把这三件事都做成了可插拔的模块,还顺手给了一套最小可跑的默认配置(examples/basic.yaml)。
你不必一上来就啃三大机制。先把流程跑通、看到 loss 在动、看到 AppWorld 任务分数在涨,再回头开开关——这比死读论文踏实得多。
故本文顺序:先讲三大机制到底治什么病,再说为什么选 AppWorld 当沙盒,然后给最小化训练示例,最后自顶向下拆训练入口,让你知道每一步代码从哪来、往哪去。
1. 三大核心机制:各自在治什么病
1.1 普通 Agent RL 的三道坎
Agent 会调工具、会跟环境交互,这不稀奇。难的是让它持续变强。传统做法卡在三个地方:
任务稀缺。训练题靠人写规则、设场景、造目标。写出来的题永远有限,像给系统画了张固定地图——边界清楚,但想象力封死。走出地图就迷路。
探索低效。强化学习靠大量交互采样,烧钱又烧时。单 CPU 核跑几百万步环境,是家常便饭。
信号模糊。奖励太稀、太糊,模型不知道中间哪一步真起了作用。整条轨迹给同一个分,样本利用率低得可怜。
AgentEvolver 的回答,是把'提问、记经验、做归因'三件事塞进一个动态学习闭环。环境 → 任务 →
经验 → 策略,自己转起来。
1.2 机制一:自我任务生成(Self-Questioning,自动生成任务)
治的是「任务从哪来」。 不让智能体等投喂,让它反躬自问:'我还有什么不知道?'
流水线四步:
好奇心引导的环境探索。把环境配置当先验塞给 LLM,让它在环境里自由逛,产出多样化、高质量的交互轨迹。
适应性任务合成。LLM 读轨迹,结合用户偏好逆推出任务查询,再从轨迹里抽操作序列当参考解。
任务筛选与验证。语义去重滤掉冗余;再在真实环境里回放参考解,验证可行性、剔掉幻觉任务。
基于参考的合成奖励。请 LLM 裁判对比'智能体轨迹 vs 参考解'的覆盖度与效率,给出稠密、可靠的奖励信号。
这块贡献有多大?看数字:7B 模型只加 Questioning,AppWorld 的 avg@8 从基线 1.8% 直接拉到 23.2%(best@8 5.6% → 40.3%)。一个'自己出题'的机制,把近零基线拽出地面。
1.3 机制二:自我经验导航(Self-Navigating,失败经验学习)
治的是「探索低效」。 传统范式里,每次探索都是孤立事件,经验不沉淀。相似场景照样踩同一个坑。
它让系统学会'记笔记':
经验获取:把历史成败轨迹提炼成结构化自然语言经验,向量化,丢进可随时检索的经验池。
经验混合探索
:一部分轨迹由检索到的相关经验引导,一部分纯探索。探索与利用之间找平衡。
经验内化:把指导探索的经验文本从训练样本里剥离——逼模型学背后的推理逻辑,而非死记文本;对'成功经验引导且产生正向收益'的轨迹,梯度加权。
说'失败经验学习',最贴切的例子来自实测:某次智能体去调一个环境里根本不存在的 API,碰壁。这被记成一条经验。下次它学会先验证函数是否存在,再动手调用。败仗,变成了避坑的肌肉记忆。
数字:7B 上加 Questioning & Navigating,AppWorld avg@8 26.3% / best@8 43.1%。
1.4 机制三:自我反思归因(Self-Attributing,步骤级奖励归因)
治的是「信号模糊」。 长程任务里奖励滞后又糊,传统信用分配定位不到关键动作。
它让系统学会'复盘':
步级贡献归因:任务跑完,请一个'复盘专家'LLM 回溯整条轨迹,给每步打 GOOD / BAD 的定性标签。
双通道复合奖励:归因奖励(过程分,好=+1 / 坏=-1)+ 结果奖励(结果分,保留任务最终得分)。两部分各自标准化,再加权融合——既看过程,也看结果。
优势计算与优化:综合奖励转成每步的 Advantage,广播到该步对应的所有 token,最后用 GRPO 高效更新策略。
这套东西叫 ADCA-GRPO(归因驱动的信用分配)。相较传统 GRPO,性能约
+10%,训练步数少 40%。在监管行业尤其吃香——怎么解,和解出没有一样重要。
数字:7B 上加 Questioning & Attributing,BFCL v3 avg@8 56.8% / best@8 65.3%。
1.5 三者合起来什么样
不是三个孤立技巧,是一条链:环境 → 任务(Questioning)→ 经验(Navigating)→ 策略(Attributing)。外循环自转,不假外求。
完整版(三机制全开)的成绩:7B 模型 AppWorld avg@8 32.4% / best@8 51.2%,BFCL v3 avg@8 57.9% / best@8 69.0%,总平均 avg@8 45.2%——已经超过参数量翻倍的 14B 基线(29.8%)。14B 版更狠:总平均 avg@8 57.6%,而基线仅 29.8%。一句话,更少参数,更优性能。
2. AppWorld 是什么,为什么拿它当入门环境
AppWorld 由 Stony Brook 与 Allen AI 联合做,拿了 ACL'24 最佳资源论文。它造了个'可控的应用世界',专门考交互式编程智能体。
它的家底:
9 个日常 App(Amazon、Gmail、Spotify、Venmo、Splitwise、SimpleNote、Todoist、Phone、FileSystem 等),对外暴露 457 个 API
。
约 100 位(论文写 ~106)虚拟用户,数据库塞了 ~37 万行真实感数字活动——通讯录、订单、歌单、消息,彼此有家庭和社会关系。
750 个任务,切分:204 训练 / 75 开发 / 187 test-normal(同分布)/ 234 test-challenge(跨域 OOD)。
为什么它适合当入门沙盒,四点:
Python REPL,不是简单工具调用。每步 LLM 吐一段 python 代码块,在沙箱里执行;变量跨步保留,能增量搭程序、靠代码状态记事儿。App 功能就是普通 Python 函数,直接调。这点对 Agent RL 太友好——动作空间就是代码,天然支持循环、条件、错误处理。
状态可查、奖励可程序化验证。评估用基于状态的单元测试,验数据库增量(DB_t 的变化),还专门查'附带损害'——你做任务时有没有误改不相关数据。同一个目标,多种完成方式都算数。
任务天然多步骤、长程。平均跨 1.8 个应用、要 9.5 次 API 调用。难度分层清楚:GPT-4o 也就解 ~49% 常规题、~30% 挑战题。够难,但可测。
环境是确定性 MDP。奖励只在'完成步'给 1,其余全 0——稀疏,但干净。配合 AgentEvolver 的归因机制,正好练'从稀奖励里抠步骤信号'的本事。
工具丰富、状态可控、奖励可程序化、文档齐全——新手踩坑有人接,老手拓展有空间。这便是选它当沙盒的理由。
3. 最小化训练示例:只用内置数据集跑基础
GRPO
目标:流程先通,不碰任务合成、不碰经验管理、不碰步骤归因。纯 GRPO 把环境自带的 original tasks 当训练集。
官方给的 examples/run_basic.sh 已经把这事做绝了。它手动起训练(不走 launcher),关键参数我挑出来讲:
python3 -m agentevolver.main_ppo \
--config-path="$CONFIG_PATH" --config-name='script_config' \
env_service.env_url=http://localhost:8080 \
algorithm.adv_estimator=grpo \
attribution_driven_credit_assignment.enable=false \
actor_rollout_ref.model.path=Qwen/Qwen2.5-7B-Instruct \
actor_rollout_ref.actor.optim.lr=1e-6 \
data.train_batch_size=32 \
trainer.total_epochs=40 \
trainer.n_gpus_per_node=8 \
actor_rollout_ref.rollout.name=vllm \
actor_rollout_ref.rollout.mode=async \
actor_rollout_ref.rollout.n=8 \
actor_rollout_ref.rollout.temperature=0.9 \
task_manager.n=0 \
task_manager.mixture.synthetic_data_ratio=0.0 \
task_manager.mixture.use_original_tasks=True \
data.train_files=null data.val_files=null \
env_service.env_type=appworld
这几行是'最小化'的命门:
algorithm.adv_estimator=grpo —— 用 GRPO,不用 PPO 的 critic。
attribution_driven_credit_assignment.enable=false —— 关掉 ADCA-GRPO(步骤归因),退回朴素结果奖励。
task_manager.n=0 + synthetic_data_ratio=0.0 + use_original_tasks=True —— 关掉任务合成,只用环境内置原题。
data.train_files=null —— 不外接数据,吃环境自带的训练切分。
actor_rollout_ref.rollout.name=vllm + mode=async + n=8 —— vLLM 异步rollout,每组采 8 条。
模型默认 Qwen2.5-7B-Instruct,学习率 1e-6,批次 32,40 轮,8×A100(论文实验 cluster
配置)。想先在本机冒烟,把 n_gpus_per_node 调小、序列长度调短即可。
最简启动,其实一行就够(走 launcher,自动连环境服务):
conda activate agentevolver
python launcher.py --conf examples/basic.yaml --with-appworld
4. 环境服务怎么起、怎么用 curl 验活
训练要连一个'环境服务'。它本质是个 FastAPI 服务,把 AppWorld 包成 HTTP 接口。
手动起法(推荐先手动,心里有数):
source $(conda info --base)/etc/profile.d/conda.sh
conda activate appworld
cd env_service/launch_script
bash appworld.sh
appworld.sh 背后就一条命令:
python -m env_service.env_service --env appworld --portal 127.0.0.1 --port 8080
监听 127.0.0.1:8080。日志里出现 Starting server on 即算起妥。
用 curl 验活——这是最容易漏的一步。 服务跑起来不代表能训,先探一口:
curl -i http://127.0.0.1:8080/healthz
预期返回 HTTP/1.1 200 OK,正文 OK。/healthz 是 FastAPI 的健康检查端点(代码里明确定义 @app.get('/healthz'))。没有 / 也没有 /health,别敲错。
业务端点全是 POST:/create(建实例)、/step(执行一步)、/evaluate(评分)、/get_info、/release、/get_env_profile。训练时由框架自己调,你一般不用手动碰。
一句话口诀:起服务看 Starting server on,验活看 curl /healthz 回 200 OK。两者都过,再跑训练。
5. basic.yaml 关键点:自顶向下看懂训练入口
examples/basic.yaml 是最小化训练的灵魂文件。先贴真本,再逐段拆。
hydra:
searchpath:
- file://external/config_fallback
- file://config
defaults:
- ppo_trainer
- agentevolver
- _self_
trainer:
experiment_name:
basic
# self-navigating
exp_manager:
val_rollout_mode: "woexp"
train_rollout_mode: "woexp"
rollout_ratio: 0.0
train_sample_mode: "alldiscard"
train_sample_keepratio: 1.0
experience_template: "\n\nSome Related Experience to help you to complete the task:<EXP>{}</EXP>\n\n"
init_exp_before_training: False
init_exp_only: False
summary_batch_size: 8
reme:
base_url: "http://127.0.0.1:8001"
workspace_id: "default"
enable_summarizer: False
enable_context_generator: False
retrieve_top_k: 3
updated_freq: 0
# self-attributing
attribution_driven_credit_assignment:
enable: false
逐段讲:
Hydra 头。searchpath 指向 config 与 external/config_fallback;defaults 拉进
ppo_trainer 和 agentevolver 两组默认配置,再 _self_ 覆盖。即:这份 yaml 只写'跟默认不同的部分',其余继承。
trainer.experiment_name: basic。实验名,决定日志/备份目录。
exp_manager 这段——把经验导航(ReMe)关干净:
val_rollout_mode / train_rollout_mode 均 'woexp'(without experience),rollout 时不注入经验;
rollout_ratio: 0.0,不加经验;
train_sample_mode: 'alldiscard',训练后样本全丢,不沉淀;
init_exp_before_training: False,不开训就别建池。
reme 子段——经验管理服务彻底禁用:enable_summarizer: False、enable_context_generator: False、updated_freq: 0(0=不更新)。经验池压根不转。
attribution_driven_credit_assignment.enable: false——把 ADCA-GRPO(步骤级归因)关掉。奖励退回到朴素结果分。
自顶向下理清训练入口这条链:
launcher.py
├─ 读 .env(取 APPWORLD_PATH / APPWORLD_SCRIPT / API key / conda 路径)
├─ pty_launch("appworld") → 起环境服务(FastAPI, :8080)
└─ python -m agentevolver.main_ppo
--config-path config --config-name basic
│
└─ main_ppo.py ← 真正的训练循环入口
加载 ppo_trainer + agentevolver 配置
连 env_service.env_url=http://localhost:8080
跑 GRPO(adv_estimator=grpo)
也就是说:launcher 是壳,main_ppo 是核。 launcher 负责起环境、备份 yaml、注入变量;真正sample-rollout-update 的活儿全在 agentevolver/main_ppo.py。
.env 里这几项必填:环境服务的 APPWORLD_PATH、APPWORLD_SCRIPT、REME 相关(本次不用可空)、你的模型 API key、conda 路径。漏一项,launcher 起服务时就卡。
最简一键:
cp example.env
.env # 填好上面几项
python launcher.py --conf examples/basic.yaml --with-appworld
6. 跑通清单 & 下一步
装机到跑通,照这个顺序:
[ ] bash install.sh 装主环境(conda env 名 agentevolver)
[ ] cd env_service/environments/appworld && bash setup.sh 装 AppWorld 沙盒(建 appworld conda 环境、下数据、click 降级到 8.2.0 修安装坑)
[ ] cp example.env .env,填 API key / conda 路径 / APPWORLD 相关路径
[ ] 起环境服务,curl -i http://127.0.0.1:8080/healthz 看到 200 OK
[ ] python launcher.py --conf examples/basic.yaml --with-appworld 开训
[ ] 盯日志:先看环境连上没,再看 GRPO 的 reward 是否在涨
下一步,循序渐进地开开关:
先确认基础 GRPO 跑通、loss 在动、AppWorld 分数在涨。
开 ADCA-GRPO:把
attribution_driven_credit_assignment.enable 改成 true,看步骤归因带来的样本效率提升(预期 ~+10%、步数 -40%)。
再开 ReMe 经验管理:bash external/reme/install_reme.sh 起 ReMe 服务(默认 :8001),把 exp_manager 与 reme 段打开,--with-reme 一起拉。
最后开 任务合成(Self-Questioning):task_manager 调 synthetic_data_ratio,让智能体自己出题,逼近论文完整版。
附:性能数字一览(Qwen2.5,AppWorld + BFCL v3,单位 %)
配置
参数量
AppWorld avg@8
AppWorld best@8
BFCL v3 avg@8
BFCL v3 best@8
总平均 avg@8
基线(仅 GRPO)
7B
1.8
5.6
29.8
42.4
—
+Questioning
7B
23.2
40.3
49.0
60.6
—
+Q & Navigating
7B
26.3
43.1
53.3
61.0
—
+Q & Attributing
7B
25.7
43.7
56.8
65.3
—
AgentEvolver 全开
7B
32.4
51.2
57.9
69.0
45.2
基线(仅 GRPO)
14B
18.0
31.4
41.6
54.1
—
AgentEvolver 全开
14B
48.7
69.4
66.5
76.7
57.6
注:7B 全开总平均 45.2%,已超 14B 基线
29.8%。更少参数、更优性能,是这套框架最硬的一张牌。
参考真本出处
AgentEvolver 官方页 / GitHub:modelscope.github.io/AgentEvolver、github.com/modelscope/AgentEvolver
技术报告:arXiv:2511.10395
AppWorld 论文:arXiv:2407.18901(ACL'24 最佳资源论文)
配置真本:examples/basic.yaml、launcher.py、examples/run_basic.sh、env_service/launch_script/appworld.sh、env_service/env_service.py(/healthz 端点)