论文精读 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-4 | Reflexion | 备注 |
|---|---|---|---|
| HumanEval Python | 80.1 | 91.0 | 论文主结果 |
| HumanEval Rust | 60.0 | 68.0 | 最难 50 题的翻译子集 |
| MBPP Python | 80.1 | 77.1 | 反而下降 |
| MBPP Rust | 70.9 | 75.4 | 有提升 |
| Leetcode Hard Python | 7.5 | 15.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 上做四组实验:
- 无记忆:每次尝试独立运行;
- 完整轨迹记忆:把上一条失败轨迹直接回填;
- 自反思记忆:只保存模型总结;
- 证据约束反思:反思中的每条结论必须引用测试或观察事件。
每组至少重复 5 次,并记录:最终成功率、首次成功所需尝试数、无效修改数、错误记忆率、token 与执行成本。若只汇报“最好一次”,就无法判断 Reflexion 是真正提高可靠性,还是扩大了采样机会。
局限与适用边界
- 记忆是短窗口,论文没有解决长期检索、冲突合并和过期清理;
- 成功依赖 evaluator 与自生成测试质量,假阳性会提前结束;
- 多次尝试默认环境可以重置,现实写操作可能不可逆;
- 反思文本可解释但不保证忠实;
- 非确定环境中,同一反思可能把偶然失败误当成稳定规律;
- 论文结果基于当时模型和小规模子集,不能直接外推到今天的生产 Agent。
Reflexion 真正留下的不是一句“让模型反思”,而是一套跨尝试的数据流:执行证据进入评估,评估进入有界记忆,记忆影响下一策略,再由环境验证改变是否有效。把这四步做成可观测、可撤销的运行时机制,才是 Harness 版本的 Reflexion。