콘텐츠로 이동

모델 폴백 시스템

라우터는 기본 모델을 사용할 수 없을 때 자동으로 대체 모델로 요청을 라우팅하는 설정 가능한 모델 폴백 시스템을 구현합니다.

아키텍처 개요

┌─────────────────────────────────────────────────────────────────┐
│              계층화된 폴백 아키텍처                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   서킷 브레이커 (인프라 계층)                                    │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │ • 백엔드 헬스 모니터링                                   │   │
│   │ • 실패 횟수/비율 추적                                    │   │
│   │ • 임계값 초과 시 회로 개방                               │   │
│   │ • 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

관련 문서