Skip to Content

论文链接:https://arxiv.org/pdf/2303.11366 

代码链接:https://github.com/noahshinn024/reflexion 

摘要

大语言模型(LLM)作为目标驱动型智能体,已被越来越多地用于与外部环境(例如游戏、编译器、API)进行交互。然而,由于传统的强化学习方法需要大量的训练样本和昂贵的模型微调,这些语言智能体难以快速高效地从试错中学习。我们提出了一种名为 Reflexion 的新型框架,它并非通过更新权重,而是通过语言反馈来强化语言智能体。具体来说,Reflexion 智能体会对任务反馈信号进行口头反思,并将反思文本保存在上下文记忆缓冲区中,从而在后续试验中做出更优的决策。Reflexion 具有足够的灵活性,可以整合各种类型(标量值或自由语言)和来源(外部或内部模拟)的反馈信号,并在各种任务(序列决策、编码、语言推理)中都取得了比基线智能体显著的改进。例如,Reflexion 在 HumanEval 编码基准测试中达到了 91% 的 pass@1 准确率,超越了之前最先进的 GPT-4 的 80%。我们还使用不同的反馈信号、反馈融合方法和智能体类型进行了消融和分析研究,并深入探讨了它们如何影响性能。所有代码、演示和数据集均发布在 https://github.com/noahshinn024/reflexion。 

1.Introduction

近期,ReAct、SayCan、Toolformer、HuggingGPT、生成式智能体和 WebGPT 等研究成果已证明,基于大语言模型 (LLM) 核心构建的自主决策智能体是可行的。这些方法利用 LLM 生成文本和“动作”,这些文本和动作可用于 API 调用并在环境中执行。由于这些方法依赖于参数数量庞大的大型模型,因此目前只能使用上下文示例来训练智能体,因为像梯度下降强化学习这样的传统优化方案需要大量的计算资源和时间。

本文提出了一种名为 Reflexion 的替代方法,该方法利用语言强化来帮助智能体从先前的失败中学习。反思将来自环境的二元信号或标量反馈转换为文本摘要形式的语言反馈,并将其作为附加上下文添加到下一轮学习任务中。这种自我反思的反馈充当“语义”梯度信号,为智能体提供具体的改进方向,帮助其从先前的错误中学习,从而更好地完成任务。这类似于人类如何通过反思之前的失败,以改进下一次尝试的策略,从而迭代地学习完成复杂任务。例如,在图 1 中,反思智能体通过试错和自我反思来学习优化自身行为,以解决决策、编程和推理任务。

生成有用的反思性反馈极具挑战性,因为它需要深入了解模型出错之处(例如,信用分配问题),以及生成包含可操作改进见解的摘要的能力。我们探索了三种方法:简单的二元环境反馈、针对常见故障情况的预定义启发式方法,以及自我评估,例如使用 LLM(决策)进行二元分类或使用自编写的单元测试(编程)。在所有实现中,评估信号都被放大为自然语言经验摘要,并可存储在长期记忆中。

与基于 policy 学习或基于 value 的学习等更传统的强化学习方法相比,反思学习具有以下几个优势:1)它轻量级,无需微调 LLM;2)它允许更细致的反馈形式(例如,针对性地改变行动),而标量或向量奖赏难以进行精确的权重分配;3)它允许使用比先前经验更明确、更易于解释的上下文记忆;4)它为未来上下文中的行动提供更明确的提示。与此同时,它也存在一些缺点,例如依赖于 LLM 的自我评估能力(或启发式方法),并且没有正式的成功保证。然而,随着 LLM 能力的提升,我们预期这种范式会随着时间的推移而不断改进。

我们开展了以下实验:(1) 决策任务,用于测试长轨迹上的序列动作选择;(2) 推理任务,用于测试知识密集型单步生成改进;(3) 编程任务,用于教会智能体有效使用编译器和解释器等外部工具。在所有三种类型的任务中,我们都观察到 Reflexion 智能体在决策、推理和编程方面表现更佳。更具体地说,Reflexion 智能体在 AlfWorld 决策任务中,经过 12 个迭代学习步骤后,性能比强大的基线方法提高了 22%;在 HotPotQA 推理问题中提高了 20%;在 HumanEval Python 编程任务中提高了高达 11%。

总而言之,我们的贡献如下:

  • 我们提出了 Reflexion,一种新的“语言”强化范式,它将策略参数化为智能体的记忆编码与 LLM 参数的选择相结合。
  • 我们探索了 LLM 中自我反思的这种涌现特性,并通过经验表明,自我反思对于在少量试验中学习复杂任务非常有用。
  • 我们推出了 LeetcodeHardGym,这是一个代码生成强化学习环境,包含 19 种编程语言的 40 道具有挑战性的 Leetcode 问题(“困难级别”)。
  • 我们证明,Reflexion 在多个任务中都比强大的基线有所改进,并在各种代码生成基准测试中取得了最先进的结果。

2.Related work

Reasoning and decision-making。Self-Refine 采用迭代框架进行自我改进,通过自我评估自主提升生成能力。这些自我评估和自我改进步骤取决于给定的任务约束,例如“如何以更积极的方式编写此生成内容”。Self-Refine 效果显著,但仅限于单步骤推理任务。Pryzant et al. [21] 执行类似的语义提示编写优化,但也仅限于单步骤任务。Paul et al. [20] 对 critic 模型进行微调,以在轨迹中提供中间反馈,从而改进推理响应。Xie et al. [27] 使用基于动作的随机 beam search 来执行更高效的决策搜索策略,该策略允许智能体利用其自我评估组件带来的预见优势。Yoran et al. [31] 和 Nair et al. [16] 使用决策者模型进行多步骤推理。Kim et al. [10] 使用固定次数的重试模式,无需评估步骤。Goodman 执行定性评估步骤,向上一次生成提出优化建议。本文表明,这些概念中的几个可以通过自我反思进行增强,从而构建持久的自我反思经验记忆,使智能体能够识别自身错误,并随着时间的推移,从错误中吸取教训。

Programming。过去和近期的一些研究工作采用了测试驱动开发或代码调试实践的变体。AlphaCode 使用隐藏的测试用例评估一组生成结果。CodeT 使用自生成的单元测试来对生成的函数实现进行评分。Self-Debugging 采用了一个调试组件,该组件利用代码执行环境的反馈来改进现有实现。CodeRL 将问题置于强化学习框架中,使用 Actor-Critic 结构来调试程序,并利用执行环境的反馈。AlphaCode、Self-Debugging 和 CodeRL 在修复不太复杂的程序错误方面是有效的,但它们依赖于会使 pass@1 失效的真实测试用例,并且没有使用自反思来弥合错误识别和实现改进之间的差距。CodeT 不访问隐藏的测试用例,也没有实现自学习步骤来改进代码编写。

3.Reflexion: reinforcement via verbal reflection

我们为 Reflexion 开发了一种模块化模型,该模型利用了三个不同的模型:Actor,记为 MaM_a,负责生成文本和行动;Evaluator,记为 MeM_e,负责对 Actor 生成的输出进行评分;以及 Self-Reflection,记为 MsrM_{sr},负责生成语言强化线索以帮助 Actor 进行自我改进。我们详细描述了每个模型,并进一步阐明了它们在 Reflexion 框架内的协作功能。

Actor。Actor 构建于大语言模型 (LLM) 之上,该模型被专门用于根据状态观测生成必要的文本和动作。与传统的基于策略的强化学习设置类似,我们在时间 tt 从当前策略 πθπ_θ 中采样一个动作或文本 ata_t,并接收来自环境的观测 oto_t。我们探索了多种 Actor 模型,包括 Chain of Thought 和 ReAct。这些不同的生成模型使我们能够在 Reflexion 框架内探索文本和动作生成的不同方面,从而深入了解它们的性能和有效性。此外,我们还添加了一个记忆组件 memmem,为该智能体提供额外的上下文信息。这一改进受到了 Brooks et al. [3] 的启发,他们提出了一种使用上下文学习的策略迭代方法。下文将详细介绍其填充方式。

Evaluator。在 Reflexion 框架中,评估器组件在评估 Actor 生成的输出质量方面发挥着至关重要的作用。它以生成的轨迹作为输入,并计算一个奖赏分数,该分数反映了其在给定任务环境中的表现。定义适用于语义空间的有效价值和奖赏函数十分困难,因此我们研究了 Evaluator 模型的几种变体。对于推理任务,我们探索了基于精确匹配(EM)评分的奖赏函数,以确保生成的输出与预期解决方案高度一致。在决策任务中,我们采用了预定义的启发式函数,这些函数针对特定的评估标准进行了定制。此外,我们还尝试使用 LLM 本身的不同实例作为 Evaluator,为决策和编程任务生成奖赏。这种多方面的评估器设计方法使我们能够检验不同的输出评分策略,从而深入了解它们在各种任务中的有效性和适用性。

Self-reflection。 Self-Reflection 模型以 LLM 的形式实现,在 Reflexion 框架中扮演着至关重要的角色,它通过生成语言形式的自我反思,为未来的试验提供有价值的反馈。给定一个稀疏的奖赏信号(例如二元成功状态(成功/失败))、当前轨迹及其持久记忆 memmem,Self-Reflectio 模型能够生成详细且具体的反馈。这种反馈比标量奖赏更具信息量,并被存储在智能体的记忆(mem)中。例如,在一个多步骤决策任务中,当智能体接收到失败信号时,它可以推断出某个特定动作 aia_i 导致了后续的错误动作 ai+1a_{i+1}ai+2a_{i+2}。然后,智能体可以口头表达它应该采取不同的动作 aia^′_i,从而避免了ai+1a^′_{i+1}ai+2a^′_{i+2} 的结果,并将这一经验存储在记忆中。在后续的试验中,智能体可以利用过去的经验,在时间 tt 通过选择动作 aia^′_i 来调整其决策方法。通过反复尝试、纠错、自我反思和持久记忆,智能体能够利用信息丰富的反馈信号,在各种环境中快速提高其决策能力。

Memory。Reflexion 过程的核心组成部分是短期记忆和长期记忆的概念。在推理阶段,Actor 会根据短期记忆和长期记忆来做出决策,这类似于人类既能记住近期细节,又能从长期记忆中提炼出重要的经验。在强化学习(RL)设置中,轨迹历史充当短期记忆,而 Self-Reflection 模型的输出则存储在长期记忆中。这两个记忆组件协同工作,提供既具体又受多次试验经验影响的背景信息,这是 Reflexion 智能体相对于其他 LLM 动作选择方法的关键优势。

The Reflexion process。Reflexion 被形式化为一个迭代优化过程(见第1节)。在第一次试验中,Actor 通过与环境交互生成轨迹 τ0τ_0。Evaluator 随后生成一个分数 r0r_0,计算公式为 rt=Me(τ0)r_t = M_e(τ_0)rtr_t 仅是第 tt 次试验的标量奖赏,其值会随着特定任务表现的提高而增加。第一次试验后,为了将 r0r_0 放大为可供 LLM 改进的反馈形式,Self-Reflection 模型分析集合 {τ0,r0}\{τ_0, r_0\},生成一个摘要信息 sr0sr_0,并将其存储在记忆 mem 中。srtsr_t 是第 tt 次试验的口头经验反馈。Actor、Evaluator 和 Self-Reflection 模型在一个循环中协同工作,直到 Evaluator 认为 τtτ_t 正确为止。如第3节所述,Reflexion 的记忆组件对其有效性至关重要。每次试验 tt 后,srtsr_t 都会被添加到 memmem 中。在实践中,我们通过存储经验的最大数量 ΩΩ(通常设置为 1-3)来限制 mem,以遵守最大上下文 LLM 限制。

4.Experiments

Last updated on