Phân loại lỗi trước, vì mỗi loại có cách xử lý riêng:
- 429 rate limit: retry với exponential backoff + jitter, tôn trọng header
retry-after. Đây là lỗi tạm, không nên chuyển provider ngay. - 5xx / timeout: retry 1-2 lần, sau đó chuyển sang model dự phòng.
- 4xx do request sai (schema, context quá dài, bị từ chối bởi bộ lọc): không retry — thử lại chỉ tốn tiền, phải sửa request.
Kiến trúc thường dùng là một lớp gateway nội bộ giữ danh sách route theo thứ tự ưu tiên, kèm circuit breaker: một provider lỗi liên tục quá ngưỡng thì mở mạch, bỏ qua nó trong vài chục giây rồi thử lại bằng một tỷ lệ nhỏ traffic.
python
ROUTES = [primary, secondary, cheap_fallback]
for route in ROUTES:
if breaker.is_open(route):
continue
try:
return route.call(payload)
except (RateLimited, ServerError) as e:
breaker.record_failure(route)
raise AllProvidersDownBa điểm hay bị bỏ sót và là chỗ ghi điểm khi phỏng vấn:
- Prompt không chuyển được nguyên xi: model khác có cách hỗ trợ tool/JSON schema khác nhau. Phải đo trước bộ eval trên model dự phòng, đừng chờ sự cố mới biết nó kém.
- Suy giảm có kiểm soát: nếu mọi route hỏng, trả lời "hệ thống bận, thử lại sau" hoặc dùng câu trả lời từ cache/kịch bản, hơn là để request treo tới timeout.
- Quan sát được: gắn nhãn provider và model vào từng log và metric, cảnh báo khi tỷ lệ chạy trên fallback vượt ngưỡng — nếu không, chất lượng tụt âm thầm mà không ai biết.