본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 23. 00:46

간단한 라우터(Router)를 통해 LLM API 비용을 80% 절감한 방법

요약

LLM API 비용을 절감하기 위해 쿼리의 복잡도를 분류하여 적절한 모델로 전달하는 라우터 구현 방법을 소개합니다. 단순 쿼리는 저렴한 모델로, 복잡한 쿼리는 고성능 모델로 배정하고 캐싱을 결합하여 비용을 최대 80%까지 절감할 수 있습니다.

핵심 포인트

  • 쿼리 복잡도에 따라 GPT-4o mini와 Claude Sonnet을 분기 처리
  • 단순한 규칙 기반의 Python 함수로 효율적인 라우팅 구현 가능
  • 캐시 레이어를 추가하여 중복 요청에 대한 비용 추가 절감
  • 트래픽 변화 없이 모델 최적화만으로 API 청구액 대폭 감소

거창한 인프라는 필요 없습니다. 적절한 쿼리에 적절한 모델을 선택해 주는 단 50줄의 Python 함수만 있으면 됩니다.

지난달 제 LLM API 청구액은 340달러였습니다. 이번 달은 67달러입니다.

트래픽은 동일합니다. 제품도 동일합니다. 유일한 변화는 GPT-4o mini가 충분히 처리할 수 있는 요청을 Claude Sonnet으로 매번 보내지 않도록 하는 간단한 라우터(Router)를 추가한 것뿐입니다.

정확히 어떻게 작동하는지 설명하겠습니다.

문제점
프로토타입을 만들 때는 하나의 모델을 선택해 모든 곳에 하드코딩합니다. 보통 빠른 결과물을 원하기 때문에 GPT-4o나 Claude Sonnet 같이 성능이 뛰어난 모델을 선택하곤 합니다.

그러다 제품을 출시하고 트래픽이 늘어나면, 인생의 선택을 의심하게 만드는 청구서를 받게 됩니다.

문제는 모든 쿼리에 플래그십(Flagship) 모델이 필요하지는 않다는 점입니다. 전형적인 RAG 앱의 경우:

"환불 정책이 무엇인가요?" → GPT-4o mini가 충분히 처리 가능
"이 5개의 상충하는 문서들을 요약하고 주요 이견을 식별하세요" → Sonnet 필요

당신은 환불 정책 질문에 대해 Sonnet 가격을 지불하고 있습니다. 그것이 바로 버그(Bug)입니다.

해결책: 복잡도 라우터 (Complexity Router)

import anthropic  
from openai import OpenAI

openai_client = OpenAI()  
anthropic_client = anthropic.Anthropic()

def classify_complexity(query: str) -> str:  
    """'simple' 또는 'complex'를 반환합니다."""
    simple_indicators = [  
        len(query.split()) < 15,  
        query.endswith("?") and query.count("?") == 1,  
        not any(w in query.lower() for w in [
            "compare", "analyze", "summarize", "explain why",  
            "difference between", "pros and cons", "evaluate"  
        ])  
    ]  
    return "simple" if sum(simple_indicators) >= 2 else "complex"

def route(query: str, context: str = "") -> str:  
    complexity = classify_complexity(query)

    if complexity == "simple":
        # $0.15/M input — GPT-4o mini
        response = openai_client.chat.completions.create(
...

캐시 레이어(Cache Layer) 추가
라우터만으로도 약 50%를 절감했습니다. 캐시(Cache)를 추가하자 절감 폭이 80%까지 늘어났습니다.

import hashlib  
import json  
from functools import lru_cache

# 프로덕션 환경에서는 Redis를 사용하세요. 프로토타이핑 단계에서는 이 방식도 괜찮습니다.

_cache: dict = {}
def get_cache_key(query: str, context: str) -> str:  
    payload = json.dumps({"q": query, "c": context}, sort_keys=True)  
    return hashlib.sha256(payload.encode()).hexdigest()

def route_cached(query: str, context: str = "") -> str:  
    key = get_cache_key(query, context)

if key in _cache:
    return _cache[key]  # 무료

...

결과적으로 제 앱의 쿼리 중 약 30%가 거의 동일하다는 사실을 발견했습니다. "영업시간이 어떻게 되나요?"와 같은 질문은 끊임없이 들어옵니다. 하루에 200번이나 동일한 LLM 호출에 비용을 지불하는 것은 그저 돈을 태우는 것과 같습니다.

실시간 비용 로깅 (Logging Costs in Real Time)
측정할 수 없는 것은 최적화할 수 없습니다. 저는 각 호출에 정확히 얼마의 비용이 드는지 알 수 있도록 비용 추적 기능을 추가했습니다:

COST_PER_1K_TOKENS = {
"gpt-4o-mini": {"input": 0.000150, "output": 0.000600},
"claude-sonnet-4-6": {"input": 0.003000, "output": 0.015000},
}

def calculate_cost(model: str, input_tokens: int, output_tokens: int) -> float:
rates = COST_PER_1K_TOKENS.get(model, {"input": 0, "output": 0})
return (input_tokens * rates["input"] + output_tokens * rates["output"]) / 1000

def route_with_logging(query: str, context: str = "") -> dict:
complexity = classify_complexity(query)
model = "gpt-4o-mini" if complexity == "simple" else "claude-sonnet-4-6"

if complexity == "simple":
    response = openai_client.chat.completions.create(
        model=model,
...

출력 샘플:

[gpt-4o-mini] simple | $0.00008 | 영업시간이 어떻게 되나요?...
[claude-sonnet-4-6] complex | $0.00340 | 환불 정책을 비교해 주세요...
[gpt-4o-mini] simple | $0.00006 | 비밀번호를 어떻게 재설정하나요?...

30일 후의 결과

지표적용 전적용 후
쿼리당 평균 비용$0.0034$0.0007
mini 모델 사용 쿼리 비율0%73%
캐시 히트율 (Cache hit rate)0%31%
월간 청구 금액$340$67
답변 품질 불만 건수23

품질 차이는 무시할 수 있는 수준이었습니다. 한 달 동안 세 명의 사용자가 답변이 얕다고 느꼈다고 말했지만, 세 명 모두 어차피 캐싱했어야 했을 단순한 사실 기반 쿼리였습니다.

이 방식이 작동하지 않는 경우
한계점에 대해 솔직해져야 합니다:

창의적 글쓰기 / 긴 형식의 콘텐츠 (long-form content) — 미니 모델(mini models)은 이 부분에서 어려움을 겪으므로, 이런 요청은 하위 모델로 라우팅하지 마세요.
다중 문서 합성 (Multi-document synthesis) — 항상 성능이 뛰어난 모델로 라우팅하세요.
리스크가 큰 모든 분야 (의료, 법률, 금융) — 여기서는 비용을 최적화하지 말고, 가장 우수한 모델을 사용하세요.
위의 classify_complexity 함수는 의도적으로 단순하게 설계되었습니다. 여러분은 저보다 자신의 쿼리 패턴을 더 잘 알고 있습니다. 키워드 리스트를 여러분의 도메인에 맞게 조정하세요.

다음 단계
이 모든 작업을 수행하기 전에, 현재 비용을 모델링하여 돈이 실제로 어디로 나가고 있는지 파악하세요. 저는 APICalculators의 LLM 비용 계산기(LLM cost calculator)를 사용했습니다. 무료이며 가입이 필요 없고, 실제 토큰 사용량에 따른 모델별 비용을 보여줍니다. 모델 간의 차이(delta)를 알게 되면 어떤 최적화를 우선시해야 할지가 명확해집니다.

질문이 있거나 여러분에게 효과적이었던 다른 라우팅 방식이 있나요? 댓글로 남겨주세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0