作者在讲做法之前先点明了这件事的难点,这段是全文的前提。
作者同时列了四条优势和两个缺点,这段话比方法本身更能说明这个方法的位置。
| 四条优势 | 说的是什么 |
|---|---|
| 1 | 轻量,不需要微调模型 |
| 2 | 反馈形式可以更细(比如指出动作要怎么改),而标量或向量奖励做不到准确的信用分配 |
| 3 | 记忆更明确、更可解释 |
| 4 | 给未来几轮的行动提示更明确 |
| 两个缺点(作者自己说的) | 说的是什么 |
|---|---|
| 1 | 依赖模型自我评估(或启发式规则)的能力 |
| 2 | 没有成功的形式保证 |
推理时一次完整的循环
这里有个容易被忽略的设计:记忆只在试错之间传递,不在任务之间传递。每换一个任务,记忆从头开始。反思机制攒的是「这个任务上试过什么」,不是「这类任务的通用经验」。
| 步 | 做什么 |
|---|---|
| 1 | 行动者照着当前的记忆跑一遍,产出一条完整轨迹(一串动作与观察) |
| 2 | 评测者给这条轨迹打分 |
| 3 | 反思模型根据轨迹与分数写一段反思,追加进长期记忆 |
| 4 | 回到第 1 步,带着新记忆再跑一遍 |
终止条件有两个:评测者判定通过,或者达到最大尝试次数。也就是说,反思机制不保证一定成功,只保证每次失败会留下点什么。
这两条缺点正好对应后面两个缺口:第 1 条对应「评测者本身可能出错,论文没量化」,第 2 条对应「本质上还是试错,只是记忆更长」。原文是先承认弱点、再用实验去试,最后在局限里认账,这条脉络也是前后呼应的。
作者先指出智能体学得慢的两个原因,再给出绕过办法。
| 传统做法的问题 | 代价 |
|---|---|
| 更新模型权重 | 要大量训练样本,代价高 |
| 无梯度方法(树上搜索、自我一致性) | 不跨回合记忆,同一个错误会反复犯 |
第二点更关键。已有的自我改进方法都是在一次任务内部反复试,试完就忘。任务失败的教训不会带到下一个任务。作者把这叫做盲目的试错,没有记忆的试错等于每次从零开始。
解法是把强化信号从数字换成文字。环境返回的反馈可能是标量(分数)、也可能是自然语言(编译器报错)。作者的做法是:用另一个语言模型把这个反馈翻译成一段反思,写进记忆,下次行动时把这段反思一起放进提示词。整个过程不动任何参数。
这一句是全文的支点:作者把它类比成一个语义梯度,不是数值上的下降方向,而是文字上的改进方向。人类学新技能也是这样,通过反思上一次的失败形成下一次的计划。
这套方法的前提是任务必须能给出可判断对错的反馈。开放式写作、没有标准答案的任务,这套循环没法运转:评测器给不出分,反思就无从写起。
框架由三个模型组成,职责分得很干净。
| 组件 | 职责 |
|---|---|
| 行动者 | 根据当前状态和记忆,生成文字和动作。可以是思维链,也可以是别的行动生成方式 |
| 评测者 | 给这一轮的表现打分,作者试了几种:精确匹配、任务特定的启发式规则、用另一个语言模型来判断 |
| 自我反思 | 根据轨迹和评测结果,写出一段自然语言的反思 |
评测者这一环是整套方法能用起来的前提,但也是最容易被忽略的一环。作者自己承认,在语义空间里定义好的价值函数很难,所以试了多个变体。换句话说,「怎么判断这次做得对不对」这件事,这篇是带着问题一起做的,没有给出通用解。
两种记忆的分工:短期记忆存这一轮的完整轨迹(动作、观察、奖励),长期记忆存反思文字。长期记忆的容量是滑动的窗口,不是无限增长的,决策任务上最多存 3 条经验,编程任务上只存 1 条。
整个循环的终止条件是「评测者判定通过」或「达到最大尝试次数」。也就是说,反思机制不保证一定成功,只保证每次失败会留下点什么。
记忆容量被作者设成了很小的值(1 到 3 条)。这个数字是调出来的还是试出来的,论文没有交代。而经验上限直接决定了一个任务最多能积累多少教训。
作者在三类任务上验证,每类的反馈信号都不同。这是这篇的设计要点:框架不变,换的是反馈来源。
| 任务类型 | 反馈从哪来 | 结果 |
|---|---|---|
| 程序生成 | 环境给的外部反馈:编译器报错、单元测试结果 | 编程基准上 91%,超过此前最好的 80% |
| 决策任务(家居环境) | 环境给的外部反馈:任务完成与否 | 134 个环境里完成 130 个 |
| 推理任务(多跳问答) | 环境给的外部反馈:答案对不对 | 提升 20% |
编程任务上的关键设计值得单独说:模型自己生成测试用例,然后跑测试,用测试结果当反馈。生成测试用的是思维链提示,生成的测试会先过一遍语法树构建,滤掉无效的,最多留 6 个。这一步把「模型觉得自己对不对」换成了「代码实际跑不跑得过」,反馈因此变得可信。
实验里有一个设计得很好的对照。推理任务上,作者加了一个能看见标准答案的基线。结果这个「作弊」的基线准确率更高,但仍有 39% 的题答不对。而反思机制在不给标准答案的情况下把准确率提升了 14%。这个对照说明:反思的作用不是提供信息,而是让已有的信息被用起来。
同一组实验里还有一个失败案例,作者自己交代了。购物网站那类任务上,加了反思机制没有显著超过不用反思的基线。作者的解释是:这类任务要求非常独特且多样的行为,而搜索空间不如维基百科那样多样。反思在答案相对收敛的任务上有效,在需要探索非常规路径的任务上帮不上忙。
另一处值得看的是失败模式分析。家居任务里最常见的错误是:智能体以为自己拿到了某个物品,但实际没有,然后沿着一条长轨迹继续走,途中没有任何回头机制。反思机制解决的正是这个:记住「我以为拿到了但没有」,下一次先确认。
三个任务都是可以自动判分的环境。开放式任务(写一份报告、设计一个方案)无法自动判分,这套框架用不上。而这恰恰是这类方法最有想象力的方向。
作者在编程任务上做了拆分测试,看四个组件各贡献多少。用的题目是最难的 50 道 Rust 题。
| 去掉哪一环 | 成功率 |
|---|---|
| 完整方法 | 68% |
| 去掉自生成测试 | 52% |
| 去掉自我反思(只保留测试) | 60% |
| 只用基础模型(两环都去掉) | 60% |
这张表的结论很直接:自生成测试的贡献(68% 掉到 52%)比自我反思的贡献(68% 掉到 60%)大得多。也就是说,这套方法里拿到可信反馈比反思更关键。
作者自己给了这个判断:近来的工作提出各种不做自我反思的盲试错调试技术,这些在难任务上(像写复杂 Rust 程序)是无效的。这跟前面的消融数据是一致的。
消融只在一类任务、一个难度档位上做过。「自我反思贡献不大」这个结论,不能推广到所有任务。而且 Rust 是这批里最难的语言,换成 Python 或 JavaScript,排序可能变。
作者在开篇划的范围就是「与外部环境交互的智能体」,而环境必须能返回反馈。开放式生成任务、长期规划任务,这篇完全没有触及,而这恰恰是这类方法想象力最大的地方。
决策任务 3 条、编程任务 1 条。这些数字是试出来的还是拍的,论文没写。而容量直接决定一个任务最多能积累多少教训:容量太小学不到东西,太大则超出上下文限制且可能引入干扰。
算法里明确写着「达到最大尝试次数就停」,但这个次数是多少、成本是多少、和最终收益的关系是什么,论文没有给。
作者在局限里承认:策略优化仍可能陷入次优的局部解。反思机制不保证能找到最优解,它只保证每次失败会留下痕迹。这个局限是方法本身带进来的,靠改记忆结构(作者建议用向量库或数据库)能不能解决,论文没有验证。
论文提到语言式的强化可能让智能体更可解释、更可诊断,因为反思文字可以被人读。但全文没有任何一处实验去验证这个说法。这是一个方向性判断,不是被证明的结论。
购物网站任务上,反思机制没有显著超过基线,作者的解释是这个任务需要「非常独特且多样的行为」。论文把它放在附录而不是正文,这个位置选择值得注意。
作者承认这套方法会放大智能体被误用的风险,说「这个方向需要在安全与伦理上花更多力气」,然后就结束了。具体是什么风险、怎么防,论文没有给。



