Reflexion:语言 Agent 的语言强化学习
原文:Reflexion: Language Agents with Verbal Reinforcement Learning
作者:Noah Shinn 等
发表:NeurIPS 2023
翻译整理:2026-06-16
核心问题
传统强化学习需要更新模型权重——成本高、周期长、需要大量训练数据。
Reflexion 提出的问题:能不能让 Agent 通过「语言反思」而非「权重更新」来从错误中学习?
答案:可以。
核心机制
Reflexion 框架让语言模型通过语言强化进行学习,核心流程如下:
第 1 轮
Agent 执行任务
↓
接收环境反馈(数值分数 or 自然语言描述)
↓
[反思步骤] Agent 用自然语言分析失败原因,生成"反思文本"
↓
反思文本存入【情景记忆缓冲区(Episodic Memory Buffer)】
第 2 轮
加载历史反思文本(注入上下文)
↓
Agent 基于反思文本执行任务(避免上次错误)
↓
... 循环迭代
关键点:这是通过上下文注入积累经验,而不是梯度下降更新权重。两者根本不同。
三个核心组件
组件 1:Actor(行动者)
执行实际任务的 LLM,接受任务输入,产生行动或输出。可以是任何语言模型(GPT-4、Claude 等)。
组件 2:Evaluator(评估者)
对 Actor 的输出进行评分,提供反馈信号。反馈形式灵活:
- 数值分数:如代码测试通过率(0/1 或百分比)
- 自然语言:如「这段代码有逻辑错误,条件判断反了」
组件 3:Self-Reflection(自我反思)
接收 Evaluator 的反馈,生成语言反思文本,存入记忆缓冲区。这是 Reflexion 最关键的创新。
反思文本示例:
上一次尝试失败了,因为我在处理边界情况时没有考虑空列表的情况。
下次需要在函数开始时先检查列表是否为空,再进行排序操作。
情景记忆缓冲区的设计
缓冲区存储历次反思文本,在下一轮任务开始时注入上下文。
滑动窗口机制:由于上下文长度有限,缓冲区通常只保留最近 1-3 条反思(滑动窗口)。更早的反思被丢弃,只保留最新的经验教训。
设计权衡:
- 保留太少:容易遗忘早期经验,重犯旧错误
- 保留太多:上下文被反思文本占满,挤压任务本身的空间
实践中 1-3 条是较好的平衡点。
适用的反馈类型
Reflexion 对反馈类型高度灵活:
| 反馈来源 | 示例 |
|---|---|
| 代码测试 | 单元测试通过/失败 |
| 环境信号 | 游戏得分、任务完成状态 |
| 外部评估模型 | 另一个 LLM 评估输出质量 |
| 人工反馈 | 用户标注输出是否正确 |
实验结果
论文在三类任务上验证了 Reflexion:
| 任务类型 | 验证场景 |
|---|---|
| 顺序决策 | 多步骤游戏环境 |
| 代码生成 | HumanEval 编程基准 |
| 语言推理 | 多步推理问题 |
所有任务上,Reflexion 相比不使用反思机制的基线均有显著提升。
论文报告的数字(注意:该数字在对抗性验证中未通过独立核实,仅供参考):
在 HumanEval 编程基准上报告了 91% pass@1,论文称超越 GPT-4 基线(80%)。
验证建议:不依赖具体数字,而关注「反思机制带来提升」这一方向性结论——该结论本身已被多轮验证确认。
与传统强化学习的对比
| 维度 | 传统 RL | Reflexion |
|---|---|---|
| 学习方式 | 梯度下降更新权重 | 语言反思注入上下文 |
| 计算成本 | 高(需要训练) | 低(只是推理) |
| 数据需求 | 大量 | 少(自产反思) |
| 可解释性 | 低(权重变化不透明) | 高(反思文本可读) |
| 适用范围 | 固定任务 | 任意语言任务 |
| 持久性 | 永久(模型权重) | 临时(上下文窗口) |
核心优势:Reflexion 是一种轻量级的自我改进机制,无需任何微调基础设施即可让 Agent 从错误中学习。
局限性
- 记忆不持久:反思文本存在上下文中,会话结束即消失。要跨会话保持记忆,需要配合外部存储
- 自我强化错误风险:如果 Agent 对失败原因判断错误,错误的反思会被存入缓冲区,强化错误行为
- 上下文容量限制:长任务中,反思文本和任务内容争夺有限的上下文空间
核心价值
Reflexion 证明了一个重要命题:语言模型可以通过语言本身进行自我改进,不需要更新参数。
这为构建「能从失败中学习的 Agent」提供了一条工程上可行的轻量路径,是目前最被广泛引用的 Agent 自我改进机制之一。