跳转至

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 的关键不只是“重做”,而是:

几个重要特点:

  1. 不更新模型权重:它不是传统强化学习训练;
  2. 使用语言反馈:把奖励、错误或外部反馈转成文本经验;
  3. 跨尝试复用:反思进入情节记忆,后续试验可读取;
  4. 依赖反馈质量:错误的反馈会形成错误经验并污染后续决策。

因此,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,避免把模型自己的错误归因变成长期记忆污染。

继续追问

  1. 为什么同模型自评容易失败?
  2. Reflexion 的情节记忆与普通长期记忆有什么区别?
  3. 如何设计一个可靠的 Evaluator Rubric?
  4. 什么时候应该停止优化并转人工?
  5. 如何判断失败经验是否值得写入 Skill?