핵심 요약
월 $10,000 LLM 비용을 $3,000으로 줄였던 7가지 기법을 정리. 모두 정확도 손실 없이 적용 가능.
1. 프롬프트 캐싱 — 가장 큰 효과
긴 시스템 프롬프트·지식베이스를 캐시. Anthropic·OpenAI 둘 다 90% 할인.
const res = await client.messages.create({
model: 'claude-opus-4-7',
system: [
{ type: 'text', text: '당신은 시니어 개발자.' },
{ type: 'text', text: HUGE_KB, cache_control: { type: 'ephemeral' } },
],
messages: [...],
})
| 비용 | 일반 | 캐시 쓰기 | 캐시 히트 |
|---|---|---|---|
| Claude Opus 4.7 | $5/M | $6.25/M (1.25x) | $0.50/M (0.1x) |
핵심: 동일 시스템 프롬프트를 5분 안에 5번 호출하면 첫 번째만 풀 비용, 나머지는 10%. 5번 호출 시 평균 28%만 지불.
2. Batch API — 50% 할인
실시간 응답 안 필요한 작업은 Batch로 제출 → 24시간 내 결과 + 50% 할인.
// OpenAI Batch API
const batch = await openai.batches.create({
input_file_id: file.id,
endpoint: '/v1/chat/completions',
completion_window: '24h',
})
// Anthropic Message Batches
const batch = await anthropic.messages.batches.create({
requests: [
{ custom_id: 'r1', params: { model: 'claude-sonnet-4-7', ... } },
...
],
})
적합한 워크로드: 대량 분류, 임베딩, 요약, 데이터 정제, 백오피스 분석.
3. 모델 라우팅 — 작업별 최저가 모델
function routeModel(task: Task) {
// 1. 정형화된 분류 — Haiku로 충분
if (task.type === 'classify' && task.tokens < 1000) {
return 'claude-haiku-4-5' // $0.80/M
}
// 2. 일반 코딩 — Sonnet
if (task.type === 'code') return 'claude-sonnet-4-7' // $3/M
// 3. 복잡 추론·대형 컨텍스트 — Opus
return 'claude-opus-4-7' // $5/M
}
실제 수치: 분류 작업의 60%를 Haiku로 보내자 비용 −42%·정확도 −0.3%p.
4. 출력 길이 강제
출력 토큰이 입력보다 5배 비싸다(Anthropic·OpenAI 평균). 출력 한도를 명시하면 절약.
// 안티패턴
"이 코드를 분석하고 설명해줘" // 평균 800 토큰 출력
// 권장
"이 코드를 5줄 이내로 핵심만 설명해줘" // 평균 120 토큰
// 또는 max_tokens 강제
{ max_tokens: 200 }
또한 JSON 모드/Structured Outputs로 형식 고정 — 부가 토큰 제거.
5. 컨텍스트 줄이기 — RAG 정제
"전체 문서 100만 토큰 통째 → 1M 컨텍스트로 답하기"는 비싸다. RAG로 관련 5K 토큰만 골라서 보내면 비용 200분의 1.
// 안티패턴
const allDocs = await loadAllDocs() // 100만 토큰
ask(model, query, allDocs)
// 권장 — 임베딩 검색 후 상위 5개
const top5 = await vectorSearch(query, 5) // ~5K 토큰
ask(model, query, top5)
6. 프롬프트 압축
같은 의도를 더 짧게. 평균 30% 단축 가능.
| 안티패턴 | 권장 |
|---|---|
| "당신은 매우 친절하고 정확한 어시스턴트입니다. 다음 작업을 신중하게 수행해주세요." | "정확하게 답한다." |
| "---"·이모지·과도한 마크다운 | 최소 마크다운 |
| 예시 10개 | 다양한 예시 3개 (실측 후) |
도구: llmlingua·microsoft/LLMLingua — 의미 보존 압축 라이브러리.
7. 캐시 가능한 응답은 자체 캐시
같은 질문이 반복되면 LLM에 또 보내지 말고 자체 캐시. Redis·DynamoDB로.
const key = sha256(model + system + JSON.stringify(messages))
const cached = await redis.get(key)
if (cached) return JSON.parse(cached)
const res = await llm.complete({ ... })
await redis.set(key, JSON.stringify(res), 'EX', 3600)
return res
한국어 자주 묻는 질문(FAQ) 챗봇에서 캐시 히트율 35%, 비용 −34%.
8. 비용 모니터링 — 실시간 알람
// Anthropic Console·OpenAI Usage Dashboard에서
// - 일/주/월 한도 알람 설정
// - 모델별 사용량 분리
// 코드 측 — 토큰 카운터 미들웨어
async function withMetrics(fn: () => Promise<Response>) {
const start = Date.now()
const r = await fn()
metrics.histogram('llm.input_tokens', r.usage.input_tokens)
metrics.histogram('llm.output_tokens', r.usage.output_tokens)
metrics.timing('llm.latency_ms', Date.now() - start)
return r
}
9. 효과 적용 순서 — 우선순위
| 기법 | 난이도 | 예상 절감 |
|---|---|---|
| 프롬프트 캐싱 | 저 | 20~50% |
| 모델 라우팅 | 중 | 20~40% |
| Batch API | 저 | 30~50% (해당 작업만) |
| 출력 길이 제한 | 저 | 10~20% |
| RAG 정제 | 중 | 50~95% |
| 프롬프트 압축 | 중 | 10~30% |
| 응답 캐시 | 저 | 20~40% (반복 쿼리) |
10. 안티패턴
- "항상 가장 비싼 모델" — Haiku로 충분한 분류에도 Opus
- "무한 컨텍스트 = 좋다" — 1M 채우면 비용·지연·정확도 모두 손해
- "캐시 한 번 설정하면 끝" — 5분 TTL이라 호출 패턴이 흩어지면 무효
- "실시간 응답 강박" — 백오피스 작업의 90%는 Batch로 가능
참고
- docs.anthropic.com/en/docs/build-with-claude/prompt-caching
- platform.openai.com/docs/guides/batch

댓글 0