5.5 反思闭环 Reflection:从错误中学习
在上一节中,我们深入探讨了 Agent 的执行机制——如何将规划拆解为具体动作、如何调用工具完成任务。然而,仅有执行能力是不够的。一个只管"做完"而不管"做好"的 Agent,往往会在同一个问题上反复犯错。本节将引入 Agent 架构中至关重要的一个环节:反思闭环(Reflection Loop)。它让 Agent 具备从错误中学习的能力,从"能执行"迈向"能改进"。
5.5.1 为什么需要反思:从"快思考"到"慢思考"
认知心理学家丹尼尔·卡尼曼在《思考,快与慢》一书中,将人类思维分为两个系统:
- System 1(快思考):直觉、自动、快速,但容易出错。比如"2+2=4"几乎是本能反应。
- System 2(慢思考):分析、反思、缓慢,但更准确。比如"17×24=?"需要你停下来仔细计算。
普通的 LLM 调用更接近 System 1——模型接收到输入后,直接生成回答,不做自我审查。这种方式速度快,但在复杂任务中容易出错:事实错误、逻辑漏洞、遗漏关键信息都可能出现。
反思(Reflection) 机制的核心目标,就是让 Agent 具备 System 2 的思维能力:在输出之前或之后,主动审查、评估、修正自己的回答。
无反思的 Agent 流程:
用户输入 -> LLM生成 -> 直接输出
(可能包含错误、不完整或不准确的回答)
有反思的 Agent 流程:
用户输入 -> LLM生成 -> 自我审查 -> 发现问题 -> 修正 -> 输出
(经过多轮检查和改进,质量更高)类比理解:反思闭环就像围棋棋手的"复盘总结"。一局棋下完后,棋手不会立刻开始下一局,而是回到关键节点,分析"这步为什么走错了""对手的意图是什么""下次遇到类似局面该怎么应对"。正是这种复盘习惯,让棋手不断进步。Agent 的反思机制,本质上就是让 AI 具备"复盘"的能力——做完一件事后,回头看看哪里做得不好,总结经验,下次做得更好。
5.5.2 Self-Reflection 基础:最简单的反思模式
Self-Reflection 是最基础的反思模式:让 LLM 审查自己的输出,发现问题并修正。它不需要外部工具,不需要长期记忆,只需要"再问一次"——只不过这一次是让模型扮演"审查者"的角色。
其工作流程可以概括为三步循环:
- 生成:LLM 根据任务生成初始输出
- 审查:LLM 以审查者身份评估自己的输出
- 修正:如果审查发现不足,则修正后回到第 1 步
下面用一段完整代码来演示这一过程:
from langchain_openai import ChatOpenAI # 导入 OpenAI 聊天模型客户端
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage # 导入消息类型
llm = ChatOpenAI(model="gpt-4o", temperature=0) # 创建模型实例,temperature=0 保证输出稳定
def self_reflection(task: str, max_iterations: int = 3) -> dict:
"""
基础 Self-Reflection 流程:
生成 -> 反思 -> 修正 -> 再反思 -> ...
参数:
task: 用户任务描述
max_iterations: 最大反思轮次,防止无限循环
返回:
包含最终输出、迭代次数、状态的字典
"""
# 初始化消息列表:系统提示 + 用户任务
messages = [
SystemMessage(content="你是一个严谨的AI助手。请认真完成任务。"),
HumanMessage(content=task)
]
history = [] # 记录每轮输出,用于追踪改进过程
for i in range(max_iterations):
# ---------- 第1步:生成/修正 ----------
response = llm.invoke(messages) # 调用 LLM 生成回答
current_output = response.content # 提取回答文本
print(f"\n{'='*50}")
print(f"第 {i+1} 轮输出:")
# 截断显示,避免过长输出刷屏
print(current_output[:200] + "..." if len(current_output) > 200 else current_output)
# ---------- 第2步:反思当前输出 ----------
reflection_prompt = f"""请严格审查以下回答,找出其中的问题:
需要审查的内容:
{current_output}
请检查:
1. 事实是否准确?
2. 逻辑是否完整?
3. 是否有遗漏的关键信息?
4. 表达是否清晰?
如果回答已经足够好,请回复"PASS"。
如果发现需要改进的地方,请直接给出修正后的完整回答。"""
reflection = llm.invoke([HumanMessage(content=reflection_prompt)])
# 注意:这里用一条新的 HumanMessage 让模型切换到"审查者"角色
# ---------- 第3步:判断是否通过 ----------
if "PASS" in reflection.content:
print(f"\n✅ 第 {i+1} 轮通过审查")
return {
"output": current_output,
"iterations": i + 1,
"status": "passed"
}
# 未通过:将修正后的输出加入消息,进入下一轮
print(f"\n🔍 第 {i+1} 轮反思发现需要改进")
messages.append(AIMessage(content=f"之前的回答需要改进。修正后:\n{reflection.content}"))
history.append(current_output)
# 达到最大迭代次数仍未通过
return {
"output": current_output,
"iterations": max_iterations,
"status": "max_iterations_reached"
}
# 测试:让 Agent 写一个带注释和错误处理的斐波那契函数
result = self_reflection(
"请写一个Python函数来计算斐波那契数列的第n项,要求有详细注释和错误处理"
)
print(f"\n最终结果({result['iterations']}轮迭代):")
print(result["output"])这段代码的精妙之处在于:它用同一个 LLM,通过切换提示词的方式让模型在"生成者"和"审查者"两个角色之间转换。这和人类的工作方式很像——你写完一篇文章后,会换一个心态重新读一遍,看看有没有问题。
Reflexion 模式:从经验中学习
Self-Reflection 只在单次任务内做反思。Reflexion 模式更进一步:它让 Agent 跨任务积累经验——每次失败后,把"哪里做错了"总结成一条经验,存入记忆,下次遇到类似任务时先查看这些经验。
💡 类比:Self-Reflection 像是"做完一道题检查一遍",Reflexion 像是"维护一个错题本"——每次考试后把做错的题记下来,下次考试前先复习错题本。
Reflexion 工作流程:
第1轮:任务 → 执行 → 失败 → 反思"为什么失败" → 存入经验
第2轮:任务 → 先查经验 → 执行(避免上次错误)→ 可能成功或再反思
第3轮:任务 → 先查经验 → 执行 → 成功这种模式特别适合需要多轮尝试的任务,如代码调试、数学推理等。
CRITIC 模式:外部工具辅助反思
CRITIC(Critique and Revise)模式引入了外部工具来验证 Agent 的输出。Self-Reflection 和 Reflexion 都是"自我审查"——让同一个模型审查自己的输出。但自我审查有盲区:模型可能不知道自己不知道什么。
CRITIC 的解决方案是:用外部工具(搜索引擎、代码解释器、事实核查API等)来验证输出的事实性。
类比:CRITIC 就像写论文时的"同行评审"——你不能只自己看,还需要让其他专家用工具检查你的结论是否成立。
常见误区
⚠️ 误区一:"反思越多越好" 每轮反思都消耗 LLM 调用(即时间和金钱)。大多数任务 2-3 轮反思就够了。如果 5 轮还没收敛,说明问题不在反思,而在规划或工具。
⚠️ 误区二:"反思能解决所有问题" 反思适合修复"小错误"(格式问题、遗漏信息),无法修复"根本性错误"(如模型缺乏领域知识)。后者需要 RAG 或微调。
⚠️ 误区三:"反思就是让模型再生成一次" 反思不是简单的"重试"。它需要有明确的审查标准和修正逻辑,否则只是低质量输出的无限循环。
本节小结
| 要点 | 说明 |
|---|---|
| 反思的本质 | 让 Agent 从 System 1(快思考)进化到 System 2(慢思考) |
| Self-Reflection | 最基础的反思:模型自我审查并修正 |
| Reflexion | 跨任务积累经验,维护"错题本" |
| CRITIC | 引入外部工具验证,避免自我审查盲区 |
| 实践建议 | 2-3 轮反思为宜;根本性问题需要 RAG/微调而非更多反思 |
启后
到目前为止,我们讲完了 Agent 的四大组件:规划、记忆、执行、反思。下一节将把这些组件组合起来,总结 Agent 的经典设计模式——ReAct、Plan-Execute-Reflect、Autonomous Agent 等,帮助你理解不同场景下该选哪种模式。