모델 폴백 시스템¶
라우터는 기본 모델을 사용할 수 없을 때 자동으로 대체 모델로 요청을 라우팅하는 설정 가능한 모델 폴백 시스템을 구현합니다.
아키텍처 개요¶
┌─────────────────────────────────────────────────────────────────┐
│ 계층화된 폴백 아키텍처 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 서킷 브레이커 (인프라 계층) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ • 백엔드 헬스 모니터링 │ │
│ │ • 실패 횟수/비율 추적 │ │
│ │ • 임계값 초과 시 회로 개방 │ │
│ │ • FallbackStrategy enum 제공 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ 트리거 시점 │
│ 회로 개방 또는 │
│ 요청 실패 │
│ ▼ │
│ 폴백 서비스 (정책 계층) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ • 모델 폴백 체인 정의 │ │
│ │ • gpt-4o → gpt-4-turbo → gpt-3.5-turbo │ │
│ │ • 크로스 프로바이더 폴백 지원 │ │
│ │ • 프로바이더 간 파라미터 변환 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
핵심 컴포넌트¶
위치: src/core/fallback/
// 폴백 체인 관리
pub struct FallbackChain {
primary_model: String,
fallback_models: Vec<String>,
is_cross_provider: bool,
}
// 폴백 정책 설정
pub struct FallbackPolicy {
trigger_conditions: TriggerConditions,
max_attempts: u32,
timeout_multiplier: f64,
preserve_parameters: bool,
}
// 트리거 이유
pub enum TriggerReason {
ErrorCode(u16),
Timeout,
ConnectionError,
CircuitBreakerOpen,
ModelNotFound,
}
// 폴백 서비스 오케스트레이터
pub struct FallbackService {
chains: Arc<RwLock<HashMap<String, FallbackChain>>>,
policy: FallbackPolicy,
translator: ParameterTranslator,
metrics: FallbackMetrics,
}
파라미터 변환¶
ParameterTranslator는 크로스 프로바이더 파라미터 매핑을 처리합니다:
pub struct ParameterTranslator {
mappings: HashMap<(Provider, Provider), ProviderMapping>,
}
pub enum Provider {
OpenAI,
Anthropic,
Google,
Mistral,
Meta,
Unknown,
}
impl ParameterTranslator {
pub fn translate(
&self,
request: &ChatRequest,
from: Provider,
to: Provider,
) -> Result<ChatRequest, FallbackError> {
// 파라미터 매핑 적용
// 프로바이더별 파라미터 제거
// 대상 프로바이더에 필요한 파라미터 추가
}
}
폴백 흐름¶
sequenceDiagram
participant Client
participant Router
participant FallbackService
participant CircuitBreaker
participant Backend1
participant Backend2
Client->>Router: 요청 (model: gpt-4o)
Router->>CircuitBreaker: 회로 상태 확인
CircuitBreaker-->>Router: Open (backend1 사용 불가)
Router->>FallbackService: 폴백 체인 가져오기
FallbackService-->>Router: [gpt-4-turbo, gpt-3.5-turbo]
Router->>FallbackService: 파라미터 변환
FallbackService-->>Router: 변환된 요청
Router->>Backend2: gpt-4-turbo로 전달
Backend2-->>Router: 응답
Router->>Router: X-Fallback-* 헤더 추가
Router-->>Client: 폴백 정보가 포함된 응답 설정¶
fallback:
enabled: true
max_attempts: 3
preserve_parameters: true
chains:
# OpenAI 모델 폴백 체인
- primary: gpt-4o
fallbacks:
- gpt-4-turbo
- gpt-3.5-turbo
# 크로스 프로바이더 폴백
- primary: claude-3-opus
fallbacks:
- gpt-4o
- gemini-pro
cross_provider: true
# 트리거 조건
triggers:
- error_codes: [500, 502, 503, 504]
- timeout: true
- circuit_breaker_open: true
메트릭¶
폴백 시스템은 Prometheus 메트릭을 노출합니다:
# 폴백 시도 카운터
fallback_attempts_total{original_model="gpt-4o", fallback_model="gpt-4-turbo", reason="circuit_breaker_open"} 15
# 성공한 폴백 카운터
fallback_success_total{original_model="gpt-4o", fallback_model="gpt-4-turbo"} 14
# 소진된 폴백 체인
fallback_exhausted_total{original_model="gpt-4o"} 1
# 크로스 프로바이더 폴백
fallback_cross_provider_total{from_provider="openai", to_provider="anthropic"} 5
# 폴백 지속 시간 히스토그램
fallback_duration_seconds_bucket{le="0.1"} 10
fallback_duration_seconds_bucket{le="0.5"} 45
fallback_duration_seconds_bucket{le="1.0"} 50
응답 헤더¶
폴백이 발생하면 응답에 정보 헤더가 포함됩니다:
X-Fallback-Used: true
X-Original-Model: gpt-4o
X-Fallback-Model: gpt-4-turbo
X-Fallback-Reason: circuit_breaker_open