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”(语义梯度)——它不像 标量那样只说“错了”,而是给出一个具体的改进方向

框架由三个模型协作(论文的形式化记号):

  1. Actor(M_a):生成文本与动作的策略,本身就是一个 LLM——论文里用 CoTReAct 充当,并额外挂一块记忆 mem 作为上下文。
  2. Evaluator(M_e):给整条轨迹打一个奖励分。论文用了三类:推理任务用精确匹配(EM)、决策任务用手写启发式、 以及用另一个 LLM 当评判;编码任务则用模型自己生成的单元测试
  3. 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 提供了一种廉价的自我改进机制:不训练,只要一块可读写的经验记忆加一个评估器,策略更新就发生在上下文里。可迁 移的原则,也分工程与观念两层:

  1. 真正起作用的是“诊断”而非“重试”。论文的消融直接证明:没有评估+反思的盲目重试循环无效。启发:给 agent 加自愈能力时, 别只写一个“失败就重跑”的循环,要在中间插入一步把失败归因成一条具体教训,再把教训带进下一次。
  2. 先保证验证器可靠,再谈反思。反思质量的天花板是 Evaluator 的信噪比。启发:优先接确定性验证器(测试、编译、类型检 查)当 Evaluator;只有 LLM 评判时要警惕它为正确答案编造失败理由。这把 记忆 (C)验证 (V) 两层耦合了起来——记忆里该写的不是“召回率高的片段”,而是“能降低下次失败率的 教训”。
  3. 记忆里存的是教训,不是流水账,且有容量上限——按“是否减少了下游动作错误”来筛选与淘汰,而非按召回率。
  4. 可读的反思带来可观测与可监管。相比黑箱 RL 的策略,verbal reinforcement 的每一步“更新”都是人能读的自然语言——论文 点出一个安全含义:在工具调用太复杂、人难以理解时,可以监控 self-reflection 来确认 agent 的意图再放行。

Reflexion 本身也是可组合的构件:LATS 正是把它作为“失败轨迹触发的语言反馈”嵌进树搜索里。

这页有帮助吗?