Skip to content
Published on

LiteLLM 완전 가이드 2025: 100+ LLM을 하나의 API로 통합하는 프록시 서버

Authors

서론: 왜 LiteLLM인가?

2025년 현재, AI 시장은 그 어느 때보다 빠르게 변화하고 있습니다. OpenAI의 GPT-4o, Anthropic의 Claude Opus 4, Google의 Gemini 2.0, Meta의 Llama 3.1, Mistral의 Large 등 새로운 모델이 매월 출시되고 있으며, 각 제공자마다 서로 다른 API 형식, 인증 방식, 가격 정책을 가지고 있습니다.

이런 상황에서 기업들이 직면하는 3가지 핵심 문제가 있습니다.

1. 벤더 락인(Vendor Lock-in) 문제

한 LLM 제공자의 API에 코드를 맞추면, 더 좋은 모델이 나와도 전환 비용이 큽니다.

# 문제: 각 제공자마다 다른 API 형식
# OpenAI
import openai
response = openai.ChatCompletion.create(model="gpt-4", messages=[...])

# Anthropic
import anthropic
response = anthropic.messages.create(model="claude-3-opus", messages=[...])

# Google
import google.generativeai as genai
response = genai.GenerativeModel("gemini-pro").generate_content(...)

2. 비용 관리의 어려움

여러 모델을 사용하면 각 제공자별 비용을 추적하고 예산을 관리하기가 복잡해집니다.

3. 가용성과 안정성

단일 제공자에 의존하면 해당 서비스에 장애가 생겼을 때 전체 시스템이 멈춥니다.

LiteLLM은 이 세 가지 문제를 하나의 솔루션으로 해결합니다.

┌──────────────────────────────────────────────────┐
Your Application              (OpenAI SDK Format)└─────────────────────┬────────────────────────────┘
┌──────────────────────────────────────────────────┐
LiteLLM Proxy Server│  ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│  │  Cost    │ │  Load    │ │  Virtual Keys    │ │
│  │  Tracking│Balance │ │  + Budget Mgmt   │ │
│  └──────────┘ └──────────┘ └──────────────────┘ │
└───┬──────────────┬──────────────┬────────────────┘
    │              │              │
    ▼              ▼              ▼
┌────────┐  ┌──────────┐  ┌───────────┐
OpenAI │  │ Anthropic│GoogleGPT-4o │  │ Claude   │  │  Gemini└────────┘  └──────────┘  └───────────┘
    ▲              ▲              ▲
    │              │              │
┌────────┐  ┌──────────┐  ┌───────────┐
AWS   │  │  Azure   │  │  Ollama│Bedrock │  │ OpenAI  (Local)└────────┘  └──────────┘  └───────────┘

1. LiteLLM 아키텍처: SDK vs Proxy

LiteLLM은 두 가지 모드로 사용할 수 있습니다.

1.1 SDK 모드 (Python 패키지)

애플리케이션에 직접 임포트하여 사용합니다. 간단한 프로젝트에 적합합니다.

# pip install litellm
from litellm import completion

# OpenAI 호출
response = completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}]
)

# Anthropic 호출 (같은 형식!)
response = completion(
    model="anthropic/claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": "Hello!"}]
)

# Google Gemini 호출 (같은 형식!)
response = completion(
    model="gemini/gemini-2.0-flash",
    messages=[{"role": "user", "content": "Hello!"}]
)

1.2 Proxy 모드 (서버)

독립 서버로 실행하여 모든 애플리케이션이 하나의 엔드포인트를 사용합니다. 팀/조직에 적합합니다.

# 프록시 서버 시작
litellm --config config.yaml --port 4000
# 어떤 언어든 OpenAI SDK 형식으로 호출
import openai

client = openai.OpenAI(
    api_key="sk-litellm-your-virtual-key",
    base_url="http://localhost:4000"
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}]
)

1.3 SDK vs Proxy 비교

항목SDK 모드Proxy 모드
사용 방식Python 패키지 임포트HTTP 서버 (REST API)
언어 지원Python만모든 언어 (OpenAI SDK 호환)
팀 관리불가능가상 키로 팀별 관리
예산 관리기본적고급 (팀별/키별)
로드 밸런싱코드에서 직접설정 파일로 자동
적합한 경우개인 프로젝트, 프로토타입팀/조직, 프로덕션

2. SDK 사용법: 다양한 LLM 통합 호출

2.1 Chat Completion

LiteLLM SDK의 핵심 기능입니다. 100+ 모델을 동일한 인터페이스로 호출합니다.

from litellm import completion
import os

# 환경 변수로 API 키 설정
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["ANTHROPIC_API_KEY"] = "sk-ant-..."
os.environ["GEMINI_API_KEY"] = "AI..."

# 동일한 함수, 다른 모델
models = [
    "gpt-4o",
    "anthropic/claude-sonnet-4-20250514",
    "gemini/gemini-2.0-flash",
    "groq/llama-3.1-70b-versatile",
    "mistral/mistral-large-latest",
]

for model in models:
    response = completion(
        model=model,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Explain quantum computing in 2 sentences."}
        ],
        temperature=0.7,
        max_tokens=200,
    )
    print(f"[{model}]: {response.choices[0].message.content}")

2.2 스트리밍 응답

from litellm import completion

response = completion(
    model="anthropic/claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": "Write a short poem about coding."}],
    stream=True,
)

for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

2.3 Embedding 호출

from litellm import embedding

# OpenAI Embedding
response = embedding(
    model="text-embedding-3-small",
    input=["Hello world", "How are you?"]
)

# Cohere Embedding (같은 형식!)
response = embedding(
    model="cohere/embed-english-v3.0",
    input=["Hello world", "How are you?"]
)

print(f"Embedding dimension: {len(response.data[0]['embedding'])}")

2.4 이미지 생성

from litellm import image_generation

response = image_generation(
    model="dall-e-3",
    prompt="A futuristic city powered by AI, digital art style",
    n=1,
    size="1024x1024",
)

print(f"Image URL: {response.data[0]['url']}")

2.5 비동기 호출

import asyncio
from litellm import acompletion

async def generate_responses():
    tasks = [
        acompletion(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": f"Tell me fact #{i} about space."}]
        )
        for i in range(5)
    ]
    responses = await asyncio.gather(*tasks)
    for i, resp in enumerate(responses):
        print(f"Fact #{i}: {resp.choices[0].message.content[:100]}")

asyncio.run(generate_responses())

3. Proxy 서버 설정

3.1 기본 설정 파일 (config.yaml)

model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY

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

  - model_name: gemini-flash
    litellm_params:
      model: gemini/gemini-2.0-flash
      api_key: os.environ/GEMINI_API_KEY

  - model_name: llama-local
    litellm_params:
      model: ollama/llama3.1:70b
      api_base: http://localhost:11434

litellm_settings:
  drop_params: true
  set_verbose: false
  num_retries: 3
  request_timeout: 120

general_settings:
  master_key: sk-master-key-1234
  database_url: os.environ/DATABASE_URL

3.2 Docker로 시작하기

# Docker Compose 파일
cat > docker-compose.yaml << 'EOF'
version: "3.9"
services:
  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    ports:
      - "4000:4000"
    volumes:
      - ./config.yaml:/app/config.yaml
    command: ["--config", "/app/config.yaml", "--port", "4000"]
    environment:
      - OPENAI_API_KEY
      - ANTHROPIC_API_KEY
      - GEMINI_API_KEY
      - DATABASE_URL=postgresql://user:pass@db:5432/litellm
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: litellm
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
EOF

# 시작
docker compose up -d

3.3 프록시 서버 테스트

# 헬스 체크
curl http://localhost:4000/health

# Chat Completion 호출
curl -X POST http://localhost:4000/v1/chat/completions \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

# 모델 목록 조회
curl http://localhost:4000/v1/models \
  -H "Authorization: Bearer sk-master-key-1234"

4. 지원 제공자 및 모델

LiteLLM은 100+ LLM 제공자를 지원합니다. 주요 제공자를 정리합니다.

4.1 주요 제공자 목록

┌────────────────────┬──────────────────────────────────────┐
│ 제공자              │ 지원 모델 (예시)├────────────────────┼──────────────────────────────────────┤
OpenAI             │ gpt-4o, gpt-4o-mini, o1, o3-mini    │
Anthropic          │ claude-opus-4, claude-sonnet, haiku  │
Google (Gemini)    │ gemini-2.0-flash, gemini-1.5-pro    │
AWS BedrockClaude, Titan, Llama via BedrockAzure OpenAI       │ gpt-4o (Azure 호스팅)Mistral AI         │ mistral-large, mistral-small         │
Groq               │ llama-3.1-70b, mixtral-8x7b         │
Together AI        │ llama-3.1, CodeLlama, QwenOllama (로컬)      │ llama3.1, codellama, mistral 등     │
vLLM (자체 호스팅) │ 모든 HuggingFace 모델               │
Cohere             │ command-r-plus, embed 모델           │
Deepseek           │ deepseek-chat, deepseek-coder        │
Fireworks AI       │ llama, mixtral 등                    │
Perplexity         │ pplx-70b-online 등                   │
└────────────────────┴──────────────────────────────────────┘

4.2 AWS Bedrock 설정

model_list:
  - model_name: bedrock-claude
    litellm_params:
      model: bedrock/anthropic.claude-3-sonnet-20240229-v1:0
      aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID
      aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY
      aws_region_name: us-east-1

  - model_name: bedrock-llama
    litellm_params:
      model: bedrock/meta.llama3-1-70b-instruct-v1:0
      aws_region_name: us-west-2

4.3 Azure OpenAI 설정

model_list:
  - model_name: azure-gpt4
    litellm_params:
      model: azure/gpt-4o-deployment-name
      api_base: https://your-resource.openai.azure.com/
      api_key: os.environ/AZURE_API_KEY
      api_version: "2024-06-01"

4.4 Ollama (로컬 LLM) 설정

model_list:
  - model_name: local-llama
    litellm_params:
      model: ollama/llama3.1:70b
      api_base: http://localhost:11434
      stream: true

  - model_name: local-codellama
    litellm_params:
      model: ollama/codellama:34b
      api_base: http://localhost:11434

5. 모델 라우팅 전략

5.1 비용 기반 라우팅 (Lowest Cost)

가장 저렴한 모델을 자동 선택합니다.

router_settings:
  routing_strategy: cost-based-routing

model_list:
  - model_name: general-chat
    litellm_params:
      model: gpt-4o-mini
      # Input: $0.15/1M tokens, Output: $0.60/1M tokens

  - model_name: general-chat
    litellm_params:
      model: anthropic/claude-3-haiku-20240307
      # Input: $0.25/1M tokens, Output: $1.25/1M tokens

  - model_name: general-chat
    litellm_params:
      model: gemini/gemini-2.0-flash
      # Input: $0.075/1M tokens, Output: $0.30/1M tokens

위 설정에서 general-chat을 호출하면 Gemini Flash가 가장 저렴하므로 자동 선택됩니다.

5.2 레이턴시 기반 라우팅 (Lowest Latency)

가장 빠른 응답 시간의 모델을 선택합니다.

router_settings:
  routing_strategy: latency-based-routing
  routing_strategy_args:
    ttl: 60  # 60초마다 레이턴시 재측정

5.3 사용량 기반 라우팅 (Usage-Based)

RPM(분당 요청 수) 기준으로 여유 있는 모델에 라우팅합니다.

router_settings:
  routing_strategy: usage-based-routing

model_list:
  - model_name: fast-model
    litellm_params:
      model: gpt-4o-mini
      rpm: 500  # 분당 최대 500 요청

  - model_name: fast-model
    litellm_params:
      model: gemini/gemini-2.0-flash
      rpm: 1000  # 분당 최대 1000 요청

5.4 커스텀 태그 기반 라우팅

# 요청 시 metadata로 라우팅 제어
response = client.chat.completions.create(
    model="general-chat",
    messages=[{"role": "user", "content": "Complex analysis..."}],
    extra_body={
        "metadata": {
            "tags": ["high-quality", "long-context"]
        }
    }
)

6. 로드 밸런싱과 폴백

6.1 로드 밸런싱 설정

같은 model_name에 여러 배포를 등록하면 자동으로 로드 밸런싱됩니다.

model_list:
  # 같은 모델의 여러 API 키로 분산
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: sk-key-1
      rpm: 100

  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: sk-key-2
      rpm: 100

  # 다른 제공자 간 분산
  - model_name: fast-model
    litellm_params:
      model: openai/gpt-4o-mini
      rpm: 500

  - model_name: fast-model
    litellm_params:
      model: anthropic/claude-3-haiku-20240307
      rpm: 300

router_settings:
  routing_strategy: simple-shuffle  # round-robin 방식
  allowed_fails: 3  # 3번 실패 시 해당 배포 비활성화
  cooldown_time: 60  # 60초 후 재활성화

6.2 폴백 체인 설정

주 모델이 실패하면 대체 모델로 자동 전환합니다.

litellm_settings:
  fallbacks:
    - model_name: gpt-4o
      fallback_models:
        - anthropic/claude-sonnet-4-20250514
        - gemini/gemini-1.5-pro

    - model_name: claude-sonnet
      fallback_models:
        - gpt-4o
        - gemini/gemini-1.5-pro

  # 콘텐츠 정책 위반 시 다른 모델로
  content_policy_fallbacks:
    - model_name: gpt-4o
      fallback_models:
        - anthropic/claude-sonnet-4-20250514

  # 컨텍스트 윈도우 초과 시 더 큰 모델로
  context_window_fallbacks:
    - model_name: gpt-4o-mini
      fallback_models:
        - gpt-4o
        - anthropic/claude-sonnet-4-20250514

6.3 폴백 동작 흐름

사용자 요청: "gpt-4o"Chat Completion
[1] gpt-4o 호출 시도
    ├── 성공 → 응답 반환
    └── 실패 (429 Rate Limit / 500 Error)
[2] claude-sonnet-4 호출 시도 (1차 폴백)
    ├── 성공 → 응답 반환
    └── 실패
[3] gemini-1.5-pro 호출 시도 (2차 폴백)
    ├── 성공 → 응답 반환
    └── 실패 → 에러 반환

7. 가상 키와 팀 관리

7.1 가상 키 생성

# 마스터 키로 새 가상 키 생성
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "key_alias": "frontend-team-key",
    "duration": "30d",
    "max_budget": 100.0,
    "models": ["gpt-4o", "claude-sonnet"],
    "max_parallel_requests": 10,
    "tpm_limit": 100000,
    "rpm_limit": 100,
    "metadata": {
      "team": "frontend",
      "environment": "production"
    }
  }'

7.2 팀 생성 및 관리

# 팀 생성
curl -X POST http://localhost:4000/team/new \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "team_alias": "ml-engineering",
    "max_budget": 500.0,
    "models": ["gpt-4o", "claude-sonnet", "gemini-flash"],
    "members_with_roles": [
      {"role": "admin", "user_id": "user-alice@company.com"},
      {"role": "user", "user_id": "user-bob@company.com"}
    ],
    "metadata": {
      "department": "engineering",
      "cost_center": "ENG-001"
    }
  }'

# 팀에 키 할당
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "team_id": "team-ml-engineering-id",
    "key_alias": "ml-team-prod-key",
    "max_budget": 200.0
  }'

7.3 키별 모델 접근 제어

# config.yaml에서 모델 접근 그룹 설정
model_list:
  - model_name: premium-model
    litellm_params:
      model: openai/gpt-4o
    model_info:
      access_groups: ["premium-tier"]

  - model_name: basic-model
    litellm_params:
      model: openai/gpt-4o-mini
    model_info:
      access_groups: ["basic-tier", "premium-tier"]

8. 예산 관리와 비용 추적

8.1 글로벌 예산 설정

general_settings:
  max_budget: 10000.0  # 전체 월 예산 $10,000
  budget_duration: 1m   # 월간 리셋

8.2 키별/팀별 예산

# 키별 예산 업데이트
curl -X POST http://localhost:4000/key/update \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "sk-virtual-key-xxx",
    "max_budget": 50.0,
    "budget_duration": "1m",
    "soft_budget": 40.0
  }'

soft_budget에 도달하면 알림을 보내고, max_budget에 도달하면 요청이 차단됩니다.

8.3 비용 추적 API

# 전체 비용 조회
curl http://localhost:4000/spend/logs \
  -H "Authorization: Bearer sk-master-key-1234" \
  -G \
  -d "start_date=2025-01-01" \
  -d "end_date=2025-01-31"

# 모델별 비용 조회
curl http://localhost:4000/spend/tags \
  -H "Authorization: Bearer sk-master-key-1234" \
  -G \
  -d "group_by=model"

# 팀별 비용 조회
curl http://localhost:4000/spend/tags \
  -H "Authorization: Bearer sk-master-key-1234" \
  -G \
  -d "group_by=team"

8.4 예산 알림 Webhook

general_settings:
  alerting:
    - slack
  alerting_threshold: 300  # 예산의 80% 소진 시 알림
  alert_types:
    - budget_alerts
    - spend_reports
    - failed_tracking

environment_variables:
  SLACK_WEBHOOK_URL: os.environ/SLACK_WEBHOOK_URL

8.5 비용 최적화 대시보드 예시

┌─────────────────────────────────────────────────────┐
LiteLLM Cost Dashboard (January 2025)├─────────────────────────────────────────────────────┤
│                                                     │
Total Spend: $3,245.67 / $10,000.00 budget        │
│  ████████████████░░░░░░░░░░ 32.5%│                                                     │
By Model:│  ├─ gpt-4o:          $1,823.45 (56.2%)│  ├─ claude-sonnet:   $891.23  (27.5%)│  ├─ gemini-flash:    $234.56  (7.2%)│  └─ gpt-4o-mini:    $296.43  (9.1%)│                                                     │
By Team:│  ├─ ML Engineering:  $1,456.78│  ├─ Frontend:        $987.65│  └─ Data Science:    $801.24│                                                     │
Daily Trend: ▁▂▃▅▆▇█▇▆▅▃▂▁▂▃▅▆                   │
└─────────────────────────────────────────────────────┘

9. 레이트 리밋 (Rate Limiting)

9.1 키 레벨 레이트 리밋

curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-master-key-1234" \
  -H "Content-Type: application/json" \
  -d '{
    "key_alias": "rate-limited-key",
    "rpm_limit": 60,
    "tpm_limit": 100000,
    "max_parallel_requests": 5
  }'

9.2 모델 레벨 레이트 리밋

model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
      rpm: 200    # 이 배포의 분당 최대 요청
      tpm: 400000 # 이 배포의 분당 최대 토큰

9.3 글로벌 레이트 리밋

general_settings:
  global_max_parallel_requests: 100  # 전체 동시 요청 제한

10. Guardrails: PII 마스킹과 콘텐츠 필터링

10.1 PII(개인정보) 마스킹

litellm_settings:
  guardrails:
    - guardrail_name: pii-masking
      litellm_params:
        guardrail: presidio
        mode: during_call  # 요청 전에 PII 마스킹
        output_parse_pii: true  # 응답에서도 PII 마스킹
# PII가 포함된 요청
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{
        "role": "user",
        "content": "My email is john@example.com and phone is 010-1234-5678"
    }],
    extra_body={
        "metadata": {
            "guardrails": ["pii-masking"]
        }
    }
)
# LLM에는 "My email is [EMAIL] and phone is [PHONE]"로 전송됨

10.2 콘텐츠 필터링 (Lakera Guard)

litellm_settings:
  guardrails:
    - guardrail_name: content-filter
      litellm_params:
        guardrail: lakera
        mode: pre_call  # 요청 전에 필터링
        api_key: os.environ/LAKERA_API_KEY

10.3 프롬프트 인젝션 방어

litellm_settings:
  guardrails:
    - guardrail_name: prompt-injection
      litellm_params:
        guardrail: lakera
        mode: pre_call
        prompt_injection: true

10.4 커스텀 Guardrail

# custom_guardrail.py
from litellm.proxy.guardrails.guardrail_hooks import GuardrailHook

class CustomContentFilter(GuardrailHook):
    def __init__(self):
        self.blocked_words = ["harmful", "dangerous", "illegal"]

    async def pre_call_hook(self, data, call_type):
        user_message = data.get("messages", [])[-1].get("content", "")
        for word in self.blocked_words:
            if word.lower() in user_message.lower():
                raise ValueError(f"Blocked content detected: {word}")
        return data

    async def post_call_hook(self, data, response, call_type):
        # 응답 후처리 로직
        return response

11. 로깅과 모니터링

11.1 Langfuse 연동

litellm_settings:
  success_callback: ["langfuse"]
  failure_callback: ["langfuse"]

environment_variables:
  LANGFUSE_PUBLIC_KEY: os.environ/LANGFUSE_PUBLIC_KEY
  LANGFUSE_SECRET_KEY: os.environ/LANGFUSE_SECRET_KEY
  LANGFUSE_HOST: https://cloud.langfuse.com

11.2 LangSmith 연동

litellm_settings:
  success_callback: ["langsmith"]

environment_variables:
  LANGCHAIN_API_KEY: os.environ/LANGCHAIN_API_KEY
  LANGCHAIN_PROJECT: my-litellm-project

11.3 커스텀 콜백

# custom_callback.py
from litellm.integrations.custom_logger import CustomLogger

class MyCustomLogger(CustomLogger):
    async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
        print(f"Model: {kwargs.get('model')}")
        print(f"Cost: ${kwargs.get('response_cost', 0):.6f}")
        print(f"Latency: {(end_time - start_time).total_seconds():.2f}s")
        print(f"Tokens: {response_obj.usage.total_tokens}")

    async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time):
        print(f"FAILED - Model: {kwargs.get('model')}")
        print(f"Error: {kwargs.get('exception')}")

11.4 Prometheus 메트릭

litellm_settings:
  success_callback: ["prometheus"]
  failure_callback: ["prometheus"]

주요 메트릭:

# 요청 수
litellm_requests_total
litellm_requests_failed_total

# 레이턴시
litellm_request_duration_seconds_bucket
litellm_request_duration_seconds_sum

# 비용
litellm_spend_total

# 토큰
litellm_tokens_total
litellm_input_tokens_total
litellm_output_tokens_total

12. 캐싱

12.1 Redis 캐싱

litellm_settings:
  cache: true
  cache_params:
    type: redis
    host: redis-host
    port: 6379
    password: os.environ/REDIS_PASSWORD
    ttl: 3600  # 1시간 캐시

    # 의미적 캐싱 (유사한 질문에 같은 응답)
    supported_call_types:
      - acompletion
      - completion

12.2 인메모리 캐싱

litellm_settings:
  cache: true
  cache_params:
    type: local
    ttl: 600  # 10분 캐시

12.3 캐시 제어

# 캐시 사용
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "What is 2+2?"}],
    extra_body={
        "metadata": {
            "cache": {
                "no-cache": False,  # 캐시 사용
                "ttl": 3600         # 이 요청의 TTL
            }
        }
    }
)

# 캐시 무시
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "What is the latest news?"}],
    extra_body={
        "metadata": {
            "cache": {
                "no-cache": True  # 항상 새로운 응답
            }
        }
    }
)

13. 프로덕션 배포

13.1 Kubernetes 배포

# litellm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: litellm-proxy
  labels:
    app: litellm
spec:
  replicas: 3
  selector:
    matchLabels:
      app: litellm
  template:
    metadata:
      labels:
        app: litellm
    spec:
      containers:
        - name: litellm
          image: ghcr.io/berriai/litellm:main-latest
          ports:
            - containerPort: 4000
          args: ["--config", "/app/config.yaml", "--port", "4000"]
          volumeMounts:
            - name: config
              mountPath: /app/config.yaml
              subPath: config.yaml
          env:
            - name: OPENAI_API_KEY
              valueFrom:
                secretKeyRef:
                  name: litellm-secrets
                  key: openai-api-key
            - name: ANTHROPIC_API_KEY
              valueFrom:
                secretKeyRef:
                  name: litellm-secrets
                  key: anthropic-api-key
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: litellm-secrets
                  key: database-url
          resources:
            requests:
              cpu: "500m"
              memory: "512Mi"
            limits:
              cpu: "2000m"
              memory: "2Gi"
          livenessProbe:
            httpGet:
              path: /health/liveliness
              port: 4000
            initialDelaySeconds: 30
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /health/readiness
              port: 4000
            initialDelaySeconds: 10
            periodSeconds: 5
      volumes:
        - name: config
          configMap:
            name: litellm-config
---
apiVersion: v1
kind: Service
metadata:
  name: litellm-service
spec:
  selector:
    app: litellm
  ports:
    - port: 80
      targetPort: 4000
  type: ClusterIP
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: litellm-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: litellm-proxy
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

13.2 Helm Chart 사용

# Helm으로 설치
helm repo add litellm https://litellm.github.io/litellm-helm
helm repo update

helm install litellm litellm/litellm-helm \
  --set masterKey=sk-your-master-key \
  --set replicaCount=3 \
  --set database.useExisting=true \
  --set database.url=postgresql://user:pass@host:5432/litellm \
  --namespace litellm \
  --create-namespace

13.3 프로덕션 체크리스트

Production Deployment Checklist
================================
[ ] PostgreSQL DB 설정 및 연결 확인
[ ] Master Key를 강력한 랜덤 값으로 설정
[ ] 모든 API 키를 환경 변수/시크릿으로 관리
[ ] HTTPS/TLS 설정 (Ingress 또는 LoadBalancer)
[ ] 레플리카 2개 이상 설정
[ ] HPA (Horizontal Pod Autoscaler) 설정
[ ] Liveness/Readiness Probe 설정
[ ] Prometheus + Grafana 모니터링 설정
[ ] Slack/PagerDuty 알림 설정
[ ] Redis 캐시 설정 (선택사항)
[ ] 예산 및 레이트 리밋 설정
[ ] Guardrails 설정 (필요 시)
[ ] 로깅 (Langfuse/LangSmith) 설정
[ ] 백업 및 복구 전략 수립
[ ] 로드 테스트 완료

14. LiteLLM vs 대안 비교

14.1 LiteLLM vs OpenRouter

항목LiteLLMOpenRouter
호스팅셀프 호스팅클라우드 서비스
데이터 프라이버시완전 제어제3자 서버 경유
비용오픈소스 무료API 마진 추가
팀 관리가상 키/팀/예산제한적
커스터마이징완전 커스터마이징제한적
셋업 난이도중간 (Docker/K8s 필요)쉬움 (API 키만)
로컬 모델지원 (Ollama/vLLM)미지원

14.2 LiteLLM vs Portkey

항목LiteLLMPortkey
오픈소스예 (Apache 2.0)부분적 (Gateway만)
프록시 서버포함포함
가상 키포함포함
AI Gateway기본적고급 (Prompt 관리 등)
가격무료프리미엄 플랜 존재
커뮤니티활발 (12K+ GitHub Stars)성장 중

14.3 언제 무엇을 선택할까

┌─────────────────────────────────────────────────┐
│ 상황별 추천 솔루션                                │
├─────────────────────────────────────────────────┤
│                                                 │
"빠르게 시작하고 싶다"│  → OpenRouter (가입 후 즉시 사용)│                                                 │
"데이터 보안이 중요하다"│  → LiteLLM (셀프 호스팅, 완전 제어)│                                                 │
"팀/조직 관리가 필요하다"│  → LiteLLM 또는 Portkey│                                                 │
"로컬 모델도 사용한다"│  → LiteLLM (Ollama/vLLM 네이티브 지원)│                                                 │
"엔터프라이즈 기능이 필요하다"│  → LiteLLM Enterprise 또는 Portkey Enterprise│                                                 │
└─────────────────────────────────────────────────┘

15. 실전 사례: 완전한 프로덕션 설정

아래는 실제 프로덕션에서 사용할 수 있는 완전한 config.yaml 예시입니다.

# production-config.yaml
model_list:
  # === 프리미엄 티어 ===
  - model_name: premium-chat
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY
      rpm: 200
      tpm: 400000
    model_info:
      access_groups: ["premium"]

  - model_name: premium-chat
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/ANTHROPIC_API_KEY
      rpm: 150
    model_info:
      access_groups: ["premium"]

  # === 기본 티어 ===
  - model_name: basic-chat
    litellm_params:
      model: openai/gpt-4o-mini
      api_key: os.environ/OPENAI_API_KEY
      rpm: 500
    model_info:
      access_groups: ["basic", "premium"]

  - model_name: basic-chat
    litellm_params:
      model: gemini/gemini-2.0-flash
      api_key: os.environ/GEMINI_API_KEY
      rpm: 1000
    model_info:
      access_groups: ["basic", "premium"]

  # === 코딩 전용 ===
  - model_name: code-model
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/ANTHROPIC_API_KEY
    model_info:
      access_groups: ["premium"]

  # === 임베딩 ===
  - model_name: embedding
    litellm_params:
      model: openai/text-embedding-3-small
      api_key: os.environ/OPENAI_API_KEY

# === 라우터 설정 ===
router_settings:
  routing_strategy: latency-based-routing
  allowed_fails: 3
  cooldown_time: 60
  num_retries: 3
  timeout: 120
  retry_after: 5

# === LiteLLM 설정 ===
litellm_settings:
  drop_params: true
  set_verbose: false
  num_retries: 3
  request_timeout: 120

  # 폴백
  fallbacks:
    - model_name: premium-chat
      fallback_models: ["basic-chat"]
    - model_name: basic-chat
      fallback_models: ["premium-chat"]

  context_window_fallbacks:
    - model_name: basic-chat
      fallback_models: ["premium-chat"]

  # 캐싱
  cache: true
  cache_params:
    type: redis
    host: os.environ/REDIS_HOST
    port: 6379
    password: os.environ/REDIS_PASSWORD
    ttl: 3600

  # 콜백
  success_callback: ["langfuse", "prometheus"]
  failure_callback: ["langfuse", "prometheus"]

  # Guardrails
  guardrails:
    - guardrail_name: pii-masking
      litellm_params:
        guardrail: presidio
        mode: during_call

# === 일반 설정 ===
general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY
  database_url: os.environ/DATABASE_URL
  max_budget: 10000
  budget_duration: 1m

  alerting:
    - slack
  alerting_threshold: 300

  global_max_parallel_requests: 200

# === 환경 변수 ===
environment_variables:
  LANGFUSE_PUBLIC_KEY: os.environ/LANGFUSE_PUBLIC_KEY
  LANGFUSE_SECRET_KEY: os.environ/LANGFUSE_SECRET_KEY
  SLACK_WEBHOOK_URL: os.environ/SLACK_WEBHOOK_URL

퀴즈

지금까지 학습한 내용을 확인해보겠습니다.

Q1. LiteLLM의 두 가지 사용 모드는 무엇이며, 각각 어떤 상황에 적합한가요?

A1. SDK 모드와 Proxy 모드가 있습니다.

  • SDK 모드: Python 패키지를 직접 임포트하여 사용. 개인 프로젝트나 프로토타입에 적합
  • Proxy 모드: 독립 HTTP 서버로 실행. 팀/조직 환경, 멀티 언어 클라이언트, 가상 키 관리, 예산 관리가 필요한 프로덕션에 적합

핵심 차이는 Proxy 모드가 가상 키, 팀 관리, 예산 관리, 로깅 등 엔터프라이즈 기능을 제공한다는 것입니다.

Q2. 모델 폴백(Fallback)이란 무엇이며, LiteLLM에서 어떤 종류의 폴백을 지원하나요?

A2. 모델 폴백은 주 모델이 실패했을 때 자동으로 대체 모델로 전환하는 메커니즘입니다.

LiteLLM은 3가지 종류의 폴백을 지원합니다.

  • 일반 폴백 (fallbacks): 모델 호출 실패 시 (429, 500 에러 등) 대체 모델로 전환
  • 콘텐츠 정책 폴백 (content_policy_fallbacks): 콘텐츠 정책 위반 시 다른 모델로 전환
  • 컨텍스트 윈도우 폴백 (context_window_fallbacks): 입력이 모델의 컨텍스트 윈도우를 초과할 때 더 큰 모델로 전환
Q3. LiteLLM의 비용 기반 라우팅(Cost-Based Routing)은 어떻게 작동하나요?

A3. 같은 model_name에 여러 제공자의 모델을 등록하고 routing_strategy를 cost-based-routing으로 설정하면, LiteLLM이 각 모델의 input/output 토큰 가격을 비교하여 가장 저렴한 모델에 자동으로 라우팅합니다.

예를 들어, GPT-4o-mini, Claude Haiku, Gemini Flash를 같은 이름으로 등록하면, 가격이 가장 낮은 모델이 자동 선택됩니다. 이를 통해 품질을 유지하면서 비용을 최적화할 수 있습니다.

Q4. 가상 키(Virtual Keys)의 역할과 주요 기능을 설명해주세요.

A4. 가상 키는 LiteLLM 프록시가 생성하는 API 키입니다. 실제 LLM 제공자의 API 키를 노출하지 않으면서 다양한 제어 기능을 제공합니다.

주요 기능:

  • 예산 제한: 키별 최대 예산 설정 (max_budget)
  • 모델 접근 제어: 특정 모델만 사용 가능하도록 제한
  • 레이트 리밋: RPM, TPM, 동시 요청 수 제한
  • 팀 연결: 키를 팀에 할당하여 팀 단위 관리
  • 기간 설정: 키의 유효 기간 지정
  • 사용량 추적: 키별 비용, 토큰, 요청 수 추적
Q5. LiteLLM을 프로덕션에 배포할 때 반드시 고려해야 할 항목 5가지는?

A5. 프로덕션 배포 시 반드시 고려해야 할 항목:

  1. 데이터베이스: PostgreSQL 연결 필수 (가상 키, 비용 추적, 팀 관리 데이터 저장)
  2. 보안: Master Key를 강력한 랜덤 값으로 설정, 모든 API 키를 시크릿으로 관리, HTTPS/TLS 적용
  3. 고가용성: 레플리카 2개 이상, HPA 설정, Liveness/Readiness Probe 구성
  4. 모니터링: Prometheus 메트릭 수집, Grafana 대시보드, Slack/PagerDuty 알림 설정
  5. 비용 제어: 글로벌 예산, 팀별/키별 예산, 소프트 예산 알림, 레이트 리밋 설정

추가로 Redis 캐싱, 로깅(Langfuse), Guardrails 설정, 백업 전략도 권장됩니다.


참고 자료

  1. LiteLLM 공식 문서 - https://docs.litellm.ai/
  2. LiteLLM GitHub - https://github.com/BerriAI/litellm
  3. LiteLLM Proxy Server 가이드 - https://docs.litellm.ai/docs/proxy/quick_start
  4. LiteLLM 지원 제공자 목록 - https://docs.litellm.ai/docs/providers
  5. LiteLLM 가상 키 관리 - https://docs.litellm.ai/docs/proxy/virtual_keys
  6. LiteLLM 라우팅 전략 - https://docs.litellm.ai/docs/routing
  7. LiteLLM 예산 관리 - https://docs.litellm.ai/docs/proxy/users
  8. LiteLLM Guardrails - https://docs.litellm.ai/docs/proxy/guardrails
  9. LiteLLM Kubernetes 배포 - https://docs.litellm.ai/docs/proxy/deploy
  10. OpenRouter 공식 사이트 - https://openrouter.ai/
  11. Portkey AI 공식 사이트 - https://portkey.ai/
  12. Langfuse LLM Observability - https://langfuse.com/
  13. LiteLLM vs Alternatives 비교 - https://docs.litellm.ai/docs/proxy/enterprise
  14. Prometheus + Grafana 모니터링 - https://prometheus.io/