拆解对象: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 十行伪代码写完整个流程 |
这套映射本身就是论文的修辞策略:读者带着 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 |
「去掉自反思持平」这条结果尤其有价值:它证明在难任务上盲目重试无效,学习的增量确实来自语言反思,这是对核心主张最硬的支撑。
另一个亮点是对唯一失利的处理。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%,可靠性数字与主结果一起给出。
六、能学走的三个写作技巧
- 概念映射修辞:用策略、奖励、记忆这些 RL 熟词讲语言反馈新机制,读者的学习成本被压到最低
- 对比表自我定位:第 2 节两张功能矩阵把相关工作按能力打勾,空白格就是本文的贡献清单
- 消融与组件一一对应:方法节切了几刀,消融就切几刀,读者拿着方法地图能直接索引到验证位置
尾注:对我自己工作的映射
赛后教练系统的「改善验证」环节,本质上就是 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