176 대규모 언어 모델(LLM) 통합 스케줄링: LiteLLM + LangGraph를 사용하여
요약
다양한 LLM 제조사마다 상이한 API 규격을 LiteLLM과 LangGraph를 활용해 통합 관리하는 방법을 소개합니다. LiteLLM으로 모델 인터페이스를 OpenAI 형식으로 통일하고, LangGraph로 복잡한 에이전트 워크플로우를 제어하여 모델 전환 비용을 최소화합니다.
핵심 포인트
- LiteLLM을 통한 100개 이상의 LLM API 규격 통합
- LangGraph를 활용한 상태 유지형 에이전트 오케스트레이션 구현
- 모델 전환 시 비즈니스 로직 수정 최소화 및 자동 Fallback 구현
- 제조사별 상이한 응답 필드 및 스트리밍 프로토콜 문제 해결
176 대규모 언어 모델(LLM) 통합 스케줄링: LiteLLM + LangGraph를 사용하여 OpenAI/Claude/Qwen/DeepSeek를 원클릭으로 전환하는 방법
새벽 3시, 당신의 AI 애플리케이션이 다운되었습니다. 원인은 OpenAI가
gpt-4o의 응답 필드를 변경했기 때문입니다. 당신의 코드는data.choices[0].message.content로 고정되어 있었는데, 이제 간헐적으로refusal이 반환됩니다. 임시로 Claude로 전환하려고 했더니, Claude의 SDK는 완전히 달라서 코드 17곳을 수정해야 합니다. 운영 담당자는 울음을 터뜨립니다.
이것은 LLM 애플리케이션의 가장 전형적인 고충입니다: 모델 제조사마다 API가 제각각이라 전환 비용이 매우 높다는 점입니다. 본문에서는 IHUI AI가 어떻게 LiteLLM + LangGraph를 사용하여 176개의 모델을 하나의 인터페이스로 통합하고, 원클릭 전환, 자동 다운그레이드(Fallback), 비용 제어를 구현하는지 설명합니다.
1. 페인 포인트(Pain Point): LLM 제조사 API의 「각자도생」
주요 대규모 언어 모델 제조사들은 API가 모두 다릅니다:
| 제조사 | SDK | 필드명 | 스트리밍 프로토콜 | Function Call | 멀티모달 |
|---|---|---|---|---|---|
| OpenAI | openai | choices[0].message.content | SSE | tool_calls | URL/Base64 |
| ... |
실제 상황에서 마주하게 될 지뢰들:
- OpenAI가
content: null+tool_calls(순수 도구 호출)를 반환하는 경우 - Claude는 사고 과정(Thinking process)을
thinking블록에 넣고, 내용은text블록에 넣는 경우 - DeepSeek-Reasoner는
reasoning_content라는 별도의 필드를 가진 경우 - Qwen의
qwen-vl멀티모달 필드명이 다른 모델과 또 다른 경우 - 국산 모델들의 속도 제한(Rate limiting) 전략이 각기 달라 재시도(Retry) 로직을 따로 작성해야 하는 경우
만약 8개 제조사를 연동하려면 8세트의 호출 코드, 8세트의 에러 처리, 8세트의 스트리밍 파싱 로직을 작성해야 합니다. 그렇다면 176개의 모델을 연동한다면 어떨까요? 불가능합니다.
2. 솔루션: LiteLLM 통합 인터페이스 + LangGraph 오케스트레이션
2.1 LiteLLM이란 무엇인가
LiteLLM은 100개 이상의 LLM 제공업체(Provider)를 OpenAI 형식으로 통합해 주는 Python 라이브러리입니다. model 문자열만 바꾸면 하위 모델을 전환할 수 있습니다:
from litellm import completion
# OpenAI
...
반환 구조가 모두 OpenAI 형식으로 통일되므로, 비즈니스 코드를 전혀 수정할 필요가 없습니다.
2.2 LangGraph란 무엇인가
LangGraph는 LangChain에서 출시한 상태 유지형(Stateful) 다단계 Agent 오케스트레이션 프레임워크입니다. LangChain Agent보다 제어력이 높습니다. 블랙박스 형태의 ReAct 방식이 아니라, 상태 머신(State Machine), 노드(Node), 엣지(Edge)를 명확하게 정의할 수 있습니다.
IHUI AI는 LiteLLM을 「모델 액세스 계층(Model Access Layer)」으로, LangGraph를 「비즈니스 오케스트레이션 계층(Business Orchestration Layer)」으로 사용합니다:
사용자 요청 → LangGraph 오케스트레이션(계획/검색/호출/반성)
↓
LiteLLM 통합 인터페이스
...
3. 기술적 세부 사항
3.1 모델의 사전화(Dictionary-ization)
IHUI AI는 모델 사전(apps/ai-service/config/model_dict.yaml)을 유지하며, 각 모델은 완전한 메타데이터를 가집니다:
models:
- id: gpt-4o
provider: openai
...
이 사전은 「단일 진실 공급원(Single Source of Truth)」 역할을 하며, 프론트엔드 모델 선택기, 백엔드 호출 계층, 비용 통계, 다운그레이드 경로 등이 모두 여기서 정보를 읽어옵니다.
3.2 통합 호출 캡슐화
apps/ai-service/src/llm/dispatcher.py:
from litellm import acompletion
from litellm.utils import get_model_info
from typing import AsyncIterator
...
비즈니스 코드는 오직 dispatcher와만 상호작용하며, 대상이 OpenAI인지 Qwen인지 신경 쓰지 않습니다.
3.3 자동 라우팅: 적절한 작업에 적절한 모델 사용
모든 작업에 GPT-4o가 필요한 것은 아닙니다. 간단한 분류에는 gpt-4o-mini를, 수학적 추론에는 deepseek-reasoner를, 중국어 장문에는 qwen-max를, 코드 생성에는 claude-3-5-sonnet을 사용하면 됩니다. IHUI AI는 LangGraph를 사용하여 오케스트레이션(Orchestration) 계층에서 라우팅을 수행합니다:
from langgraph.graph import StateGraph, END
from typing import TypedDict, Literal
...
실전 이점: 간단한 작업을 gpt-4o($2.5/1M token) 대신 gpt-4o-mini($0.15/1M token)로 라우팅함으로써, 비용을 94% 절감하면서도 사용자 경험은 거의 차이가 없습니다.
3.4 스트리밍 통합 (Streaming Unification)
모델마다 스트리밍 프로토콜의 차이가 가장 큽니다. LiteLLM은 모든 스트리밍 응답을 OpenAI의 ChatCompletionChunk 형식으로 통일합니다:
async def stream_chat(model_id: str, messages: list[dict]):
async for chunk in await dispatcher.chat(model_id, messages, stream=True):
# 모든 모델의 delta.content를 통일
...
프론트엔드 SSE(Server-Sent Events)는 통일된 형식을 수신하므로, 더 이상 각 벤더(Vendor)마다 별도의 스트리밍 파서를 작성할 필요가 없습니다.
3.5 비용 제어 (Cost Control)
모델 딕셔너리의 input_price_per_1k / output_price_per_1k는 비용 산정의 기초가 됩니다. 매 호출 시 토큰(Token) 소모량을 기록합니다:
from datetime import datetime
from packages.database import db
...
실전 데이터: 사용자 월간 비용 = Σ(매 호출 시 input × 단가 + output × 단가). 실시간으로 통계를 산출하며, 예산 초과 시 자동으로 저렴한 모델로 다운그레이드합니다.
3.6 다운그레이드 전략 (Degradation Strategy)
IHUI AI의 다운그레이드 체인은 3단계로 구성됩니다:
- 모델 레벨 다운그레이드: 메인 모델이 5xx 에러 또는 타임아웃 발생 시 → 자동으로 폴백(Fallback) 경로로 전환(
gpt-4o→claude-3-5-sonnet→qwen-max). - 기능 레벨 다운그레이드: 사용자가 비전(Vision) 기능을 요구했으나 모든 비전 모델이 작동하지 않을 경우 → 에러를 던지는 대신 「현재 사용 불가」 메시지를 반환.
- 플랜 레벨 다운그레이드: 무료(Free) 사용자 한도 초과 시 → 요청을 거절하는 대신 자동으로
gpt-4o-mini로 전환하여 기본적인 경험을 보장.
async def chat_with_full_fallback(user_id: str, model_id: str, messages: list[dict]):
try:
return await dispatcher.chat_with_fallback(model_id, messages)
...
4. IHUI AI 실전 데이터
| 지표 | 수치 |
|---|---|
| 지원 모델 수 | 176개 |
| ... |
실제 사례: 한 차례 OpenAI의 글로벌 장애 발생 시, 우리의 폴백(Fallback) 체인은 8초 이내에 모든 트래픽을 Claude와 통의(Tongyi)로 전환하여 사용자가 거의 느끼지 못하게 했습니다. 사후 로그 분석 결과, 요청의 96%가 성공적으로 다운그레이드되었으며, 단 4%만이 Anthropic의 속도 제한(Rate Limit)이 동시에 발생하여 실패했습니다.
5. 시행착오 요약 (Lessons Learned)
문제 1: LiteLLM의 model 접두사(Prefix) 규칙
LiteLLM의 model 파라미터에는 접두사 규칙이 있습니다. claude-3-5-sonnet처럼 접두사가 없으면 기본적으로 OpenAI 호환 모드로 동작하며, 네이티브 Anthropic 모델을 사용하려면 반드시 anthropic/claude-3-5-sonnet이라고 작성해야 합니다. 우리의 디스패처(Dispatcher)에는 비즈니스 로직에서 실수를 방지하기 위해 접두사를 일괄 추가하는 로직을 포함했습니다.
문제 2: Claude의 thinking 블록
Claude 3.5 Sonnet에서 확장된 사고(Extended Thinking) 기능을 활성화하면, 응답에 thinking 블록과 text 블록이 포함됩니다. 단순히 content[0].text만 가져오면 사고 과정이 누락됩니다. 우리는 디스패처 계층에서 사고(Thinking) 내용을 별도로 추출하여, 비즈니스 계층에서 선택적으로 소비할 수 있도록 구현했습니다.
문제 3: 중국 모델의 reasoning_content
DeepSeek-Reasoner와 QwQ는 추론 과정(reasoning process)을 content가 아닌 reasoning_content 필드에 담습니다. LiteLLM의 최신 버전에서야 이 부분이 통일되었으며, 구버전에서는 직접 패치(patch)를 적용해야 합니다.
함정 4: 도구 호출(Tool Calling) 필드 차이
OpenAI는 tool_calls를 사용하고, Claude는 tool_use 블록을 사용하며, 통의(Tongyi)는 tools를 사용합니다. LiteLLM이 **입력 파라미터(input parameters)**의 차이는 메워주지만, 특정 경계 사례(edge cases)에서는 반환(return) 구조의 차이가 누락될 수 있으므로 테스트 코드를 작성하여 커버해야 합니다.
6. LiteLLM + LangGraph를 사용하지 말아야 할 때
- 단일 벤더만 사용하는 경우: 해당 벤더의 SDK를 직접 사용하는 것이 더 가볍습니다.
- 모델 수가 5개 미만인 경우: LiteLLM의 이점이 크지 않으며, 직접 래핑(encapsulation)하는 것이 오히려 제어하기 쉽습니다.
- 다단계 추론(multi-step reasoning)이 필요 없는 경우: LangGraph는 상태 기반 오케스트레이션(stateful orchestration) 도구이므로, 단순한 채팅(chat) 용도로 쓰기에는 다소 무겁습니다. 직접
dispatcher.chat()을 사용하는 것으로 충분합니다.
우리가 이 조합을 선택한 이유는 IHUI AI가 '176개 모델 통합 플랫폼'을 지향하며, 첫날부터 10개 이상의 벤더를 지원해야 하기에 통합 인터페이스(unified interface)가 필수적이기 때문입니다.
7. 결론
176개 모델 통합 스케줄링의 핵심은 다음과 같습니다:
- 모델의 사전화(Dictionary-based): 13개의 메타데이터 필드를 통해 프론트엔드/백엔드/통계/폴백(fallback)이 모두 동일한 데이터를 읽습니다.
- 인터페이스 통합: LiteLLM이 벤더 간 차이를 메워주므로, 비즈니스 로직에서는
model문자열만 교체하면 됩니다. - 지능형 라우팅(Intelligent Routing): LangGraph가 오케스트레이션 계층에서 작업 유형에 따라 모델을 선택하여 비용을 78% 절감합니다.
- 3단계 폴백(Fallback): 모델 레벨 / 능력 레벨 / 요금제 레벨의 단계별 폴백을 통해 가용성을 보장합니다.
- 비용 제어: 토큰(token)과 가격을 실시간으로 기록하며, 초과 시 자동으로 폴백합니다.
이 아키텍처를 통해 IHUI AI는 OpenAI의 글로벌 장애 발생 시 8초 만에 트래픽을 전환하여 사용자가 체감하지 못하게 하며, 무료 사용자도 GPT-4o 급의 성능을 사용할 수 있게 하고(저렴한 모델로 지능형 라우팅), 기업 사용자는 코드 한 줄 수정 없이 하나의 API key로 176개 모델을 전환할 수 있습니다.
LLM 애플리케이션을 개발 중이라면, 처음부터 LiteLLM 통합 인터페이스를 사용할 것을 강력히 권장합니다. 나중에 마이그레이션하려면 비즈니스 코드 수백 곳을 수정해야 할 수도 있습니다.
IHUI AI 소개
IHUI AI는 Apache 2.0 오픈 소스인 원스톱 8개 엔드포인트 풀스택 AI 운영체제입니다.
- 🌐 공식 웹사이트: https://aizhs.top
- 💻 GitHub: https://github.com/IHUI-INF-AI/IHUI-AI (Star ⭐ 지원 부탁드립니다)
- 📦 8개 엔드포인트 동일 소스: Web / API / CLI / Desktop / Extension / Mobile / Miniapp
- 🤖 176개 모델: OpenAI / Claude / Gemini / 통의(Tongyi) / DeepSeek / 智谱(Zhipu) / 文心(ERNIE) / 豆包(Doubao) / Kimi / Ollama
- 💰 가격 정책: Free / Pro ¥49/월 / Team ¥199/인/월 / Enterprise ¥2999/월부터
5분 만에 Fork 하여 배포하고, ChatGPT Team + Claude Code + Notion AI를 대체하여 월 $60 이상을 절약하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기