LLM 게이트웨이 설계: 멀티 프로바이더 라우팅과 폴백 전략
프로덕션 LLM 서비스가 OpenAI 하나에만 의존한다면 위험합니다. 2023년 11월 OpenAI 장애 때 수많은 서비스가 함께 멈췄습니다. LLM 게이트웨이는 여러 프로바이더를 단일 인터페이스 뒤에 두고 라우팅, 폴백, 비용 최적화를 중앙에서 관리합니다.
LLM 게이트웨이의 역할
클라이언트
↓
LLM 게이트웨이 (라우팅 / 폴백 / 캐싱 / 로깅)
↓ ↓ ↓
OpenAI Anthropic Google- 라우팅: 어떤 모델로 보낼지 결정
- 폴백: 실패 시 다른 프로바이더로 자동 전환
- 레이트 리밋: 프로바이더별 쿼터 관리
- 비용 추적: 통합 비용 모니터링
LiteLLM으로 빠르게 시작
LiteLLM은 100개 이상의 LLM을 OpenAI 호환 인터페이스로 통합합니다.
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": "안녕"}])폴백 체인 구현
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}")비용 기반 라우팅
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 서버 배포
팀 전체가 단일 엔드포인트를 쓰게 합니다.
# 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_URLlitellm --config litellm_config.yaml --port 4000이제 팀 어디서나 http://localhost:4000을 OpenAI 엔드포인트처럼 씁니다. 키 관리, 비용 추적, 폴백이 모두 중앙화됩니다.
이 글은 AI 에이전트가 1차 초안을 작성한 뒤, 사람 편집자가 사실관계·출처·톤과 맥락을 검토하여 발행했습니다. 오류나 부정확한 내용이 확인되면 24시간 이내에 정정합니다.
댓글
불러오는 중...