论文
经验积累
★ 必读
Reflexion: Language Agents with Verbal Reinforcement Learning
Reflexion:用语言化自我反思替代梯度更新的 agent 学习框架
Noah Shinn, Federico Cassano, Edward Berman, Ashwin Gopinath, Karthik Narasimhan, Shunyu Yao · Northeastern / Princeton · NeurIPS 2023 · 2023-03 · 被引 4997
一句话让 LLM agent 在失败后用语言写下"我错在哪、下次怎么改",存入 episodic memory 供下轮尝试使用,以此替代权重更新:AlfWorld 12 轮做到 130/134,HumanEval pass@1 报 91%(GPT-4 基线 80%)——但多项头条数字被第三方复现打了折扣。
这是什么
2023 年 3 月,ReAct 一系的 agent 已经能靠 LLM 在环境里行动,但"从试错中学习"仍然只能靠 RL 微调——样本贵、算力贵,对闭源模型根本做不了。Reflexion(Northeastern / Princeton,作者含 ReAct 的 Shunyu Yao,NeurIPS 2023)提出换一条路:不更新权重,而是把环境给的 binary/scalar 反馈"放大"成一段自然语言的自我反思(verbal reinforcement),追加进下一轮尝试的 prompt。作者称之为 semantic gradient:策略被参数化为"冻结的 LLM + 一段可增长的记忆文本"。
论文在三类任务上验证:AlfWorld 文本家务环境(决策)、HotPotQA(推理)、HumanEval/MBPP/自建 LeetcodeHardGym(编程),并顺带释出 LeetcodeHardGym——40 道 GPT-4 训练截止后发布的 Leetcode hard 题、19 种语言的 RL gym。S2 引用数近 5000(Google Scholar 已过 7000),是"测试时经验学习/agent 记忆"这条线被引用最多的奠基工作之一,后来几乎所有 agent 框架里的 self-reflection / retry-with-memory 组件都源于此。
三类任务上的完整循环示例(决策/编程/推理):轨迹失败(红) → Evaluation(三种来源:heuristic、自生成 unit test、环境 binary reward)→ 语言化 Reflection 指出具体错因 → 下一轮修正(绿)。一张图看懂方法全貌,注意三列的评估信号来源各不相同。机制与做法
三个 LLM 角色 + 两级记忆
框架由三个(共享底座的)LLM 实例组成:Actor(即 ReAct 或 CoT agent,产生动作/答案)、Evaluator(给轨迹打分)、Self-Reflection 模型(把"轨迹 + 分数"改写成第一人称的反思文本,例如"失败是因为我误以为两人都有多重职业……下次应先确认")。记忆分两级:当前轨迹是 short-term memory,反思文本追加进长期记忆 mem——实践中 mem 是个容量 Ω=1~3 条的滑动窗口(受 2023 年 context 长度所限),编程任务只存 1 条。
架构图:Actor/Evaluator/Self-reflection 三个 LLM 角色,轨迹作 short-term memory、反思文本作 long-term memory(Experience)。所谓"verbal RL"就是这条 反思→记忆→条件生成 的回路替代了梯度回传。反馈信号从哪来:三个任务三种 Evaluator
这是读这篇必须看清的一点,三个任务的"成功信号"来源完全不同。AlfWorld:手写 heuristic(同一动作连续 3 次无效、或超 30 步即判卡死)或让另一个 LLM 做二分类,属于无 oracle 的自评。编程:让模型自己用 CoT 生成至多 6 个 unit test(过 AST 语法过滤),在解释器里跑,以此自评——因为测试是自生成的,作者据此声称仍符合 pass@1 口径。HotPotQA:直接用数据集 ground truth 答案做 exact match——这是外部 oracle 信号,后面 reality 部分会展开这个争议。
循环流程即论文 Algorithm 1:生成轨迹 τ_t → Evaluator 打分 r_t → Self-Reflection 生成 sr_t 存入 mem → 带着 mem 重试,直到 Evaluator 判过或达到最大轮数(AlfWorld 12 轮左右,HotPotQA 连续 3 次失败即停)。
AlfWorld 主结果:ReAct-only(灰虚线)在 6-7 轮后停滞于约 75%,ReAct+Reflexion(heuristic 蓝 / GPT 自评绿)持续爬到约 97%。看这张图时记住 issue #19:成功判定代码曾把"跑满步数"也算成功,且换用现存模型后第三方复现不出这条曲线的起点。关键消融:反思 ≠ 单纯重试,也 ≠ 单纯记住上次轨迹
HotPotQA 上的消融是全文最有说服力的部分:CoT(GT) 基线在 temperature 0.7 下盲目重采样,失败题一道也救不回来;加 episodic memory(只把上次轨迹塞回 context)有提升;再加语言化反思,比 EPM 又多 8 个绝对点(图 c)。编程侧的消融(HumanEval Rust 最难 50 题):去掉自生成测试,52% 反而低于基线 60%——agent 不知道何时该停,会做有害的"修复";去掉反思只保留"测试失败就盲改",60% 与基线持平。作者由此论证:blind trial-and-error debugging 在难题上无效,语言化的错误归因才是增量所在。
全文最重要的消融:CoT(GT) 盲目重采样(灰)完全不涨,加 episodic memory(粉)涨一点后停滞,加语言化反思(紫)再多 8 个绝对点。它回答了"增益是不是只来自重试+排除法"这一质疑——反思有独立贡献。能力门槛:反思是强模型的 emergent 能力
附录 A 很诚实:用开源的 starchat-beta 跑 HumanEval,基线 0.26,Reflexion 还是 0.26,零提升;HotPotQA 上 gpt-4 与 gpt-3.5-turbo 的增益幅度其实相近(ReAct 组均约 +12,CoT 组 +12 vs +14),差别主要在绝对水平。作者的结论是"指出并修正自己错误"的能力在弱模型上不存在,这决定了 2023 年时该方法基本只对 GPT-4 级模型成立。
关键结果
- HumanEval Python pass@1 报 91.0%,当时 GPT-4 直接生成为 80.1%;HumanEval Rust 68% vs 60%;自建 LeetcodeHard 15% vs 7.5%,翻倍。
- MBPP Python 是唯一输的项:77.1% vs GPT-4 的 80.1%,作者归因于自生成测试的 false positive 率——MBPP 上 16.3%,而 HumanEval 上只有 1.4%,烂测试会让 agent 提前交错答案。
- AlfWorld 134 个环境、12 轮迭代后完成 130/134(约 97%),heuristic 自评略优于 GPT 自评;ReAct-only 基线在 6-7 轮后停滞于约 75%,hallucination 率恒在 22%。
- HotPotQA 100 题采样:各类 agent 均提升约 20%;CoT(GT) 消融显示语言化反思比纯 episodic memory 再多 8 个绝对点——这是"反思有独立贡献"的核心证据。
- 编程消融(Rust 最难 50 题):去掉自生成测试 52%(低于基线 60%),去掉反思 60%(持平),两者都在才有 68%。
- 弱模型无效:starchat-beta 上 0.26 → 0.26,零提升(附录自报)。
- 长期记忆实际只是 1~3 条反思的滑动窗口,没有检索、没有整合,Limitations 一节自己点名希望后续接向量库/数据库。
实证核查
有水分机制本身(语言反思 > 盲目重试/纯轨迹记忆)扎实、代码日志全开源且被海量后续工作复用;但三条头条数字都经不起细看:AlfWorld 有作者承认的成功判定 bug 且换模型后无法复现,HumanEval 91% 第三方普遍只跑到 77-83%,HotPotQA 的成功信号直接来自验证集标签。
AlfWorld 上 ReAct+Reflexion 完成 130/134(约 97%),12 轮持续改进。
issue #19 指出 alfworld_trial.py 的成功判定有 bug:轨迹达到步数上限也会被记为成功,作者回复承认("You are right. We didn't notice this");同一 thread 里复现者按修复版 + gpt-3.5-turbo 跑,第 0 轮成功率只有 13%(论文约 60%)。issue #35(29 条评论)进一步确认:论文用的 text-davinci-002 已下线,替代模型(davinci-002/gpt-3.5-turbo)只有约 0.3,基本无法复现;这些问题后来被 StateAct 论文(arXiv 2410.02810)系统整理。作者的辩护是模型漂移 + chat 模型动作格式错误,并以仓库内的原始日志为凭。
HumanEval pass@1 91%,超过 GPT-4 的 80%。
issue #30(已关闭)里多位用户直接跑官方 programming_runs/run_reflexion.sh,只得到 77-83%;作者(noahshinn)归因于 OpenAI 专有模型随时间漂移,建议钉住 -0314 版本,但没人复现出 91%。另外合作者 cassanof 在同一 thread 确认评测用的是 MultiPL-E 清洗后的 161 题子集,不是标准 HumanEval 164 题,数字与其它论文不严格可比。
在 HotPotQA 推理任务上比基线提升 20%。
issues #27、#45 都指出:HotPotQA 的 Evaluator 是拿验证集 ground truth 答案做 exact match,binary 成功信号直接来自标签——多轮重试 + 标签反馈本质上带 label leakage(至少可以靠排除法逼近答案)。作者回应称这正是论文设定(方法研究的就是"如何放大一个给定的 binary reward"),并引用 EPM 消融证明反思在排除法之外另有 +8% 贡献。机制结论成立,但没有 oracle 成功信号的真实场景不能指望复现这 20%。
Reflexion 是通用框架,可用于各种反馈类型和 agent。
论文附录自报 starchat-beta 上零提升(0.26→0.26),repo issues #37/#38/#39 里用 Llama-2-7b/CodeLlama 等本地模型的用户同样跑不出效果——该方法对基座能力有硬门槛,2023 年时实际上是"GPT-4 专属"。这点论文没有隐瞒,但摘要和正文的普适表述容易让人忽略。
代码、demo、数据全部开源,结果可查。
属实且值得肯定:repo(noahshinn/reflexion,MIT,3.2k stars)保留了论文全部 run 的原始日志(alfworld_runs/root、hotpotqa_runs/root、programming_runs/root),README 明确提示个人复跑成本高、建议查日志;LeetcodeHardGym 独立开源(GammaTauAI/leetcode-hard-gym)。争议 issue 作者基本都有回应,这在同期 agent 论文里算态度好的。
与我们方向的关系
对我们 continual-learning / 经验积累方向,这是必须精读的原点论文:它把"学习"从参数空间挪到了 context/记忆空间——策略 = 冻结 LLM + 可增长的经验文本,试错的产物是语言而不是梯度。后来的 memory bank、skill library、experience replay for agents(Voyager、ExpeL、AWM 等)全都是在补它明说的两个坑:记忆只有 1~3 条滑动窗口(没有检索、没有跨任务整合、没有遗忘机制),以及经验不能跨任务迁移(每道题的反思只服务于该题重试)。
可直接借鉴的教训有三条:(1) 反馈信号的可靠性决定一切——自生成 unit test 的 false positive 率(MBPP 16.3% vs HumanEval 1.4%)直接决定成败,设计经验积累系统时先想清楚成功信号从哪来、有多脏;(2) "语言反思"与"纯重试/纯轨迹记忆"要用消融分开,不然增益可能只是排除法;(3) 评估时警惕它踩过的坑:成功判定代码要审(issue #19)、报数要钉住模型版本、有 oracle 标签参与循环的数字要单独标注。
阅读笔记
复现建议:不要重跑,直接读仓库里的原始日志(各 *_runs/root 目录),API 成本高且 2023 年的模型已全部下线,跑出来的数字没有对照意义。读代码注意 HotPotQA 的 is_correct() 用了 GT。引用数口径:S2 计 4997,Google Scholar 已 7000+。原始博客(nanothoughts.substack.com)报的是早期版本 88%,与论文 91% 不同,可见数字本身对采样和模型快照敏感。
材料清单
TeX 源码已存档:Raw/reflexion/source/
同类条目