LearnAct
Agent · arXiv 2024 · 2402.15809v2

LearnAct:让智能体自己写工具,而不是只改提示

LLM 智能体的动作空间通常是写死的:规划层说“把杯子搬过去”,执行层只有“移动、抓取、放下”。 LearnAct 让一个更强的学习者 LLM 把常用动作组合写成 Python 函数,再在失败轨迹上迭代修函数或补使用说明。 每个任务只拿 3 个训练实例,剩下的实例用来测泛化。

Haiteng Zhao, Chang Ma 等 · 北京大学 / 字节跳动 / 香港大学 arXiv 2402.15809v2 ↗
TL;DR · 30 秒抓住核心

论文把瓶颈定位在“能做什么”,而不是“怎么想”。ReAct 是提示框架(Table 1 的 Learnable 为 ✗);Reflexion(ReAct+Reflexion)学的是自然语言层面的策略:下一步该想什么、该怎么改提示。动作空间本身没有变。LearnAct 换了一个作用点:让智能体把若干原子动作封装成新的 Python 函数,再用环境返回的失败信息修改这些函数。

学习循环分两段。ActionCreation 先生成动作函数,并为每个函数写描述和使用示例;ActionLearn 在训练实例上跑出失败轨迹,选出错误案例,让学习者 LLM 改函数或补说明。每轮改 K=4 份候选,逐个在训练集上评估,按 μ = psucc + pstepacc 选最好的一份。

在 GPT-4 上,Robotic Planning 平均成功率 82.8%,比 ReAct+Reflexion 的 66.7% 高 16.1 个百分点,比 Voyager 的 72.1% 高 10.7 个百分点;AlfWorld 平均 72.2%,比 Voyager 的 58.0% 高 14.2 个百分点。

但收益不是无条件的:换成 GPT-3.5 当被测模型,Robotic Planning 平均只剩 23.2%;逐任务看也有反例,GPT-4 的 AlfWorld Look 上 Voyager 反而高 4.1 个百分点。所谓“学习”也主要是改已有函数(86% / 92% 的修改是 Function Updating),动作数量几乎没涨。

16.1pp
GPT-4 · Robotic Planning
82.8% 对 ReAct+Reflexion 66.7%
14.2pp
GPT-4 · AlfWorld
72.2% 对 Voyager 58.0%
3个
每个任务用于学习的实例数
其余实例全部留作测试
01

动作空间是写死的,规划再聪明也只能用同一套扳手

先分清两件事:策略学习改的是“怎么选”,动作学习改的是“有哪些可选”。

语言智能体的典型结构是:LLM 生成下一步动作,环境执行后返回观察或错误信息,循环到任务结束。动作集合 A 由开发者预先给定,通常是很底层的原语:move()、pick()、drop()。论文在引言里用调酒举例:如果要做一杯 Old Fashioned,标准做法是 muddle sugar;但环境里只有糖浆,没有方糖。智能体如果能改写动作,就可以把“加糖浆”封装成一个新动作推断(依据:§1 的 Old Fashioned 例子;原文说要调整预设动作以避免反复失败,未直接写“封装”);如果动作空间固定,它只能在原有原语上反复失败(§1)。

论文把固定动作空间带来的问题归成两类(§1):

错位

常识规划与底层动作对不上

LLM 的规划是在“把饮料调好”这个抽象层做的,可执行动作却只有“移动到某处、抓住某个瓶子”。中间的抽象层要由模型自己在推理里补齐,步骤一长就更容易断。

失败

前置条件不满足、策略无效

原语动作往往有前置条件:手上已经有东西时不能再抓;容器没打开时不能倒。每一步都要模型记住并检查这些条件,错误会沿着长序列累积。

作者的判断是:这些失败不全是“想得不够好”,而是“工具不够用”。如果智能体能从失败经验里造出更贴合任务的动作,规划层需要覆盖的步骤会变短,错误暴露面也会变小。这就是论文标题里的 Action Learning。

论文的立场

动作学习与策略学习不是同一层

论文 §5.4 的原话是:“Action learning outperforms the verbal policy learning... possessing proficient skills is essential for the agent to fully realize its potential.” 它没有否认提示和反思的作用,但认为这些手段主要在规划层加码,不能替代动作空间的扩展推断(依据:§5.4 称 verbal policy 与 prompt 对规划的帮助有限、proficient skills 才让智能体充分发挥;原文未直接断言“不能扩展工具”)。

02

前人改“怎么想”,很少有人系统改“能做什么”

四条路线放在同一张表里,差别主要在两点:动作是不是代码,以及学习是不是闭环。

论文在 Table 1 里把代表性方法按五个维度摊开。“Closed Loop”指有没有环境反馈驱动的闭环学习;“Action Type”指动作是自然语言还是代码;“Learnable”指动作本身能不能被学习;“Transferable”指学到的动作能否迁移;“Learnable Module”指学习发生在策略层还是动作层。

Table 1 转录 · 论文对开放动作智能体的分类。Voyager 的 Learnable 带脚注:其 curriculum learning pipeline 是为 MineDojo 定制的。
方法Closed LoopAction TypeLearnableTransferableLearnable Module
ReAct✔Natural language✗––
ReAct+Reflexion✔Natural language✔✗Policy
CodeAsPolicy✗Code✗––
Voyager✔Code✔*✔Action
LearnAct✔Code✔✔Action

* Table 1 脚注:Voyager 使用为 MineDojo 定制的 curriculum learning pipeline 来学习新动作。

两条对照最值得注意。第一条是 ReAct+Reflexion:它有闭环,但学到的产物是自然语言策略,动作类型仍是 Natural language,学习模块写的是 Policy。Reflexion 的反思会改进下一次尝试,却不会沉淀成一个可调用的新动作。第二条是 Voyager:动作类型已经是 Code,学习模块也是 Action,但 Table 1 把它的 Transferable 标成 ✔、Learnable 带 MineDojo 脚注;论文用这张表把“能学代码动作”和“能在不同任务间迁移”分开。

CodeAsPolicy 则是另一头:动作是代码,但没有闭环学习(Closed Loop 为 ✗)。它说明“把动作写成代码”本身不够,代码必须进入“执行—失败—修改”的循环,才会随经验变好。

LearnAct 的位置很清楚:动作类型用代码,学习模块放在动作层,学习过程闭环。它要验证的假设是:把学习对象从提示换成函数,智能体的能力边界会随经验扩张,而不只是把同一套动作用得更好。

03

把动作写成函数,再用失败案例改函数

核心只有两个动作:先生成动作函数,再按失败轨迹迭代修改;采样是为了过滤掉改坏的那几次。

ActionCreation:先造函数,再写说明书

训练开始时只有原始动作集 A0 和基础指令 π0。学习者 LLM F 先读任务说明,生成一组新的动作函数 A′。这些函数是普通 Python 代码,可以调用 pick()、move() 这类原语,也可以使用条件、循环和断言。论文强调的正是后者:代码让动作能表达“如果手上有东西就先放下”这类逻辑,而不只是固定顺序的宏(§4.1)。

函数生成后,还要生成使用说明 πA′。每份说明包含两件事:函数描述(它做什么、需要什么前置条件)和使用示例(在什么场景下调用、参数怎么填)。这两部分会和原始指令一起拼进被测智能体的提示。论文把这一步拆成两个子步骤:先生成描述,再生成示例(§4.1、Appendix)。

ActionLearn:从失败轨迹里选一个案例来改

每轮迭代,被测智能体带着当前动作集在 M 个训练实例上执行。论文的选择规则是 SelectErrorCase:从失败结果里挑出一条轨迹,把状态序列 s1:T、动作序列 a1:T 和失败信息交给学习者 LLM。学习者有两条修改路径:

路径 A

Function Updating

直接改函数体。例如发现“手上已有物体时不能再抓”,就在函数里加一个前置检查。论文观察到绝大多数修改走这条路。

路径 B

Note Writing

函数逻辑不改,只补使用说明。适合“代码没写错,但调用场景不对”的错误。改完的说明会和函数一起进入下一轮提示。

这两条路径是二选一:§4.1 写 “LLM F is free to choose one of them”,Table 4 里两项占比在每个环境都恰好加和为 1(0.86 + 0.14、0.92 + 0.08)。论文还允许学习过程新增函数,所以动作集可能变大。

为什么要采 4 份候选:一次改写可能改坏

论文指出,学习者生成的修改并不总是有效,有些只是“看起来像修复”的表面改动。为了降低单次改写的方差,ActionLearn 会独立采样 K 次,得到 K 组候选动作集和说明。每组都在同一批训练实例上跑一遍,算一个分数:

μk = psucc,k + pstepacc,k
Eq. 3 · psucc 是训练实例上的成功率;pstepacc 是成功执行的动作步数占总步数的比例,用来衡量动作是否可执行。两项直接相加,没有权重。原文 Eq. 3 写作 μ = psucc + pstepacc,没有下标 k;页面按 Algorithm 2 的 K 份候选样本加 k 索引。

分数最高的那组进入下一轮。K 在实验里取 4(§5.3)。这个选择标准同时看“任务有没有做完”和“动作有没有频繁执行失败”。推断 只看成功率可能选中靠反复试错蒙对的版本;把 step accuracy 加进来,会偏向动作本身更可执行的版本(依据:§4.1 对 pstepacc 的定义;论文未单独消融这一选择标准)。

这套流程不是策略梯度:没有奖励模型,也没有对 LLM 参数做更新。所谓“学习”,是在代码空间里做带执行反馈的搜索,产物是一个新的动作库和一份新的使用说明。理解这一点,才能解释后面“动作数量几乎没变、成功率却上去了”的结果。

04

3 个训练实例、4 份改写:学习发生在很小的样本上

这一节把实验设置摊开:训练集有多小、每轮要跑多少次、迭代到第几步停。

§5.1–§5.3 实验设置;表中所有数字都来自这三节。
项目设置出处
被测智能体GPT-4 或 GPT-3.5 Turbo§5.3
学习者 LLM全程 GPT-4,包括 ActionCreation 与 ActionLearn§5.3
训练实例每个任务随机选 3 个;其余实例全部作测试§5.3
采样候选数K = 4§5.3
温度0.0§5.3
学习迭代正文未给固定 maxiter;Figure 3(右)比较了不同最大步数,并称 2 步即达到最好结果§5.5 / Figure 3
重复次数每个任务重复 3 次,报告平均§5.3
In-context 示例所有方法统一给 1 个;CodeAsPolicy 与 Voyager 的代码示例与 LearnAct 相同§5.3
Robotic PlanningGripper / Blockworld / Barman / Tyreworld,共 4 个任务;沿用 AgentBoard 与 LLM+P 的环境实现§5.1
AlfWorldPut / Clean / Heat / Cool / Look / Put 2,共 6 类目标§5.1
基线Act、ReAct、Act+Reflexion、ReAct+Reflexion、CodeAsPolicy、Voyager§5.2

每轮的实际开销:Appendix A.1 的 Algorithm 2 先采样 K 份候选,再对每个训练实例、每份候选各跑一次 SolveProblem 做评估。按 K=4、M=3 算,每轮至少 12 次完整的智能体执行(4 × 3)。论文没有报告 token 数、墙钟时间或 API 成本;这一项只能在部署时自己测。

迭代到第几步停:论文没有在正文给出固定的 maxiter 数值,而是用 Figure 3(右)比较不同最大迭代步数的效果。它的结论是 2 步就达到最好结果(§5.5 / Figure 3)。继续加步数不会继续涨,反而会因为对训练案例的过度优化而下降;作者把原因归为“过拟合到具体训练案例、误解任务规则”,并在 Figure 10 给了失败案例。

小样本的代价:每个任务只有 3 个训练实例,任务规则和原始动作空间在训练集与测试集之间保持一致,变的是场景和目标。推断 这个设定把“记忆训练实例”排除在外:如果智能体只是背下 3 个案例,测试集上不会涨(依据:§5.3 训练实例与测试实例不相交)。反过来说,推断 3 个实例也不足以覆盖任务的所有分支;论文每个任务重复三次并报告平均,但没有报告标准差,也未说明重复的目的(§5.3);推断 重复是为了降低单次运行的波动。

05

一条循环:造动作 → 跑训练集 → 选错误 → 改动作 → 再跑

LearnAct 没有新网络,流程是 Algorithm 1 的主循环,加上 Appendix A.1 的 Algorithm 2 里的采样与选择。

A₀ + π₀ 原始动作集 与基础指令 ActionCreation 学习者 F 生成函数 A′ 再生成描述 + 示例 得到 A₁, π_A₁ 跑训练实例 SolveProblem 3 个实例,逐个执行 记录失败轨迹 SelectErrorCase 选一条失败轨迹 s₁:T, a₁:T, r 交给学习者 F ActionLearn 改函数 / 补说明 采样 K = 4 份候选 各在训练集上评估 按 μ 选最高的一份 Aᵢ₊₁, π_Aᵢ₊₁ 回到「跑训练实例」 直到达到最大迭代步数 测试阶段:用最终的 A_last 与 π_A_last 在未参与学习的实例上评估成功率 学习结束后
按 Figure 1、Algorithm 1 与 Appendix A.1 的 Algorithm 2 重绘的简化流程:覆盖 ActionCreation、SolveProblem、SelectErrorCase、ActionLearn、K 次采样与按 μ 选择六个分支。配色上,青灰(c1)是输入与执行环节,陶土(c2)是生成与选择环节,强调色是 ActionLearn;测试虚线从循环结束处(学习后的最终动作集)出发。未覆盖 prompt 的具体内容、生成代码的解析失败回退、函数库的版本管理,以及测试阶段的逐步执行细节;页面不做代码执行模拟。

Algorithm 1 的循环体只有三步:在训练集上执行、选出错误案例、让学习者改写。真正让流程转起来的是环境反馈:失败信息既是“哪里出错”的信号,也是下一轮改写的输入。测试阶段不再更新动作,只把最终动作集 Alast 和使用说明 πA_last 带到未参与学习的实例上。

06

平均成功率抬起来了,但提升高度依赖被测模型

先看两个环境、两个模型的平均账,再看逐任务反例和消融。

下表把 Table 2 与 Table 3 的平均列合在一起,方便横向比较。— 表示原文 Table 3 中 CodeAsPolicy 在 AlfWorld 没有结果(原文单元格为 “-”)。GPT-3.5 的逐任务未转录,仅保留平均列;逐任务数字见原文 Table 2 / Table 3。

Table 2 / Table 3 平均列转录 · Act 到 LearnAct 共 7 种方法。
方法Robotic · GPT-3.5Robotic · GPT-4AlfWorld · GPT-3.5AlfWorld · GPT-4
Act4.060.724.848.6
ReAct3.963.316.253.7
Act+Reflexion3.957.227.348.9
ReAct+Reflexion7.666.718.654.7
CodeAsPolicy1.727.9——
Voyager11.572.118.358.0
LearnAct23.282.835.872.2

交互:切换环境与模型,看每种方法的平均成功率

下面把 Table 2 / Table 3 的 7 个方法做成可切换柱状图。选环境与模型,柱子逐条重画;读数区给出 LearnAct 与当前第二名的差值,Robotic 读数取自 Table 2,AlfWorld 取自 Table 3。青灰柱是基线,陶土红是 LearnAct。AlfWorld 的 CodeAsPolicy 原文没有结果,显示为“—”。

当前读数
LearnAct 82.8% · 次优 Voyager 72.1% · 领先 10.7 个百分点(Table 2)
LearnAct 基线方法 “—”:原表无结果
手算:两组读数与差值与上面的交互同一口径

配置 A:AlfWorld · GPT-4。LearnAct = 72.2,次优 Voyager = 58.0,绝对差 = 72.2 − 58.0 = 14.2 个百分点(Table 3)。

配置 B:Robotic Planning · GPT-3.5。LearnAct = 23.2,次优 Voyager = 11.5,绝对差 = 23.2 − 11.5 = 11.7 个百分点(Table 2)。

交互只做表格读数与两个数值的减法,不计算平均、标准差或相对提升;因此不存在 ÷N 与 ÷(N−1) 的口径选择。表中数字逐字来自 Table 2 / Table 3。

GPT-4 的逐任务结果:Robotic Planning

Table 2 转录 · GPT-4,四个 Robotic Planning 任务的逐任务成功率与平均。
方法BlockworldGripperBarmanTyreworldAvg.
Act57.158.764.762.160.7
ReAct71.445.170.566.463.3
Act+Reflexion62.158.870.637.157.2
ReAct+Reflexion72.257.174.463.166.7
CodeAsPolicy23.641.217.629.327.9
Voyager66.476.580.565.072.1
LearnAct73.982.587.487.682.8

GPT-4 的逐任务结果:AlfWorld

Table 3 转录 · GPT-4,六个 AlfWorld 目标类型的逐任务成功率与平均。
方法PutCleanHeatCoolLookPut 2Avg.
Act77.750.513.042.840.866.648.6
ReAct73.961.930.546.459.749.853.7
Act+Reflexion71.447.56.835.180.252.448.9
ReAct+Reflexion61.854.039.962.957.652.354.7
CodeAsPolicy———————
Voyager84.160.827.949.768.657.158.0
LearnAct85.676.253.272.064.581.572.2

平均账:GPT-4 的 Robotic Planning 上,LearnAct 比 ReAct+Reflexion 高 16.1 个百分点(82.8 − 66.7),比 Voyager 高 10.7 个百分点(82.8 − 72.1)。AlfWorld 上比 Voyager 高 14.2 个百分点(72.2 − 58.0)。GPT-3.5 的 Robotic Planning 上,LearnAct 的 23.2% 比 Voyager 的 11.5% 高 11.7 个百分点;AlfWorld 上 35.8% 比第二名 Act+Reflexion 的 27.3% 高 8.5 个百分点。

反例 1 · 不是每个子任务都赢。GPT-4 的 AlfWorld Look 上,Voyager 68.6% 高于 LearnAct 的 64.5%,差 4.1 个百分点;Act+Reflexion 的 80.2% 比 LearnAct 的 64.5% 高 15.7 个百分点。GPT-3.5 上差距更大:AlfWorld Look 的 Act 48.1% 对 LearnAct 24.1%(差 24.0 个百分点),Put 2 的 ReAct+Reflexion 39.3% 对 16.9%(差 22.4 个百分点);Robotic Blockworld 上 Voyager 18.6% 高于 LearnAct 的 10.0%,差 8.6 个百分点。平均值领先成立,但逐任务并非每一项都领先。

反例 2 · 收益高度依赖被测模型。同一个 LearnAct,在 Robotic Planning 上 GPT-4 比 GPT-3.5 高 59.6 个百分点(82.8 − 23.2),AlfWorld 上高 36.4 个百分点(72.2 − 35.8)。这个模型差与 ReAct+Reflexion 基本持平:LearnAct 的 59.6 / 36.4 对 ReAct+Reflexion 的 59.1(66.7 − 7.6)和 36.1(54.7 − 18.6);Voyager 的对应差值更大,60.6(72.1 − 11.5)和 39.7(58.0 − 18.3);Act 的 56.7(60.7 − 4.0)和 23.8(48.6 − 24.8)更小。真正成立的是绝对水平:GPT-3.5 下 LearnAct 只剩 23.2% / 35.8%,虽然仍是同表最高,但远低于 GPT-4 的 82.8% / 72.2%。

摘要里的 32% 是什么口径:论文摘要写 “by 32% in AlfWorld compared to ReAct+Reflexion”,未注明模型与口径。这里的 32% 推断 是 GPT-4 上的相对提升(依据:摘要未注明模型与口径;由 Table 3 GPT-4 列复算,(72.2 − 54.7) / 54.7 = 32.0%);绝对差是 17.5 个百分点(72.2 − 54.7)。GPT-3.5 上这两个数是原始成功率:LearnAct 35.8%、ReAct+Reflexion 18.6%,绝对差 17.2 个百分点、相对提升 92.5%;不能把 GPT-4 的 32% 套到 GPT-3.5 上。

消融:采样很重要,改函数比写说明更重要

Table 6 拆动作说明的两个组成部分,Table 7 拆学习流程的三个部件。下表的 Δ 列是“该行 − 完整模型”,负值表示去掉该项后变差。

Table 6 / Table 7 转录 · GPT-4 消融实验的平均成功率(%)与差值(个百分点)。Δ 由该行减去完整模型得到。
配置RoboticΔAlfWorldΔ出处
LearnAct82.8—72.2—Table 6 / 7
w.o. description78.5−4.372.4+0.2Table 6
w.o. usage example77.4−5.465.4−6.8Table 6
sampling only73.4−9.460.2−12.0Table 7
w.o. updating function75.3−7.562.0−10.2Table 7
w.o. writing notes80.8−2.071.5−0.7Table 7
w.o. sampling73.2−9.662.4−9.8Table 7

三个结论可以直接从表里读出来。第一,采样很重要:去掉采样(每轮只生成一份候选)在 Robotic 掉 9.6 个百分点、在 AlfWorld 掉 9.8 个百分点。只采样、不做 ActionLearn(sampling only)也掉很多,Robotic 9.4、AlfWorld 12.0 个百分点;AlfWorld 上比去掉采样掉得更多(12.0 vs 9.8),Robotic 两者接近(9.4 vs 9.6)。采样本身不产生学习,它只是给学习提供可比较的候选。

第二,改函数比写说明重要:去掉 Function Updating,Robotic 掉 7.5、AlfWorld 掉 10.2 个百分点;去掉 Note Writing 只掉 2.0 和 0.7 个百分点。Table 4 的比例与此一致:Function Updating 占 86% / 92%,Note Writing 占 14% / 8%。

第三,动作描述的作用因环境而异:去掉 description(动作描述)后,Robotic 掉 4.3 个百分点,AlfWorld 基本不变(72.4 对 72.2,高 0.2,非方向性)。原文只报告三次重复的平均,没有给标准差,0.2 这个差不宜当成方向性结论;§5.6 把 Robotic 的下降归因于该环境动作前置条件多,描述对正确使用更关键。

Table 4

修改类型占比

Function Updating:Robotic 86%、AlfWorld 92%;Note Writing:14%、8%。两个环境平均 89%((86 + 92) / 2)的修改在改函数;原文 §5.5 的表述是 “about 90%”,89% 是页面按 Table 4 两列算的。原文未标注这批比例的模型与运行次数。

Table 5

动作数量几乎不变

Robotic Planning 从 3.75 增到 3.83(+0.08);AlfWorld 从 3.44 增到 3.50(+0.06)。推断 成功率的主要来源是修改已有函数,而不是大量新增工具(依据:Table 4 的修改类型占比与 Table 5 的动作数量变化)。原文未标注这批动作数量的模型与运行次数。

07

它解决不了:学习者能力、过拟合、离散环境与技能库

这些限制决定了 LearnAct 适合什么场景,以及什么时候不该用。

限制 1

学习者与被测模型都未单独消融

实验里所有 ActionCreation 与 ActionLearn 都由 GPT-4 完成,论文没有做“换成更弱学习者”的消融;A.6.2 只说这出于 “necessity for substantial model capacity”,没有给弱学习者的对照结果。被测模型换成 GPT-3.5 后,Robotic 平均只剩 23.2%——这是被测模型能力的证据,不是学习者消融。推断 框架的收益至少部分取决于被测模型能否正确调用新函数(依据:Table 2 / Table 3 的模型间差值;论文未单独验证这一机制)。

限制 2

迭代多了会过拟合

Figure 3(右)显示 2 步达到最好结果,继续增加步数会下降;作者把原因解释为对训练案例的过度优化和对任务规则的误解,并在 Figure 10 给了失败案例。训练集只有 3 个实例;推断 这会让上述过拟合风险更值得注意(依据:§5.3 每任务 3 个训练实例,§5.5 把退化归因于对训练案例过度优化;论文未做实例数对照)。

限制 3

只在离散模拟环境验证

Robotic Planning 与 AlfWorld 都是文本化、离散状态的模拟环境。真实机器人面对连续控制、传感器噪声和执行器误差;论文没有做 sim-to-real 实验。

成本没有对账。每轮至少 12 次完整执行(4 份候选 × 3 个训练实例),而论文没有报告 token、墙钟或 API 成本。与只做推理的 ReAct 相比,LearnAct 多出了训练阶段的执行与改写开销;这个开销是否值得,取决于任务重复次数和部署规模。

技能库管理没有涉及。Table 5 的动作数量只从 3.75 增到 3.83、3.44 增到 3.50,规模很小。论文没有讨论当动作达到几十、上百个之后如何索引、检索、组合和淘汰;也没有讨论不同任务学到的函数如何共享。这意味着它目前更像“每个任务现场造几个工具”,还不是一个可维护的技能库推断(依据:Table 5 的动作数量只有 3.44–3.83 个;原文未讨论大规模动作库的索引、检索、组合与淘汰)。

什么时候别用:如果动作空间由外部 API 固定、代码执行有安全风险、或者没有更强的学习者模型可用,LearnAct 的前提就不成立。如果任务只需要一次性推理、没有可重复的训练实例,闭环学习也缺少输入。反过来,在动作原语稳定、任务类型重复、允许执行代码并读取失败信息的场景里,它的方法最直接:把失败轨迹变成函数修改,再把修改后的函数留在动作库里。