# LLM 故障切换设计指南：恢复请求，同时避免不安全重试

> 可靠的故障切换策略是一套封闭阶梯，由已批准线路、可重试错误和截止时间组成。它记录每次尝试，并在可靠性功能变成重复工具执行、失控费用或静默模型替换前停止。应用层与网关层必须一起设计，因为任何一层都无法自动知道另一层的副作用。

_发布 2026-08-15 · 更新 2026-08-15 · [KeepRouter Editorial](https://keeprouter.com/editorial-policy#editorial-team) · 10 分钟阅读_

![展示安全重试、回退、取消与副作用边界的 LLM 请求状态机](https://keeprouter.com/editorial/blog/llm-failover-design-guide.png)

_故障切换策略必须保留操作身份，并在产生不安全重复副作用前停止。_

**先给结论：**故障切换只能恢复应用已经判断为可安全重复的失败。先建立已批准线路集合，再定义可重试错误、单次超时、总截止时间、流式规则、幂等性与费用证据。不要让通用重试策略悄悄切换模型或执行两次工具。

## 分开四种恢复动作

| 恢复动作 | 线路变化 | 适用情况 | 主要危险 |
|---|---|---|---|
| 重试同一线路 | 不变 | 临时网络或部分服务器错误可能恢复 | 重复 token 与更长截止时间 |
| 尝试另一供应商线路 | 供应商或 deployment 变化 | 等价线路通过相同验收套件 | 区域、版本、数据策略或缓存不同 |
| 回退到另一模型 | 公开模型或家族变化 | 产品明确批准不同模型行为 | 质量、工具、安全与价格变化 |
| 停止并返回错误 | 不再尝试 | 永久错误、时间耗尽或副作用不确定 | 完成率下降，但保护正确性 |

最后一种也是可靠策略的一部分。总要返回内容的系统，可能不如在破坏状态前停止的系统可靠。

## 用真实响应建立错误分类

收集准确端点与供应商的错误。认证失败、未知模型 ID、不支持字段和错误输入通常需要修复配置或代码，重复请求不会改变这些事实。

限流、连接重置、部分 5xx 和超时可能可以重试，但仍要检查供应商指南、`Retry-After` 与剩余产品截止时间。代码 Agent、自动补全和语音交互能接受的等待时间不同。

保留原始错误类型和之后的每次尝试。只返回最终 200 会让不稳定线路看起来健康，也隐藏恢复成本。

## 为完整阶梯分配时间

设置一个逻辑操作截止时间，再分配给各次尝试。如果客户端只允许 12 秒，两次独立的 10 秒上游超时就放不下。还要保留流式输出和返回有效错误的时间。

只有等待可能改善条件时才使用指数退避。永久 Schema 错误后的退避只会耗尽时间。多个 worker 可能在同一故障后一起重试时，应增加 jitter。

[网关延迟指南](/zh/blog/ai-gateway-latency-guide)说明如何分开报告首次尝试与获救请求。

## 流式需要状态机

第一个输出事件之前，另一次尝试可能对用户不可见；部分输出之后，重新播放会重复文本或产生冲突答案。应跟踪客户端是否已经收到响应头、内容、工具调用、用量和终止事件。

为部分流选择明确策略：停止并返回带标记的不完整响应；只在协议和供应商支持时恢复；或作为新的用户可见尝试重新开始。不要把不同模型输出拼接成一个响应。

## 在应用边界保护副作用

网关看到的是模型请求，通常不知道生成的工具调用是否已经发送邮件、扣款或修改数据库。应用必须分配稳定 operation ID、持久保存工具状态，并拒绝重复执行。

每个回退模型都必须通过相同工具 Schema 与授权测试。较弱模型即使使用同一兼容 API，如果参数格式不同，也不能视为等价线路。

## 核对所有尝试的成本

| 成本来源 | 为什么可能重复 |
|---|---|
| 输入 token | 每个供应商都会再次收到提示词 |
| 输出 token | 失败流可能已经生成内容 |
| 缓存输入 | 缓存 Key 与可用性会随线路变化 |
| 网关请求费 | 部分产品按请求或套餐用量收费 |
| 工具操作 | 外部系统可能执行付费或不可逆工作 |

把所有尝试归入同一个逻辑操作，同时保留逐次模型、用量、状态与费用。产品团队需要总数，平台团队需要线路明细。[成本控制文章](/zh/blog/control-multi-model-api-costs)解释这种归属模型。

## 生产前运行失败矩阵

1. 拒绝无效认证，并确认没有重试。
2. 发送不支持参数，并确认策略停止。
3. 模拟带与不带 `Retry-After` 的限流。
4. 让首字节超过单次超时。
5. 在部分内容前后分别中断流。
6. 在提出工具调用后和返回工具结果后分别失败。
7. 耗尽总截止时间并检查客户端错误。
8. 比较每次尝试的请求记录与计费证据。
9. 禁用主线路并证明回滚控制。

先阅读[什么是 LLM API 故障切换](/zh/answers/what-is-llm-api-failover)，再把最终策略写在路由配置旁边。策略是生产契约，不应只是隐藏的网关默认值。

## 常见问题

### 所有 5xx 都应该重试吗？

不是。应结合供应商指南、端点行为、剩余时间与副作用状态，部分服务器错误会持续存在。

### 故障切换可以更换模型吗？

只有产品明确允许，并且回退模型通过相同任务、工具、安全和成本检查时才可以。

### 多少次尝试是安全的？

没有通用次数，应由用户截止时间、可重试条件、副作用风险与总成本上限共同限制。

### 故障切换应记录什么？

记录一个逻辑 operation ID，以及每次尝试的线路、模型、错误、时间、用量、费用与最终状态。

## 参考的一手资料

_本文最近复核 2026-08-15_

1. [Cloudflare AI Gateway request handling](https://developers.cloudflare.com/ai-gateway/configuration/request-handling/)
2. [Cloudflare AI Gateway dynamic routing](https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/)
3. [Vercel AI Gateway provider options](https://vercel.com/docs/ai-gateway/models-and-providers/provider-options)
4. [OpenRouter provider routing](https://openrouter.ai/docs/guides/routing/provider-selection)

## 继续阅读

- [什么是 LLM API 故障切换？](https://keeprouter.com/zh/answers/what-is-llm-api-failover.md)
- [什么是 LLM 路由？](https://keeprouter.com/zh/answers/what-is-llm-routing.md)
- [AI Gateway 延迟指南：分别测量网关、供应商与获救请求](https://keeprouter.com/zh/blog/ai-gateway-latency-guide.md)
- [如何用证据、限额与责任归属控制多模型 API 成本](https://keeprouter.com/zh/blog/control-multi-model-api-costs.md)
- [模型路由](https://keeprouter.com/zh/features/model-routing.md)
- [Agent 构建者](https://keeprouter.com/zh/built-for/agent-builders.md)

[全部文章](https://keeprouter.com/zh/blog.md) · [模型与价格](https://keeprouter.com/models.md)
