Reflection
Reflexion 是 Noah Shinn 等人在 2023 年提出的框架,论文名直译过来是“用语言强化学习训练语言 Agent”,发表在 NeurIPS 2023。核心思想一句话:任务失败后不急着重试,先让模型把“为什么失败、下次怎么改”写成一段文字,存进记忆,下一轮尝试带着这段反思重新开始。
它和前两篇的 ReAct、Plan-and-Execute 不在同一个维度上。那两者管“下一步做什么”和“整件事怎么安排”,是执行轴上的选择;Reflexion 管“做完了对不对”,是横跨多次尝试的学习层。它不是替代品,是包在基础循环外面的增强层。没有反思层,系统只能重试;有了反思层,系统才开始真正学习。
语言强化学习
传统强化学习靠奖励信号更新模型权重,代价是训练数据和算力。Reflexion 换了一条路:把环境反馈(成败、测试结果、奖励分数)转换成一段文字总结,作为额外上下文喂给下一轮尝试。作者称之为 verbal reinforcement,反思文本就是“语义梯度”,给模型指出具体的改进方向。
整个过程模型权重冻结,所有学习都发生在上下文里。成本低、即时生效、可解释,代价是经验只活在上下文和记忆里,受窗口限制,难以像权重更新那样长期积累。
四组件架构
Reflexion 的试错-反思-重试循环
- Actor:实际干活的模型,根据任务和累积的反思记忆生成轨迹。内核可以用 CoT 或 ReAct,论文里两种都试过
- Evaluator:给轨迹打分。可以是二元的成败信号、预定义的启发式规则,也可以是另一个 LLM。代码任务里就是单元测试
- Self-Reflection:根据失败轨迹和反馈生成语言反思。论文里的例子:HotpotQA 上反思“我搜错了节目名,应该搜主演的名字”,下一轮就换了搜索策略
- Memory:反思文本存进情景记忆,下一轮 Actor 带着它执行。论文实践上记忆只保留最近 1 到 3 条,受上下文限制
循环直到 Evaluator 判定通过,或达到最大尝试次数。
论文结果
HumanEval 代码基准上,Reflexion 达到 91% 的 pass@1,对比的 GPT-4 基线是 80%。消融实验显示去掉反思环节或去掉测试生成,效果都会掉,说明两件事都不可缺。在顺序决策(ALFWorld)、编程(HumanEval)、语言推理(HotpotQA)三类任务上都有一致提升。
论文也记录了它的边界:在 WebShop 购物任务上跑了 4 次尝试看不到改善就终止了。需要大量多样性和创造性探索的任务,反思帮不上忙,因为模型根本不知道该反思什么。
前提:可验证的信号
Reflexion 的成败完全押在 Evaluator 上。它需要客观的成败信号:
- 代码任务:单元测试、编译、lint
- SQL 任务:schema 校验、执行结果
- RAG 任务:引用支持、答案正确性
- 网页任务:页面状态、按钮是否点击成功
没有可靠信号时可以用 LLM judge,但要有评分标准和人工校准,否则反思器很容易编一个看似合理的失败原因,把错误经验写进记忆,帮倒忙。这也是为什么生产里 Evaluator 尽量工具化,不要用模型自评。
和 Self-Refine、CRITIC 的边界
同一年还有两个常被混为一谈的方法:
| 方法 | 反馈来源 | 是否跨尝试记忆 | 典型用途 |
|---|---|---|---|
| Reflexion | 任务成败信号 + 语言反思 | 是 | 失败后总结经验,下一轮重试 |
| Self-Refine | 同一个模型自评 | 通常否 | 对单个初稿反复润色(文案、摘要) |
| CRITIC | 外部工具校验(搜索、执行代码) | 不一定 | 事实核查、高风险输出的修正 |
Self-Refine 是“生成 → 批评 → 精炼”的线性迭代,没有明确的失败信号,也不跨尝试保留经验,胜在轻量。CRITIC 的关键增量是把外部工具校验作为批判依据,压缩“自我感觉良好”的空间。三者的共同点是显式的批判环节,没有 Critic 的多次生成只是重复采样,不是反思。
生产实践
Evaluator 是系统瓶颈。 反思质量由反馈质量决定,一句“错了”只能产生空洞的反思。反馈要包含错误位置、缺失条件和失败输入。评估器的 prompt 是整套系统里最重要的 prompt,值得先拿固定测试集调它,再调别的。
轮数设上限。 通常 2 到 3 轮就收敛,超过 3 轮边际收益递减甚至改对为错。生产还要加质量回退检测:某一轮分数比历史最好掉超过 20%,回退到最好版本直接结束,防止评估器标准漂移把好结果改坏。
记忆要防污染。 不是每次失败都值得写长期记忆。一次性任务的临时错误放短期上下文;稳定的、可复用的失败模式才写长期存储。反思建议带元数据:适用范围、置信度、有效期。写错长期记忆,Agent 会在之后持续犯错。
角色分离。 生成者和评判者用不同的 prompt,甚至不同的模型。同一个 prompt 既生成又自查,存在确认偏误,发现不了自己的盲区。生成器温度可以高一点换取多样性,评估器温度压低保证评分一致。
成本账要算。 每轮反思是完整的生成加批评加改进,3 轮反思的 Token 消耗是单次调用的 6 到 10 倍。有实测报告说约 1.6 倍的 Token 换 34% 的质量提升,这个账划算,但前提是任务值得。实时对话、不可逆操作(删数据、转账)、没有客观标准的任务(写诗),都不适合反思。
面试追问
- Reflexion 和普通 retry 什么区别? retry 只是重新尝试,Reflexion 会根据失败轨迹生成反思并写入记忆,下一轮带着约束重试。反思把失败压缩成下一轮的具体约束,减少重复犯错
- Reflexion 是强化学习吗? 是,但是语言形式的:不更新权重,用反思文本作为语义梯度。论文叫 verbal reinforcement learning
- 没有评估信号能用吗? 能用但效果存疑。LLM 自评缺乏锚点,反思容易变成编故事。优先用可执行反馈,代码跑测试,SQL 查 schema
- Reflexion 和 Self-Refine 什么区别? Self-Refine 是同一模型对单次输出迭代润色,不跨尝试保留经验;Reflexion 把失败经验写进情景记忆,影响后续尝试。文本润色用 Self-Refine 更省,多轮试错任务用 Reflexion
- 反思会越改越差吗? 会,叫过度反思。解法:轮数 1 到 2 轮封顶、强模型当评判者、明确的 PASS 退出机制、分数回退检测