反思——验证、批评、修订。
反思加入一个自我修正步骤:智能体生成、批评自己的输出、再修订。它能切实提升质量——但仅限于有可用正确性信号的任务。本文涵盖 self-refine 与 Reflexion 的区别、信号从何而来,以及自我批评反而使结果变差的那个有充分记载的失败。
两种风味:self-refine 与 Reflexion。
Self-Refine(Madaan 等人,2023)是单回合循环:产出草稿,提示同一模型对该草稿给出可操作反馈,再产出一份基于该反馈的修订。重复固定预算次数或直到反馈说"够好了"。无外部环境,无跨任务记忆——纯粹是任务内打磨。
Reflexion(Shinn 等人,2023)更宽:当一条轨迹未通过外部检查(单元测试、任务奖励、环境信号)后,模型写一份自然语言复盘并存入情节记忆。该反思在下一次尝试时被前置到上下文,于是智能体跨回合从自己的失败中学习。Reflexion 是言语化强化学习:策略固定,但上下文携带一条学到的教训。
关键区别在于真相来源。Self-Refine 的批评者是模型在评判自己。Reflexion 的触发是一个外部信号(一个失败的测试)。这一区分预测了二者各自何时奏效——它是关于反思你最需要内化的一点。
这个循环。
# Reflection with an external verifier (the version that reliably helps) draft = generator.produce(task) for attempt in range(MAX_REVISIONS): verdict = verify(draft) # tests / schema / tool — NOT the model if verdict.ok: return draft critique = critic.analyze(task, draft, verdict.failures) draft = generator.revise(task, draft, critique) return draft # budget exhausted: return best, flag low-confidence
verify() 函数就是全部胜负所在。如果它是真实的外部检查——编译器、测试套件、JSON-schema 校验、一个成功或报错的工具——反思会朝正确性复利累积。如果 verify() 只是另一次给草稿打分的模型调用,你就落入了 self-refine 范畴,保证大幅减弱。
反思何时见效。
- 可校验输出。代码(能否编译并通过测试?)、结构化数据(能否校验?)、工具调用参数(工具是否接受?)、受约束格式。这里批评者拥有真相,修订会收敛。
- 有清晰、可言明质量评分标准的任务。"这份摘要是否覆盖了全部五个必需小节?"足够可校验,以至连模型批评者也增值,因为标准是具体的而非凭感觉。
- 高价值、可容忍延迟的工作。一轮反思大致使延迟与 token 成本翻倍。对一份合同草稿或迁移脚本值得;对一个自动补全建议不值得。
反思何时使结果更糟。
这是多数团队跳过、然后上线一个回归的部分。无外部信号的自我批评有记载的病理:
- 无可靠自我修正信号。在开放式推理上,研究显示模型常常分不清自己的答案对不对。被要求批评一个正确答案时,模型常常"找出"一个瑕疵,把对的答案改成错的。净质量可能下降。
- 谄媚或橡皮图章式批评。批评者无论如何都说"看起来不错",徒增延迟与成本而零质量收益。当生成器与批评者共享同一模型与提示框架时常见。
- 偏离任务的批评。开放式反馈("让它更好")产出改变风格而非正确性的修订,有时让一个不错的输出退化。
- 收敛到自信的错误。迭代式自我反思会固化早期错误,模型每一轮都更流畅地为错误辩解。
经验法则:如果你无法指出批评者所查阅的那个外部信号,就不要上线反思循环。模型在一个它无法验证的任务上给自己打分,是耗费 2 倍延迟的表演。修复几乎总是"构建一个校验器",而非"改进批评者提示词"。
在生产中奏效的设计指南。
- 把批评者锚定到外部之物。跑测试、校验 schema、执行工具。把具体失败而非"审查这个"喂给批评者。
- 分离生成器与批评者。不同提示词,最好不同模型或严格的结构化标准。共享生成器盲点的批评者看不见这些盲点。
- 强约束修订次数(1–3)。收益集中在前面;超过几轮你主要看到漂移与固化。首次通过或预算耗尽即停。
- 把"无需更改"作为一等裁定。批评者必须能够批准,门槛是批准需要外部检查通过。
- 当回合重复时持久化 Reflexion 式笔记。如果同一智能体重试相似任务,存下复盘并前置。这是反思最大的跨回合收益所在。
诚实的权衡:反思在可校验任务上以大致乘性的延迟/成本买入更高质量,而在你无法校验的任务上买入一个质量回归。它是最常被部署在错误地方的模式,因为"让模型自己复查一下"听起来免费。它不免费,且在不可校验任务上为负。