Agent 能不能先定义“做成什么样”,再学会按这个标准工作?
SERA 让同一个 Qwen3-4B 策略模型拆任务、执行子任务、生成验收标准(rubric),再用成败可验证的反事实分支训练这份标准。
一次委派:先写验收标准,子 Agent 才开始做菜
根任务要求完成多道菜。所有 Agent 共享物品和厨房状态,但各自保留位置、历史和步数预算。
把 dish_1 与 dish_2 拆成独立目标,最后由自己执行 prepare / eat 收尾。
→
找 red apple、olive oil、water、orange bell pepper;切、烤并放到共享台面。
→
如果另一支也完成,根 Agent 准备两道菜并分别吃掉;检查器再看最终世界状态。
根任务有答案,Agent 自己发明的子任务通常没有
执行
子 Agent 是否完成目标?二元 judge 的信息很粗,而且树上每个节点都要额外判断。
拆解
“子任务是否成功”无法回答“当初是否该拆、该拆出多少工作”。
评价
同一组模型参数既要完成工作,又要判断返回结果是否足够好。
RAO 把程序检查器或 LLM judge 的二元结果直接发给每个节点;SERA 把外部标签集中用于训练 rubric,普通执行则改用 policy 自己的连续分数。
rubric 必须在子任务轨迹出现前冻结
读取父轨迹、当前状态、子任务目标、工具和预算。
每项含权重、零分/满分条件,另有成败门槛。
rubric 不再改写,子 Agent 仍可继续递归委派。
输入冻结 rubric、完整轨迹与最终状态。
根节点用环境结果;非根节点用 rubric 分数。
同一委派点复制 8 份,才能检验 rubric 排得对不对
8 条分支的起点、子任务目标和 rubric 完全相同,差别只来自后续采样。TextCraft 用程序标签,TextWorld 用 Kimi 做二元判断。
第 0 条分支
承担真实递归执行,并把最终状态提交给父节点。
第 1–7 条分支
只提供反事实训练数据;全成功或全失败的组会被跳过。
只训练“写 rubric”这次动作,评分输出不进入优化器
接收梯度
生成 rubric 的那段输出 token。
不接收梯度
8 次评分调用、子任务执行和真实成败标签。
LOO 基线
在一个 batch 的有效调用组之间计算 advantage。
一次委派覆盖多少叶节点,就分到多少结构奖励
发起这次委派的动作得到 2/3;只训练对应语句的 token。
完整 SERA 不再按子任务成败过滤。叶节点默认等权,拆得更碎不等于贡献更大。
16 : 2 : 2 是优化步骤调度,不是三种奖励的权重
Execution
Delegation
Rubric generation
真实题:Craft 3x a1_i5
Agent 看见
目标、当前库存和 5 个工具:get_info、view_inventory、craft、launch_subagent、finish。它需要自行查询五层配方依赖。
公开题目记录
该样例的标准轨迹有 22 次 craft。这条轨迹存在题目元数据里,但不会进入模型提示。
Agent 显式调用 finish();最终库存里的 a1_i5 比初始库存至少多 3 个。
少做任一中间物、用错原料、超过预算,或没有调用 finish()。已有目标物不能冒充本次新产物。
共享世界里的两道菜:完成一半仍是 0
题目与运行接口
dish_1 要烤切 red apple 与 orange bell pepper,并收集 olive oil、water;dish_2 要处理 carrot、purple potato,并收集 salt、flour。Agent 能看到任务描述、当前位置、可见物体、合法动作和剩余共享步数。
各 Agent 的位置和历史彼此独立;库存、物品、门、工具冷却状态、菜品进度和全局动作预算共享。环境动作加锁并原子提交。
每种食材都已收集,处理方式与配方完全匹配;两道菜都已完成并吃掉。
只完成 dish_1、忘记吃掉、删除食材,或做了不可逆的错误处理。任何一种都会让根任务失败。
最终榜单不用 LLM judge:跑完递归轨迹后直接检查根状态
| 协议 | TextCraft-Synth | TextWorld-Sync |
|---|---|---|
| 模型 | Qwen3-4B-Instruct-2507 全参数训练;分别取第 250 / 400 次更新 | |
| 题集 | 固定验证池中的 632 题 | 独立测试集中的 1,400 题 |
| 轨迹 | temperature 0;每题一条轨迹;根/子 Agent 各 20 步;最大深度 3 | |
| 上下文 | 10,240;单次输出 512 | 13,312;单次输出 3,072 |
| 运行接口 | CodeAct + IPython 函数 | text action / inventory / delegate / finish |
| 根任务判定 | 目标物净增达标且调用 finish | 食材与处理正确;每道菜都完成并吃掉 |
| 聚合 | 147/213/136/136,按题数加权 | 每档 350 题,等价四档宏平均 |
只写 rubric 不够,经过真实成败校准的排序才带来主要增益
| 方法 | 执行奖励 | rubric 怎样训练 | TextCraft | TextWorld |
|---|---|---|---|---|
| RAO | 程序 / judge 给二元成败 | 不训练 | 68.93 | 51.93 |
| SERA w/o D & RT | policy 按 rubric 给分 | 不训练 | 72.26 | 51.10 |
| SERA w/o D | policy 按 rubric 给分 | 按真实成败训练排序 | 74.84 | 60.26 |
| SERA | policy 按 rubric 给分 | 排序训练 + 叶节点奖励 | 74.31 | 65.07 |
Rank + score-dispersion 在 TextCraft 只有 65.77,比 verified ranking 的 74.84 低 9.07 分。把分数拉开,无法保证成功轨迹排在失败轨迹前面。
少调用外部 judge,不代表总训练更便宜
Judge 调用
TextWorld:147.80K → 35.79K;输入 token 633.80M → 125.32M。
实际用时
同为 2 × 8 H200:RAO 13h08m;SERA 24h14m。
测试时 N=2
65.07 → 67.50;policy 自选与 Kimi 的 67.29 基本持平。
推理时,每次委派都克隆两棵完整候选子树;先完成子任务,再按冻结 rubric 自底向上选择,最后提交获胜分支的共享环境状态。
算法核很小,论文级系统并不“小”
建议先读这五处
Runtime/rubric/prompts.py
Training/runtime/rubric_generation_ranking/stage.py
Training/runtime/three_stage_train/counterfactual.py
Training/runtime/two_stage_rao_leaf/leaf_credit.py
Training/sera_training/stage_kernel.py
单进程可复制环境 + delegate 工具 + 冻结 rubric + 复制 4/8 条分支 + 程序检查器 + 离线记录。
递归树、共享状态、精确 token 掩码、三套 LOO、CISPO、Ray/AReaL/FSDP/SGLang、16 张 H200。
只测一个 4B 模型和两个合成文字环境;TextCraft 的开发/评测题不独立;根仓库没有项目级 LICENSE。