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 背后的核心机制之一)
- 多步检索/工具调用:工具调用失败或结果不合理时,反思后换一种调用方式
- 决策类任务:复盘上一轮决策依据,修正判断偏差
- 数据清洗/解析:第一次解析结构不对,反思后调整解析规则
三个必须注意的坑
- 成本翻倍:每轮反思都多消耗 token,务必设置最大尝试次数(通常 2-4 次),避免「反思循环烧钱」
- 反思质量决定上限:反思者本身也会「反思错」,建议让 Evaluator 提供结构化反馈(如具体报错行号),而不是笼统的「不对」
- 防止无限循环:同一错误反复触发时,要加入「如果反思内容与上次相同则终止」的兜底逻辑
总结
- 反思是 Agent 闭环的关键一环:感知 → 规划 → 行动 → 反思 → 记忆,缺了反思,Agent 只会闷头重复错误
- Reflexion 三组件:Actor 执行、Evaluator 评估、Reflector 总结经验写入记忆
- 与 CoT/ReAct 互补:反思是「跨轮次学习」,是 Agent 从「会说话」走向「会干活」的分水岭
- 落地要点:限次数、给结构化反馈、防死循环
延伸阅读:
- 《什么是 AI Agent?》:Agent 基础概念与整体架构
- 《什么是 Agent 记忆系统?》:反思经验的持久化存储
- 《什么是多智能体协作?》:反思在多 Agent 场景中的应用
- Reflexion 论文:Reflexion: Language Agents with Verbal Reinforcement Learning(Shinn et al., NeurIPS 2023)