一句话定义
反思是让 Agent 在行动后显式评估"我做得对吗、错在哪、下次怎么改",并把评估结论写回上下文或记忆以改进后续行为——把"错误→重试"升级为"错误→归因→定向修正"。
为什么重要
没有反思的 Agent 只有两 种命运:错了就死(直接返回错误结果)或错了瞎试(无信息重试烧钱,kp-006 的死循环)。反思是自我纠正的"消化过程":Reflexion 论文(2023)让 Agent 在失败后生成语言化的自我反馈存入情景记忆,下一轮尝试成功率大幅提升,在 HumanEval 编程任务上超过多数当时的有监督方法。同时它是廉价的可靠性杠杆——不加反思 70 分的任务,加对反思可能到 85 分,而不需要换更贵的模型。
前置知识
kp-012(ReAct 的观察机制)、kp-004(提示工程)。
核心概念
反思的三个层级
- 行动级(内置):工具错误信息引导修正——kp-010 的"可行动错误"已经在做最朴素的反思(观察→改参数重试)
- 任务级(显式反思步骤):一次尝试结束后(无论成败)插入一个"评审"调用:
`` 这是任务与你的完整轨迹,请评估: 1) 结果是否满足验收标准?逐条对照。 2) 若失败,根因是哪一步的哪个决策? 3) 下一轮应该具体改变什么(一句话行动项)? `` 产出的结论进入下一轮(或作为最终自检报告)
- 跨会话级(Reflexion 式记忆):失败归因存入长期记忆,下次同类任务开场就带上"上次我栽在 X"(kp-015 的情景记忆)
何时触发反思
三种触发器:失败触发(验收不通过/异常)、置信触发(模型自评不确定,可靠性存疑)、例行触发(每 N 步或关键节点,高风险任务用)。反思本身是一次模型调用——有成本,不是越多越好。
评审者的三种来源
- 自评:同一个模型审自己(最常用,便宜;有自我偏好偏置)
- 独立评审(self-consistency / 多数投票):多次独立生成后投票,抓"不稳定错误"
- 外部校验:最可靠——测试通过了吗?行数对吗?编译过吗?能用程序判定的绝不劳烦模型(kp-024 的同一哲学:能写断言就别用判断题)
原理与机制
为什么"自己批评自己"有效?看似悖论(能看出错当初为何会做错),机制上并不矛盾:
- 视角差:生成时模型是"解题者"(局部、向前续写),评审时是"审阅者"(全局、拿着标准对照轨迹)——两 种条件化的任务难度不同,审阅显著更容易
- 语言的固化作用:反思文本写回上下文后,成为后续生成的条件(kp-012 同理)——"上次数组越界是因为没查 length"这句话直接改变下一轮的代码分布
- 轨迹对照验收标准:逐条对照给检查提供了锚点,防止"感觉挺好"式的橡皮图章
同样要清醒其边界:Self-Refine 论文也报告对事实性错误(模型根本不知道自己错)修正有限——反思能修"过程错误",修不了"知识空洞"(那要靠工具/检索,kp-016)。
直觉类比
学生做完卷子直接交(无反思)vs 对答案后写错题本:错题本的价值不是"知道自己错了"(分数已经告诉你了),而是那句"我把半径当直径用了"——归因文本让下次见到同类题时的正确率上升。跨会话记忆 = 把错题本带进下一场考试。
实例与案例
代码 Agent 的反思循环(示例骨架):
pythonfor attempt in range(3):
code = agent.write_code(task, feedback) # feedback 初次为空
result = sandbox.run(code) # 外部校验优先
if result.tests_passed:
return code
feedback = agent.reflect(task, code, result.stderr) # ★ 归因
# 反思输出形如:"失败根因:未处理空列表输入。
# 行动项:所有入口函数先做参数校验。"
raise TaskFailed(attempt_logs) # 交给人工,附完整轨迹
注意三点:外部校验(跑测试)先于模型自评;反思产出行动项而非情绪("下次细心点"没用);封顶重试次数,失败后带着轨迹升级人工(kp-023)。
常见误区
- 误区一:"多反思几次总能对"。反思有成本且可能改对为错(本来对的被自我怀疑改坏)——生产中常见教训:只在失败/低置信时触发,且有重试上限。
- 误区二:用模型自评替代客观校验。能跑断言的场景(代码、结构化数据)自评既贵又不准。
- 误区三:反思输出不给行动项。"分析了一堆原因"却没有"下次具体改什么",等于写日记。
- 误区四:忽视反思的放大效应。错误归因本身可能错误,把 Agent 引向更错的方向——关键任务用独立评审者交叉验证。
自测题
- 反思为什么能修正"自己犯的错"?机制上矛盾吗?
- 三种评审者来源中哪种最可靠?取舍是什么?
- 反思的两类失败模式是什么(何时无效/何时有害)?
(参考答案:1. 不矛盾——审阅是全局对照标准的条件化任务,比局部向前生成容易,且归因文本写回上下文改变后续分布;2. 外部程序校验最可靠,但只覆盖可形式化的标准;3. 知识空洞类错误修不了(无效),错误归因或过度自我怀疑(有害)。)
与其他知识点的关系
- 观察驱动的朴素修正 → kp-012;反思记忆 → kp-015
- 客观校验与评测 → kp-024;失败升级人工 → kp-023
- 编程 Agent 中的测试-反思循环 → kp-028
延伸阅读
- Shinn et al., Reflexion: Language Agents with Verbal Reinforcement Learning(2023)
- Madaan et al., Self-Refine: Iterative Refinement with Self-Feedback(2023)