⚡ 중급2026-05-206분
토큰 예산을 설계하면 비용이 절반으로 줄어든다
입력·출력 토큰을 의도적으로 제어하는 전략을 익히면 품질을 유지하면서 API 비용을 대폭 절감할 수 있다. 컨텍스트 창을 낭비 없이 채우는 실전 기법을 다룬다.
token-managementcost-optimizationprompt-caching
왜 토큰 관리가 중급의 핵심인가
기초 단계에서는 프롬프트를 그냥 길게 쓰는 경향이 있다. 하지만 토큰은 곧 비용이고, 컨텍스트 창의 앞쪽과 뒤쪽에 위치한 내용이 모델 주의도에 훨씬 큰 영향을 미친다는 연구 결과가 있다("Lost in the Middle" 현상). 토큰을 전략적으로 배치하면 비용과 품질을 동시에 잡을 수 있다.
입력 토큰 절감 3가지 전략
1. 시스템 프롬프트 캐싱 활용
반복 호출 시 동일한 시스템 프롬프트는 cache_control을 붙여 프롬프트 캐시를 활성화한다. Anthropic 기준 캐시 히트 시 입력 토큰 비용이 90% 감소한다.
2. 불필요한 컨텍스트 청소
대화 히스토리가 쌓이면 중간 턴의 장황한 내용을 요약 메시지 1개로 교체한다. 전체 히스토리를 그대로 넘기는 것은 토큰 낭비의 주범이다.
3. max_tokens로 출력 상한 고정
짧은 답변만 필요한 작업(분류, 예/아니오 판단)에 max_tokens=50처럼 낮게 설정하면 출력 토큰을 직접 제어할 수 있다.
코드로 보는 캐시 + 토큰 제어
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const SYSTEM_PROMPT = `
당신은 고객 문의를 분류하는 전문가입니다.
카테고리: [결제, 배송, 환불, 기술지원, 기타]
반드시 카테고리 이름 하나만 반환하세요.
`.trim();
async function classifyInquiry(userMessage: string): Promise<string> {
const response = await client.messages.create({
model: "claude-haiku-4-5",
max_tokens: 20, // 분류 작업이므로 출력 토큰 최소화
system: [
{
type: "text",
text: SYSTEM_PROMPT,
cache_control: { type: "ephemeral" }, // 시스템 프롬프트 캐싱
},
],
messages: [{ role: "user", content: userMessage }],
});
// 사용 토큰 모니터링
const usage = response.usage;
console.log({
inputTokens: usage.input_tokens,
outputTokens: usage.output_tokens,
cacheCreation: (usage as any).cache_creation_input_tokens ?? 0,
cacheRead: (usage as any).cache_read_input_tokens ?? 0,
});
return response.content[0].type === "text" ? response.content[0].text : "기타";
}
// 동일 시스템 프롬프트로 반복 호출 → 2번째부터 캐시 히트
await classifyInquiry("주문한 상품이 아직 안 왔어요");
await classifyInquiry("결제가 두 번 됐습니다");
토큰 비용 설계 체크리스트
- [ ] 시스템 프롬프트가 1,024 토큰 이상이면
cache_control적용 여부 확인 - [ ] 분류·추출 등 단답 작업에
max_tokens를 50 이하로 설정했는가 - [ ] 멀티턴 대화에서 히스토리가 10턴을 넘으면 중간 요약으로 압축했는가
- [ ]
usage필드를 로깅해 실제 소비 토큰을 주기적으로 모니터링하는가 - [ ] 긴 문서 첨부 시 핵심 청크만 선별해 넣고 있는가(전문 붙여넣기 지양)