论文精读 02|Reflexion:语言反馈如何成为跨回合记忆

论文档案

项目内容
论文Reflexion: Language Agents with Verbal Reinforcement Learning
作者Noah Shinn 等
发表NeurIPS 2023
原文NeurIPS Proceedings
代码noahshinn/reflexion
本文定位从单条 ReAct 轨迹扩展到多次尝试之间的反馈闭环

一句话读懂

Reflexion 不更新模型权重,而是把一次失败经过 evaluator 评估后,转换成一段可操作的语言反思,写入有限的 episodic memory,下一次尝试时与任务一起交给 actor。

它可以写成:

Actor 生成轨迹
      │
      ▼
Evaluator 判断成功/失败并提供信号
      │
      ▼
Self-Reflection 把轨迹和信号压缩为经验
      │
      ▼
Memory 保存 1~3 条反思 ──► 下一 episode 的 Actor

这里的“reinforcement”是语言上下文中的策略调整,不是梯度下降意义上的强化学习。

研究问题:失败信号怎样变成下一次的行为改变

普通 Agent 往往能收到失败信息:游戏未完成、答案不匹配、代码测试失败。但只有一个 0/1 奖励时,模型不知道失败发生在哪一步;直接把整条历史再次塞回 prompt,又可能带来长度、噪声和重复错误。

Reflexion 把问题拆成三个角色:

角色输入输出工程责任
Actor任务、当前状态、记忆动作或答案执行策略
Evaluator轨迹、环境结果分数、标签或反馈提供外部证据
Self-Reflection轨迹、反馈、旧记忆简洁的语言经验信用分配与压缩

最关键的不是使用三个不同模型,而是三种职责不能混成一个自我确认回路。Evaluator 可以是环境返回的二元信号、规则启发式、编译器/测试器,也可以是 LLM 判断器;不同来源的可信度完全不同。

方法内部机制

语言化信用分配

传统标量奖励只能告诉策略“这次不好”。Self-Reflection 尝试回答更具体的问题:

  • 哪个早期决定造成后续连锁错误?
  • 下一次应该换哪个动作或计划?
  • 哪条环境事实此前被忽略?
  • 是推理失败、信息缺失,还是执行错误?

例如 ALFWorld 中,Agent 误以为已经拿到物体,随后很多动作都会建立在错误前提上。反思把长轨迹压缩成“先确认物体已在 inventory,再继续后续操作”,让下次尝试在关键分支改变行为。

有界 episodic memory

论文实现通常把记忆限制在最近 1–3 条反思。这不是完整长期记忆系统,而是受上下文长度约束的滑动窗口。它能抑制轨迹膨胀,却会引入遗忘和错误经验污染问题。

Harness 中至少要为记忆项保存:

task_id: ...
attempt_id: ...
source: evaluator | environment | model
verdict: failed
reflection: ...
evidence_refs: [event-17, test-3]
created_at: ...
expires_after: ...

只保存一段无来源的“经验”会让错误反思长期控制策略。

多种反馈来源

论文探索三类评估信号:环境二元反馈、针对常见失败的预定义启发式、模型自评。在代码任务中,反馈来自自生成测试与解释器;在 ALFWorld 中,环境只在任务完成时给成功信号,因此还使用启发式或 LLM 分类;在 HotpotQA 中用 exact match 产生二元信号。

这意味着 Reflexion 的效果不能只归因于“反思 prompt”。反馈通道的质量是隐藏变量:可靠测试能提供新信息,模型凭空自评则可能只是复述原错误。

实验设计与关键数字

ALFWorld:跨尝试修复长轨迹错误

论文在 134 个 ALFWorld 环境、6 类任务上使用 ReAct 作为 actor,并把记忆限制为最近 3 条反思。为了减少语法错误,沿用 ReAct 的 few-shot 轨迹。

ReAct + Reflexion 在 12 次迭代内完成 130/134 个任务;论文概括为相对强基线取得 22 个百分点的绝对提升。纯 ReAct 的学习曲线在第 6–7 次尝试附近趋于停滞,且约 22% 的失败最终仍表现为幻觉式状态判断。

这个结果支持:跨 episode 的失败压缩能帮助 Agent 找回早期错误。但它没有说明 12 次在线尝试在真实业务中的成本是否可接受。

HotpotQA:反思不仅是重放历史

HotpotQA 实验使用 100 个问题,比较 CoT、ReAct、带 ground-truth context 的 CoT,以及不同记忆方式。作者将最近完整轨迹作为 episodic memory 的消融,与语言反思比较;反思在该设置下比单纯轨迹记忆再提高约 8 个百分点。

论文报告 Reflexion 在 HotpotQA 上相对基线可提升约 20 个百分点。但样本规模较小,而且存在多次尝试,应将它理解为机制证据,而非稳定排行榜结论。

代码生成:测试反馈的力量与陷阱

编程实验覆盖 HumanEval、MBPP、LeetcodeHardGym,并用 MultiPL-E 加入 Rust。Agent 先生成程序,再生成最多 6 个内部测试,执行测试后生成反思并修订。

基准论文中的基础 GPT-4Reflexion备注
HumanEval Python80.191.0论文主结果
HumanEval Rust60.068.0最难 50 题的翻译子集
MBPP Python80.177.1反而下降
MBPP Rust70.975.4有提升
Leetcode Hard Python7.515.0绝对值仍很低

MBPP 的反例非常重要。论文分析显示,自生成测试在 MBPP Python 上出现约 16.3% 假阳性,而 HumanEval Python 约 1.4%。错误程序一旦通过了错误测试,Agent 会提前停止;反馈机制不是天然正确的。

HumanEval Rust 消融进一步展示各组件作用:基础模型 0.60,只有反思但没有测试为 0.52,只有测试没有反思为 0.60,二者结合为 0.68。没有外部执行证据的反思甚至可能带来伤害。

关键反证:自我纠错不是免费能力

ICLR 2024 论文 Large Language Models Cannot Self-Correct Reasoning Yet 给 Reflexion 一个必要边界:当模型没有外部反馈、只被要求重新检查自己的推理时,自我纠错往往不改善,甚至降低表现。

两篇论文并不矛盾。Reflexion 的有效路径通常包含:

新的环境证据或执行结果
        +
对长轨迹的信用分配
        +
下一次尝试真正改变动作

如果去掉第一项,就容易变成“同一个模型用相似上下文再次猜测”。因此必须把以下对象分开记录:

  • 外部反馈:测试失败、数据库差异、环境终态;
  • 模型批评:对失败原因的假设;
  • 策略更新:下一次准备改变什么;
  • 验证结果:改变之后是否真的改善。

Harness 设计启示

反思是派生数据,不是真相

原始轨迹和 evaluator 证据应不可变地保存,反思只是它们的可丢弃摘要。调试时必须能从反思追溯到具体事件、工具输出和测试结果。

记忆需要写入门槛

并非每次失败都值得长期保存。推荐的写入条件包括:

  • evaluator 给出可复现失败;
  • 新反思指出了此前未记录的根因;
  • 修订策略在后续尝试中得到验证;
  • 记忆作用域与当前任务、仓库版本或环境版本一致。

未经验证的自评应降权或设置短 TTL。

停止条件必须在模型之外

Reflexion 通过多次尝试改善结果,但重试也会增加成本和副作用。Harness 应限定 max_attempts、总 token、工具调用、时间和金钱预算;对写操作还要有幂等键或环境回滚。不能让模型因为“我还能继续改进”自行扩大预算。

评估器也是攻击面

若 evaluator 是另一个 LLM,工具输出里的恶意文本可能同时影响 actor 和 judge。生产系统应优先使用执行式检查;不得不用模型裁判时,至少隔离上下文、固定 rubric、保存版本并做抽样复核。

可复现的工程实验

可以在本专题的最小 Harness 上做四组实验:

  1. 无记忆:每次尝试独立运行;
  2. 完整轨迹记忆:把上一条失败轨迹直接回填;
  3. 自反思记忆:只保存模型总结;
  4. 证据约束反思:反思中的每条结论必须引用测试或观察事件。

每组至少重复 5 次,并记录:最终成功率、首次成功所需尝试数、无效修改数、错误记忆率、token 与执行成本。若只汇报“最好一次”,就无法判断 Reflexion 是真正提高可靠性,还是扩大了采样机会。

局限与适用边界

  • 记忆是短窗口,论文没有解决长期检索、冲突合并和过期清理;
  • 成功依赖 evaluator 与自生成测试质量,假阳性会提前结束;
  • 多次尝试默认环境可以重置,现实写操作可能不可逆;
  • 反思文本可解释但不保证忠实;
  • 非确定环境中,同一反思可能把偶然失败误当成稳定规律;
  • 论文结果基于当时模型和小规模子集,不能直接外推到今天的生产 Agent。

Reflexion 真正留下的不是一句“让模型反思”,而是一套跨尝试的数据流:执行证据进入评估,评估进入有界记忆,记忆影响下一策略,再由环境验证改变是否有效。把这四步做成可观测、可撤销的运行时机制,才是 Harness 版本的 Reflexion。

延伸阅读