主题
高频面试题
什么是 Reflexion?它和 ReAct 有什么区别?如何提升 Agent 的自我纠错能力?
这道题把两个范式放在一起考:ReAct 解决一次任务里怎么边做边改,Reflexion 解决失败之后怎么把教训变成下一次的能力。
面试官角度分析,想考什么
Reflexion 是什么?核心机制是什么?
考 Actor / Evaluator / Reflector / Memory,而不是“让模型再想想”。它和 ReAct 差在哪?
考层次:ReAct 是单次任务内的步级循环,Reflexion 是跨尝试的轨迹级学习。自我纠错靠什么真正成立?
考闭环质量:反馈要可信,反思要绑定失败,记忆要治理,重试后还要验证。
可直接抄走的 30 秒参考答案
text
Reflexion 是一种失败后复盘再重试的机制:Agent 先执行任务,Evaluator 判断哪里失败,Reflector 把失败轨迹总结成一条可执行的教训,写进记忆,下一次带着这条教训再试。它和 ReAct 的区别在时间尺度:ReAct 是一次任务里边做边改,Reflexion 是一次尝试失败后,把整条轨迹复盘成经验。生产里经常是内层 ReAct 执行,外层 Reflexion 负责重试和沉淀。它能不能真纠错,不取决于模型会不会“反思”,而取决于反馈是否可信、反思是否具体、记忆是否治理、重试后是否验证。面试回答详解,知其所以然
这道题的核心是分清两个纠错层次:任务内的一步步纠错,和失败后跨尝试的经验学习。先把这个层次讲清楚,再讲工程闭环,答案就立住了。
1. Reflexion 是什么
Reflexion 出自 2023 年论文 Language Agents with Verbal Reinforcement Learning,核心思想是:Agent 任务失败后,把失败轨迹转成一段语言反思(verbal reflection),写入 episodic memory,下一次尝试时作为上下文注入,从而避免重复犯错。论文称之为"语言强化学习"——不动模型参数,用自然语言经验代替梯度更新。
典型架构四个角色:
text
Actor(执行)-> 产出轨迹
Evaluator(评估)-> 测试、规则、工具反馈或人工判断成败
Reflector(反思)-> 从失败轨迹生成"失败原因 + 下一轮约束"
Memory(记忆)-> 存反思,下次注入 Actor一个具体例子:
text
attempt 1: 生成 SQL "SELECT SUM(total) FROM orders",执行报错 column "total" does not exist
reflection: orders 表没有 total 字段,金额字段是 amount_cents;
下次收入查询必须用 amount_cents 并除以 100
attempt 2: 带着反思重试,生成正确 SQL,通过对比一下普通 retry:直接重新采样,第二把大概率还是用 total。差别就在于失败信息被压缩成约束传了下去。
2. 和 ReAct 的本质区别
两者不是竞争关系,而是作用在不同时间尺度上:
- 时间尺度:ReAct 在单次任务(episode)内循环,每一步 Thought -> Action -> Observation;Reflexion 在多个 episode 之间循环,每次重试是一个新 episode。
- 纠错对象:ReAct 纠的是"这一步动作"——搜索没结果就换 query,工具报错就换工具;Reflexion 纠的是"整条轨迹"——为什么这次尝试整体失败,根因是什么。
- 记忆载体:ReAct 的观察留在当轮上下文里,任务结束就没了;Reflexion 把教训写入跨尝试的 episodic memory,能影响之后的执行。
- 学习方式:ReAct 是实时应变,不沉淀;Reflexion 是经验沉淀,接近"不改参数的自我学习"。
| 维度 | ReAct | Reflexion |
|---|---|---|
| 循环范围 | 单次任务内,步级 | 多次尝试间,轨迹级 |
| 反馈来源 | 每步的环境观察 | episode 级的评估信号 |
| 是否写记忆 | 否,随任务结束丢弃 | 是,反思写入 memory |
| 典型问题 | 死循环、短视 | 记忆污染、反思失真 |
生产里两者是组合使用的:内层 ReAct 负责执行和步内应变,外层 Reflexion 负责失败后重试和经验回写。代码 Agent 的常见形态就是"ReAct 执行 + 测试评估 + 失败反思 + 带教训重试"。
3. 自我纠错能力从哪里来:四个环节
环节一:可信的 Evaluator。 反思质量的上限由反馈质量决定。优先级:可执行反馈(单元测试、类型检查、schema 校验、页面状态)> 工具反馈(编译器、lint、规则引擎)> 人工反馈 > LLM judge。LLM judge 必须带 rubric 并定期人工校准,否则 Reflector 会顺着错误评分编出一个"看起来合理的根因"。
环节二:绑定具体失败的反思。 反思必须包含三件事:失败样本、根因、下一轮可执行约束。空泛的"下次仔细点"没有信息量。好反思像 bug 单:什么场景、错在哪、下次怎么改。
环节三:可治理的记忆。 反思不要全量塞 prompt。结构化保存并带元信息:
json
{
"task_type": "sql_generation",
"failure": "unknown_column_total",
"lesson": "orders 表金额字段是 amount_cents,不是 total",
"applies_when": ["query_orders", "revenue_sql"],
"confidence": 0.92,
"ttl": "30d"
}按任务类型和错误码检索 top-k 注入;重复反思定期合并;低置信反思只放短期上下文;写入长期记忆要有门槛(evaluator 通过或人工确认)。
环节四:重试后必须再验证。 反思只是假设,修完要跑闭环:fail -> reflect -> retry -> evaluate。不验证的反思是自我安慰。同时反思永远低于系统安全策略——Agent 不能通过"记住跳过确认更快"来给自己提权。
4. Reflexion 的边界和失败模式
- 无外部反馈时收益有限:研究表明纯自我反思(模型评自己)在推理任务上的纠错收益不稳定,甚至可能把对的改错。反馈信号是硬前提。
- 根因错误会复利:反思写错根因,错误经验进入记忆,之后每次尝试都被带偏,比不反思更糟。
- 记忆膨胀:每次失败都写反思,上下文成本上升、注意力被分散,需要检索和压缩。
- 循环自证:模型用自己生成的反思验证自己的输出,容易强化初始偏差,需要外部信号打断。
适用判断也很简单:有重试空间、有可信反馈、失败能归因的任务适合;一次性任务、反馈噪声大、错误不可观察的任务,收益就低。
面试官追问3个问题
追问一:没有单元测试这类外部反馈,Reflexion 还能用吗?
- 考察点:是否知道反馈信号是 Reflexion 的硬前提,以及替代方案的质量分层。
- 回答方向:可以用 LLM judge + rubric 兜底,但必须人工抽检校准;更好的做法是构造弱监督,比如用 schema 校验、lint、示例对齐、多模型交叉评审。纯无反馈的自我反思在推理任务上收益不稳定,可能把对的改错,这时宁愿直接重采样也不要写错误根因进记忆。
追问二:反思记忆怎么防止污染和膨胀?
- 考察点:记忆治理的工程能力。
- 回答方向:写入侧分级——临时错误只放短期上下文,稳定失败模式才写长期,敏感信息和未确认推断拒绝写入;存储侧结构化,带 confidence、applies_when、ttl;读取侧按任务特征检索 top-k 而不是全量注入;维护侧定期合并去重、淘汰低置信和过期条目;权限侧反思永远低于系统安全策略。
追问三:ReAct 内部也有观察反馈,为什么还需要 Reflexion?
- 考察点:是否真正理解两个层次的分工。
- 回答方向:ReAct 的观察只影响当轮下一步,任务结束就消失,同一个任务第二次做还会从零犯错。Reflexion 把失败信息压缩成跨尝试约束,让重试和未来同类任务受益。一个是实时控制,一个是经验学习,解决的问题不同。
扩展知识
自我纠错家族的三个成员
- Self-Refine:同一个模型内自评自改,反馈是模型自己给的,适合文本润色、格式优化,成本最低但自评偏差大。
- CRITIC:批判环节接入外部工具(搜索、代码执行、约束检查),用工具反馈纠正输出,可信度高于纯自评。
- Reflexion:把失败教训写进跨尝试记忆,是三者里唯一带经验沉淀的,适合多轮重试任务。
一句话区分:Self-Refine 自问自答,CRITIC 借工具问,Reflexion 还把答案记下来。
Reflexion 和 RL 微调的关系
- 学习载体:Reflexion 写 episodic memory(上下文级),RL 写模型参数(权重级)。
- 见效速度与成本:Reflexion 即时生效、零训练成本,但记忆有容量和检索开销;RL 一次训练长期受益,但需要大量轨迹、奖励设计和算力。
- 适用判断:没有训练预算、任务分布变化快、反馈可获取时用 Reflexion;任务大规模稳定、有充足轨迹和奖励信号时才考虑 RL。
和 Voyager、技能库的延伸
Reflexion 记的是"失败教训",Voyager 这类系统记的是"成功经验"(可复用技能代码)。两者合起来就是完整的经验学习:失败写反思,成功写技能,对应本仓库 Agent Skills 的思路——把稳定经验做成可加载能力包。