30 秒快速回答

Agent 反思(Reflexion / Self-Reflection)是让 AI 在执行任务后「回头看」自己的结果、总结经验教训,再带着这些经验重新尝试的能力。 它不是换个提示词让模型多想一步,而是一套「执行 → 评估 → 反思 → 重试」的闭环:模型先干活,然后自己检查哪里错了、为什么错,把反思结果写进记忆,下一次尝试时直接用这些经验修正行为。

核心价值一句话:没有反思的 Agent 会重复犯错,会反思的 Agent 能在同一轮任务里不断逼近正确答案。


一、为什么 Agent 必须会反思?——「一次性作答」的致命缺陷

传统大模型的使用方式是「问一句、答一句」,模型生成的第一个答案就是最终答案。这在简单问答里没问题,但一旦进入 Agent 场景——写代码、查资料、多步操作——问题立刻暴露:

场景 一次作答的结果 反思后的结果
写一段有 bug 的代码 报错后直接放弃或再猜一次 读取报错信息,分析根因,针对性修复
从网页提取数据 抓错字段,输出垃圾数据 对比预期,识别解析规则错误,重新提取
多步任务中途失败 卡死在错误分支 记录失败点,绕开或修正该分支

关键洞察:LLM 的第一次回答并不总是最好的回答。 推理模型(如 o1/R1)靠「内部慢思考」提升单次回答质量,而 Agent 反思靠「外部试错闭环」提升任务成功率——两者互补,不冲突。


二、Reflexion 工作原理:Actor-Evaluator-Reflector 三组件

Reflexion 是 2023 年由 Shinn 等人提出的经典框架,把 Agent 拆成三个角色,各司其职:

┌─────────┐   动作    ┌─────────┐   结果    ┌─────────┐
│  Actor  │─────────▶│Evaluator│─────────▶│Reflector│
│(执行者)│◀─────────│ (评估者)│◀─────────│(反思者)│
└─────────┘  重试    └─────────┘  评分/反馈  └─────────┘
     │                                             │
     │            写进短期/长期记忆                   │
     └─────────────── 经验教训 ──────────────────────┘
  • Actor(执行者):负责执行任务,把当前问题 + 历史反思结果作为输入,输出新的尝试
  • Evaluator(评估者):判断 Actor 的结果对不对——可以是规则、测试用例、编译器,也可以是另一个 LLM
  • Reflector(反思者):根据评估反馈,生成一段「经验总结」存入记忆,指导下一轮尝试

循环直到 Evaluator 判定通过或达到最大尝试次数。Reflexion 的名字就来源于此:Agent 像人一样,通过语言反思(verbal reinforcement)来学习,而不是重新训练模型。


三、Reflexion vs ReAct vs Chain-of-Thought:别再搞混

技术 核心思想 是否有记忆 适用场景
Chain-of-Thought 一步步想清楚再作答 数学题、逻辑推理
ReAct 边思考边调用工具 无(单轮) 需要工具调用的单次任务
Self-Refine 输出后用反馈优化一次 写作、翻译等润色任务
Reflexion 失败后反思并带经验重试 有(跨轮次) 编码、决策、复杂多步任务

一句话区分:CoT 是「多想」,ReAct 是「多动」,Self-Refine 是「改一次」,Reflexion 是「错了就学、学会再战」。 Reflexion 的关键差异在于把反思结果持久化,让每一次失败都变成下一次尝试的「前车之鉴」。


四、代码示例:20 行搭一个能自我纠错的编码 Agent

下面用 Python 实现一个最小 Reflexion 循环:让 Agent 写一个函数,Evaluator 用测试用例检查,错了就反思再重试。

from openai import OpenAI
client = OpenAI()

def run_reflexion(task, max_attempts=3):
    reflections = []          # 反思记忆
    for attempt in range(1, max_attempts + 1):
        # Actor:带上历史反思经验执行任务
        prompt = f"任务:{task}\n" + "".join(
            f"{i}次反思:{r}\n" for i, r in enumerate(reflections, 1))
        code = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content":
                f"{prompt}\n请直接输出 Python 函数代码。"}],
        ).choices[0].message.content

        # Evaluator:用测试用例执行验证
        passed, output = evaluate(code)
        if passed:
            print(f"{attempt}次尝试成功!"); return code

        # Reflector:让 LLM 分析失败原因,写入记忆
        reflection = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content":
                f"我写的代码是:{code}\n执行报错/结果:{output}\n"
                f"请分析失败原因并给出修复要点。"}],
        ).choices[0].message.content
        reflections.append(reflection)   # 经验进入下一轮
    return None   # 超过最大次数仍未通过

print(run_reflexion("写一个反转字符串的函数"))

核心就三行逻辑:失败信息不丢掉,而是让模型提炼成「反思经验」存进列表,下一次尝试开始时把经验塞回 prompt。 实际项目中,反思记忆可以升级为向量数据库或外部文件,跨会话复用。


五、应用场景与注意事项

常见落地场景

  • AI 编程:代码报错 → 读取 traceback → 反思修复(Claude Code、Cursor Agent 背后的核心机制之一)
  • 多步检索/工具调用:工具调用失败或结果不合理时,反思后换一种调用方式
  • 决策类任务:复盘上一轮决策依据,修正判断偏差
  • 数据清洗/解析:第一次解析结构不对,反思后调整解析规则

三个必须注意的坑

  1. 成本翻倍:每轮反思都多消耗 token,务必设置最大尝试次数(通常 2-4 次),避免「反思循环烧钱」
  2. 反思质量决定上限:反思者本身也会「反思错」,建议让 Evaluator 提供结构化反馈(如具体报错行号),而不是笼统的「不对」
  3. 防止无限循环:同一错误反复触发时,要加入「如果反思内容与上次相同则终止」的兜底逻辑

总结

  1. 反思是 Agent 闭环的关键一环:感知 → 规划 → 行动 → 反思 → 记忆,缺了反思,Agent 只会闷头重复错误
  2. Reflexion 三组件:Actor 执行、Evaluator 评估、Reflector 总结经验写入记忆
  3. 与 CoT/ReAct 互补:反思是「跨轮次学习」,是 Agent 从「会说话」走向「会干活」的分水岭
  4. 落地要点:限次数、给结构化反馈、防死循环

延伸阅读