Reflexion
语言化的自我反思与重试——不更新权重的 verbal reinforcement。
模型侧背景,取自 Reflexion 原论文(Shinn et al., 2023,arXiv:2303.11366v4,“Reflexion: Language Agents with Verbal Reinforcement Learning”,NeurIPS 2023)。harness 综述在 V 层 与开放问题(§12.3) 中援引其“从自身 trace 学习”的思想。
方法
Reflexion 要解决的问题是:让语言 agent 从试错中变好,传统路径是强化学习——把“成功/失败”变成标量奖励,再用梯度更新 权重。这条路对语言 agent 有两个硬伤:需要大量样本与昂贵的微调;而对只能推理、拿不到权重的模型不可行。论文的核心主张是: 强化的闭环不必落在权重上,可以落在语言上——称为 verbal reinforcement。它把环境给的二元/标量反馈转写成一段文字 总结,作为下一回合的额外上下文喂回给模型;论文把这段自我反思明确称作一个 “semantic gradient”(语义梯度)——它不像 标量那样只说“错了”,而是给出一个具体的改进方向。
框架由三个模型协作(论文的形式化记号):
- Actor(M_a):生成文本与动作的策略,本身就是一个 LLM——论文里用 CoT
或 ReAct 充当,并额外挂一块记忆
mem作为上下文。 - Evaluator(M_e):给整条轨迹打一个奖励分。论文用了三类:推理任务用精确匹配(EM)、决策任务用手写启发式、 以及用另一个 LLM 当评判;编码任务则用模型自己生成的单元测试。
- Self-Reflection(M_sr):读入“轨迹 + 奖励 + 已有记忆”,写出一段具体、可执行的自然语言复盘——为什么失败、下次
怎么改,比标量信息量大得多,然后存进
mem。
循环(论文 Algorithm 1):Actor 产出轨迹 → Evaluator 打分 → Self-Reflection 复盘 → 追加进 mem → 带着 mem 重试,直到
Evaluator 判定通过或达到最大尝试次数——全程不更新任何权重。
这里有一个精确但常被读漏的点:论文把策略参数化为 {LLM 参数, mem} 这对组合。也就是说,“策略更新”并不发生在 LLM 上,
而是发生在 mem 上——权重冻结,变的只是下一次注入的那段反思。
短期记忆 vs 长期记忆:短期记忆是当前这一条轨迹(Thought/Action/Observation 序列),尝试结束即滚动;长期记忆是 mem,
跨尝试保留历次反思。真正驱动改进的是后者。mem 有容量上限 Ω(论文通常设 1–3 条)以免撑破上下文。
一次跨尝试的改进长什么样
论文 Figure 1 的决策任务(ALFWorld)例子——目标是“洗净一个锅,放到台面”。它最能说明 Reflexion 的机制:
Trial 1
Actor(ReAct): 「从灶台拿起锅」……
Environment: Nothing happens.(锅其实不在灶台,动作无效)
Actor: (却以为已经拿到锅)「用水槽把锅洗干净」……
Environment: Nothing happens.
Evaluator: 同一动作反复无效、步数超限 → 判定失败(典型错误:以为持有其实没有的物品)
Self-Reflection: 「我以为从灶台拿到了锅,但锅并不在灶台,之后的清洗动作全部落空。
下次应先确认锅的真实位置,再执行拿取。」 ← 写入长期记忆 mem
Trial 2 (上一条反思已注入上下文)
Actor: 先在可能的位置逐一定位锅 → 找到后再拿 → 洗净 → 放到台面
Evaluator: 任务完成,PASS
要点在 Trial 1 到 Trial 2 之间模型权重一字未改,改变的只是 mem 里多了一条反思。而这条反思做的事,正是强化学习里最难
的 credit assignment(归因):一个标量“FAIL”只说“错了”,反思却定位到具体哪一步是根因(“锅不在灶台”),并翻译
成一条下次能直接照做的指令。论文的分析印证:baseline agent 常常“以为持有其实没拿到的物品”,且无法回溯去找错在哪;
Reflexion 用反思把这类长轨迹蒸馏成“self-hint”,几乎消除了它们。
本质:把策略更新从参数空间搬到上下文空间
Reflexion 最容易被读浅成“失败了让模型再想想”。它真正的洞见是一次结构上的对号入座——传统 RL 的每个部件,它都在语言层 面找到了对应物:
| 传统强化学习 | Reflexion 的语言化对应 |
|---|---|
| policy(策略) | {LLM 参数, mem} 这对组合——论文把策略参数化为二者 |
| reward(标量奖励) | Evaluator 打的分(标量或文本;来自 EM、启发式、LLM 评判或单元测试) |
| gradient(梯度) | Self-Reflection 写出的复盘——论文原话叫 “semantic gradient” |
| 权重更新的落点 | 只更新 mem,LLM 权重一字不动 |
看懂这张表就抓住了本质:“策略更新”从参数空间挪到了上下文空间——被改变的不是权重,而是下一次喂给模型的 prompt。
由此能解释它为何有效。标量奖励是稀疏的:一个 pass/fail 不告诉“错在哪、怎么改”,梯度要靠大量样本才能把这点信息摊开。 而 Self-Reflection 把这个稀疏标量当场翻译成一条稠密、可执行的指令——信息量远高于一个数字,所以 Reflexion 往往几次尝 试内就收敛,而非成千上万个 episode。论文把这种“自我反思”视为大模型的一种涌现能力:小模型未必能写出有用的复盘,它随 基座能力增强而变好。
一句话概括与 ReAct 的分工:ReAct 管“单条轨迹内如何交织推理与行动”,Reflexion 在其外面套 一层跨尝试的记忆——做错一次,把教训写下来,下一次带着教训重来。
论文与实验结果
- 设置:决策 ALFWorld、推理 HotpotQA、编码 HumanEval/MBPP/LeetcodeHard(后者是论文新建的 40 道 hard 题、多语言 gym), 基座 GPT-3.5/GPT-4。三项头条增益:ALFWorld +22%、HotpotQA +20%、HumanEval +11%。
- 编码:HumanEval 取得 91% pass@1,超过当时 SOTA 的 GPT-4 的 80.1%(更早的 CodeT+GPT-3.5 为 65.8%);Rust、 LeetcodeHard 等亦刷新 SOTA。Evaluator 用模型自生成的单元测试,因而结果可按 pass@1 计。唯一落后的是 MBPP-Python (77.1 vs GPT-4 80)——论文归因于自生成测试偶发失真导致的假阳性率偏高(16.3% vs HumanEval 的 1.4%)。
- 决策:ReAct + Reflexion 用一个检测“幻觉/低效规划”的简单启发式,完成 134 题中的 130 题,并在 12 次连续尝试中持续 学会新题;而 ReAct-only 在第 6–7 次尝试后就不再提升,稳定停在 22% 的幻觉率。
- 两个决定性的消融(论文最有力的证据,也最该记住):
- 推理:仅仅“允许重试”并不奏效——ReAct-only/CoT-only/CoT(GT)-only 在温度 0.7 下几乎没能把任何首轮失败的题在后续 尝试中做对。而在只加“最近轨迹”(episodic memory)的基础上,再加 self-reflection 又带来 +8% 绝对提升。
- 编码:去掉单元测试生成,准确率反而从 60% 掉到 52%(模型无从判断当前实现对不对);去掉反思、只留测试,则相对基线毫 无提升。
- 两条合起来的结论:起作用的是“诊断失败”这一步,而不是“再试一次”。盲目试错的重试循环无效。
- 贡献:提出 verbal reinforcement,把策略参数化为“记忆 + LLM”并只更新记忆;指出自我反思是 LLM 的涌现能力;发布 LeetcodeHardGym;在多个代码基准上取得 SOTA。
局限
- 收益上限由 Evaluator 的信噪比决定:反馈若有噪声,反思会学错方向——它会为一个其实正确的答案编造“失败原因”,反而把 下一次带偏。这也是它在编码任务(有单元测试/编译器这种确定性验证器)上最强的原因。论文自陈:Reflexion 没有成功的形式保 证,依赖 LLM 的自评估能力,且作为策略优化仍可能陷入非最优的局部解。
- 必须允许多次尝试:它改进的是“跨尝试”,不适用于一次性、不可重试、或每次尝试代价极高的场景。
- 记忆是有上限的滑动窗口(Ω 通常 1–3):容量受上下文限制,论文建议未来用向量库/数据库等更强结构承载长期记忆。
- 编码场景的测试驱动评估有边界:非确定性、带副作用(调 API)、依赖硬件或并发的函数,难以用单元测试准确刻画;测试失真 还会产生假阳性。
对 agent 设计的价值
Reflexion 提供了一种廉价的自我改进机制:不训练,只要一块可读写的经验记忆加一个评估器,策略更新就发生在上下文里。可迁 移的原则,也分工程与观念两层:
- 真正起作用的是“诊断”而非“重试”。论文的消融直接证明:没有评估+反思的盲目重试循环无效。启发:给 agent 加自愈能力时, 别只写一个“失败就重跑”的循环,要在中间插入一步把失败归因成一条具体教训,再把教训带进下一次。
- 先保证验证器可靠,再谈反思。反思质量的天花板是 Evaluator 的信噪比。启发:优先接确定性验证器(测试、编译、类型检 查)当 Evaluator;只有 LLM 评判时要警惕它为正确答案编造失败理由。这把 记忆 (C) 与 验证 (V) 两层耦合了起来——记忆里该写的不是“召回率高的片段”,而是“能降低下次失败率的 教训”。
- 记忆里存的是教训,不是流水账,且有容量上限——按“是否减少了下游动作错误”来筛选与淘汰,而非按召回率。
- 可读的反思带来可观测与可监管。相比黑箱 RL 的策略,verbal reinforcement 的每一步“更新”都是人能读的自然语言——论文 点出一个安全含义:在工具调用太复杂、人难以理解时,可以监控 self-reflection 来确认 agent 的意图再放行。
Reflexion 本身也是可组合的构件:LATS 正是把它作为“失败轨迹触发的语言反馈”嵌进树搜索里。