Reflexion 拆解:NeurIPS 2023 论文怎么把「试错学习」写成语言闭环

从结构解剖视角读一篇无梯度学习范本

Posted by Kevin on September 3, 2026

拆解对象:Reflexion: Language Agents with Verbal Reinforcement Learning,NeurIPS 2023。一作 Noah Shinn(美国东北大学),作者还包括 MIT 的 Ashwin Gopinath 与普林斯顿的 Karthik Narasimhan、Shunyu Yao。它与 ReAct 构成一对:ReAct 是单次尝试内的推理与行动循环,Reflexion 是跨次尝试的语言学习闭环。这篇文章只做一件事:分析这篇论文的结构为什么好。所有数字出自论文 arXiv v4 正文与附录,可对照复核。

一、为什么值得拆

「verbal reinforcement learning」这个词组一次就立住了:不更新权重、不采集人类偏好,靠语言反馈把失败的轨迹变成下一次尝试的输入。概念上它把 agent 学习的成本打到了地板(零梯度、零标注),工程上它成了后来所有「重试 + 记忆」机制的源头。

论文的写作难题也很典型:一个由三个 LLM 实例组成的框架,没有公式推导、没有训练曲线,说服力从哪来。它的答案是结构:组件定义清晰、消融与组件一一对应、失败实验主动暴露。

二、正文骨架:方法按组件切,实验按任务切

章节 职责 拆解要点
1 Introduction 立论 Figure 1 一图讲清三类任务上的工作方式
2 Related Work 前置定位 两张功能对比表,Reflexion 是唯一全勾选项
3 Reflexion 方法 五个小节:Actor / Evaluator / Self-reflection / Memory / Process,Figure 2 加 Algorithm 1
4 Experiments 实验 三小节:ALFWorld / HotPotQA / Programming,各自自带 Results 与 Analysis
5 Limitations 边界 独立成节,含 WebShop 失败实验
6-8 收束 Broader impact / Conclusion / Reproducibility 各自独立成节

方法节与实验节用了两种不同的切法,这个对齐关系值得细看:方法按组件切(三个模型加一个记忆),实验按任务切(决策、推理、编程),消融再切回组件。全文因此形成「组件定义 → 任务验证 → 组件消融」的闭环。

三、方法节:用 RL 词汇讲 in-context 学习

第 3 节的五个小节各自映射一个 RL 概念:

组件 对应的 RL 概念 描述要点
Actor 策略 基于 LLM 生成动作,探索了 CoT 与 ReAct 两种实现
Evaluator 奖励函数 三种变体:精确匹配、预定义启发式、LLM 自评
Self-reflection 信用分配的语言版 把稀疏的成败信号转成「第 i 步动作导致后续出错」的具体归因
Memory 经验回放的语言版 短期记忆存轨迹,长期记忆存反思,容量 1 到 3 条
Process 训练循环 Algorithm 1 十行伪代码写完整个流程
Actor(策略) LLM 生成动作 · ReAct / CoT Evaluator(奖励) 精确匹配 / 启发式 / LLM 自评 Self-reflection 「第 i 步动作导致后续出错」 Memory(回放) 长期记忆存反思 · 容量 1–3 条 trajectory · 本轮轨迹 成败信号 具体归因 带着反思再试一次 尝试 t → t+1 外循环 零梯度 · 零人类标注 与 ReAct 的关系:ReAct 是单次尝试内的 Thought-Action-Observation 循环,Reflexion 把循环抬到「跨尝试」层
Figure 2 仿绘:三个 LLM 实例加一个记忆构成的语言学习闭环,每个组件映射一个 RL 概念

这套映射本身就是论文的修辞策略:读者带着 RL 直觉来,用熟悉的词汇理解一个全新的机制。Algorithm 1 与 Figure 2 放在方法节末尾,先分后总,读完组件立刻看到它们如何咬合。

四、实验的组织:消融只出现在最强的地方

三类任务的数字:ALFWorld 上 ReAct 加 Reflexion 完成 134 个任务中的 130 个,较基线绝对提升 22%;HotPotQA 提升 20%;HumanEval Python 91.0% pass@1,超过当时 GPT-4 的 80.1%。

结构上最值得注意的是消融的分布:只有编程节(4.3)有独立的 Ablation study 小节。三个消融维度正好对齐方法节的三个组件:

消融维度 回答的问题 关键数字
反馈信号来源 奖励从哪来 启发式(动作重复超 3 次即失败)与 LLM 自评两种实现,Figure 3 对比
记忆方式 记什么 情景记忆(EPM,只存最近轨迹)对自反思,自反思额外带来 8% 绝对提升
组件消融 缺一不可吗 HumanEval Rust 最难 50 题:基线 0.60,去掉测试生成掉到 0.52,去掉自反思持平 0.60,完整 Reflexion 0.68
0.500.550.600.650.70 0.600.520.600.68 基线(纯重试)− 测试生成− 自反思完整 Reflexion HumanEval Rust 最难 50 题 pass@1 · 纵轴自 0.50 起(截断轴特此标注)
组件消融重绘:去掉自反思回到 0.60 说明盲目重试无效,学习增量确实来自语言反思;去掉测试生成掉到 0.52 说明反思质量依赖可靠的奖励

「去掉自反思持平」这条结果尤其有价值:它证明在难任务上盲目重试无效,学习的增量确实来自语言反思,这是对核心主张最硬的支撑。

另一个亮点是对唯一失利的处理。MBPP Python 上 Reflexion 77.1% 低于 GPT-4 的 80.1%,论文没有藏,而是用测试生成质量分析解释原因:MBPP 上自生成单元测试的假阳性率 16.3%,远高于 HumanEval 的 1.4%,测试不可靠导致反思被误导。失利被转化为「这套方法的适用条件」。

五、Limitations 独立成节:把失败实验写成边界

第 5 节与附录 B.1 主动报告了两类失败:WebShop 上 Reflexion 无法超越纯 ReAct(Figure 6),需要高度多样性探索的任务是其短板;附录 A 显示 starchat-beta 小模型上加 Reflexion 毫无提升,自纠错能力是强模型的涌现属性。

91% pass@1 的合法性也在结构里交代了:HumanEval 的评估用自生成单元测试(AST 过滤语法无效项,每套最多 6 个测试)而非隐藏测试,因此符合 pass@1 报告口径,与那些用测试集泄漏刷分的工作划清界限。测试生成的 TP 达 0.99,假阳性率 1.4%,可靠性数字与主结果一起给出。

六、能学走的三个写作技巧

  1. 概念映射修辞:用策略、奖励、记忆这些 RL 熟词讲语言反馈新机制,读者的学习成本被压到最低
  2. 对比表自我定位:第 2 节两张功能矩阵把相关工作按能力打勾,空白格就是本文的贡献清单
  3. 消融与组件一一对应:方法节切了几刀,消融就切几刀,读者拿着方法地图能直接索引到验证位置

尾注:对我自己工作的映射

赛后教练系统的「改善验证」环节,本质上就是 Reflexion 外循环的领域化:一局比赛轨迹是 trajectory,算法层的结构化诊断是 evaluator,教练反馈生成是 self-reflection,下一局带着反馈上场是 episodic memory。Reflexion 的一条教训直接适用:反思必须落到具体动作序列(第 i 步操作导致了后续掉速),空泛的「过弯再稳一点」无法带来提升。这也解释了教练系统为什么坚持算法层先出结构化证据、LLM 层只做转述:没有具体归因的反馈,重试只是昂贵的随机。

参考

  • 论文:arXiv:2303.11366,发表于 NeurIPS 2023
  • 代码:github.com/noahshinn/reflexion
  • 主实验口径:ALFWorld 134 任务 12 轮迭代内,HumanEval / MBPP / LeetcodeHardGym 覆盖 Python 与 Rust,pass@1