LLM Model Selection Guide: Finding the Optimal Model by Cost vs. Performance
The idea that “you should just use the best model” comes back as a cost bomb in production. In practice, the key is choosing the right model for the task.
Cost and Performance Comparison of Major Models (as of 2025)
| Model | Input ($/1M tokens) | Output ($/1M tokens) | Context | Characteristics |
|---|---|---|---|---|
| GPT-4o | $2.50 | $10.00 | 128K | Multimodal, general-purpose |
| GPT-4o mini | $0.15 | $0.60 | 128K | Lightweight, fast |
| Claude Opus 4.7 | $15.00 | $75.00 | 200K | Best reasoning |
| Claude Sonnet 4.6 | $3.00 | $15.00 | 200K | Balanced, strong at code |
| Claude Haiku 4.5 | $0.80 | $4.00 | 200K | Ultra-lightweight, low latency |
| Gemini 1.5 Flash | $0.075 | $0.30 | 1M | Lowest cost, long-context processing |
Recommended Models by Task Type
Simple Classification and Extraction
from openai import OpenAI
client = OpenAI()
def classify_sentiment(text):
# Sentiment classification is enough with gpt-4o-mini — 17x cheaper than gpt-4o
response = client.chat.completions.create(
model="gpt-4o-mini",
max_tokens=10,
messages=[{
"role": "user",
"content": f"Classify the sentiment of the following text as only one of positive/negative/neutral:
{text}"
}]
)
return response.choices[0].message.content.strip()At 100,000 requests per day, switching from GPT-4o to GPT-4o mini alone can save millions of KRW per month.
Code Generation and Review
import anthropic
client = anthropic.Anthropic()
def review_code(code):
# Claude Sonnet excels at code tasks
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
messages=[{
"role": "user",
"content": f"Find bugs and improvements in the following code:{code}
}]
)
return response.content[0].textComplex Reasoning and Analysis
For business strategy analysis, legal document interpretation, and complex math, use a top-tier model.
def deep_analysis(document):
response = client.messages.create(
model="claude-opus-4-7", # When maximum reasoning capability is needed
max_tokens=4000,
messages=[{"role": "user", "content": document}]
)
return response.content[0].textModel Routing: Automatically Selecting the Right Model
from openai import OpenAI
import json
client = OpenAI()
ROUTER_PROMPT = """Classify the complexity of the following user request.
- simple: simple questions, keyword extraction, translation, summarization
- medium: general writing, code generation, analysis
- complex: complex reasoning, specialized domains, creative work
Return JSON only: {"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"]]In production, introducing routing typically cuts overall costs by 40–60% while keeping quality nearly the same.
Cost Monitoring
COST_PER_1M = {
"gpt-4o": {"input": 2.50, "output": 10.00},
"gpt-4o-mini": {"input": 0.15, "output": 0.60},
"claude-opus-4-7": {"input": 15.00, "output": 75.00},
"claude-sonnet-4-6": {"input": 3.00, "output": 15.00},
"claude-haiku-4-5-20251001": {"input": 0.80, "output": 4.00},
}
def calculate_cost(model, input_tokens, output_tokens):
rates = COST_PER_1M.get(model, {"input": 0, "output": 0})
return (input_tokens * rates["input"] + output_tokens * rates["output"]) / 1_000_000In the next post, we compare the cost structures and ROI of three customization approaches: RAG, Fine-tuning, and prompt engineering.
Nodelog는 모든 콘텐츠의 내용과 출처를 공개 전에 검토합니다. 환경(OS·버전)에 따라 결과가 달라질 수 있는 기술 정보는 공식 문서와 함께 확인하며, 검토 기준과 정정 원칙은 편집 정책에서 안내합니다. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.
Comments
Be the first to comment.