AI 코딩 에이전트 실전 (5/5) — 비용 관리: 토큰·캐싱·라우팅
"왜 이렇게 비싸지?"의 답은 거의 항상 어느 토큰이 캐시되지 않았는가에 있다.
핵심 요약
- 비용 4가지 레버: 토큰 단가 / 캐시 적중 / 모델 라우팅 / 컨텍스트 관리
- 1차 자료: Anthropic prompt caching docs, OpenAI prompt caching, Claude Code 가격 페이지
- 가장 강한 단일 레버: prompt caching — 같은 시스템 프롬프트·CLAUDE.md를 매번 캐시 적중시키면 입력 토큰 비용이 ~10%까지 떨어진다
- 조심: Anthropic cache write는 베이스 가격 × 1.25(5분) 또는 × 2(1시간)이다. 적중률이 낮으면 역효과가 나기도 한다
1. 비용은 어디서 발생하는가
LLM 토큰 비용 = (입력 토큰 × 입력 단가) + (출력 토큰 × 출력 단가). 여기에 캐시 상태가 곱해진다.
| 토큰 종류 | 단가 (Claude Sonnet 4.6 예시) | 비고 |
|---|---|---|
| 입력 (cache miss) | 베이스 단가 1.0× | 매번 새로 보낼 때 |
| 입력 (cache write, 5분 TTL) | 베이스 × 1.25 | 캐시 생성 비용 |
| 입력 (cache write, 1시간 TTL) | 베이스 × 2.0 | 더 오래 살리려면 더 비쌈 |
| 입력 (cache hit) | 베이스 × 0.1 | 적중 시 ~10% |
| 출력 | 베이스 × ~5 | 보통 입력보다 5배 비쌈 |
핵심 관찰: - 출력은 입력보다 비싸다 → 모델에게 짧게 답하라고 명시적으로 지시하는 것만으로도 비용 절감. - 캐시 적중은 1/10 비용 → CLAUDE.md / 시스템 프롬프트 / 자주 쓰는 컨텍스트는 반드시 캐시되도록 배치. - 캐시 쓰기는 5분 1.25×, 1시간 2× 배수 → 적중 횟수가 손익분기를 넘어야 이익. 1시간 캐시는 2× 비용이라 최소 4번은 적중해야 본전 (시리즈 C-3편에서 자세히 다룸).
2. 레버 1 — Prompt Caching
가장 강한 단일 레버다. 캐싱 가능한 항목: - 시스템 프롬프트 - CLAUDE.md / 룰 파일 - 자주 쓰는 static 컨텍스트 (도구 정의, 설계 문서)
적용 패턴 (Anthropic):
- API 메시지에 cache_control 표시.
- 블록 단위로 캐시 — 같은 블록을 같은 순서로 보내야 적중.
- 5분 TTL이 기본. Claude Code는 1시간 TTL을 자동 사용하는 것으로 알려져 있다.
자주 하는 실수: - 캐시 블록 앞부분을 매 요청마다 바꿈 → 캐시 미스. 변경되는 부분은 뒤로 빼고, 변경되지 않는 부분을 앞에 캐시. - 1시간 캐시를 적중률 낮은 작업에 씀 → 2× 쓰기 비용을 회수 못 함. - 캐시되는 컨텍스트 자체가 너무 길게 — 캐시는 비용을 나누는 게 아니라 낮추는 것이다. 컨텍스트 자체 길이는 별도 관리.
3. 레버 2 — 모델 라우팅
같은 작업을 항상 가장 비싼 모델로 보낼 필요가 없다.
| 작업 종류 | 적합 모델 | 이유 |
|---|---|---|
| 깊은 추론 / 설계 / 복잡한 디버깅 | Opus 4.7 | 추론 깊이, 비용은 높지만 재시도가 줄어든다 |
| 기본 코드 변경 / 일반 PR | Sonnet 4.6 | 가성비 균형 |
| 간단한 텍스트 작업 / 분류 / 요약 | Haiku 4.5 | 단가가 1/10 수준. 가장 빠름 |
| 백그라운드 모니터링 / 폴링 | Haiku 또는 oMLX 로컬 | 외부 API 호출 자체를 줄임 |
라우팅 룰의 두 축: - 품질 임계: "이 작업이 실패하면 다시 해야 하는가" → 그렇다면 더 비싼 모델. - 레이턴시 허용: "사용자가 5초 안에 답을 받아야 하는가" → 작은 모델 + 캐시.
라우팅은 시리즈 C-2편에서 따로 다룬다. 여기서는 "단일 모델로 모든 작업"이 거의 항상 비싸다는 것만 기억한다.
4. 레버 3 — 컨텍스트 관리
긴 컨텍스트는 모든 토큰에 비용이 든다. 줄이는 4가지 방법:
- 메모리 외부화: 자주 참조하지 않는 정보는 메모리 파일로 빼고, 인덱스(MEMORY.md)만 컨텍스트에 둔다.
- 요약 보고: 서브에이전트는 full output 대신 요약을 돌려준다 (시리즈 4편).
- 자동 압축 (auto-compact): Claude Code는 컨텍스트가 차면 자동으로 압축한다 — 하지만 압축은 결정의 근거를 잃을 수 있다. 중요한 결정 직전에는 수동으로 정리.
- 세션 분리: 한 세션에 너무 많은 작업을 넣지 말고, 작업이 종료되면 새 세션을 시작한다.
5. 레버 4 — 출력 길이 통제
출력 단가는 입력보다 ~5배 비싸다. 출력을 줄이는 방법:
- 명시적 제한: 시스템/스킬 프롬프트에 "report under 200 words", "code only, no explanation" 등.
- 구조화 출력: JSON 스키마, 표, 체크리스트로 받으면 자연스럽게 짧아진다.
- 하나만: "옵션 3개"가 아니라 "최선의 옵션 1개"를 요청 — 비교가 정말 필요한 경우만 다중.
- 이어쓰기 회피: 모델이 자기 답을 재진술하는 패턴(요약 + 결론)을 시스템 프롬프트로 막는다.
6. 모니터링 — 측정 없이는 줄어들지 않는다
비용 관리의 첫 단계는 측정이다.
최소 모니터링 항목: - 일별 토큰 사용량 (입력 / 출력 / 캐시 적중률). - 작업 종류별 비용 분포 (코드 변경 vs 리뷰 vs 문서). - 모델별 사용 비율.
도구:
- Anthropic console의 Usage 페이지에서 일·주·월별 토큰 분해를 볼 수 있다.
- Claude Code는 /cost 슬래시 명령으로 세션 비용을 확인 가능 (CLI 버전).
- 자체 라우팅 시스템을 쓴다면 라우터 로그에 cost 추적을 붙인다.
경험적 신호: cache_hit 비율이 30% 미만이면 캐시 설정을 다시 본다 (앞부분이 매번 바뀌고 있을 가능성).
7. 한눈에 정리
| 레버 | 효과 크기 | 적용 난이도 | 첫 단계 |
|---|---|---|---|
| Prompt Caching | 매우 큼 (1/10) | 中 (블록 배치 재설계) | CLAUDE.md / 시스템 프롬프트를 캐시 |
| 모델 라우팅 | 큼 (작업당 10× 차이) | 中 (작업 분류 룰) | "이 작업에 Opus가 필요한가?"를 자문 |
| 컨텍스트 관리 | 中 (긴 작업일수록 큼) | 低 | 서브에이전트 요약 보고 |
| 출력 길이 | 中 (출력 비용이 입력의 5×) | 低 | 시스템 프롬프트에 길이 제한 |
첫 시작 권장 순서: 1. 시스템 프롬프트 + CLAUDE.md 캐시 적용 (즉시 50%+ 절감 가능) 2. Haiku 라우팅 도입 (간단한 작업부터) 3. 출력 길이 제한 룰 도입 4. 일별 cache_hit 모니터링 시작
시리즈 마무리 — A 시리즈 (5/5)
코딩 에이전트 실전 시리즈는 워크플로우(1편), 도구 비교(2편), MCP(3편), 멀티 에이전트(4편), 비용(5편) 다섯 축으로 묶였다. 각 편의 답이 다른 편의 답을 지원하는 구조다 — 워크플로우가 잡혀야 멀티 에이전트가 의미 있고, 멀티 에이전트가 정착해야 비용 라우팅이 효과를 낸다.
다음 캠페인 (시리즈 C — AI 운영 경제학 4편)이 이 시리즈의 비용 편을 심화한다. 첫 편은 토큰 비용 구조의 실측 함정이다.
참고 자료
- Anthropic, Prompt Caching — docs.claude.com/en/docs/build-with-claude/prompt-caching (2026-05-05 확인).
- Anthropic, Pricing — claude.com/pricing (2026-05-05 확인).
- OpenAI, Prompt Caching — platform.openai.com/docs/guides/prompt-caching (2026-05-05 확인).
- 시리즈 1편(워크플로우), 4편(멀티 에이전트).
이 글은 AI 코딩 에이전트 실전 시리즈의 5/5 편이자 마지막 편입니다.
댓글
댓글 쓰기