反思机制

4213 字
28 分钟
反思机制
反思机制
Reflexion: Language Agents with Verbal Reinforcement Learning
Noah Shinn、Federico Cassano、Edward Berman 等 · 东北大学 · 2023 年 10 月
主线
大模型做智能体时试错学得很慢,因为传统的强化学习要更新权重,代价高。这篇的改法是不更新任何参数,而是让模型把失败写成一段文字,下一次带着这段文字再试。编程任务上首次生成的成功率是 91%,超过了当时最好的模型(80%)。
内核
反馈不需要是数字。传统强化学习用标量奖励,但标量丢掉了「错在哪」这个信息。这篇把二元或数值反馈翻译成一段自然语言的反思,存进记忆。这段文字是下一次尝试的输入,相当于一个用语言表示的梯度。
方法
难在哪,作者说清楚了

作者在讲做法之前先点明了这件事的难点,这段是全文的前提。

生成有用的反思,作者点明要求两件事 知道模型错在哪 写出可执行的改进摘要 信用分配问题 一串动作里哪一步出的错 把「错了」翻译成「下次该怎么做」 这是序列决策里公认的老大难 作者把反馈分成三路,共同点是最后都要「放大」成一段话 环境的二元反馈 任务完成与否,环境直接给 预设的启发式规则 常见失败模式,人写规则去匹配 模型自评 用大模型做二元分类,或自写单元测试 三路的共同点:评估信号最后都要放大成一段自然语言的经验总结,存进长期记忆
「放大」这个词用得准:环境给的是 0 或 1,反思要变成一句可读的话。

作者同时列了四条优势和两个缺点,这段话比方法本身更能说明这个方法的位置。

四条优势说的是什么
1轻量,不需要微调模型
2反馈形式可以更细(比如指出动作要怎么改),而标量或向量奖励做不到准确的信用分配
3记忆更明确、更可解释
4给未来几轮的行动提示更明确
两个缺点(作者自己说的)说的是什么
1依赖模型自我评估(或启发式规则)的能力
2没有成功的形式保证
前后呼应

推理时一次完整的循环

这里有个容易被忽略的设计:记忆只在试错之间传递,不在任务之间传递。每换一个任务,记忆从头开始。反思机制攒的是「这个任务上试过什么」,不是「这类任务的通用经验」。

步做什么
1行动者照着当前的记忆跑一遍,产出一条完整轨迹(一串动作与观察)
2评测者给这条轨迹打分
3反思模型根据轨迹与分数写一段反思,追加进长期记忆
4回到第 1 步,带着新记忆再跑一遍

终止条件有两个:评测者判定通过,或者达到最大尝试次数。也就是说,反思机制不保证一定成功,只保证每次失败会留下点什么。

这两条缺点正好对应后面两个缺口:第 1 条对应「评测者本身可能出错,论文没量化」,第 2 条对应「本质上还是试错,只是记忆更长」。原文是先承认弱点、再用实验去试,最后在局限里认账,这条脉络也是前后呼应的。

论证链
为什么反馈要用文字表达

作者先指出智能体学得慢的两个原因,再给出绕过办法。

传统做法的问题代价
更新模型权重要大量训练样本,代价高
无梯度方法(树上搜索、自我一致性)不跨回合记忆,同一个错误会反复犯

第二点更关键。已有的自我改进方法都是在一次任务内部反复试,试完就忘。任务失败的教训不会带到下一个任务。作者把这叫做盲目的试错,没有记忆的试错等于每次从零开始。

传统强化学习 标量奖励:对 1 分、错 0 分 丢掉了「错在哪」这个信息 反思机制 一段自然语言的反思 相当于一个语义梯度 下一次尝试 反思文字进入提示词 不动任何参数 作者类比的场景:人类怎么学新技能 这一次失败了 只留下一个对或错的分数 反思上一次失败 形成下一次的计划
这一句是全文的支点:作者把语言式的反馈类比成语义梯度,不是数值上的下降方向,而是文字上的改进方向。

解法是把强化信号从数字换成文字。环境返回的反馈可能是标量(分数)、也可能是自然语言(编译器报错)。作者的做法是:用另一个语言模型把这个反馈翻译成一段反思,写进记忆,下次行动时把这段反思一起放进提示词。整个过程不动任何参数。

这一句是全文的支点:作者把它类比成一个语义梯度,不是数值上的下降方向,而是文字上的改进方向。人类学新技能也是这样,通过反思上一次的失败形成下一次的计划。

前提与边界

这套方法的前提是任务必须能给出可判断对错的反馈。开放式写作、没有标准答案的任务,这套循环没法运转:评测器给不出分,反思就无从写起。

三组件
三个模型,两种记忆

框架由三个模型组成,职责分得很干净。

组件职责
行动者根据当前状态和记忆,生成文字和动作。可以是思维链,也可以是别的行动生成方式
评测者给这一轮的表现打分,作者试了几种:精确匹配、任务特定的启发式规则、用另一个语言模型来判断
自我反思根据轨迹和评测结果,写出一段自然语言的反思

评测者这一环是整套方法能用起来的前提,但也是最容易被忽略的一环。作者自己承认,在语义空间里定义好的价值函数很难,所以试了多个变体。换句话说,「怎么判断这次做得对不对」这件事,这篇是带着问题一起做的,没有给出通用解。

行动者根据状态和记忆生成动作 环境 评测者打分 自我反思写一段文字 长期记忆 存反思,滑动的窗口 两种记忆的分工 短期:这一轮的完整轨迹 长期:提炼过的经验 决策任务最多 3 条 编程任务只存 1 条
作者的类比是:这对应人类「记得最近的细节,同时回想提炼过的重要经验」。

两种记忆的分工:短期记忆存这一轮的完整轨迹(动作、观察、奖励),长期记忆存反思文字。长期记忆的容量是滑动的窗口,不是无限增长的,决策任务上最多存 3 条经验,编程任务上只存 1 条。

整个循环的终止条件是「评测者判定通过」或「达到最大尝试次数」。也就是说,反思机制不保证一定成功,只保证每次失败会留下点什么。

前提与边界

记忆容量被作者设成了很小的值(1 到 3 条)。这个数字是调出来的还是试出来的,论文没有交代。而经验上限直接决定了一个任务最多能积累多少教训。

实验
三类任务,三种反馈

作者在三类任务上验证,每类的反馈信号都不同。这是这篇的设计要点:框架不变,换的是反馈来源。

任务类型反馈从哪来结果
程序生成环境给的外部反馈:编译器报错、单元测试结果编程基准上 91%,超过此前最好的 80%
决策任务(家居环境)环境给的外部反馈:任务完成与否134 个环境里完成 130 个
推理任务(多跳问答)环境给的外部反馈:答案对不对提升 20%

编程任务上的关键设计值得单独说:模型自己生成测试用例,然后跑测试,用测试结果当反馈。生成测试用的是思维链提示,生成的测试会先过一遍语法树构建,滤掉无效的,最多留 6 个。这一步把「模型觉得自己对不对」换成了「代码实际跑不跑得过」,反馈因此变得可信。

不可信的反馈 模型自己判断这段代码对不对 错了也不知道错在哪 自生成测试用例 语法树构建滤掉无效的 最多留 6 个 可信的反馈 代码实际跑不跑得过 错在哪一目了然 推理任务上的对照设计 给一个能看见标准答案的基线 它的准确率更高,但仍有 39% 答不对 反思在不给答案的情况下提升了 14% 家居任务里最常见的错误 智能体以为自己拿到了某个物品,实际没有 然后沿一条长轨迹继续走 途中没有任何回头机制
反思机制解决的正是这个:记住「我以为拿到了但没有」,下一次先确认。

实验里有一个设计得很好的对照。推理任务上,作者加了一个能看见标准答案的基线。结果这个「作弊」的基线准确率更高,但仍有 39% 的题答不对。而反思机制在不给标准答案的情况下把准确率提升了 14%。这个对照说明:反思的作用不是提供信息,而是让已有的信息被用起来。

同一组实验里还有一个失败案例,作者自己交代了。购物网站那类任务上,加了反思机制没有显著超过不用反思的基线。作者的解释是:这类任务要求非常独特且多样的行为,而搜索空间不如维基百科那样多样。反思在答案相对收敛的任务上有效,在需要探索非常规路径的任务上帮不上忙。

另一处值得看的是失败模式分析。家居任务里最常见的错误是:智能体以为自己拿到了某个物品,但实际没有,然后沿着一条长轨迹继续走,途中没有任何回头机制。反思机制解决的正是这个:记住「我以为拿到了但没有」,下一次先确认。

前提与边界

三个任务都是可以自动判分的环境。开放式任务(写一份报告、设计一个方案)无法自动判分,这套框架用不上。而这恰恰是这类方法最有想象力的方向。

消融
哪一环都不能少

作者在编程任务上做了拆分测试,看四个组件各贡献多少。用的题目是最难的 50 道 Rust 题。

去掉哪一环成功率
完整方法68%
去掉自生成测试52%
去掉自我反思(只保留测试)60%
只用基础模型(两环都去掉)60%
这份方法里「拿到可信反馈」比「反思」更关键 完整方法 68% 去掉自生成测试 52% 去掉自我反思 60% 掉 16 个点是自生成测试,去掉自我反思只掉 8 个点
作者据此说,近来那些不做自我反思的盲试错调试技术,在难任务上(像写复杂 Rust 程序)是无效的。

这张表的结论很直接:自生成测试的贡献(68% 掉到 52%)比自我反思的贡献(68% 掉到 60%)大得多。也就是说,这套方法里拿到可信反馈比反思更关键。

作者自己给了这个判断:近来的工作提出各种不做自我反思的盲试错调试技术,这些在难任务上(像写复杂 Rust 程序)是无效的。这跟前面的消融数据是一致的。

前提与边界

消融只在一类任务、一个难度档位上做过。「自我反思贡献不大」这个结论,不能推广到所有任务。而且 Rust 是这批里最难的语言,换成 Python 或 JavaScript,排序可能变。

缺口
这篇论文没回答什么
1. 只能解决能被自动判分的任务。

作者在开篇划的范围就是「与外部环境交互的智能体」,而环境必须能返回反馈。开放式生成任务、长期规划任务,这篇完全没有触及,而这恰恰是这类方法想象力最大的地方。

2. 记忆容量怎么定,没有交代。

决策任务 3 条、编程任务 1 条。这些数字是试出来的还是拍的,论文没写。而容量直接决定一个任务最多能积累多少教训:容量太小学不到东西,太大则超出上下文限制且可能引入干扰。

3. 试错的次数上限与成本,没有系统分析。

算法里明确写着「达到最大尝试次数就停」,但这个次数是多少、成本是多少、和最终收益的关系是什么,论文没有给。

4. 本质上还是试错,只是记忆更长。

作者在局限里承认:策略优化仍可能陷入次优的局部解。反思机制不保证能找到最优解,它只保证每次失败会留下痕迹。这个局限是方法本身带进来的,靠改记忆结构(作者建议用向量库或数据库)能不能解决,论文没有验证。

5. 「可解释性更好」是作者的判断,不是实验结论。

论文提到语言式的强化可能让智能体更可解释、更可诊断,因为反思文字可以被人读。但全文没有任何一处实验去验证这个说法。这是一个方向性判断,不是被证明的结论。

6. 有一个失败案例被放在附录里,正文没提。

购物网站任务上,反思机制没有显著超过基线,作者的解释是这个任务需要「非常独特且多样的行为」。论文把它放在附录而不是正文,这个位置选择值得注意。

7. 风险那一段只有一句话。

作者承认这套方法会放大智能体被误用的风险,说「这个方向需要在安全与伦理上花更多力气」,然后就结束了。具体是什么风险、怎么防,论文没有给。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

当前页面没有目录

文章目录

当前页面没有目录