两种 Recovery 顺序,解决的是同一个问题
AI 编码过程中,模型可能会输出无效代码、幻觉错误或偏离上下文。Recovery workflow 就是定义当生成结果不可用时,系统如何自动恢复——是重试、回滚,还是切换到备用模型。
核心矛盾在于:恢复顺序决定了代价与成功率的平衡。Default order(默认顺序)通常遵循“先轻后重”原则:先重试当前请求,再检查上下文完整性,然后尝试简化提示,最后回滚到上一个稳定状态。而 Responses API recovery order 则是 OpenAI Responses API 推荐的恢复路径:先验证响应结构,再使用 API 内置的 fallback 机制(如 fallback 参数),最后才触发外部回滚。
你的团队到底适合哪种?
Default order 适合以下场景:
- 团队使用本地或自建 AI 编码工具(如 Continue.dev、CodeGPT 等),可以自定义 recovery 逻辑
- 编码工作流中包含多步 agent 调用(如代码生成→检查→调试),每一步都可能失败
- 你更关心灵活性和可定制性,愿意花时间调试 recovery 顺序
Responses API recovery order 适合以下场景:
- 团队已经接入或计划接入 OpenAI Responses API(兼容 Chat Completions)
- 需要减少 recovery 逻辑的维护成本,利用 API 内置功能
- 工作流相对简单:单次生成→检查→接受/拒绝,不需要复杂的回滚状态
真实场景:一个失败的 recovery 案例
小张的团队使用 Default order 构建了一个代码审查 agent。当模型生成的代码有语法错误时,默认 recovery 流程是:先重试 3 次,如果失败就回滚到上一次通过审查的代码。
有一天,模型连续 5 次生成了一个包含不存在的 API 调用,但语法正确。默认顺序的“重试”和“回滚”都没触发(因为语法检测通过),导致有 bug 的代码被合并到主分支。直到 CI 失败,团队才发现问题。
这个案例暴露了 Default order 的一个盲区:重试和回滚只针对显性错误(如语法错误、超时),对语义错误无效。 后来他们改进了 recovery 逻辑:在重试之前加入“语义一致性检查”——用另一个模型快速验证生成代码是否在业务上下文中合理。

对比维度:从 4 个角度决策
1. 恢复粒度
- Default order:可以精细控制每一步的恢复动作。例如,当代码审查失败时,可以只重新生成被标记的代码块,而不是整个函数。代价是逻辑复杂,需要维护状态机。
- Responses API:恢复粒度较粗。API 的
fallback参数允许指定一个备用模型或 prompt,但无法针对子步骤恢复。如果你的工作流是多步 agent,Responses API 可能不够灵活。
2. 与现有工具链的集成
- Default order:可以与任何 AI 编码工具配合,但需要自己实现 recovery 逻辑。许多开源框架(如 LangChain、AutoGPT)提供了 recovery hooks,但默认顺序需要你手动配置。
- Responses API:与 OpenAI 生态深度绑定。如果你的工具链已经使用 OpenAI 模型,集成成本很低。但如果你想切换模型(如 Anthropic、Google),recovery 逻辑需要重写。
3. 失败处理的可观测性
- Default order:可以记录每次 recovery 动作的日志(重试次数、回滚原因等),方便调试。
- Responses API:API 返回的结构化响应中包含
finish_reason和错误信息,但 recovery 内部过程(如 fallback 切换)不透明。如果需要审计,这会是一个痛点。
4. 性能与成本
- Default order:重试和回滚会增加延迟和 token 消耗。但你可以针对性优化,比如只在错误概率高的步骤启用 recovery。
- Responses API:内置 fallback 的延迟较低,但如果你频繁触发 fallback,成本可能更高(因为调用不同模型可能导致 token 浪费)。

最容易踩的坑:没有定义“恢复成功”的标准
无论选择哪种顺序,最容易犯的错误是 没有明确什么算“恢复成功”。
示例:你的 recovery 流程尝试了 5 次重试,每次 prompt 都稍微不同。但第 5 次的结果仍然有错,却被标记为“成功”,因为代码通过了语法检查。结果就是 silently bad code。
正确的做法是:在 recovery 流程的每个出口(包括回滚、fallback 成功、重试成功)都设置一个验证步骤,确保恢复的结果满足业务质量标准。对于代码生成来说,至少需要:语法检查、类型检查、lint 规则、与现有代码的兼容性检查。
当两种都失败时的备用方案
如果你尝试了 Default order 和 Responses API recovery order,但仍然频繁遇到 recovery 失败,那么问题可能不在 recovery 顺序上,而在最初的 prompt 设计上。
备用方案:
- 简化 prompt:减少单次生成的任务复杂度,将大需求拆成多个小步骤。
- 增加 human-in-the-loop:当 recovery 连续失败 3 次以上,自动暂停并通知开发者人工介入。
- 切换模型:如果当前模型在特定类型错误上表现不佳,考虑更换模型或使用不同模型的 ensemble。
下一步
你的选择取决于团队的技术栈、工作流复杂度和运维能力。如果追求灵活性和可控性,Default order 更合适;如果想快速接入并减少轮子,Responses API recovery order 是更稳妥的起点。
不过,无论选择哪条路,都需要持续监控 recovery 效果,并根据失败模式调整顺序。没有一劳永逸的配置。

暂无评论,快来发表你的见解吧