02-路由Fallback与降级
核对日期:2026-05-13。
不稳定项:模型能力、模型价格、供应商限流、区域可用性、SLA、上下文长度和安全策略变化较快;路由规则上线前必须结合最新 eval、账单和压测数据复核。
1. 学习目标
本专题解决一个生产系统最常见的问题:模型调用失败、变慢、变贵或质量退化时,系统如何继续可控运行。
学完后你应该能做到:
- 设计基于任务、风险、成本、延迟和 eval 的模型路由。
- 区分 retry、fallback、熔断和降级。
- 识别哪些任务可以自动 fallback,哪些任务必须停止或转人工。
- 为 429、timeout、provider down、质量退化和成本异常设计响应策略。
- 把路由变化纳入 trace、监控和发布门禁。
2. 路由不是“便宜优先”
模型路由要回答:这个任务在当前约束下最适合哪个模型和链路。
核心维度:
| 维度 | 例子 | 风险 |
|---|---|---|
| 任务类型 | 分类、摘要、RAG、代码、Agent | 不同任务能力差异大 |
| 风险等级 | 低风险草稿 vs 合同审查 | 高风险不能随意降级 |
| 质量门槛 | eval 通过率、引用准确率 | 无 eval 的路由不可控 |
| 延迟要求 | 聊天首 token、后台批处理 | 实时和离线策略不同 |
| 成本预算 | 免费用户、企业租户 | 预算不能压倒安全 |
| 上下文长度 | 短文本、长文档、多轮历史 | 长上下文成本高 |
| 区域合规 | 数据驻留、跨境限制 | 合规优先级高 |
| 可用性 | provider 状态、限流 | 路由要感知故障 |
低风险任务可以做成本优先;高风险任务必须质量和安全优先。
3. 路由表模板
| 任务 | 风险 | 默认模型 | Fallback | 禁止 fallback | 门禁 |
|---|---|---|---|---|---|
| 文本分类 | 低 | small-fast | medium | 无 | 分类准确率 |
| FAQ 摘要 | 低 | medium | queued-small | 无 | 摘要覆盖率 |
| RAG 问答 | 中 | medium | search-only | 未评测弱模型 | 引用支持率、拒答准确率 |
| 合同审查 | 高 | strong | human_review | 弱模型自动接管 | 漏报率、安全负例 |
| Agent 工具规划 | 高 | strong | stop_escalate | 任意模型接管 | 轨迹 eval、工具安全 |
注意:fallback 不一定是另一个模型,也可以是搜索结果、排队、人工审核或停止任务。
4. Retry、Fallback、熔断和降级
| 机制 | 解决问题 | 适用条件 | 主要风险 |
|---|---|---|---|
| Retry | 瞬时失败、短暂 429 | 幂等、低副作用请求 | 重复扣费、放大故障 |
| Fallback | 默认链路不可用 | 备用链路经过评测 | 质量或格式变化 |
| Circuit Breaker | 上游持续失败 | 错误率超过阈值 | 误伤可用链路 |
| Degradation | 保留核心功能 | 非核心能力故障或预算超限 | 用户体验下降 |
判断顺序:
错误是否可重试?
-> 请求是否幂等?
-> fallback 是否经过评测?
-> 任务是否高风险?
-> 是否应降级或转人工?
5. 429 和限流处理
上游 429 不应被简单当作服务失败。
策略:
- 短请求:指数退避重试。
- 长任务:进入队列。
- 低优先级任务:延后执行。
- 高优先级任务:切换同等级备用 provider。
- 高风险任务:如果没有同等级备用,停止并提示人工处理。
用户提示要说明状态:
当前系统繁忙,任务已进入队列。你可以稍后查看结果,或缩短输入后重试。
不要把供应商内部错误、配额细节或密钥状态暴露给用户。
6. 熔断策略
熔断用于阻止系统持续请求故障上游。
指标:
- 错误率。
- timeout 比例。
- P95/P99 延迟。
- 429 比例。
- schema 失败率。
- safety block 异常。
熔断状态:
closed -> open -> half_open -> closed
设计原则:
- 按 provider、model、region、feature 分维度熔断。
- half-open 只放小流量探测。
- 熔断事件必须进告警和变更记录。
- 熔断恢复后继续观察质量和成本。
7. 降级方式
| 场景 | 降级 |
|---|---|
| RAG 生成失败 | 返回检索结果和引用,不生成总结 |
| rerank 不可用 | 使用 hybrid top k,并提示置信度降低 |
| 强模型不可用 | 高风险任务转人工,低风险任务排队 |
| Agent 工具失败 | 停止 loop,输出当前状态和下一步 |
| 成本超预算 | 缩短上下文、限制输出、排队或审批 |
| 安全告警 | 关闭写入工具,仅保留只读问答 |
好的降级不是“装作没事”,而是明确告诉用户系统现在能做什么、不能做什么。
8. 质量退化路由
模型没有报错,也可能质量退化。
来源:
- 模型版本变化。
- Prompt 变更。
- RAG 索引变化。
- provider 隐式更新。
- 上下文裁剪策略变化。
监控:
- 每日抽样 eval。
- 用户负反馈率。
- 引用通过率。
- schema 失败率。
- 人工审核拒绝率。
处理:
- 自动降低灰度比例。
- 回滚 prompt 或路由规则。
- 高风险功能切人工审核。
- 将失败样例加入回归集。
9. 工程案例
9.1 客服草稿生成
风险:中等。
策略:
- 默认使用中模型。
- 上游 timeout 时重试一次。
- 仍失败则返回知识库检索结果和草稿模板。
- 不自动切到未评测小模型。
9.2 合同风险审查
风险:高。
策略:
- 默认强模型。
- 模型失败时转人工,不自动弱模型接管。
- 输出永远是“风险提示草稿”,不能当最终法律意见。
- 灰度和回滚由评测门禁控制。
9.3 活动高峰 RAG 问答
风险:低到中。
策略:
- 热点问题走权限感知缓存。
- rerank 服务异常时使用 hybrid top k。
- 生成超时时返回搜索结果。
- 提示“当前为降级结果,建议查看引用原文”。
10. 常见反模式
| 反模式 | 表现 | 后果 | 修正 |
|---|---|---|---|
| 失败就换便宜模型 | 没有质量约束 | 高风险输出错误 | fallback 绑定 eval |
| 无限 retry | 一直重试 429 | 成本和延迟爆炸 | 最大次数和退避 |
| 降级不告知用户 | 悄悄换能力 | 误用低置信结果 | 明示降级状态 |
| 熔断维度太粗 | 全站切断 provider | 可用性下降 | 按模型/功能熔断 |
| 不记录路由原因 | 无法复盘 | 调参靠猜 | trace 记录 route_reason |
11. 练习
设计一个模型路由策略,覆盖:
- FAQ 问答。
- 代码解释。
- 合同风险审查。
- Agent 工具规划。
要求写出默认模型、fallback、禁止 fallback 场景、降级提示、回滚阈值。
12. 验收题
- 为什么 fallback 不一定是切换到另一个模型?
- 高风险任务为什么不能自动降级到弱模型?
- 429、timeout、schema failed 分别应该如何处理?
- 熔断应按哪些维度做?
- 如何发现“模型没报错但质量退化”?
- trace 中应该记录哪些路由字段?