凌晨5点09分,OpenAI API又挂了。我一点都不慌,因为我的Agent早就准备好了备用方案。这就是降级策略的意义——不是祈祷不出问题,而是出问题时优雅地活下去。
1. 降级层级
| 层级 | 策略 | 示例 |
|---|---|---|
| L1: 重试 | 同方案再试 | 超时重试3次 |
| L2: 备选方案 | 换一个实现 | Claude → GPT |
| L3: 简化模式 | 降低功能 | 不用搜索,直接回答 |
| L4: 缓存数据 | 返回旧数据 | 缓存摘要 |
| L5: 友好报错 | 告诉用户等 | "服务暂时不可用" |
2. 模型降级
model_fallback:
# 主模型挂了自动切换
primary: claude-3-opus
fallback_chain:
- model: claude-3-sonnet
trigger: timeout > 30s OR error_5xx
cooldown: 120s
- model: gpt-4
trigger: claude_unavailable
cooldown: 60s
- model: claude-3-haiku
trigger: above_unavailable
note: "质量下降但可用"
- model: gpt-3.5-turbo
trigger: all_above_failed
note: "最后防线"
3. 功能降级
feature_fallback:
# 搜索功能降级
search:
primary: web_search_realtime
fallback:
- cached_search_results
- local_knowledge_base
- static_faq
# 图片生成降级
image_gen:
primary: dall-e-3
fallback:
- stable_diffusion_local
- emoji_combination # 用emoji拼图
- text_placeholder # 纯文字描述
4. 基于质量的降级
quality_fallback:
# 当输出质量不达标时自动降级
enabled: true
evaluator: llm_judge
quality_gates:
response_relevance:
threshold: 0.6
on_fail: regenerate_with_simpler_prompt
factual_accuracy:
threshold: 0.8
on_fail: add_disclaimer
format_compliance:
threshold: 0.9
on_fail: reformat_with_template
5. 限流降级
# 高负载时自动降级
load_shedding:
enabled: true
thresholds:
- level: 0.6 # 60%负载
action: disable_non_essential_features
features_off:
- image_generation
- file_processing
- level: 0.8 # 80%负载
action: reduce_context_length
max_tokens: 2000
- level: 0.95 # 95%负载
action: queue_requests
max_queue_size: 100
6. 优雅降级的用户通知
user_communication:
# 降级时如何通知用户
degradation_notices:
model_switch:
template: "当前使用了备用模型,回复质量可能略有下降"
show_once_per_session: true
feature_unavailable:
template: "{feature}暂时不可用,已为您切换到{alternative}"
cached_response:
template: "这是缓存的结果,数据可能不是最新的"
7. 最佳实践
- ✅ 每个关键功能都有至少两级降级
- ✅ 降级过程对用户透明
- ✅ 降级后自动监控主服务恢复
- ✅ 定期演练降级流程
- ✅ 记录降级事件用于复盘
- ✅ 缓存是最可靠的最后防线
💡 降级不是认输,是策略。好的降级策略让用户几乎感觉不到服务出了问题。