Skip to content

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 审查自己的输出,发现问题并修正。它不需要外部工具,不需要长期记忆,只需要"再问一次"——只不过这一次是让模型扮演"审查者"的角色。

其工作流程可以概括为三步循环:

  1. 生成:LLM 根据任务生成初始输出
  2. 审查:LLM 以审查者身份评估自己的输出
  3. 修正:如果审查发现不足,则修正后回到第 1 步

下面用一段完整代码来演示这一过程:

python
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 等,帮助你理解不同场景下该选哪种模式。

参考资料

  1. Reflexion: Language Agents with Verbal Reinforcement Learning
  2. CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing
  3. Thinking, Fast and Slow - Daniel Kahneman