第11章:Reflection 模式:让 Agent 学会“照镜子”
Reflection(反思)不是为了让 Agent 变得完美,而是为了提高“及格线”。它把“听天由命”的单次生成,变成了“自我纠错”的闭环系统。
想象一下,你让 Agent 写一段 Python 代码。 第一次运行,它报错了。 Agent 对此一无所知,直接把这段报错的代码扔给了用户。 用户一跑,炸了。
这就是没有 Reflection 的后果。
LLM(大模型)在本质上是一个概率模型。它就像一个醉酒的作家,有时候下笔如有神,有时候胡言乱语。如果你每次都直接采纳它的第一稿,那你就是在赌博。
Reflection 模式的核心思想很简单: 在把结果交给用户之前,先让 Agent 自己看一眼(照镜子),问自己一句:“我写的对吗?”如果不对,自己改好再发出去。
本章我们来聊聊这个能让 Agent “智商暴涨”的模式。
01. 系统 1 与系统 2:快思考与慢思考
在认知心理学神作《思考,快与慢》中,丹尼尔·卡尼曼提出了两个系统:
- 系统 1(快思考) :直觉、本能、反应快但容易出错。
- 系统 2(慢思考) :逻辑、推理、反应慢但准确。
普通的 LLM 生成(Direct Generation)就是 系统 1。它根据概率快速吐字,不假思索。 Reflection 模式则是强制 LLM 进入 系统 2。它强迫模型停下来,审视自己的输出,进行逻辑校验。
比喻: 没有 Reflection 的 Agent 就像 口无遮拦的醉汉,想到什么说什么。 有 Reflection 的 Agent 就像 谨慎的发言人,打好草稿,反复推敲,确认无误后再发布。
02. Reflection 的核心三部曲
Reflection 不是玄学,它在工程上通常由三个明确的步骤组成,我们可以用 “作家与编辑” 的关系来比喻:
第一步:初稿生成(Writer)
Agent 像往常一样,根据用户的 Prompt 生成一个 初稿(Draft) 。
- 状态:可能包含错误、幻觉或逻辑漏洞。
第二步:质量评估(Editor)
这是一个专门的“评估者角色”(可以是同一个 LLM,也可以是更强的 LLM)。它不负责写,只负责挑刺。 它会拿着放大镜检查初稿:
- 代码能运行吗?(调用解释器验证)
- 格式是 JSON 吗?(正则验证)
- 有没有回答用户的核心问题?(语义评分)
如果发现问题,它会写下一段 反馈意见(Feedback) :“第 3 行代码引用了不存在的库;JSON 缺少 user_id 字段。”
第三步:带反馈重写(Reviser)
Agent 拿到初稿和编辑的反馈意见,重新生成 终稿(Final Version) 。 这一次,它有了明确的修改方向,质量通常会大幅提升。
03. 架构设计:闭环与护栏
在 Shannon 框架中,Reflection 是一个标准的 While 循环。
# 伪代码:Reflection 主循环
def generate_with_reflection(query):
# 1. 写初稿
draft = llm.generate(query)
retry_count = 0
while retry_count < MAX_RETRIES:
# 2. 评估(照镜子)
score, feedback = evaluator.assess(draft)
# 3. 达标判断
if score > PASS_THRESHOLD:
return draft # 质量过关,直接返回
# 4. 根据反馈重写
prompt = f"""
你的上一次回答有问题。
问题:{query}
你的回答:{draft}
反馈意见:{feedback}
请根据反馈修正回答。
"""
draft = llm.generate(prompt)
retry_count += 1
# 5. 兜底:如果重试多次还不行,返回最后一次的结果(或报错)
return draft
关键组件
-
Evaluator(评估器) :这是最核心的组件。
- 基于规则:比如代码必须通过单元测试,JSON 必须能 Parse。这是最硬的指标。
- 基于模型:让 LLM 自己打分(0-10 分)。提示词:“作为一个严厉的教授,请给这篇论文打分,并指出逻辑谬误。”
-
Controller(控制器) :防止死循环。
- 必须设置
MAX_RETRIES(通常是 1-3 次)。否则遇到修不好的 Bug,Agent 会把你的 Token 烧光。
- 必须设置
04. 经济学账本:质量与成本的博弈
Reflection 听起来很美,为什么不给所有 Agent 都装上? 因为 贵。
引入 Reflection 后,原本 1 次的 API 调用,变成了 1(初稿)+ N(评估)+ N(重写) 次。
- Token 消耗:可能翻倍甚至三倍。
- 延迟(Latency) :用户等待时间显著增加。
什么时候该用 Reflection?
| 场景 | 建议 | 原因 |
|---|---|---|
| 代码生成 | 必须用 | 代码错一个标点就跑不通,必须自我纠错。 |
| 复杂逻辑推理 | 推荐用 | 数学题、侦探推理,容易一步错步步错。 |
| 创意写作 | 慎用 | 创意没有标准答案,“纠错”可能会扼杀灵感。 |
| 简单闲聊 | 禁用 | “你好”不需要反思,秒回最重要。 |
升维思考: 这本质上是 质量成本(Cost of Quality) 的权衡。对于高价值输出(如生产环境代码、医疗建议),多花几倍的 Token 换取准确性是值得的;对于低价值输出(如闲聊),则是浪费。
05. 常见的坑(Pitfalls)
坑 1:盲目自信的评估器
如果你让 GPT-3.5 去评估 GPT-4 的回答,它往往看不出问题,甚至会觉得“写得真好”。 原则:评估者的能力必须 大于等于 生成者。或者使用确定性工具(编译器、数据库)作为评估标准。
坑 2:模糊的反馈
评估器给出的反馈如果是:“这写得不好,重写。” —— 这种反馈毫无价值。 原则:反馈必须 具体(Actionable) 。比如:“第 2 段逻辑与第 1 段矛盾”、“缺少具体的案例支撑”。
坑 3:死循环陷阱
有时候 Agent 会陷入怪圈:A 改成了 B,评估说 B 不对;B 改回了 A,评估说 A 不对。 原则:在 Prompt 中加入 Temperature(随机性) 的微调,或者在重试时强制切换思路。
06. Reflection vs 其他优化手段
Reflection 经常被拿来和 Self-Consistency(自洽性) 做比较。
- Reflection(反思) :串行。写完 -> 改 -> 再改。适合 修正错误。
- Self-Consistency(自洽) :并行。同时写 5 个版本 -> 投票选最好的。适合 开放性探索。
Human Review(人工审核) 则是 Reflection 的终极形态——由人来充当 Evaluator。这是最贵但最准的。!
总结
Reflection 模式是 Agent 从“鹦鹉学舌”迈向“独立思考”的关键一步。
它教会了 Agent 审视自我。 虽然它会增加成本和延迟,但在追求高可靠性的场景下,它是不可或缺的质量守门员。
记住:我们不要求 Agent 一次就对,但我们要求它在交卷前,至少自己检查一遍。
下一章预告
Agent 学会了反思,质量有了保障。但面对那些需要几十步推理的超级难题,光靠反思还不够。它需要学会把思维过程“显性化”。 下一章,我们来聊 Chain-of-Thought (CoT,思维链) :如何让 Agent 像数学家一样,把推理过程一步步写在纸上,从而解开最难的谜题。