조대협 (http://bcho.tistory.com)

최근 여러 LLM이 소개 되고 있는데, LLM 마다 가격이나 특성이 틀리기 때문에 여러 모델을 함께 사용하는 경우가 있는데, 이때 마다 SDK가 달라서 어려움이 있을 수 있다. (물론 Langchain을 써도 된다.) 또한 금액이나 요청 종류에 따라서 특정 LLM으로 라우팅을 하거나 또는 특정 LLM 모델이 응답을 하지 못할때 Fallback등의 기능을 구현해야 하는데, LiteLLM은 이런 기능을 제공하는 파이썬 라이브러리이다.
이글에서는 LiteLLM과, 대표적인 라우팅 기능에 대해서 알아보도록 한다.
1. LiteLLM이란 무엇이고 왜 필요한가?
LiteLLM은 다양한 LLM 제공자(Provider)들의 API를 표준화된 단일 인터페이스로 호출할 수 있게 해주는 Python 라이브러리이다. 마치 여러 종류의 데이터베이스를 동일한 SQL 쿼리로 다룰 수 있게 해주는 ORM(Object-Relational Mapping)처럼, LiteLLM은 다양한 LLM API를 litellm.completion()이라는 일관된 함수 호출 방식으로 사용할 수 있게 한다.
왜 LiteLLM이 필요한가?
- 복잡성 감소: 각 LLM 제공자(OpenAI, Azure OpenAI, Anthropic, Cohere, Hugging Face 등)는 서로 다른 API 엔드포인트, 인증 방식(API 키, 토큰 등), 요청/응답 형식, 모델 파라미터 이름을 사용한다. 여러 모델을 사용하려면 각 API에 맞춰 개별 코드를 작성하고 관리해야 하는데, 이는 상당한 개발 시간과 노력을 요구한다. LiteLLM은 이를 단일 인터페이스로 추상화하여 코드 복잡성을 크게 줄여준다.
- 유연성 및 확장성 증대: 특정 LLM에 종속되지 않고 필요에 따라 다른 모델로 쉽게 전환할 수 있다. 예를 들어, 비용 효율적인 모델을 사용하다가 더 높은 성능이 필요할 때 다른 모델로 바꾸거나, 특정 모델의 장애 발생 시 다른 모델로 대체하는 것이 용이하다. 새로운 LLM이 등장하더라도 LiteLLM이 해당 모델을 지원하기 시작하면 큰 코드 변경 없이 바로 활용할 수 있다.
- 통합 관리: 로드 밸런싱, 폴백(Fallback), 재시도, 타임아웃, 비용 추적 등 여러 LLM을 운영할 때 필요한 고급 기능들을 LiteLLM을 통해 일관된 방식으로 관리할 수 있다.
결론적으로 LiteLLM은 여러 LLM을 효율적으로 사용하고 관리하기 위한 필수적인 도구라고 할 수 있다.
2. LiteLLM의 주요 기능
LiteLLM은 LLM 통합 관리를 위한 다양한 기능을 제공한다.
- 통합된 API 호출 형식: litellm.completion() 함수 하나로 100개 이상의 LLM(텍스트 생성), 임베딩 모델, 이미지 생성 모델 호출을 지원한다.
- 광범위한 LLM 지원: OpenAI, Azure OpenAI, Anthropic (Claude), Cohere, Google (Gemini, Vertex AI), Mistral AI, Hugging Face, Replicate, Bedrock 등 거의 모든 주요 LLM 제공자를 지원한다.
- 입력/출력 표준화: 다양한 LLM의 요청 파라미터와 응답 형식을 OpenAI의 표준 형식으로 맞춰주어 일관된 데이터 처리가 가능하다.
- 로드 밸런싱: 여러 LLM 배포(deployments) 간에 API 요청을 분산시켜 부하를 조절하고 안정성을 높인다.
- 폴백 (Fallback) 및 재시도: 특정 모델 호출에 실패했을 경우, 미리 지정된 다른 모델로 자동으로 전환하여 요청을 재시도한다.
- 타임아웃 설정: 각 LLM API 호출에 대한 최대 응답 대기 시간을 설정하여 무한정 대기하는 상황을 방지한다.
- 비용 추적 및 예산 관리: 모델별 API 호출 비용을 추적하고, 설정된 예산을 초과하지 않도록 관리할 수 있다.
- 스트리밍 지원: LLM이 생성하는 텍스트를 실시간으로 스트리밍하여 사용자 경험을 향상시킨다.
- 일관된 예외 처리: 다양한 LLM 제공자의 오류를 표준화된 LiteLLM 예외 형식으로 변환하여 에러 핸들링을 용이하게 한다.
- 프록시 서버: LiteLLM Proxy를 사용하면 API 키 관리, 사용자별 속도 제한, 로깅, 캐싱 등을 중앙에서 관리하는 자체 LLM 게이트웨이를 구축할 수 있다.
- 라우팅 전략: 태그 기반, 예산 기반 등 다양한 조건에 따라 요청을 특정 LLM으로 라우팅하는 고급 기능을 제공한다.
3. LiteLLM 설치 방법 (Step-by-step)
LiteLLM 설치는 Python 패키지 매니저인 pip를 사용하여 매우 간단하게 진행할 수 있다.
1단계: LiteLLM 설치
- pip를 사용하여 LiteLLM을 설치한다.최그
-
pip install litellm
2단계 (선택): 특정 LLM 제공자 SDK 설치
- LiteLLM은 기본적으로 많은 LLM을 지원하지만, 일부 LLM(예: OpenAI, Anthropic, Cohere 등)은 해당 제공자의 공식 Python SDK가 설치되어 있어야 최적으로 작동하거나 특정 기능(예: 스트리밍)을 사용할 수 있다.
- 필요한 제공자의 SDK를 함께 설치하려면 대괄호([])를 사용한다.
# OpenAI 사용 시 pip install litellm[openai] # Anthropic 사용 시 pip install litellm[anthropic] # 여러 개를 동시에 설치할 경우 쉼표로 구분 pip install litellm[openai,anthropic,cohere]
- 지원하는 추가 기능 목록은 LiteLLM 공식 문서를 참조하는 것이 좋다.
3단계: API 키 설정
- 사용하려는 LLM 제공자의 API 키를 환경 변수로 설정해야 한다. LiteLLM은 표준화된 환경 변수 이름(예: OPENAI_API_KEY, ANTHROPIC_API_KEY, COHERE_API_KEY 등)을 자동으로 인식한다.
# Linux/macOS export OPENAI_API_KEY="your-openai-api-key" export ANTHROPIC_API_KEY="your-anthropic-api-key" # Windows (Command Prompt) set OPENAI_API_KEY=your-openai-api-key set ANTHROPIC_API_KEY=your-anthropic-api-key # Windows (PowerShell) $env:OPENAI_API_KEY="your-openai-api-key" $env:ANTHROPIC_API_KEY="your-anthropic-api-key"
- Python 스크립트 내에서 os.environ을 사용하여 설정할 수도 있지만, 보안상 환경 변수를 사용하는 것이 더 권장된다.
4단계: 설치 확인 및 기본 사용
- 간단한 Python 스크립트를 작성하여 LiteLLM이 정상적으로 작동하는지 확인한다.
import litellm import os # 환경 변수가 설정되어 있다고 가정 # 또는 스크립트 내에서 설정 (주의: 실제 배포 시에는 권장되지 않음) # os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" try: response = litellm.completion( model="gpt-3.5-turbo", # 사용하려는 모델 지정 (예: OpenAI) messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello, LiteLLM!"} ] ) # 응답 출력 (OpenAI 형식) print(response.choices[0].message.content) # 다른 모델 호출 예시 (Anthropic Claude 3 Haiku) # os.environ["ANTHROPIC_API_KEY"] = "YOUR_ANTHROPIC_KEY" # response_claude = litellm.completion( # model="claude-3-haiku-20240307", # messages=[{"role": "user", "content": "LiteLLM에 대해 설명해줘."}] # ) # print(response_claude.choices[0].message.content) except Exception as e: print(f"An error occurred: {e}")
이제 LiteLLM이 성공적으로 설치되었고 기본적인 LLM 호출이 가능해졌다.
4. 고급 기능: 로드 밸런싱, 폴백, 타임아웃, 라우팅 전략
LiteLLM은 단순한 API 호출 통합을 넘어, 안정적이고 효율적인 LLM 서비스 운영을 위한 고급 기능들을 제공한다. 특히 litellm.Router 클래스를 활용하면 이러한 기능들을 쉽게 구현할 수 있다.
1) 로드 밸런싱 (Load Balancing)
- 설명: 여러 개의 동일하거나 다른 LLM 배포(예: 여러 개의 OpenAI gpt-3.5-turbo 인스턴스, 또는 OpenAI와 Azure OpenAI 혼용)에 API 요청을 분산시키는 기능이다. 이를 통해 특정 배포에 과부하가 걸리는 것을 방지하고, 전체 처리량을 높이며, 안정성을 개선할 수 있다. Router는 기본적으로 라운드 로빈 방식으로 요청을 분산시키거나, 각 배포에 가중치(weight)를 부여하여 분산 비율을 조절할 수 있다.
- 예시:
import litellm import os # API 키 설정 가정 # 여러 모델 배포 정의 model_list = [ { "model_name": "gpt-3.5-turbo-group", # 라우터에서 사용할 가상 모델 이름 "litellm_params": { "model": "azure/gpt-35-turbo-eastus", # Azure 배포 1 "api_key": os.getenv("AZURE_API_KEY"), "api_base": os.getenv("AZURE_API_BASE"), "api_version": os.getenv("AZURE_API_VERSION") }, "rpm": 100 # 분당 요청 수 제한 (선택 사항) }, { "model_name": "gpt-3.5-turbo-group", # 동일한 가상 모델 이름 사용 "litellm_params": { "model": "gpt-3.5-turbo", # OpenAI 배포 "api_key": os.getenv("OPENAI_API_KEY") }, "rpm": 50 } ] # 라우터 생성 router = litellm.Router(model_list=model_list) # 라우터를 통해 'gpt-3.5-turbo-group' 호출 (자동 로드 밸런싱됨) response = router.completion( model="gpt-3.5-turbo-group", messages=[{"role": "user", "content": "로드 밸런싱 테스트"}] ) print(response)
2) 폴백 (Fallback)
- 설명: 주 사용 모델(primary)의 API 호출이 실패했을 때(예: API 오류, 타임아웃, 사용량 제한 초과 등), 미리 지정된 예비 모델(fallback)로 자동으로 요청을 보내는 기능이다. litellm.completion 함수에 모델 이름 리스트를 전달하거나, Router의 model_list에 정의된 순서대로 폴백이 작동한다. 이를 통해 서비스의 안정성을 크게 높일 수 있다.
- 예시 (Router 사용):
# 위의 model_list 정의에서, 'gpt-3.5-turbo-group' 내의 배포 순서가 폴백 순서가 됨 # 첫 번째 배포 (azure/gpt-35-turbo-eastus) 실패 시, # 두 번째 배포 (gpt-3.5-turbo) 로 자동 폴백 # 라우터 생성 (기본 폴백 동작) router = litellm.Router(model_list=model_list, # num_retries=1, # 실패 시 재시도 횟수 (폴백 포함) # allowed_fails=10 # 해당 배포를 일시 제외하기 전 허용 실패 횟수 ) # 호출 시, 첫 번째 모델 실패하면 자동으로 두 번째 모델 시도 response = router.completion( model="gpt-3.5-turbo-group", messages=[{"role": "user", "content": "폴백 테스트"}] ) print(response)
- 예시 (completion 직접 사용):
response = litellm.completion( model=["azure/gpt-4-fails-often", "gpt-3.5-turbo"], # 첫 모델 실패 시 두 번째 모델 사용 messages=[{"role": "user", "content": "폴백 테스트"}], # 필요한 API 키 등은 환경 변수 또는 litellm.api_key = ... 등으로 설정 )
3) 타임아웃 (Timeout)
- 설명: LLM API 호출이 응답을 반환할 때까지 기다리는 최대 시간을 설정하는 기능이다. LLM 응답이 지연되거나 네트워크 문제 발생 시, 무한정 대기하는 것을 방지하고 정해진 시간 내에 실패 처리를 할 수 있게 한다. litellm.completion 또는 router.completion 호출 시 timeout 파라미터를 초 단위로 지정한다.
- 예시:
try: response = litellm.completion( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "타임아웃 테스트"}], timeout=10 # 10초 타임아웃 설정 ) print(response) except litellm.Timeout as e: print(f"API call timed out after 10 seconds: {e}") except Exception as e: print(f"An error occurred: {e}")
4) 태그 기반 라우팅 (Tag-Based Routing)
- 설명: Router에 정의된 각 모델 배포에 특정 '태그(tag)'를 부여하고, API 호출 시 해당 태그를 지정하여 특정 태그를 가진 모델 그룹으로만 요청을 라우팅하는 기능이다. 예를 들어, 'fast' 태그가 붙은 모델 그룹(저렴하고 빠른 모델)과 'quality' 태그가 붙은 모델 그룹(고성능 모델)을 나누어 관리할 수 있다. 호출 시 metadata 파라미터를 사용한다.
- 예시:
model_list = [ { "model_name": "cheap-and-fast", "litellm_params": {"model": "gpt-3.5-turbo", "api_key": os.getenv("OPENAI_API_KEY")}, "metadata": {"tag": "fast"} # 'fast' 태그 지정 }, { "model_name": "high-quality", "litellm_params": {"model": "gpt-4", "api_key": os.getenv("OPENAI_API_KEY")}, "metadata": {"tag": "quality"} # 'quality' 태그 지정 } ] router = litellm.Router(model_list=model_list) # 'fast' 태그가 있는 모델로 라우팅 response_fast = router.completion( model=None, # 특정 모델 그룹 지정 안함 (라우터가 태그로 찾음) messages=[{"role": "user", "content": "빠른 응답 필요"}], metadata={"tag": "fast"} ) print("Fast Response:", response_fast.model) # 사용된 모델 확인 (gpt-3.5-turbo 예상) # 'quality' 태그가 있는 모델로 라우팅 response_quality = router.completion( model=None, messages=[{"role": "user", "content": "고품질 응답 필요"}], metadata={"tag": "quality"} ) print("Quality Response:", response_quality.model) # 사용된 모델 확인 (gpt-4 예상)
5) 예산 기반 라우팅/관리 (Budget-Based Routing/Management)
- 설명: LiteLLM은 모델 또는 사용자별 API 사용 비용을 추적하고, 설정된 예산(budget) 한도에 도달하면 해당 모델/사용자에 대한 요청을 차단하거나 다른 모델로 라우팅하는 기능을 제공한다 (주로 차단 기능이 더 일반적). 이는 예상치 못한 비용 발생을 막고 서비스 운영 비용을 효과적으로 통제하는 데 매우 유용하다. 이 기능은 주로 LiteLLM Proxy 또는 Router의 고급 설정과 연계하여 사용된다. Router에서는 max_budget 파라미터를 모델 또는 전체 라우터 레벨에서 설정할 수 있다.
- 예시 (개념):
# 라우터 설정 시 예산 정의 (예: 월 $10) # router = litellm.Router(model_list=model_list, max_budget=10.0, budget_duration="monthly") # 또는 특정 모델 배포에 예산 설정 # model_list = [ # { ... "max_budget": 5.0, "budget_duration": "monthly" ...}, # { ... "max_budget": 5.0, "budget_duration": "monthly" ...} # ] # router = litellm.Router(model_list=model_list) # 예산 초과 시, 해당 라우터 또는 모델 배포로의 요청은 litellm.BudgetExceededError 발생 try: response = router.completion(...) except litellm.BudgetExceededError as e: print(f"Budget exceeded: {e}") # 예산 초과 시 다른 로직 처리 (예: 사용자에게 알림, 더 저렴한 모델 사용 등)
- 예산 관리는 일반적으로 데이터베이스(예: Redis, PostgreSQL)와 연동하여 사용량 및 비용 정보를 영구적으로 저장하고 추적한다. LiteLLM Proxy는 이러한 기능을 내장하고 있다.
결론
LiteLLM은 다양한 LLM을 통합하고 관리하는 복잡성을 해결해주는 강력하고 유연한 도구이다. 단일 인터페이스를 통해 여러 LLM을 쉽게 사용하고 전환할 수 있으며, 로드 밸런싱, 폴백, 타임아웃, 비용 관리, 고급 라우팅 전략 등 안정적이고 효율적인 LLM 애플리케이션 구축에 필요한 핵심 기능들을 제공한다. 여러 LLM을 활용하거나, 특정 LLM 종속성에서 벗어나 유연한 시스템을 구축하고자 하는 개발자에게 LiteLLM은 훌륭한 선택이 될 것이다.
위의 글은 생성형 AI를 이용하여 생성한 글을 수정한 글입니다.
'빅데이타 & 머신러닝 > 생성형 AI (ChatGPT etc)' 카테고리의 다른 글
바이브 코딩 메뉴얼 - AI 에이전트를 활용한 더 빠르고 스마트한 개발 (0) | 2025.03.27 |
---|---|
LLM 파인튜닝 기법 LoRA에 대한 개념 이해 (1) | 2025.01.24 |
로컬에서 LLM 모델을 실행하기 위한 Ollama, LMStudio (0) | 2025.01.23 |
생성형 AI로 코드 품질을 높이는 방법 (0) | 2025.01.04 |
2024년 LLM 애플리케이션 아키텍쳐 및 2025년 전망 (0) | 2025.01.04 |