LLM 모델 선택 가이드: 비용 대비 성능으로 최적 모델 찾기
"가장 좋은 모델을 쓰면 되지 않나?"라는 생각은 프로덕션에서 비용 폭탄으로 돌아옵니다. 실제로는 태스크에 맞는 모델을 고르는 것이 핵심입니다.
현재 모델을 확인하고 실제 요청으로 비교하기
모델 이름·지원 범위·단가는 바뀝니다. 2026-09-30 확인 기준, 후보를 고르기 전에 각 공급사의 모델 목록과 가격표를 다시 확인하고 평가 결과에 모델 버전과 가격 확인일을 함께 기록하세요.
같은 평가 세트에서 품질·형식 준수율·p95 지연·1,000건당 비용을 비교합니다. 아래 모델 ID는 라우팅 구조 예시이며 계정에서의 사용 가능 여부를 확인한 뒤 호출해야 합니다.
태스크 유형별 추천 모델
단순 분류·추출
from openai import OpenAI
client = OpenAI()
def classify_sentiment(text):
# 감성 분류는 gpt-4o-mini로 충분 — gpt-4o 대비 — 가격 차이는 현재 가격표로 확인
response = client.chat.completions.create(
model="gpt-4o-mini",
max_tokens=10,
messages=[{
"role": "user",
"content": f"다음 텍스트의 감성을 positive/negative/neutral 중 하나로만 답하세요:\n{text}"
}]
)
return response.choices[0].message.content.strip()코드 생성·리뷰
import anthropic
client = anthropic.Anthropic()
def review_code(code):
# 코드 태스크는 Claude Sonnet이 강점
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
messages=[{
"role": "user",
"content": f"다음 코드의 버그와 개선점을 찾아주세요:\n{code}"
}]
)
return response.content[0].text복잡한 추론·분석
사업 전략 분석, 법률 문서 해석, 복잡한 수학 풀이는 최상위 모델을 씁니다.
def deep_analysis(document):
response = client.messages.create(
model="claude-opus-4-7", # 최고 추론력 필요 시
max_tokens=4000,
messages=[{"role": "user", "content": document}]
)
return response.content[0].text모델 라우팅: 자동으로 적절한 모델 선택
from openai import OpenAI
import json
client = OpenAI()
ROUTER_PROMPT = """다음 사용자 요청의 복잡도를 분류하세요.
- simple: 단순 질문, 키워드 추출, 번역, 요약
- medium: 일반적인 글쓰기, 코드 작성, 분석
- complex: 복잡한 추론, 전문 도메인, 창의적 작업
JSON으로만 반환: {"complexity": "simple|medium|complex"}"""
MODEL_MAP = {
"simple": "gpt-4o-mini",
"medium": "claude-sonnet-4-6",
"complex": "claude-opus-4-7"
}
def route_and_run(user_query):
routing = client.chat.completions.create(
model="gpt-4o-mini",
max_tokens=50,
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": ROUTER_PROMPT},
{"role": "user", "content": user_query}
]
)
route = json.loads(routing.choices[0].message.content)
return MODEL_MAP[route["complexity"]]비용 모니터링
현재 입력·출력 단가를 글 밖의 설정에 보관하고 출처와 확인일을 기록합니다. 알 수 없는 모델의 비용을 0으로 처리하지 마세요.
def calculate_cost(input_tokens, output_tokens, input_rate_per_m, output_rate_per_m):
return (input_tokens * input_rate_per_m + output_tokens * output_rate_per_m) / 1_000_000후보 모델을 우리 데이터로 비교하는 평가 절차
공개 벤치마크 순위는 우리 업무의 입력 형식·언어·출력 규격을 반영하지 않습니다. 모델 선택이 틀어지는 가장 흔한 원인이 여기에 있습니다.
재현 가능한 평가 설계
- 실제 요청 로그에서 100~200건을 뽑아 개인정보를 제거하고, 정답 또는 채점 기준을 붙입니다. 한국어 요청 비율과 긴 입력 비율이 실제와 비슷해야 합니다.
- 모든 후보에 같은 시스템 프롬프트와 같은 출력 형식 지시를 사용합니다.
- 정확도, 형식 준수율(JSON 파싱 성공 등), p95 지연, 1,000건당 비용을 함께 기록합니다.
import json, time
def run(model, cases):
ok = fmt = 0; lat = []; tok_in = tok_out = 0
for c in cases:
t = time.time(); r = call_llm(model, c["input"]) # 공통 래퍼
lat.append(time.time() - t)
tok_in += r.usage.input_tokens; tok_out += r.usage.output_tokens
try: out = json.loads(r.text); fmt += 1
except ValueError: continue
ok += grade(out, c["expected"])
lat.sort()
return {"acc": ok/len(cases), "format": fmt/len(cases),
"p95": lat[int(len(lat)*0.95)-1], "tokens": (tok_in, tok_out)}비용은 기록한 토큰 수에 각 공급사의 현재 공시 단가를 곱해 계산합니다(단가는 자주 바뀌므로 코드에 고정하지 말고 설정으로 분리).
해석
- 정확도 차이가 작다면 형식 준수율과 지연, 비용이 결정 요인입니다.
- 특정 유형에서만 차이가 크면 그 유형만 상위 모델로 보내는 라우팅이 합리적입니다.
재발 방지
- 모델 버전을 스냅샷 이름으로 고정하고, 새 버전이 나오면 같은 평가 세트로 다시 돌린 뒤 교체합니다.
코드 검증 범위 (2026-09-30)
Python 3.14.6에서 코드 블록의 문법을 ast.parse로 확인했습니다. 외부 SDK 호출·실제 서비스 연결·성능 수치는 이 검사에 포함되지 않습니다. 예시의 의존성과 모델 사용 가능 여부는 실행 환경에서 별도 확인해야 합니다.
공식 참고: OpenAI model catalog, OpenAI pricing.
글마다 출처와 확인 범위가 다릅니다. 아래에 확인일·확인 범위·출처가 기록된 글만 그 범위에서 확인된 것입니다. 기록이 없는 글은 적용 전 사용 중인 버전의 공식 문서로 직접 확인하고, 오류는 이메일로 알려주세요. 편집 정책 · 이메일로 제보
이 글에는 사람이 확인한 날짜·범위 기록이 아직 없습니다.
댓글
첫 번째 댓글을 남겨보세요.