/AI & 자동화/LLM 게이트웨이 설계: 멀티 프로바이더 라우팅과 폴백 전략
AI & 자동화LLM게이트웨이

LLM 게이트웨이 설계: 멀티 프로바이더 라우팅과 폴백 전략

OpenAI, Anthropic, Google 등 여러 LLM 프로바이더를 단일 인터페이스로 통합하는 LLM 게이트웨이를 설계합니다. 비용 기반 라우팅, 장애 대응 폴백, 레이트 리밋 관리, LiteLLM 활용 전략까지 다룹니다.

LLM 게이트웨이 설계: 멀티 프로바이더 라우팅과 폴백 전략

LLM 게이트웨이 설계: 멀티 프로바이더 라우팅과 폴백 전략

프로덕션 LLM 서비스가 OpenAI 하나에만 의존한다면 위험합니다. 2023년 11월 OpenAI 장애 때 수많은 서비스가 함께 멈췄습니다. LLM 게이트웨이는 여러 프로바이더를 단일 인터페이스 뒤에 두고 라우팅, 폴백, 비용 최적화를 중앙에서 관리합니다.

LLM 게이트웨이의 역할

CODE
클라이언트
    ↓
LLM 게이트웨이 (라우팅 / 폴백 / 캐싱 / 로깅)
    ↓        ↓        ↓
  OpenAI  Anthropic  Google
  • 라우팅: 어떤 모델로 보낼지 결정
  • 폴백: 실패 시 다른 프로바이더로 자동 전환
  • 레이트 리밋: 프로바이더별 쿼터 관리
  • 비용 추적: 통합 비용 모니터링

LiteLLM으로 빠르게 시작

LiteLLM은 100개 이상의 LLM을 OpenAI 호환 인터페이스로 통합합니다.

Python
from litellm import completion

# 모델명만 바꾸면 모든 프로바이더 동일하게 사용
def llm_call(model, messages):
    response = completion(model=model, messages=messages)
    return response.choices[0].message.content

llm_call("gpt-4o",              [{"role": "user", "content": "안녕"}])
llm_call("claude-sonnet-4-6",   [{"role": "user", "content": "안녕"}])
llm_call("gemini/gemini-1.5-pro",[{"role": "user", "content": "안녕"}])

폴백 체인 구현

Python
from litellm import completion

FALLBACK_CHAIN = [
    "gpt-4o",
    "claude-sonnet-4-6",
    "gemini/gemini-1.5-pro"
]

def resilient_llm_call(messages, preferred_model=None):
    chain = ([preferred_model] + FALLBACK_CHAIN) if preferred_model else FALLBACK_CHAIN
    chain = list(dict.fromkeys(chain))

    last_error = None
    for model in chain:
        try:
            response = completion(model=model, messages=messages, timeout=10, num_retries=1)
            return {
                "content":      response.choices[0].message.content,
                "model_used":   model,
                "was_fallback": model != chain[0]
            }
        except Exception as e:
            last_error = e
            print(f"[WARN] {model} 실패, 다음 모델로 시도")

    raise RuntimeError(f"모든 모델 실패: {last_error}")

비용 기반 라우팅

Python
ROUTING_TABLE = {
    "low":    {"primary": "gpt-4o-mini",       "fallback": "claude-haiku-4-5-20251001"},
    "medium": {"primary": "claude-sonnet-4-6", "fallback": "gpt-4o"},
    "high":   {"primary": "claude-opus-4-7",   "fallback": "gpt-4o"},
}

def classify_task(messages):
    user_text = " ".join(m["content"] for m in messages if m["role"] == "user")
    if any(kw in user_text for kw in ["분석", "설계", "아키텍처", "전략"]):
        return "high"
    if any(kw in user_text for kw in ["번역", "요약", "분류", "추출"]):
        return "low"
    return "medium"

def smart_route(messages):
    complexity = classify_task(messages)
    route = ROUTING_TABLE[complexity]
    return resilient_llm_call(messages, preferred_model=route["primary"])

LiteLLM Proxy 서버 배포

팀 전체가 단일 엔드포인트를 쓰게 합니다.

YAML
# litellm_config.yaml
model_list:
  - model_name: gpt-4o
    litellm_params:
      model: gpt-4o
      api_key: os.environ/OPENAI_API_KEY

  - model_name: claude-sonnet
    litellm_params:
      model: claude-sonnet-4-6
      api_key: os.environ/ANTHROPIC_API_KEY

router_settings:
  routing_strategy: cost-based-routing
  fallbacks:
    - {"gpt-4o": ["claude-sonnet", "gemini-pro"]}

general_settings:
  master_key: sk-my-master-key
  database_url: os.environ/DATABASE_URL
Bash
litellm --config litellm_config.yaml --port 4000

이제 팀 어디서나 http://localhost:4000을 OpenAI 엔드포인트처럼 씁니다. 키 관리, 비용 추적, 폴백이 모두 중앙화됩니다.

✦ ✦ ✦
편집 검토 · Editorial Review

이 글은 AI 에이전트가 자료 조사와 1차 초안 작성을 담당하고, 사람 편집자가 사실관계·출처·톤과 맥락을 검토한 뒤 발행했습니다. 환경(OS·버전)에 따라 결과가 다를 수 있으니 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.

초안 · AI (Content Director)·검토 · Nodelog 편집자·발행 ·

댓글

첫 번째 댓글을 남겨보세요.