反思规划与停止条件
本节目标
你将能把“让模型多想几次”改造成带外部反馈、错误分类、预算和终态的受控循环;还能区分预先计划与滚动计划,并验证计划是否仍基于当前观察。
反思必须有反馈信号
**反思(reflection)**不是同一模型再生成一次,而是根据可定位的反馈修订产物。可靠反馈可以来自:
- 编译器或类型检查错误;
- 单元测试失败及失败用例;
- JSON Schema 校验;
- 引用不存在或证据不支持主张;
- 固定量表的人工或模型评审。
最小循环是:
生成 -> 检查 -> 分类失败 -> 定向修订 -> 再检查没有独立判据时,再次采样可能把正确部分改坏。模型评审适合文风、完整性等主观目标,但应固定量表、保留评语并用人工标注样本校准。确定性检查器适合语法、结构、存在性和执行结果。
Anthropic 所称 evaluator–optimizer 工作流同样要求一个模型生成、另一个依据明确标准提供反馈,再循环改进。这里的“另一个”不自动意味着独立事实来源;若两者共享相同缺失信息,仍可能一起出错。
计划不是愿望清单
可执行计划至少包含:
{
"step_id": "S2",
"depends_on": ["S1"],
"action": "query_inventory",
"expected_output": "inventory-result-v1",
"done_when": "status is ok and item_id matches request"
}字段阅读:
-
step_id为计划步骤提供稳定、可引用的标识。 -
depends_on明确执行前必须已完成的步骤,避免把数据依赖误做成并行。 -
action应映射到允许的工具或业务动作,而不是执行模型生成的任意字符串。 -
expected_output描述下游可验证的产物合同或版本。 -
done_when将完成条件写成可由程序或审核者检查的断言。 -
预先计划适合目标明确、依赖稳定的任务。开始时拆分,执行中只在事实变化时修订。
-
滚动计划适合工具观察逐步出现的环境。每次只承诺下一段,避免远期步骤基于猜测。
ReAct 原始论文研究把推理与动作交错,使模型可依据环境观察调整后续动作;Plan-and-Solve 研究先生成计划再执行。它们是研究范式,不表示生产系统必须暴露模型的私有思维过程。工程日志应记录简洁决策理由、选中动作、参数摘要和观察,而不是依赖不可验证的长篇“思维链”。
先写停止条件,再写循环
每个循环至少有:
| 条件 | 示例 | 终态或动作 |
|---|---|---|
| 成功断言 | 5 个测试全部通过 | success |
| 不可恢复错误 | 权限明确拒绝 | failed |
| 同类错误重复 | 相同错误签名连续两次 | human_review |
| 步数预算 | 达到 8 步 | budget_exhausted |
| 重试预算 | 瞬时失败已重试 2 次 | degraded 或 failed |
| 时间/成本预算 | 截止时间或费用上限 | 保存状态并退出 |
| 人工请求 | 缺少业务判断 | awaiting_input |
“最多两轮”不是普遍真理,但“直到满意”为无限循环留下了入口。预算应来自任务风险与收益,并在离线评测中调整。
错误分类决定下一步
不要把所有失败都交给“反思”:
invalid_input:请求澄清或拒绝,不重试。permission_denied:停止并报告,不通过换提示绕过。transient:有限重试与退避。deterministic_validation:依据具体错误定向修订。policy_rejected:正常业务终态,不重试。unknown:保留证据,转人工或安全降级。
若工具已经产生副作用但响应超时,不能直接重试。先用幂等键查询回执,判断动作是否已提交。
状态机例子:生成并验证 Python 函数
状态字段包括 spec_digest、candidate_path、test_report、revision_count、last_error_signature 和预算。流程如下:
- 根据固定规格生成候选文件。
- 在隔离环境运行语法和单元测试。
- 若全部通过,保存测试报告并完成。
- 若失败,将结构化失败信息交给修订步骤。
- 若同一错误重复或达到预算,停止并交给人,而不是继续改写。
完成判据是测试环境中的结果,不是模型声称“代码现在正确”。测试也可能不完整,因此发布前还要评审覆盖面和安全边界。
计划失效与重规划
每次工具观察后问:
- 观察是否与计划假设一致?
- 后续步骤依赖的数据版本是否改变?
- 已获审批是否仍绑定相同动作和参数?
- 预算是否足以继续?
若动作参数发生变化,旧审批应失效。若关键依赖改变,只重规划受影响步骤,并记录新旧计划版本,避免把所有历史清空后“从头猜”。
常见错误与排查
- 生成者与评审者共享盲点:补充工具证据、人工标注或不同类型的确定性检查。
- 修订请求太宽泛:传入具体失败断言和允许修改的范围。
- 计划完成等同任务完成:用环境结果或验收测试确认。
- 无限重试瞬时错误:设置次数、总时长和熔断条件。
- 旧观察留在上下文:状态保存最新事实及来源版本,明确废弃过时结果。
- 只记录最终文本:保存动作、参数摘要、观察、检查结果和终态。
练习
为“生成一个函数并通过 5 个测试”画状态机,并提交:
- 生成、测试、分类、修订、完成、失败、人工接管节点;
- 最大步骤、最大修订、总时间三个预算;
- 三种不可重试错误和一种可重试错误;
- 两个会使旧计划失效的观察;
- 一个证明“模型自评通过但环境失败”的测试样本。
掌握检查
- 能指出每次反思使用的反馈来自哪里。
- 能区分预先计划与滚动计划。
- 能为循环写成功、失败、预算和人工接管出口。
- 能区分可修订、可重试和不可恢复错误。
- 能用环境状态而不是模型声明判断完成。
下一步
进入 工具、记忆与状态边界,把循环中的动作和持久数据分清。
参考资料
- ReAct 原始论文(核对:2026-07-14)
- Reflexion 原始论文(核对:2026-07-14)
- Plan-and-Solve 原始论文(核对:2026-07-14)
- Anthropic:Building effective agents(核对:2026-07-14)