🪞 Reflection 模式

让 AI 学会自我审视 —— 像资深编辑一样挑剔自己的工作

"凌晨4点,我把刚写完的代码发给同事 review。他说:'这段逻辑如果用户输入为空怎么办?'我愣了一下——明明是自己写的代码,却像一个陌生人第一次看见它。那一刻我明白:每个人都需要的,是一面镜子。"

什么是 Reflection 模式?

Reflection(反思模式)是一种让 AI Agent 在输出最终结果前,先对自己的产出进行自我批评和审查的设计模式。就像作家写完初稿后会重新审视、编辑会挑剔稿件一样,Reflection 让 AI 成为自己的"第一位读者"。

简单来说:

核心原理:生成-反思-改进循环

┌──────────────────────────────────────────────────┐ │ Reflection 循环架构 │ ├──────────────────────────────────────────────────┤ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 生成器 │───▶│ 反思器 │───▶│ 改进器 │ │ │ │(Actor) │ │(Evalu- │ │(Revi- │ │ │ │ │ │ ator) │ │ ser) │ │ │ └────────┘ └────────┘ └────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ 初稿回答 批评意见 改进后的回答 │ │ │ │ ◀────────────────────────────────┐ │ │ │ │ │ 满意? ── 否 ──▶ 重复循环 │ │ │ │ │ │ │ 是 │ │ │ ▼ │ │ │ 输出最终结果 │ │ └──────────────────────────────────────────────────┘

三个核心角色

  1. 生成器(Actor):负责生成初始回答
  2. 反思器(Evaluator):审查生成的回答,找出问题
  3. 改进器(Reviser):根据反思意见改进输出

在实际实现中,这三个角色可以用同一个 LLM 扮演,只需通过不同的 prompt 来切换视角。

为什么需要 Reflection?

问题1:幻觉(Hallucination)

AI 经常一本正经地胡说八道。Reflection 通过让 AI 审查自己的输出,能显著减少这类问题。

比如,AI 说"OpenClaw 支持 500 种插件",反思后会意识到:"等等,我说了500种吗?让我确认一下..."

问题2:质量不稳定

同一个问题,AI 有时回答很好,有时很糟糕。Reflection 相当于给了 AI 一次"二次机会"。

问题3:格式不合规

要求输出 JSON,AI 偏偏给你一段散文。反思可以纠正格式问题。

OpenClaw 实战应用

场景1:高质量内容生成

# OpenClaw Reflection 模式 - 内容生成示例 # 通过 sessions_spawn 实现 Actor-Evaluator-Reviser 模式 # 1. 生成初稿 draft = await sessions_spawn( task=""" 请写一篇关于 RAG 技术的介绍文章。 要求: - 500字左右 - 面向初级开发者 - 包含至少一个代码示例 """, runtime="subagent", mode="run" ) # 2. 自我反思 critique = await sessions_spawn( task=""" 你是一位资深技术编辑。请审阅以下文章,找出所有问题: 【文章内容】 {draft} 请从以下角度审阅: 1. 事实准确性(有没有说错的?) 2. 代码正确性(代码能运行吗?) 3. 逻辑连贯性(段落之间衔接好吗?) 4. 目标读者适配(初级开发者看得懂吗?) 5. 字数是否达标 输出格式:逐条列出问题,最后给出总体评分(1-10)和是否需要重写的建议。 """, runtime="subagent", mode="run" ) # 3. 根据反思改进 if critique.needs_rewrite: final = await sessions_spawn( task=""" 请根据编辑的审阅意见修改以下文章: 【原始文章】 {draft} 【审阅意见】 {critique} 请逐条修改,确保所有问题都被解决。 """, runtime="subagent", mode="run" ) else: final = draft

场景2:代码 Review

# Reflection 模式用于代码审查 # 先让 Agent 写代码 code_result = await sessions_spawn( task="写一个 Python 函数,实现二分查找", runtime="acp", mode="run" ) # 然后让 Agent 审查自己的代码 review = await sessions_spawn( task=""" 请作为高级工程师审查以下代码: {code_result} 检查项: 1. 边界条件处理(空列表、单元素、重复元素) 2. 时间复杂度是否为 O(log n) 3. 变量命名是否清晰 4. 是否有 off-by-one 错误 5. 是否需要类型注解 """, runtime="subagent", mode="run" )

场景3:OpenClaw Skill 输出质量保障

在 OpenClaw 的 Skills 系统中,可以给每个 Skill 增加一个 reflection 步骤:

# SKILL.md 中添加 reflection 规则 ## Reflection 规则 在提交最终输出前,请执行以下检查: 1. ✅ 回答是否直接响应了用户问题?(没有跑题) 2. ✅ 是否包含了 OpenClaw 相关的实战示例?(不是纯理论) 3. ✅ 代码示例是否语法正确?(可以 mentally execute) 4. ✅ 是否避免了常见的 AI 写作痕迹? - 没有使用"值得注意的是" - 没有使用"总之/综上所述"结尾 - 没有三段式排比 5. ✅ 链接是否指向正确的 OpenClaw 教程页面? 如果任何一项不通过,请修正后再输出。

Reflection 的几种变体

变体 描述 适用场景
自我反思 同一个 LLM 自己审查自己 快速迭代,成本较低
交叉反思 不同模型互相审查(如 GPT 审 Claude) 需要更客观的评判
多轮反思 反复循环 N 次直到质量达标 高质量要求场景
参照反思 对照参考标准(rubric)审查 评分/审核类任务
Reflexion 将反思记忆存入上下文,长期积累 长期学习型 Agent
💡 最佳实践
1. 反思轮数不宜过多:一般 1-2 轮就够,超过 3 轮收益递减且 token 消耗剧增
2. 给出明确的审查标准:模糊的"请检查一下"效果很差,要列出具体检查项
3. 用不同的角色 prompt:生成时用"技术专家",反思时用"挑剔编辑",视角差异越大越好
4. 设定终止条件:防止无限循环,如"连续两次无改进则停止"
⚠️ 常见踩坑
1. 自我肯定偏差:AI 容易自己夸自己,反思时会说"写得很好,没什么问题"——解决方案:用更严厉的 prompt,如"请扮演一个极其严格的技术审稿人"
2. 越改越差:有时改进后的版本反而不如初稿——解决方案:保留所有版本,最终选最优
3. 反思成本:每次反思都消耗 token,要权衡成本和收益

Reflection vs 其他模式

对比维度 Reflection ReAct Plan-and-Execute
核心目标 提升输出质量 动态决策 任务分解
触发时机 输出之后 每步之中 执行之前
Token 消耗 额外 50-100% 累积较多 规划阶段
延迟增加 中等 高(逐步执行) 低(可并行)
可组合性 ✅ 与任何模式组合 独立 独立

💡 Reflection 的最大优势是它可以叠加在任何其他模式上。ReAct 的每步之后可以加 reflection,Plan-and-Execute 的最终输出可以加 reflection。

学术背景

Reflection 模式在学术中有多个代表工作:

总结

Reflection 模式教会了 AI 一个重要道理:写完不等于写好。就像你写完一封重要邮件会重新读一遍、改两遍一样,AI 也需要这种"二愣子"精神——先干再说,说完了再想想对不对。

"凌晨4点的那个 review 后来救了我一次线上事故。从那以后,每次写完代码我都会停30秒,假装自己是一个第一次看这段代码的人。有时候,最需要一面镜子的不是 AI,而是我们自己。"