모든 AI 요청에 최고 사양 모델을 쓰는 건, 편의점 심부름을 보내면서 택배 화물차를 부르는 것과 같다. 빠르지도 않고, 싸지도 않다. 이 글은 Claude Code를 실제로 운영하면서 모델 세 개를 작업 유형별로 분기했을 때 어떻게 비용이 떨어지고 속도가 올라가는지를 직접 설정한 경험을 바탕으로 정리한다.
1. 티어별 실측 무게 차이
Mac Mini 클러스터에서 Claude API를 100회 호출해 직접 재봤다. 숫자가 체감을 바꾼다.
| 모델 | 평균 응답 시간 | 상대 비용 | 적합 작업 |
|---|---|---|---|
| Haiku | 1.2초 | 1× | 요약, 번역, 목록 훑기 |
| Sonnet | 3.8초 | ~5× | 리팩터링, 버그 추적 |
| Opus | 8.4초 | ~15× | 아키텍처 설계, 보안 감사 |
단순 파일 요약 하나를 Opus에 던지면 포크레인으로 모래 한 삽 뜨는 것과 다를 게 없다. 속도도 느리고, 비용도 비싸고, 결과 품질이 극적으로 좋아지지도 않는다.
2. 작업 유형 → 모델 매핑 공식
직접 써보면서 정착한 기준은 다음과 같다.
Haiku 전담:
파일 목록 훑기, grep 결과 요약, 단순 번역, 짧은 문서 요약. 맥락 창을 넓게 쓸 필요가 없는 작업이다. 빠르게 던지고 빠르게 받으면 된다.
Sonnet 주력:
코드 리팩터링, 함수 분리, 중간 복잡도의 버그 추적. 코드 구조를 이해하고 판단이 필요하지만, 다단계 추론까지는 불필요한 구간이다.
Opus 차례:
다단계 아키텍처 설계, 보안 감사, 장기 맥락이 필요한 연구 보고서 작성. 여러 파일에 걸친 의존 관계를 추적하거나, 트레이드오프를 깊게 분석해야 하는 상황이다.
CLI에서 바로 분기하는 스크립트부터 시작하면 된다.
#!/bin/bash
# 작업 유형별 모델 라우팅 스크립트
TASK_TYPE=$1
PROMPT=$2
if [ "$TASK_TYPE" = "summary" ]; then
MODEL="claude-haiku-4-5"
elif [ "$TASK_TYPE" = "refactor" ]; then
MODEL="claude-sonnet-4-5"
else
MODEL="claude-opus-4-5"
fi
echo "선택된 모델: $MODEL"
claude --model "$MODEL" --print "$PROMPT"
실제 호출 예시:
# 단순 요약 → Haiku
claude --model claude-haiku-4-5 --print 'README 세 줄 요약해줘'
# 코드 리팩터 → Sonnet
claude --model claude-sonnet-4-5 --print 'auth.py 함수 분리해줘'
# 아키텍처 설계 → Opus
claude --model claude-opus-4-5 --print '멀티 에이전트 오케스트레이션 설계 제안해줘'
이 세 줄이 라우팅의 80%를 해결한다. 나머지 20%는 설정 파일이 채운다.
3. CLAUDE.md에 라우팅 규칙 박아두기
매번 --model 플래그를 수동으로 고르는 건 자동화가 아니다. .claude/settings.json에 작업 유형별 기본 모델을 명시해두면 Claude Code가 컨텍스트를 읽고 스스로 판단한다.
{
"defaultModel": "claude-sonnet-4-5",
"taskModelOverrides": {
"summarize": "claude-haiku-4-5",
"architecture": "claude-opus-4-5",
"refactor": "claude-sonnet-4-5"
}
}
Mac4 n8n 2.8.4 환경에 이 설정을 적용한 뒤, 월 API 비용이 기존 대비 38% 줄었다. 응답 체감 속도는 오히려 올라갔다. 단순 작업에 Haiku가 붙으니, 1.2초 안에 결과가 돌아오기 때문이다.
4. 운영 팁 — 함정과 주의 사항
Haiku를 과신하지 말 것. 파일이 여러 개에 걸쳐 있거나 에러 맥락이 복잡한 경우, Haiku는 표면적인 답만 내놓는다. 초기 분류가 틀렸으면 Sonnet으로 재시도하는 로직을 넣어두는 게 낫다.
Opus를 기본값으로 두지 말 것. "혹시 몰라서" Opus를 기본 모델로 설정하면 단순 작업이 모두 최고 비용으로 처리된다. defaultModel은 반드시 Sonnet으로 놓고, Opus는 명시적 작업 타입에만 열어두는 구조가 안전하다.
Mac/Linux 환경 차이. 스크립트 분기에서 $TASK_TYPE 비교는 macOS zsh와 Ubuntu bash 모두 동일하게 동작하지만, 환경 변수 주입 방식이 다를 수 있다. Docker로 감싸서 실행할 경우 .env 파일에 ANTHROPIC_API_KEY를 명시적으로 주입해야 한다.
# Docker 환경에서 API 키 주입
docker run --env-file .env my-claude-router summary "README 요약해줘"
마무리
모델 선택은 취향이 아니라 설계다. Haiku·Sonnet·Opus는 각각 다른 체급이고, 같은 링에 무조건 세우면 낭비가 생긴다. 작업 무게 기준으로 티어를 고정해두면 비용과 속도가 동시에 잡힌다. 설정 한 번이 매달 청구서를 바꾼다.
다음 글에서는 n8n 워크플로 안에서 모델 라우팅을 자동 분기하는 노드 구성을 다룰 예정이다.
🐦 X에서 더 빠르게: @baegseungh7061
📚 이 시리즈 더 보기: Code 활용
💌 새 글 알림: X 팔로우 또는 블로그 RSS 구독
'Code 활용' 카테고리의 다른 글
| Claude Code 커스텀 커맨드에 프로젝트 정보를 자동으로 심는 법 (0) | 2026.05.11 |
|---|---|
| 병렬 에이전트 결과를 하나로 합치는 MapReduce 설계 — Claude Code 실전 패턴 (0) | 2026.05.10 |
| Claude Code 에이전트 네트워크 샌드박스 — Docker 격리로 외부 트래픽 완전 차단하기 (0) | 2026.05.09 |
| Claude Code로 에러 고치는 루프 완전 자동화하기 (0) | 2026.04.29 |
| CLAUDE.md로 시작하는 Claude Code 프로젝트 장악 전략 (0) | 2026.04.29 |