Reflection反思机制
2172 字约 7 分钟
domain/aiai/agents
2026-07-24
反思(Reflection)机制让 Agent 能够评估和改进自己的输出——不仅生成答案,还能审视答案是否合理、发现错误并自我修正。这是 Agent 从"一次性生成"到"迭代改进"的关键能力跃迁。
一句话解释
Agent 做完一件事后"回头看"——检查自己做得对不对、哪里可以改进、下次怎么做得更好。这就是反思。
核心问题
为什么需要反思机制?
- LLM 的首次输出往往不是最优的:代码可能有 bug,文章可能逻辑不通,方案可能有遗漏
- 错误自检比外部检测更高效:让 Agent 自己发现问题,比依赖外部评估更快
- 经验积累:从失败中学习,避免重复犯错
- 质量提升:多轮反思和修正可以显著提升输出质量
三种反思模式对比
1. Self-Critique(自我批评)
原理:LLM 生成初始输出后,用另一个 Prompt(或同一个 LLM)对输出进行批评和评估,发现不足之处。
流程:
初始输出 → 自我批评 Prompt → 发现问题列表 → 修正输出典型实现:
Prompt 1: "请回答以下问题:{question}"
→ 初始回答
Prompt 2: "请审视以下回答,检查是否有以下问题:
- 事实错误
- 逻辑漏洞
- 遗漏重要信息
- 表述不清
回答:{initial_answer}"
→ 问题列表
Prompt 3: "根据以下反馈修正回答:
原始回答:{initial_answer}
问题:{feedback}"
→ 修正后的回答适用场景:写作质量提升、代码审查、方案评估 优势:实现简单,一次反思即可 劣势:批评质量依赖 LLM 能力,可能"自己看不出自己的错"
2. Reflexion(从失败中学习)
原理:来自 Shinn et al.(2023)的论文 "Reflexion: Language Agents with Verbal Reinforcement Learning"。Agent 在任务失败后,用自然语言总结失败原因,存入记忆,在后续尝试中使用这些经验。
核心机制:
Trial 1: 执行任务 → 失败 → 反思:"我失败是因为..." → 存入记忆
Trial 2: 读取记忆中的反思 → 执行任务 → 可能失败 → 再次反思 → 更新记忆
Trial 3: 读取所有历史反思 → 执行任务 → 更可能成功与 Self-Critique 的关键区别:
- Self-Critique 是单轮的(一次输出 → 一次批评 → 一次修正)
- Reflexion 是跨轮的(多次尝试 → 每次从失败中学习 → 经验积累)
论文核心数据:Reflexion 在 HumanEval 代码生成基准上,将 pass@1 从 80%(GPT-4 基线)提升至 91%,提升幅度 11 个百分点,仅通过语言反馈(无需梯度更新)。数据来源:Shinn et al., 2023, "Reflexion: Language Agents with Verbal Reinforcement Learning" (NeurIPS 2023)。
3. 迭代改进(Iterative Refinement)
原理:多轮生成-评估-修正的循环,直到输出质量达标或达到最大迭代次数。
流程:
Round 1: 生成 → 评估(质量分数 6/10)→ 修正
Round 2: 修正 → 评估(质量分数 8/10)→ 修正
Round 3: 修正 → 评估(质量分数 9/10)→ 达标,输出与 Self-Critique 的区别:迭代改进是多轮的 Self-Critique,每轮都在上一轮的基础上改进。
终止条件:
- 质量分数 >= 阈值
- 连续两轮分数不再提升(边际收益递减)
- 达到最大迭代次数
三种模式对比
| 维度 | Self-Critique | Reflexion | 迭代改进 |
|---|---|---|---|
| 轮次 | 单轮 | 跨轮(多次尝试) | 多轮(同一任务内) |
| 学习 | 不积累 | 跨任务积累 | 不跨任务 |
| 反馈来源 | 自我批评 | 环境/评估器 | 自我评估 |
| 适用场景 | 一次性输出改进 | 需要多次尝试的任务 | 质量要求高的输出 |
| 实现复杂度 | 低 | 中 | 低 |
| 代表论文 | — | Shinn et al., 2023 | Self-Refine (Madaan et al., 2023) |
反思触发条件设计
反思不需要在每步都触发,合理的触发条件设计能平衡质量和效率:
| 触发策略 | 描述 | 适用场景 | 成本 |
|---|---|---|---|
| 每次执行后 | 每个 Action 后都做反思 | 高风险任务(医疗、金融) | 高 |
| 质量低于阈值 | 用评估器检测输出质量,低于阈值时触发 | 通用场景 | 中 |
| 关键节点 | 仅在子任务完成、阶段转换时反思 | 长任务、多步骤任务 | 低 |
| 失败后 | 仅在任务失败时触发反思(Reflexion 模式) | 可重试的任务 | 低 |
| 定期反思 | 每 N 步做一次反思 | 长对话、持续运行的 Agent | 中 |
推荐实践:
- 短任务:每次输出后做 Self-Critique
- 长任务:关键节点 + 失败后触发
- 可重试任务:Reflexion 模式
反思质量评估
如何判断反思是否有效?这是一个元问题——"反思的反思"。
评估维度:
| 维度 | 评估方法 | 好的反思 | 差的反思 |
|---|---|---|---|
| 具体性 | 检查反思内容是否指向具体问题 | "第 3 行的变量名拼写错误" | "代码可能有问题" |
| 可操作性 | 反思是否能指导具体修正 | "应该使用 try-except 处理异常" | "需要改进错误处理" |
| 正确性 | 反思指出的问题是否真实存在 | 确实发现了 bug | 误报(指出不存在的问题) |
| 完整性 | 是否覆盖了所有重要问题 | 发现了主要和次要问题 | 只发现了表面问题 |
提高反思质量的方法:
- 使用更强的模型做反思:反思用的 LLM 应该 >= 生成用的 LLM
- 提供评估标准:在反思 Prompt 中明确评估维度和标准
- 分离角色:生成和反思使用不同的 Prompt/角色,避免"自己给自己打高分"
- 外部验证:对代码做单元测试,对事实做检索验证,提供客观反馈
反思的边际收益递减
反思不是越多越好。存在一个最优反思次数,超过后收益递减甚至起反作用:
输出质量
↑
│ ╭──────● ← 最优反思点
│ ╱ ╲
│ ╱ ╲ ← 边际收益递减
│ ╱ ╲
│╱ ╲ ← 过度反思可能导致"越改越差"
└────────────────→ 反思次数
0 1 2 3 4 5经验法则:
- 代码生成:1-2 轮反思足够
- 写作任务:2-3 轮
- 复杂推理:3-5 轮
- 超过 5 轮:通常收益极小
ReAct + Reflection = 自我修正 Agent
将 Reflection 嵌入 ReAct 循环,形成自我修正的 Agent:
Thought 1: 分析任务,制定计划
Action 1: 执行第一步
Observation 1: 结果
Thought 2: 分析结果
Action 2: 执行第二步
Observation 2: 结果
[反思点]: 评估到目前为止的进展
├─ 进展顺利 → 继续执行
└─ 发现问题 → 调整计划,回退或修正
Thought 3: 基于反思调整后的计划
Action 3: 执行修正后的步骤
...Reflexion 论文的核心贡献:在 ReAct 基础上加入显式自我反思循环——失败后用自然语言总结错因并存储反馈,用于改进后续尝试。这催生了 Error Correction Rate (ECR)、Recovery Rate (RR) 等评估指标。
反思与 Agent评估的关系
反思机制的效果需要系统性地评估:
| 评估指标 | 定义 | 说明 |
|---|---|---|
| 改进率 | 反思后输出质量的提升幅度 | 反思是否有效 |
| 收敛速度 | 达到目标质量所需的反思轮次 | 反思是否高效 |
| 误报率 | 反思指出的"问题"中,实际不是问题的比例 | 反思是否准确 |
| 回退率 | 反思修正后反而变差的比例 | 反思是否有害 |
| ECR | 错误修正率(Reflexion 论文指标) | Agent 从失败中恢复的能力 |
常见误区
- 反思用和生成一样的 Prompt:应该分离角色,避免"自己给自己打高分"
- 反思次数越多越好:边际收益递减,过度反思可能越改越差
- 忽视反思质量:差的反思(泛泛而谈)不仅无用,还可能误导修正方向
- 所有任务都加反思:简单任务不需要反思,增加延迟和成本
- 反思不用外部反馈:纯自我反思有盲区,代码应该跑测试,事实应该做检索
可继续补充的方向
- Reflexion 的完整实现与评估
- 多 Agent 场景下的交叉反思(Agent A 反思 Agent B 的输出)
- 反思的自动化触发策略优化
- 反思与 RLHF 的结合