论文标题Reflexion: Language Agents with Verbal Reinforcement Learning论文链接https://arxiv.org/abs/2303.11366论文来源NeurIPS 2023论文分类Self-Improvement一、概述随着大语言模型逐渐被用作能够调用工具、搜索网页、执行代码、与环境交互的语言智能体Language Agent一个自然的问题变得越来越重要智能体能否像人一样从失败经验中快速学习传统强化学习当然也在研究“试错学习”但它通常需要大量交互样本、价值函数或策略梯度训练并且往往要更新模型参数。对于以大语言模型为核心的智能体来说这条路成本很高模型很大、环境反馈稀疏、轨迹是自然语言和动作混合序列很多任务还涉及搜索、编程、调用外部工具等离散行为。相比之下当前常见的 LLM agent 更多依赖 prompt、in-context examples 或 ReAct 这类推理-行动框架一旦失败下一次尝试并不一定真正吸收上一次的经验。本文提出的 Reflexion 试图解决这个问题。它的核心观点非常直接不通过梯度更新模型权重而是通过自然语言形式的自我反思来更新智能体的记忆从而改进后续决策。论文将这种机制称为 verbal reinforcement learning。这里的“reinforcement”不是一个标量 reward 直接驱动参数优化而是把环境反馈、测试结果、失败状态等信号转写成可读、可复用的经验总结并放入 episodic memory 中作为下一轮 Actor 的上下文。换句话说Reflexion 把强化学习里的“学习信号”从数值梯度变成了“语义梯度”失败之后智能体写下一段“我刚才哪里错了、下次应该怎么做”的文本下一次尝试时这段文本会和新任务上下文一起进入模型影响它的推理和行动。Reflexion在三类任务中的工作方式这篇论文的主要贡献可以概括为三点提出 Reflexion 框架将语言智能体的策略表示为 LLM 参数与记忆内容的组合即不更新 LLM 权重而更新 agent memory。在决策、问答推理、代码生成三类任务上验证了自我反思记忆的有效性尤其展示了少数几轮试错就能明显提升性能。系统分析不同反馈来源、反馈写入方式、agent 类型和模型能力对 Reflexion 的影响指出它的收益依赖较强的模型自我评估和自我修正能力。二、核心思想把失败变成可复用的语言经验Reflexion 最值得关注的地方并不是“让模型再试一次”而是它明确区分了三类信息Trajectory当前尝试中的短期轨迹例如一系列 thought/action/observation或者一段代码及其测试结果。Evaluation对这次轨迹的评价可以是环境给出的成功/失败信号、exact match 分数、手写 heuristic、LLM evaluator或者编程任务中的自生成单元测试结果。Reflection把评价信号和轨迹转写成自然语言经验例如“我误把问题问的是单个战役而不是战役系列”“我只检查了括号数量相等却没有检查括号顺序”。这种设计解决了 LLM agent 学习中的一个关键痛点很多环境反馈本身太稀疏。比如 ALFWorld 只告诉智能体任务是否完成HumanEval 的测试只告诉某些 case 是否通过HotPotQA 的 exact match 只告诉答案对错。这些反馈对人类读者有意义但对下一轮 LLM 推理来说并不够具体。Reflexion 的 Self-Reflection 模块负责把这些稀疏信号扩展为更可执行的语言建议。从强化学习角度看Reflexion 没有显式学习一个 value function 或 policy network而是将策略写成❝其中是 Actor 所使用的语言模型是长期记忆。模型参数保持不变但 memory 会随着每轮反思被更新。因此Reflexion 的“策略优化”发生在上下文层面下一轮动作分布的变化来自 prompt 中新增的反思文本。三、方法Reflexion 框架包含三个主要模型角色Actor、Evaluator 和 Self-Reflection。它们不一定是三个不同的底层模型也可以是同一个 LLM 在不同 prompt 下扮演的不同角色。Reflexion整体框架与算法1. ActorActor 负责生成任务轨迹。在不同任务中Actor 可以是 CoT agent、ReAct agent 或代码生成模型。它接收当前任务状态、短期轨迹上下文以及长期记忆中的反思文本然后输出下一步 thought/action或者直接生成最终答案/代码。这里的关键是Actor 并不是单纯重复上次尝试而是在 prompt 中显式看到过去的反思。例如在编程任务中Actor 会看到上一版实现、单元测试反馈和上一轮 self-reflection再生成改进后的函数体。2. EvaluatorEvaluator 负责判断当前尝试的质量。论文中根据任务类型使用了不同评价方式在 ALFWorld 这类交互式环境中可以使用环境成功信号也可以用手写 heuristic 或 LLM 判断是否陷入循环、幻觉或低效规划。在 HotPotQA 中使用 exact match 将答案判为正确或错误。在代码生成中使用自生成单元测试、解释器或编译器反馈来判断代码是否可能正确。Evaluator 的输出可以是二值信号也可以是标量或自然语言反馈。Reflexion 并不要求反馈必须来自人工标注它只要求这个反馈能被 Self-Reflection 模块进一步转化成“下一次应该怎么改”的语言经验。3. Self-ReflectionSelf-Reflection 是 Reflexion 的核心模块。它接收当前轨迹、评价结果和已有记忆生成一段自然语言反思并追加到长期记忆中。论文中通常将 memory 限制为最近 1 到 3 条经验以适配 LLM 的上下文长度。一个好的 reflection 不只是复述“失败了”而要完成某种 credit assignment定位失败可能由哪一步导致并提出后续行为调整。例如决策任务中不要继续在错误容器里找物品应优先检查已经观察到的相关位置。推理任务中问题问的是“共同职业”而不是两个人所有职业的并集。编程任务中当前实现只检查了括号数量没有检查括号嵌套顺序。因此Reflexion 的效果高度依赖模型能否把失败轨迹压缩成有用经验。它不是保证收敛的 RL 算法而是一种利用 LLM 语言理解能力做经验归纳的 agent learning 框架。4. 整体循环Reflexion 的训练/推理循环可以概括为Actor 根据当前任务和 memory 生成一次轨迹。Evaluator 对轨迹打分或判定成功失败。如果失败Self-Reflection 根据轨迹和反馈生成反思文本。将反思写入 memory。重置或继续环境在下一轮尝试中使用更新后的 memory。这个循环最像人类做题或调试程序时的过程先尝试再看哪里错了写下一条经验然后带着这条经验重新做。它与普通 retry 最大的区别在于下一轮不是只依赖采样随机性而是显式注入了失败归因。四、不同任务中的实现方式1. 顺序决策ALFWorldALFWorld 是一个文本交互环境智能体需要完成找物品、移动物品、清洗/加热/冷却物品等多步任务。论文使用 ReAct 作为 Actor因为 ReAct 本身适合交替生成 thought 和 action。失败之后Reflexion 会总结这次轨迹的问题例如是否在错误位置重复搜索、是否误解任务目标、是否出现无效动作循环。在这个场景中长期记忆有两个作用一是从很长的失败轨迹中提炼出关键错误二是帮助智能体跨轮次系统性探索环境而不是每次都从零开始。2. 知识推理HotPotQAHotPotQA 需要模型在多文档信息中进行推理。论文测试了 CoT、ReAct 以及给定 ground-truth context 的 CoT (GT) 设置。这里的评价信号主要是 exact match答案对或错。这个任务尤其能说明 Reflexion 与“只把上一轮轨迹塞回 prompt”的区别。论文对比了 episodic memory ablation仅加入上一轮轨迹确实有帮助但加入自然语言 self-reflection 后还能进一步提升。这表明有用的并不是“上下文变长”本身而是把失败压缩成了更明确的可执行经验。3. 代码生成HumanEval、MBPP 与 LeetcodeHard编程任务是 Reflexion 最自然的应用之一因为代码可以运行错误信息和测试反馈非常具体。论文中的编程 agent 大致流程如下生成函数实现。用 CoT 生成若干自定义单元测试并通过 AST 检查过滤语法无效测试。执行测试得到失败 case 或编译/解释器反馈。如果失败Self-Reflection 总结实现错误。Actor 根据测试结果和反思重新生成实现。这里有一个重要细节Reflexion 的提升依赖测试质量。错误测试可能导致 false negative测试不充分则可能导致 false positive。论文指出 false positive 更危险因为 agent 会误以为错误实现已经通过从而提前停止。五、实验结论与关键 insight实验部分不需要记住所有 setting更重要的是理解它们说明了什么。1. Reflexion 能让 agent 在少数试错轮次内持续变好在 ALFWorld 中ReAct baseline 很快遇到瓶颈而加入 Reflexion 后成功率随 trial number 持续上升。论文报告 Reflexion 相比强 baseline 在 ALFWorld 上有约 22% 的绝对提升。更重要的是错误类型分析显示自我反思显著减少了 hallucination 和 inefficient planning 这类会让 agent 长期卡住的问题。ALFWorld实验结果2. Reflection 比单纯保留上一轮轨迹更有效HotPotQA 的结果表明Reflexion 能提升搜索、信息检索和推理能力。尤其在 CoT (GT) 的消融中仅加入 episodic memory 已经带来一定收益但再加入 self-reflection 后仍有额外提升。这个结果支持了论文最核心的假设自然语言反思不是冗余上下文而是一种经过压缩和归因的经验表示。HotPotQA实验结果3. 编程任务中测试反馈和自我反思需要配合使用在 HumanEval Python 上Reflexion 达到 91.0 pass1高于论文中对比的 GPT-4 baseline 80.1。在 HumanEval Rust、MBPP Rust 和 LeetcodeHard Python 上也有明显提升但在 MBPP Python 上Reflexion 低于 GPT-4 baseline。论文进一步分析发现MBPP Python 的自生成测试 false positive 更高也就是说测试更容易“放过”错误实现。编程任务Pass1结果消融实验也支持这一点只做 self-reflection 但没有测试生成会伤害性能只做测试生成但没有自然语言反思又无法把测试失败有效转化为代码修复方向。完整 Reflexion 才能在困难 Rust 子集上取得最好结果。4. Reflexion 依赖强模型的自我修正能力附录实验显示较弱模型不一定能从 Reflexion 中受益。原因很直观如果模型无法准确识别自己哪里错了或者反思文本只是空泛建议那么 memory 反而会变成噪声。论文将“能够写出有效自我修正”视为更强 LLM 的一种 emergent quality。六、局限性与启示Reflexion 的价值在于轻量、可解释、容易和现有 LLM agent 结合但它不是万能的。论文也明确指出了几个限制没有形式化成功保证。Reflexion 更像是上下文层面的策略优化可能陷入局部最优。依赖反馈质量。如果 Evaluator 或测试信号错误reflection 也可能朝错误方向总结。依赖模型能力。较弱模型可能写不出有效的失败归因。探索能力有限。在 WebShop 这类需要大范围、多样化探索的任务中Reflexion 没有显著优于 ReAct。长期记忆结构较简单。论文主要使用滑动窗口式 memory未来可以结合向量数据库、结构化数据库或更复杂的记忆检索机制。从更宏观的角度看Reflexion 提供了一个很有启发性的 agent 设计范式当模型太大、微调太贵、环境反馈太稀疏时我们可以先不急着更新权重而是更新“智能体知道自己曾经错在哪里”的记忆。对于很多真实应用中的 LLM agent这种方法非常实用因为它天然具备可解释性我们不仅能看到 agent 做了什么还能看到它认为自己为什么失败、下次准备如何修正。七、总结Reflexion 的核心可以用一句话概括让语言智能体通过语言形式的失败经验来强化自己。它把传统强化学习中的 reward signal 转换为自然语言 reflection把参数更新转换为 memory 更新从而让 LLM agent 在不微调模型的情况下从试错中获益。实验表明这种机制在顺序决策、知识推理和代码生成中都能带来明显提升尤其适合那些可以获得自动反馈、但不适合频繁训练模型参数的任务。这篇论文的重要性不只在于具体数值而在于它指出了一条构建自改进 agent 的轻量路径未来的语言智能体不一定每次失败都要重新训练也可以先学会认真记录、解释和使用自己的失败。
Reflexion:让语言智能体通过语言反馈自我强化
论文标题Reflexion: Language Agents with Verbal Reinforcement Learning论文链接https://arxiv.org/abs/2303.11366论文来源NeurIPS 2023论文分类Self-Improvement一、概述随着大语言模型逐渐被用作能够调用工具、搜索网页、执行代码、与环境交互的语言智能体Language Agent一个自然的问题变得越来越重要智能体能否像人一样从失败经验中快速学习传统强化学习当然也在研究“试错学习”但它通常需要大量交互样本、价值函数或策略梯度训练并且往往要更新模型参数。对于以大语言模型为核心的智能体来说这条路成本很高模型很大、环境反馈稀疏、轨迹是自然语言和动作混合序列很多任务还涉及搜索、编程、调用外部工具等离散行为。相比之下当前常见的 LLM agent 更多依赖 prompt、in-context examples 或 ReAct 这类推理-行动框架一旦失败下一次尝试并不一定真正吸收上一次的经验。本文提出的 Reflexion 试图解决这个问题。它的核心观点非常直接不通过梯度更新模型权重而是通过自然语言形式的自我反思来更新智能体的记忆从而改进后续决策。论文将这种机制称为 verbal reinforcement learning。这里的“reinforcement”不是一个标量 reward 直接驱动参数优化而是把环境反馈、测试结果、失败状态等信号转写成可读、可复用的经验总结并放入 episodic memory 中作为下一轮 Actor 的上下文。换句话说Reflexion 把强化学习里的“学习信号”从数值梯度变成了“语义梯度”失败之后智能体写下一段“我刚才哪里错了、下次应该怎么做”的文本下一次尝试时这段文本会和新任务上下文一起进入模型影响它的推理和行动。Reflexion在三类任务中的工作方式这篇论文的主要贡献可以概括为三点提出 Reflexion 框架将语言智能体的策略表示为 LLM 参数与记忆内容的组合即不更新 LLM 权重而更新 agent memory。在决策、问答推理、代码生成三类任务上验证了自我反思记忆的有效性尤其展示了少数几轮试错就能明显提升性能。系统分析不同反馈来源、反馈写入方式、agent 类型和模型能力对 Reflexion 的影响指出它的收益依赖较强的模型自我评估和自我修正能力。二、核心思想把失败变成可复用的语言经验Reflexion 最值得关注的地方并不是“让模型再试一次”而是它明确区分了三类信息Trajectory当前尝试中的短期轨迹例如一系列 thought/action/observation或者一段代码及其测试结果。Evaluation对这次轨迹的评价可以是环境给出的成功/失败信号、exact match 分数、手写 heuristic、LLM evaluator或者编程任务中的自生成单元测试结果。Reflection把评价信号和轨迹转写成自然语言经验例如“我误把问题问的是单个战役而不是战役系列”“我只检查了括号数量相等却没有检查括号顺序”。这种设计解决了 LLM agent 学习中的一个关键痛点很多环境反馈本身太稀疏。比如 ALFWorld 只告诉智能体任务是否完成HumanEval 的测试只告诉某些 case 是否通过HotPotQA 的 exact match 只告诉答案对错。这些反馈对人类读者有意义但对下一轮 LLM 推理来说并不够具体。Reflexion 的 Self-Reflection 模块负责把这些稀疏信号扩展为更可执行的语言建议。从强化学习角度看Reflexion 没有显式学习一个 value function 或 policy network而是将策略写成❝其中是 Actor 所使用的语言模型是长期记忆。模型参数保持不变但 memory 会随着每轮反思被更新。因此Reflexion 的“策略优化”发生在上下文层面下一轮动作分布的变化来自 prompt 中新增的反思文本。三、方法Reflexion 框架包含三个主要模型角色Actor、Evaluator 和 Self-Reflection。它们不一定是三个不同的底层模型也可以是同一个 LLM 在不同 prompt 下扮演的不同角色。Reflexion整体框架与算法1. ActorActor 负责生成任务轨迹。在不同任务中Actor 可以是 CoT agent、ReAct agent 或代码生成模型。它接收当前任务状态、短期轨迹上下文以及长期记忆中的反思文本然后输出下一步 thought/action或者直接生成最终答案/代码。这里的关键是Actor 并不是单纯重复上次尝试而是在 prompt 中显式看到过去的反思。例如在编程任务中Actor 会看到上一版实现、单元测试反馈和上一轮 self-reflection再生成改进后的函数体。2. EvaluatorEvaluator 负责判断当前尝试的质量。论文中根据任务类型使用了不同评价方式在 ALFWorld 这类交互式环境中可以使用环境成功信号也可以用手写 heuristic 或 LLM 判断是否陷入循环、幻觉或低效规划。在 HotPotQA 中使用 exact match 将答案判为正确或错误。在代码生成中使用自生成单元测试、解释器或编译器反馈来判断代码是否可能正确。Evaluator 的输出可以是二值信号也可以是标量或自然语言反馈。Reflexion 并不要求反馈必须来自人工标注它只要求这个反馈能被 Self-Reflection 模块进一步转化成“下一次应该怎么改”的语言经验。3. Self-ReflectionSelf-Reflection 是 Reflexion 的核心模块。它接收当前轨迹、评价结果和已有记忆生成一段自然语言反思并追加到长期记忆中。论文中通常将 memory 限制为最近 1 到 3 条经验以适配 LLM 的上下文长度。一个好的 reflection 不只是复述“失败了”而要完成某种 credit assignment定位失败可能由哪一步导致并提出后续行为调整。例如决策任务中不要继续在错误容器里找物品应优先检查已经观察到的相关位置。推理任务中问题问的是“共同职业”而不是两个人所有职业的并集。编程任务中当前实现只检查了括号数量没有检查括号嵌套顺序。因此Reflexion 的效果高度依赖模型能否把失败轨迹压缩成有用经验。它不是保证收敛的 RL 算法而是一种利用 LLM 语言理解能力做经验归纳的 agent learning 框架。4. 整体循环Reflexion 的训练/推理循环可以概括为Actor 根据当前任务和 memory 生成一次轨迹。Evaluator 对轨迹打分或判定成功失败。如果失败Self-Reflection 根据轨迹和反馈生成反思文本。将反思写入 memory。重置或继续环境在下一轮尝试中使用更新后的 memory。这个循环最像人类做题或调试程序时的过程先尝试再看哪里错了写下一条经验然后带着这条经验重新做。它与普通 retry 最大的区别在于下一轮不是只依赖采样随机性而是显式注入了失败归因。四、不同任务中的实现方式1. 顺序决策ALFWorldALFWorld 是一个文本交互环境智能体需要完成找物品、移动物品、清洗/加热/冷却物品等多步任务。论文使用 ReAct 作为 Actor因为 ReAct 本身适合交替生成 thought 和 action。失败之后Reflexion 会总结这次轨迹的问题例如是否在错误位置重复搜索、是否误解任务目标、是否出现无效动作循环。在这个场景中长期记忆有两个作用一是从很长的失败轨迹中提炼出关键错误二是帮助智能体跨轮次系统性探索环境而不是每次都从零开始。2. 知识推理HotPotQAHotPotQA 需要模型在多文档信息中进行推理。论文测试了 CoT、ReAct 以及给定 ground-truth context 的 CoT (GT) 设置。这里的评价信号主要是 exact match答案对或错。这个任务尤其能说明 Reflexion 与“只把上一轮轨迹塞回 prompt”的区别。论文对比了 episodic memory ablation仅加入上一轮轨迹确实有帮助但加入自然语言 self-reflection 后还能进一步提升。这表明有用的并不是“上下文变长”本身而是把失败压缩成了更明确的可执行经验。3. 代码生成HumanEval、MBPP 与 LeetcodeHard编程任务是 Reflexion 最自然的应用之一因为代码可以运行错误信息和测试反馈非常具体。论文中的编程 agent 大致流程如下生成函数实现。用 CoT 生成若干自定义单元测试并通过 AST 检查过滤语法无效测试。执行测试得到失败 case 或编译/解释器反馈。如果失败Self-Reflection 总结实现错误。Actor 根据测试结果和反思重新生成实现。这里有一个重要细节Reflexion 的提升依赖测试质量。错误测试可能导致 false negative测试不充分则可能导致 false positive。论文指出 false positive 更危险因为 agent 会误以为错误实现已经通过从而提前停止。五、实验结论与关键 insight实验部分不需要记住所有 setting更重要的是理解它们说明了什么。1. Reflexion 能让 agent 在少数试错轮次内持续变好在 ALFWorld 中ReAct baseline 很快遇到瓶颈而加入 Reflexion 后成功率随 trial number 持续上升。论文报告 Reflexion 相比强 baseline 在 ALFWorld 上有约 22% 的绝对提升。更重要的是错误类型分析显示自我反思显著减少了 hallucination 和 inefficient planning 这类会让 agent 长期卡住的问题。ALFWorld实验结果2. Reflection 比单纯保留上一轮轨迹更有效HotPotQA 的结果表明Reflexion 能提升搜索、信息检索和推理能力。尤其在 CoT (GT) 的消融中仅加入 episodic memory 已经带来一定收益但再加入 self-reflection 后仍有额外提升。这个结果支持了论文最核心的假设自然语言反思不是冗余上下文而是一种经过压缩和归因的经验表示。HotPotQA实验结果3. 编程任务中测试反馈和自我反思需要配合使用在 HumanEval Python 上Reflexion 达到 91.0 pass1高于论文中对比的 GPT-4 baseline 80.1。在 HumanEval Rust、MBPP Rust 和 LeetcodeHard Python 上也有明显提升但在 MBPP Python 上Reflexion 低于 GPT-4 baseline。论文进一步分析发现MBPP Python 的自生成测试 false positive 更高也就是说测试更容易“放过”错误实现。编程任务Pass1结果消融实验也支持这一点只做 self-reflection 但没有测试生成会伤害性能只做测试生成但没有自然语言反思又无法把测试失败有效转化为代码修复方向。完整 Reflexion 才能在困难 Rust 子集上取得最好结果。4. Reflexion 依赖强模型的自我修正能力附录实验显示较弱模型不一定能从 Reflexion 中受益。原因很直观如果模型无法准确识别自己哪里错了或者反思文本只是空泛建议那么 memory 反而会变成噪声。论文将“能够写出有效自我修正”视为更强 LLM 的一种 emergent quality。六、局限性与启示Reflexion 的价值在于轻量、可解释、容易和现有 LLM agent 结合但它不是万能的。论文也明确指出了几个限制没有形式化成功保证。Reflexion 更像是上下文层面的策略优化可能陷入局部最优。依赖反馈质量。如果 Evaluator 或测试信号错误reflection 也可能朝错误方向总结。依赖模型能力。较弱模型可能写不出有效的失败归因。探索能力有限。在 WebShop 这类需要大范围、多样化探索的任务中Reflexion 没有显著优于 ReAct。长期记忆结构较简单。论文主要使用滑动窗口式 memory未来可以结合向量数据库、结构化数据库或更复杂的记忆检索机制。从更宏观的角度看Reflexion 提供了一个很有启发性的 agent 设计范式当模型太大、微调太贵、环境反馈太稀疏时我们可以先不急着更新权重而是更新“智能体知道自己曾经错在哪里”的记忆。对于很多真实应用中的 LLM agent这种方法非常实用因为它天然具备可解释性我们不仅能看到 agent 做了什么还能看到它认为自己为什么失败、下次准备如何修正。七、总结Reflexion 的核心可以用一句话概括让语言智能体通过语言形式的失败经验来强化自己。它把传统强化学习中的 reward signal 转换为自然语言 reflection把参数更新转换为 memory 更新从而让 LLM agent 在不微调模型的情况下从试错中获益。实验表明这种机制在顺序决策、知识推理和代码生成中都能带来明显提升尤其适合那些可以获得自动反馈、但不适合频繁训练模型参数的任务。这篇论文的重要性不只在于具体数值而在于它指出了一条构建自改进 agent 的轻量路径未来的语言智能体不一定每次失败都要重新训练也可以先学会认真记录、解释和使用自己的失败。