Claude 모델 셀렉트 — 카테고리 분류에 Opus를 쓰고 있었다
카테고리 분류에 Opus를 쓰고 있었다
Claude Code CLI를 래핑하는 공용 라이브러리(claude-lib)를 만들어서 여러 프로젝트에서 쓰고 있다. 그런데 문제를 발견했다. 모든 호출이 Opus로 실행되고 있었다.
카테고리 분류, 태그 생성 같은 단순 작업도 전부 Opus. Claude CLI의 기본 모델이 Opus이고, 라이브러리에 모델을 지정하는 옵션 자체가 없었기 때문이다.
// 기존 코드 — 모델 지정 불가
const result = await claude.prompt("이 영상을 분류해줘", {
systemPrompt: "카테고리를 분류하세요",
});
// → 항상 Opus 실행 (가장 비싼 모델)
모델 3종의 가격 차이
Claude 모델별 비용 차이는 크다.
| 모델 | 입력 (1M 토큰) | 출력 (1M 토큰) | 용도 |
|---|---|---|---|
| Opus | $15 | $75 | 복잡한 추론, 코딩 |
| Sonnet | $3 | $15 | 분석, 정제, 요약 |
| Haiku | $0.80 | $4 | 분류, 태그, 단순 작업 |
Opus 대비 Haiku는 입력 기준 약 19배 저렴하다. 카테고리 분류에 Opus를 쓰는 건 택시 기본요금 거리를 리무진으로 가는 것과 같다.
해결: 모델 지정 옵션 추가
claude-lib에 model 옵션을 추가했다. 별칭(alias)으로 간단하게 지정할 수 있다.
// 개선된 코드 — 모델 지정 가능
const result = await claude.prompt("이 영상을 분류해줘", {
systemPrompt: "카테고리를 분류하세요",
model: "haiku", // 단순 작업은 Haiku
});
별칭 매핑 테이블:
const MODEL_ALIASES = {
sonnet: "claude-sonnet-4-5-20250929",
opus: "claude-opus-4-6",
haiku: "claude-haiku-4-5-20251001",
};
모델 선택 우선순위는 호출 시 model > 설정 파일 defaultModel > CLI 기본값 순이다. 설정 파일에서 프로젝트 전체 기본 모델을 지정해두고, 특정 호출에서만 오버라이드할 수 있다.
작업별 최적 모델 배분
YTK-Note 프로젝트에 적용한 모델 배분이다.
| 작업 | 모델 | 이유 |
|---|---|---|
| 전문가 심층 분석 | Sonnet | 긴 텍스트 분석, 구조화 필요 |
| 텍스트 정제 | Sonnet | 문맥 이해 + 자연스러운 교정 |
| 요약 생성 | Sonnet | 핵심 추출 + 문장력 |
| 카테고리 분류 | Haiku | 선택지 중 고르기, 단순 |
| 태그 생성 | Haiku | 키워드 추출, 단순 |
| 짧은 요약 | Haiku | 1~2문장, 단순 |
기준은 간단하다. "이 작업에 추론이 필요한가?"
추론이 필요하면 Sonnet, 패턴 매칭 수준이면 Haiku. Opus는 정말 복잡한 코딩이나 깊은 추론이 필요할 때만 쓴다.
테스트 결과
| 테스트 | 모델 | 결과 | 소요시간 |
|---|---|---|---|
| 영상 분석 (5,853자) | Sonnet | 성공 | ~113초 |
| 카테고리 분류 | Haiku | 성공 ("부동산" 정확 분류) | ~6.7초 |
Haiku로 카테고리 분류가 6.7초 만에 정확하게 끝났다. 이전에 Opus로 했을 때와 결과 품질 차이는 없다. 분류 같은 단순 작업에서 비싼 모델은 낭비다.
교훈
기본값이 곧 비용이다. 라이브러리를 만들 때 모델 선택 옵션을 빠뜨린 건 사소한 누락이었지만, 그 기본값이 가장 비싼 모델이었다. 모든 호출에 걸쳐 조용히 비용을 쌓고 있었다.
AI API를 래핑하는 라이브러리를 만든다면, 모델 선택은 첫 번째로 구현해야 할 옵션이다. 기본값에 의존하면 비용은 보이지 않는 곳에서 새어나간다.