01 · QUESTIONarXiv:2610.04902v1 · 2026-10-04

Agent 能不能先定义“做成什么样”,再学会按这个标准工作?

SERA 让同一个 Qwen3-4B 策略模型拆任务、执行子任务、生成验收标准(rubric),再用成败可验证的反事实分支训练这份标准。

74.31%TextCraft 成功率
65.07%TextWorld 成功率
4.1×外部 judge 调用减少
16 GPUs论文默认 2 × 8 H200
来源:Abstract;Tables 1, 2, 51 / 14
02 · ONE RECURSIVE CASEFigure 2;Dataset/training/textworld_train.jsonl

一次委派:先写验收标准,子 Agent 才开始做菜

根任务要求完成多道菜。所有 Agent 共享物品和厨房状态,但各自保留位置、历史和步数预算。

根节点 · 深度 0准备并吃掉两道菜

把 dish_1 与 dish_2 拆成独立目标,最后由自己执行 prepare / eat 收尾。

rubric
→
子节点 · 深度 1处理 dish_1

找 red apple、olive oil、water、orange bell pepper;切、烤并放到共享台面。

结果
→
父节点恢复执行读回结果与新状态

如果另一支也完成,根 Agent 准备两道菜并分别吃掉;检查器再看最终世界状态。

论文 Figure 2 是说明性轨迹;食材来自公开训练样例,本文重新组织2 / 14
03 · WHYSections 1, 3.1

根任务有答案,Agent 自己发明的子任务通常没有

执行

子 Agent 是否完成目标?二元 judge 的信息很粗,而且树上每个节点都要额外判断。

拆解

“子任务是否成功”无法回答“当初是否该拆、该拆出多少工作”。

评价

同一组模型参数既要完成工作,又要判断返回结果是否足够好。

RAO 把程序检查器或 LLM judge 的二元结果直接发给每个节点;SERA 把外部标签集中用于训练 rubric,普通执行则改用 policy 自己的连续分数。

来源:Sections 1, 2;Table 63 / 14
04 · EXECUTION REWARDSection 3.2;Runtime/rubric/prompts.py

rubric 必须在子任务轨迹出现前冻结

1 · 观察父任务与轨迹前缀

读取父轨迹、当前状态、子任务目标、工具和预算。

2 · 提交写 4–8 项 rubric

每项含权重、零分/满分条件,另有成败门槛。

3 · 执行子 Agent 跑完整轨迹

rubric 不再改写,子 Agent 仍可继续递归委派。

4 · 评分同一 policy 评分

输入冻结 rubric、完整轨迹与最终状态。

5 · 更新只训练执行 token

根节点用环境结果;非根节点用 rubric 分数。

代码核验:prompts.py:157–260;rubric_subagent_reward/processor.py4 / 14
05 · COUNTERFACTUALSSection 3.4;counterfactual.py

同一委派点复制 8 份,才能检验 rubric 排得对不对

8 条分支的起点、子任务目标和 rubric 完全相同,差别只来自后续采样。TextCraft 用程序标签,TextWorld 用 Kimi 做二元判断。

✓s=.92
×s=.21
✓s=.81
×s=.36
✓s=.74
×s=.12
×s=.42
✓s=.88

第 0 条分支

承担真实递归执行,并把最终状态提交给父节点。

第 1–7 条分支

只提供反事实训练数据;全成功或全失败的组会被跳过。

来源:Section 3.4;代码 counterfactual.py:84–2145 / 14
06 · RUBRIC OBJECTIVEEquation 3;rubric_generation_ranking/stage.py

只训练“写 rubric”这次动作,评分输出不进入优化器

Lrank = meani∈success,j∈failure max(0, 0.2 − si + sj)成功分支应比失败分支至少高 0.2;rubric reward = −Lrank

接收梯度

生成 rubric 的那段输出 token。

不接收梯度

8 次评分调用、子任务执行和真实成败标签。

LOO 基线

在一个 batch 的有效调用组之间计算 advantage。

来源:Equation 3, 6;实现 stage.py:29–63, 163–2556 / 14
07 · DELEGATION REWARDSection 3.3;leaf_credit.py

一次委派覆盖多少叶节点,就分到多少结构奖励

rleaf(e) = root_success × |leaves under e| / |all leaves|
根任务成功某次委派覆盖 2 / 3 叶节点

发起这次委派的动作得到 2/3;只训练对应语句的 token。

根任务失败所有委派奖励都是 0

完整 SERA 不再按子任务成败过滤。叶节点默认等权,拆得更碎不等于贡献更大。

来源:Equation 2;实现 leaf_credit.py:99–135,reward_first_launch/stage.py7 / 14
08 · UPDATE ROUTINGSections 3.5–3.6;stage_kernel.py

16 : 2 : 2 是优化步骤调度,不是三种奖励的权重

E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
D
D
R
R

Execution

solverubricdelegatereturn

Delegation

solverubricdelegatereturn

Rubric generation

solverubricscorereturn
同一个全参数 policy;CISPO + 各阶段独立 LOO 基线 + 深度加权8 / 14
09 · TEXTCRAFT CASEDataset/training/textcraft_synth_train.jsonl;env.py

真实题:Craft 3x a1_i5

Agent 看见

目标、当前库存和 5 个工具:get_info、view_inventory、craft、launch_subagent、finish。它需要自行查询五层配方依赖。

公开题目记录

该样例的标准轨迹有 22 次 craft。这条轨迹存在题目元数据里,但不会进入模型提示。

PASS

Agent 显式调用 finish();最终库存里的 a1_i5 比初始库存至少多 3 个。

FAIL

少做任一中间物、用错原料、超过预算,或没有调用 finish()。已有目标物不能冒充本次新产物。

代码核验:TextCraft env.py:710–768;样例 ID textcraft_synth.train.09 / 14
10 · TEXTWORLD CASETextWorld-Sync V9;composite_scorer.py

共享世界里的两道菜:完成一半仍是 0

题目与运行接口

dish_1 要烤切 red apple 与 orange bell pepper,并收集 olive oil、water;dish_2 要处理 carrot、purple potato,并收集 salt、flour。Agent 能看到任务描述、当前位置、可见物体、合法动作和剩余共享步数。

各 Agent 的位置和历史彼此独立;库存、物品、门、工具冷却状态、菜品进度和全局动作预算共享。环境动作加锁并原子提交。

PASS

每种食材都已收集,处理方式与配方完全匹配;两道菜都已完成并吃掉。

FAIL

只完成 dish_1、忘记吃掉、删除食材,或做了不可逆的错误处理。任何一种都会让根任务失败。

来源:公开训练样例;checker composite_scorer.py:14–4510 / 14
11 · EVALUATION HARNESSTable 5;Evaluation READMEs and code

最终榜单不用 LLM judge:跑完递归轨迹后直接检查根状态

协议TextCraft-SynthTextWorld-Sync
模型Qwen3-4B-Instruct-2507 全参数训练;分别取第 250 / 400 次更新
题集固定验证池中的 632 题独立测试集中的 1,400 题
轨迹temperature 0;每题一条轨迹;根/子 Agent 各 20 步;最大深度 3
上下文10,240;单次输出 51213,312;单次输出 3,072
运行接口CodeAct + IPython 函数text action / inventory / delegate / finish
根任务判定目标物净增达标且调用 finish食材与处理正确;每道菜都完成并吃掉
聚合147/213/136/136,按题数加权每档 350 题,等价四档宏平均
主表对 3 次运行报告均值 ± 标准差;评测错误按失败计入11 / 14
12 · RESULTSTables 1 and 3

只写 rubric 不够,经过真实成败校准的排序才带来主要增益

方法执行奖励rubric 怎样训练TextCraftTextWorld
RAO程序 / judge 给二元成败不训练68.9351.93
SERA w/o D & RTpolicy 按 rubric 给分不训练72.2651.10
SERA w/o Dpolicy 按 rubric 给分按真实成败训练排序74.8460.26
SERApolicy 按 rubric 给分排序训练 + 叶节点奖励74.3165.07

Rank + score-dispersion 在 TextCraft 只有 65.77,比 verified ranking 的 74.84 低 9.07 分。把分数拉开,无法保证成功轨迹排在失败轨迹前面。

数值均为成功率;报告 3 次运行均值;TextCraft 按 632 道题加权12 / 14
13 · COST & REUSETables 2, 4, 7

少调用外部 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 自底向上选择,最后提交获胜分支的共享环境状态。

TextCraft SERA 24h06m,比 RAO 29h36m 快;成本结论依 benchmark 与硬件13 / 14
14 · HOW TO LEARN ITRepository revision 0443b19

算法核很小,论文级系统并不“小”

建议先读这五处

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。

代码和两个 checkpoint 已公开;HF checkpoint 仓库有 Apache-2.0,代码复用需另行确认14 / 14