
摘要Reflexion 是一种不更新模型权重的语言智能体反思框架执行任务、获得评价、写出可用于行动的反思再把反思放进下一次尝试的上下文。本文依据 NeurIPS 2023 论文梳理其三个角色与两种记忆、反思应留下可检查的行动变化、代码任务需要可靠的测试器并解读 91% HumanEval 数字背后的提交协议与反例最后给出环境任务、问答与附录中不能略过的失败。智能体把锅拿起来了吗它刚刚执行了一条取物命令环境返回“Nothing happens”。下一步它却开始清洗这口锅然后把它放到台面。整条计划听起来合理前提却没有成立。这类失败需要的不只是再试一次。下一次尝试之前智能体应该记住不能把“已经发出取物命令”当成“手里已经有锅”需要查看环境返回。Reflexion 用一种轻量方法保存这类经验执行任务获得评价写出可用于行动的反思把反思放进下一次尝试的上下文。模型权重不更新改变的是它读到的经验。本文依据 NeurIPS 2023 会议论文Reflexion: Language Agents with Verbal Reinforcement Learning核对了主体实验及附录中的反例。下面会特别区分跨尝试的记忆、环境提供的反馈与无反馈的自我纠错。[1]“语言强化学习”到底强化了什么传统强化学习常根据奖励更新策略参数。Reflexion 的“verbal reinforcement”把反馈转换为文字用这段文字影响后续决策。它没有计算一段自然语言的梯度再反向传播到 LLM。如果用 π 表示模型可以把行为理解成 π(a | 当前观察、当前历史、过去反思)。同一个模型读到不同反思可能采取不同动作。论文用“语义梯度”描述这种改进方向是一种解释性比喻。这一点决定了它的成本结构不需要为每个任务进行训练却需要额外生成评价、反思和后续尝试。模型服务的成本、运行时间和上下文空间仍然要计算。它也没有保证一段反思能变成跨任务的永久能力。如果移除经验上下文行为可能回到原来的模式。把经验保存进外部文件或数据库属于记忆系统的实现选择不能与模型参数学会这件事混为一谈。图 1一次失败怎样影响下一次尝试。评价给出信号反思将信号与轨迹关联记忆把结果传到下一轮。回路表示再次执行任务常需要重置环境不是在失败动作发生后自动撤销其影响。依据原论文第 3 节重绘。三个角色与两种记忆Reflexion 将过程分成 Actor、Evaluator、Self-Reflection 三个角色。角色可以使用 LLM也可以结合规则和环境评分这不要求训练三个独立模型。组件输入输出容易混淆的边界Actor执行者任务、观察、当前历史、已有经验答案或环境动作它仍可能误读环境反馈Evaluator评价者轨迹或生成结果完成信号、测试结果、评分判定失败不等于已经找到原因Self-Reflection反思者轨迹、评分、过去经验可供下一轮使用的文字反馈对原因的推断可能有误当前尝试中的详细动作和观察是短期记忆跨尝试保留的经验摘要是论文中的长期记忆。这里“长期”主要相对于一条轨迹而言并不表示论文建立了一套无限增长的个人记忆库。原实现限制记忆窗口决策与问答实验通常保留最近 3 条反思代码实验保留 1 条。这让下一轮仍能读到最近经验同时控制上下文长度。[1, §3–4]一个合理循环是先执行若通过判定则结束否则反思、记录、重置或重新提交再试一次预算耗尽就返回真实的未完成状态。不能让“再写一段反思”变成没有出口的循环。好的反思需要留下能检查的行动变化“我应该更认真”很难改变下一条工具调用。对开头的取锅例子更有用的经验是取物返回没有动作效果不能假设已经持有物品先检查当前观察和物品位置再决定是否重试取物。它把失败关联到了一个可检查的前提。但反思者无法只凭终局失败就证明这一定是唯一原因。错误还可能来自动作语法、位置不对或工具返回被截断。可靠的经验应区分观察到的事实与待检验的解释。图 2本文对反思内容的工程整理。直接证据、待验推断和动作建议承担不同职责。原框架没有为自然语言反思提供完备的因果正确性证明因此记忆中的一句结论仍应能回到日志核查。图为原创解释。这个区分也解释了为什么单纯回放上一条完整轨迹不一定足够。长日志里下一次生成需要自己重新发现问题一段简短经验可以提前突出关键失败。论文在 HotpotQA 的一项对照中比较了只加入近期轨迹的 episodic memory 与进一步生成反思观察到后者有额外收益。[1, §4.2]不过压缩不是无损的。如果摘要把“这次页面没有显示库存”改成“该商品永远没有库存”下一轮就会继承一个过度结论。工程上保留原始记录的引用和经验的适用范围会比无限增加反思条数更有帮助。代码任务里反思需要一个不会轻易撒谎的测试器程序提供了相对明确的反馈语法是否有效、编译是否通过、测试是否满足预期。Reflexion 让模型根据任务生成内部测试再运行代码根据测试结果反思和修改。原文先用 AST 检查生成测试的语法最多选择 6 条测试构成测试集。AST 能排除一部分语法错误却不能证明测试的期望答案正确也不能保证覆盖到了关键边界。[1, §4.3]图 3代码任务中的失败反馈路径。自建测试驱动内部纠错独立评分评估最终提交。图聚焦测试失败后怎样重试内部测试通过时可以提前提交但通过自测仍不等于通过独立测试。依据原文第 4.3 节整理。一个很小的括号判断函数就能展示这个问题。假设输入只包含左右括号错误程序写成defcounts_only(text):returntext.count(()text.count())如果内部测试只有()和(())它都会通过。可)(的左右括号数也一样顺序却不合法。这个程序把数量相等误认为正确嵌套。一段有用的反思应指向规则缺失“任意前缀中右括号不能比左括号更多最终余额还要等于零。”修正程序需要逐字符检查这个条件而不是不断换一种方式计算总数。本文实际运行了这个确定性例子错误函数通过 2/2 条薄弱测试在另外四条检查上只通过 2/4按前缀余额检查的修正函数通过 4/4。修正代码由本文编写没有调用 LLM这不是 Reflexion 的模型效果复现。素材包中的data/test_feedback_demo.py可重新生成结果。这个例子说明的是验证器的信息质量。如果错误程序通过内部测试系统会提前退出根本没有机会写出纠正反思。反思能力与反馈质量必须一起讨论。91% HumanEval要怎样读这个数字原文代码实验报告了以下结果任务与语言GPT-4 基线Reflexion原文的关键范围HumanEval Python80.1%91.0%最终提交的 pass1内部有测试与纠错循环HumanEval Rust60.0%68.0%由 MultiPL-E 转换的较难 50 题子集MBPP Python80.1%77.1%出现性能下降必须保留这一反例MBPP Rust70.9%75.4%Rust 转换任务的对应设置Leetcode Hard Python7.5%15.0%论文构建的 40 题困难集合数据会议版表 1。这里是 2023 年研究结果不是对当前模型的排行榜。不同语言和题集不能混为同一难度。其中 pass1 需要看提交协议。Reflexion 最后只提交一份程序用未用于内部纠错的基准测试评分因此论文采用这一名称。**它不表示整套系统只有一次模型生成或一次模型调用。**与直接生成比较时内部测试生成、反思、重写和执行预算都要计入。MBPP Python 的下降很有解释力。论文正文报告在内部测试已经通过的提交中实际程序错误的比例MBPP Python 为 16.3%HumanEval Python 为 1.4%。这是条件概率 P(程序实际错误 | 内部测试通过)不能改成“所有错误程序中有多少骗过测试”。[1, 表2及其分析]测试通过得不可靠模型就会在错误答案上停下来。反过来错误测试也可能把正确程序判坏引发无谓修改。论文认为前一种提前提交错误答案的情况尤其有害。在 HumanEval Rust 的 50 题子集上消融还显示了两部分的配合基线 60%只反思、不做内部测试为 52%只有测试而没有反思为 60%完整方案为 68%。这些结果支持该设置中测试和解释的互补作用不证明任意代码任务都需要同样的反思模板。[1, 表3]环境任务与问答反馈条件也不同在 ALFWorld 中任务需要寻找、移动或处理物品。原文使用 134 个环境最多进行 12 次尝试启发式评价把同一动作与同一返回重复超过 3 次或动作数量超过 30 等情况标记为失败原文也比较了用 LLM 判断的评价方案。失败后总结经验重置环境再试。启发式方案累计解决 130/134 个任务约 97.0%。这是多次尝试后的累计解决比例不是一次执行的成功率。模型记住“上次在哪里找过”“哪一步前提没有成立”帮助下一轮改变计划。[1, §4.1]HotpotQA 则要区分两种输入条件一种直接给正确支持上下文主要检验阅读与推理另一种需要 ReAct 通过检索取得材料。给了正确上下文的结果不能当成包含检索能力的完整问答表现。各次尝试之间问答实验使用与参考答案匹配的结果提供成功或失败信号。虽然模型没有拿到完整标准答案但它仍获得了外部真假反馈。**“没告诉答案是什么”与“没有外部反馈”是不同条件。**这也是理解 Reflexion 与 SCoRe 时最需要保留的区别。原文附录里还有两个不能略过的失败WebShop 的 100 个购物任务中作者运行四次尝试后未观察到明显改进也没有得到足够有效的反思于是停止该实验。原文把它与多样探索和精确搜索困难联系起来。[1, 附录B]这个结果提醒我们一段经验可以阻止重复错误却未必能帮模型找到一个从未探索过的有效商品或搜索策略。记忆压缩与探索覆盖是两个不同问题。附录还报告使用 starchat-beta 的 HumanEval Python 实验中基线和 Reflexion 的平均准确率都是 26%。更弱的模型未在这个设置中受益不能据此推成所有小模型都无法反思但足以否定“只要加反思模块就必然提升”。[1, 附录A]此外经验窗口有容量限制模型可能停在不好的局部方案真实程序若涉及非确定性、外部 API、并发或硬件差异准确构造输入输出测试也会更难。论文把更复杂的数据库记忆作为未来方向而非已经验证的组成部分。对一个实际智能体最容易先检查的不是反思文笔而是三件事失败信号是否可靠经验是否对应真实观察下一轮动作是否因此改变。若第三件事没有发生系统可能只是在失败之后多写了一段话。参考资料Shinn, N., Cassano, F., Gopinath, A., Narasimhan, K., Yao, S.Reflexion: Language Agents with Verbal Reinforcement Learning.NeurIPS 2023。会议版 PDF。核对框架、三个主体实验、编程消融、限制及附录 A–D 的相关设置与反例。