Reflection、Reflexion 和 Evaluator-Optimizer 有什么区别?¶
- ID:Q011
- 难度:进阶
- 标签:Reflection、Reflexion、Evaluator-Optimizer、Episodic Memory、Verification
同义问法¶
- Agent 的反思机制怎么做?
- Reflection 和 Reflexion 有什么区别?
- 让另一个 Agent 评审是否一定能提升效果?
- 自我修正循环应该如何设置停止条件?
来源¶
原始题目线索¶
- 用户提供的二手题库:
1.7 什么是 Reflexion,它和普通 reflection 有什么区别? - 用户提供的二手题库:
1.16 讲一讲 Agent 的反思机制
技术依据¶
- Shinn et al., Reflexion: Language Agents with Verbal Reinforcement Learning。 查看原文
- Anthropic, Building Effective Agents 中的 Evaluator-Optimizer pattern。 查看原文
可视化图解¶
flowchart LR
A[初始输出或轨迹] --> E[Evaluator 评估]
E --> D{是否达标}
D -->|是| F[接受结果]
D -->|否| R[Reflection 归因与建议]
R --> O[Optimizer 重新生成或修正]
O --> E
R --> M[Reflexion 写入可复用经验]
核心结论¶
这三个概念处在不同层次:
- Reflection:泛称。模型对当前输出或轨迹进行复盘并提出改进意见。
- Reflexion:一套具体研究框架。把任务反馈转成语言反思,并写入情节记忆,在后续尝试中复用,不更新模型权重。
- Evaluator-Optimizer:一种系统架构模式。生成器负责产出,评估器按明确 Rubric 评分和反馈,优化器迭代修改。
它们可以组合,但不能互相等同。
1. Reflection:一次任务内的自我复盘¶
最简单形式:
对应流程使用 Mermaid 图解展示。
Reflection 可能由:
- 同一个模型在下一轮完成;
- 不同 Prompt 的同一模型完成;
- 独立 Reviewer 模型完成;
- 规则、测试或人类反馈触发。
它的目标是利用第二次注意和显式检查,发现首次生成中的遗漏、矛盾或格式错误。
但“让模型再想一遍”不等于可靠验证。同一个模型可能在两轮中重复同一种错误,甚至为错误答案编造更完整的解释。
2. Reflexion:把反思写入情节记忆¶
Reflexion 的关键不只是“重做”,而是:
几个重要特点:
- 不更新模型权重:它不是传统强化学习训练;
- 使用语言反馈:把奖励、错误或外部反馈转成文本经验;
- 跨尝试复用:反思进入情节记忆,后续试验可读取;
- 依赖反馈质量:错误的反馈会形成错误经验并污染后续决策。
因此,Reflexion 更接近一种运行时学习和记忆机制,而不是普通的单轮自我检查。
3. Evaluator-Optimizer:围绕验收标准的迭代架构¶
典型结构:
它适用于:
- 质量标准可以明确表达;
- 首次输出经常不够好;
- 反馈能指导下一轮具体修改;
- 改进收益高于额外模型成本。
例如:
- 代码是否通过测试和静态检查;
- 文档是否覆盖必填章节;
- SQL 是否只读、语法正确且返回预期字段;
- 回答中的每个事实是否有证据支持。
三者对比¶
| 维度 | Reflection | Reflexion | Evaluator-Optimizer |
|---|---|---|---|
| 性质 | 泛化机制 | 具体研究框架 | 系统架构模式 |
| 作用范围 | 当前任务或当前轮 | 多次尝试之间 | 当前产物的生成-评估循环 |
| 是否需要持久记忆 | 不一定 | 是,情节记忆是核心 | 不一定 |
| 是否需要独立评估器 | 不一定 | 反馈可来自多种来源 | 通常显式区分生成与评估角色 |
| 是否更新模型权重 | 否 | 否 | 否 |
| 最重要前提 | 能发现可修正问题 | 有可信反馈且经验可复用 | 有清晰 Rubric 或外部 Oracle |
反思机制为什么有时无效¶
1. 错误相关性¶
同一个模型既生成又评估,知识盲区和偏差高度相关。它可能检查不出自己不知道的事实。
改进:
- 引入外部工具、测试、数据库和规则;
- 使用不同模型或不同信息源做交叉检查;
- 对关键事实要求引用证据。
2. Rubric 太模糊¶
“请检查是否正确、完整、清晰”往往只会得到泛泛意见。
更好的评估输入应该包含:
- 必须满足的约束;
- 失败分类;
- 可操作的修改建议格式;
- PASS 的严格条件。
3. 评估器偏好漂亮答案¶
LLM Judge 容易受长度、措辞、自信度和输出顺序影响。表达更完整不代表事实更正确。
改进:先验证事实和任务结果,再评价风格。
4. 无限优化¶
每轮都能找到“还能更好”的地方,系统无法停止。
必须设置:
- 最大迭代次数;
- 时间和 Token 预算;
- 最小改进阈值;
- 连续无改进检测;
- 外部测试通过即停止;
- 高风险或不确定时转人工。
5. 反思污染¶
Reflexion 把错误归因写进长期记忆后,后续任务可能被错误经验误导。
写入前需要:
- 区分事实、假设和策略;
- 记录适用条件;
- 对经验设置置信度和版本;
- 只有外部验证通过的经验才能提升权重;
- 支持废弃和覆盖旧经验。
生产实现建议¶
不要把整个轨迹再次塞给 Reviewer。可以维护结构化状态:
{
"goal": "修复启动失败",
"attempt": 2,
"facts": ["缺少 dubbo.properties"],
"hypotheses": ["打包遗漏资源文件"],
"actions": ["检查 classes 目录", "检查构建产物"],
"verification": {
"startup_passed": false,
"tests_passed": null
},
"failure": "修复后出现新的 Bean 初始化错误"
}
Evaluator 应输出结构化结果:
{
"verdict": "REVISE",
"failed_criteria": ["根因未被最终验证"],
"evidence": ["修复配置文件后启动仍失败"],
"next_action": "分析新的最早异常链",
"confidence": 0.82
}
什么时候值得使用¶
适合:
- Coding Agent:测试和编译可作为外部反馈;
- 文档生成:有明确结构和内容要求;
- 数据分析:结果可通过计算或约束验证;
- 长任务:失败经验能在后续尝试中复用。
不适合:
- 极简单、低价值任务;
- 没有评估标准的主观问题;
- 每轮反馈都来自同一个模型且没有新增证据;
- 延迟和成本要求极严的在线路径。
可直接口述的回答¶
Reflection 是一个泛称,指模型对当前输出或执行轨迹进行复盘并修改。Reflexion 是具体框架,它把外部反馈转成语言形式的经验,写入情节记忆,在后续尝试中复用,但不更新模型参数。Evaluator-Optimizer 则是架构模式,由生成器产生产物,评估器按照明确 Rubric 给出反馈,再由优化器修改。
真正决定效果的不是多调用一次 LLM,而是有没有可信的反馈信号。代码测试、规则校验和真实工具结果比模型自评更可靠。生产实现还要限制迭代次数、检测无进展,并防止错误反思写入长期记忆。没有外部验证时,两个 Agent 互相评论可能只是把同一个错误说得更完整。
结合个人项目回答¶
在 CI/CD 故障分析中:
我会把反思放在“证据不足或验证失败”之后,而不是每一步都反思。第一次分析给出根因假设后,Evaluator 检查是否有日志、代码 Diff 或环境事实支撑。如果修复后启动仍失败,就把这次结果记录为“原问题已处理,但存在后续异常”,而不是简单判断前一轮完全错误。只有被真实启动结果或测试验证的经验,才适合沉淀进案例库或 Skill,避免把模型自己的错误归因变成长期记忆污染。
继续追问¶
- 为什么同模型自评容易失败?
- Reflexion 的情节记忆与普通长期记忆有什么区别?
- 如何设计一个可靠的 Evaluator Rubric?
- 什么时候应该停止优化并转人工?
- 如何判断失败经验是否值得写入 Skill?