降级与容错
🎯 学习目标
- 区分 transient 与 permanent 错误并采取不同策略
- 实现 JSON 解析失败、工具超时的回退路径
- 避免 silent failure 与无限重试
引言
生产环境一定会失败:限流、超时、解析错误。用户宁可看到「服务繁忙」,也不要 silent wrong answer。
章节正文
第 1 步:失败分类与策略表
| 失败 | 策略 |
|---|---|
| 网络 5xx / 429 | 指数退避重试(最多 3 次) |
| JSON 解析失败 | 带错误信息重问模型 1 次 → fallback 文本 |
| 工具超时 | 跳过该工具,告知用户部分功能不可用 |
| 主模型不可用 | 备用模型(如 4o → 4o-mini) |
| RAG 无命中 | 拒答或仅通用知识(需产品策略) |
第 2 步:代码模式
python
import tenacity
from langchain_openai import ChatOpenAI
@tenacity.retry(stop=tenacity.stop_after_attempt(3), wait=tenacity.wait_exponential())
def call_llm(messages):
return primary_llm.invoke(messages)
def chat_with_fallback(messages):
try:
return call_llm(messages)
except Exception:
return fallback_llm.invoke(messages)前端配合:HTTP 503 + { error: "service_busy", retry_after: 30 },UI 展示重试按钮。
动手练习
- 模拟 429 响应,验证指数退避
- 解析失败时实现一次「请只输出合法 JSON」重试
本节小结
重试仅限 transient;解析/工具失败有 fallback;主备模型切换;禁止 silent failure。