Reflexion: Language Agents with Verbal Reinforcement Learning


TL;DR

本文提出 Reflexion 框架,通过让语言智能体对过去的试错经验进行口头反思(verbal reflection)并形成文本记忆,从而在无需更新模型权重的情况下实现强化学习,显著提升了其在决策、推理和编程等任务上的表现。

关键定义

本文的核心是 Reflexion 框架,它由几个关键概念组成:

相关工作

当前,利用大型语言模型(LLM)作为核心来构建与外部环境(如游戏、编译器、API)交互的自主智能体已成为一个热门研究方向(例如 ReAct, SayCan, Toolformer)。然而,这些语言智能体在通过试错法学习时面临巨大挑战。传统的强化学习(RL)方法通常需要大量的训练样本和昂贵的模型微调(fine-tuning),这对于参数量巨大的LLM来说是不切实际的。现有的方法大多依赖于上下文学习(in-context learning),但缺乏一种高效的、从失败中快速学习的机制。

一些相关工作尝试解决类似问题,但存在局限:

本文旨在解决的核心问题是:如何让语言智能体能够在几次尝试内,像人类一样通过反思过去的失败来高效地学习和改进,而无需进行计算成本高昂的模型权重更新。

本文方法

Reflexion 框架示意图与算法流程 图注:(a) Reflexion示意图。(b) Reflexion强化算法流程

本文提出的 Reflexion 框架通过模拟人类的反思学习过程,实现了一种轻量级但高效的“口头强化学习”。其核心在于将稀疏的外部反馈转化为丰富的语言文字指导,并存储于记忆中以备后续使用。

模块化设计

Reflexion 包含三个核心模型:

  1. 行动者 (Actor, $M_a$): 一个 LLM,其策略 $\pi_{\theta}(a_t \mid s_t)$ 由 LLM 本身和记忆 \(mem\) 共同参数化,即 $\theta={M_a, mem}$。它根据当前状态和短期记忆(当前轨迹)与长期记忆(反思文本)来生成行动 $a_t$。

  2. 评估者 (Evaluator, $M_e$): 对行动者生成的完整轨迹 $\tau$ 进行打分。这个评估器可以是多样的:
    • 对于推理任务,可以使用精确匹配(EM)来判断答案是否正确。
    • 对于决策任务,可以使用预定义的启发式规则(例如,是否在原地打转、行动步数是否过多)。
    • 对于编程任务,可以利用编译器或自生成的单元测试来判断代码的正确性。
  3. 自我反思模型 (Self-Reflection Model, $M_{sr}$): 这是 Reflexion 的关键。它也是一个 LLM,接收行动轨迹 $\tau_t$ 和评估分数 $r_t$ 作为输入,然后生成一段反思文本 $sr_t$。这段文本会分析失败的原因,并提出具体的改进策略。例如,“我不应该在第 i 步执行动作 a,而应该尝试动作 a’,因为 a 导致了后续的一系列错误。”

Reflexion 流程

该过程是一个迭代循环,如算法1所示:

  1. 首次尝试: 行动者在没有长期记忆的情况下生成初始轨迹 $\tau_0$。
  2. 评估: 评估者对 $\tau_0$ 进行评分,得到标量奖励 $r_0$。
  3. 反思: 自我反思模型分析 ${\tau_0, r_0}$,生成一段反思文本 $sr_0$。
  4. 记忆存储: 将反思文本 $sr_0$ 添加到长期记忆 \(mem\) 中。为避免上下文窗口过长,记忆通常只保留最近的 N 次(例如1-3次)反思。
  5. 后续尝试: 在第 $t$ 次尝试中,行动者将结合长期记忆 \(mem\) 中的所有反思内容作为上下文,生成新的轨迹 $\tau_t$。
  6. 循环: 重复步骤 2-5,直到任务成功或达到最大尝试次数。

核心创新与优点

Reflexion 在不同任务上的应用 图注:Reflexion 框架可应用于决策、编程和推理等多种任务。

实验结论

本文在决策、推理和编程三大类任务上验证了 Reflexion 框架的有效性,结果表明 Reflexion 智能体在多个基准测试中均显著优于强大的基线模型。

顺序决策任务 (ALFWorld)

ALFWorld 任务性能 ALFWorld 任务失败原因分类 图注:(a) Reflexion 在 ALFWorld 任务上随尝试次数增加的性能表现优于基线。 (b) Reflexion 显著减少了因幻觉和低效规划导致的失败。

推理任务 (HotpotQA)

HotpotQA 任务性能 HotpotQA (CoT) 任务性能 HotpotQA 消融实验

编程任务 (HumanEval, MBPP等)

基准 + 语言 先前 SOTA Pass@1 SOTA Pass@1 Reflexion Pass@1
HumanEval (PY) 65.8 (CodeT + GPT-3.5) 80.1 (GPT-4) 91.0
HumanEval (RS) 60.0 (GPT-4) 68.0
MBPP (PY) 67.7 (CodeT + Codex) 80.1 (GPT-4) 77.1
MBPP (RS) 70.9 (GPT-4) 75.4
Leetcode Hard (PY) 7.5 (GPT-4) 15.0

表1: 不同模型和策略组合在编程任务上的 Pass@1 准确率。

基准 + 语言 基线 Reflexion TP FN FP TN
HumanEval (PY) 0.80 0.91 0.99 0.40 0.01 0.60
MBPP (PY) 0.80 0.77 0.84 0.59 0.16 0.41
HumanEval (RS) 0.60 0.68 0.87 0.37 0.13 0.63
MBPP (RS) 0.71 0.75 0.84 0.51 0.16 0.49

表2: 总体准确率和单元测试生成性能分析。FP (假阳性) 率过高会损害 Reflexion 性能。

方法 测试生成 自我反思 Pass@1 (Acc)
基线模型 0.60
省略测试生成 0.52
省略自我反思 0.60
Reflexion 0.68

表3: 在 HumanEval Rust 上的消融研究,证明了测试生成和自我反思两个组件缺一不可。

最终结论

Reflexion 是一种有效且通用的方法,它通过口头强化学习,使语言智能体能够从过去的错误中高效学习,而无需进行昂贵的模型微调。实验证明,这种通过自我反思提炼经验并指导未来行动的机制,能够显著提升智能体在决策、推理和编程等一系列复杂任务上的性能。