🔥 고급2026-05-166~8분
Prompt Caching 적중률 90%+ 달성: 캐시 구조 설계와 비용 계측
Anthropic의 prompt caching은 잘못 설계하면 적중률 20% 이하로 떨어진다. 캐시 경계 배치 원칙과 TTL 감쇄를 고려한 구조 설계로 토큰 비용을 실질적으로 70% 이상 절감하는 방법을 다룬다.
prompt-cachingcost-optimizationobservability
왜 캐시 적중률이 낮은가
Anthropic prompt caching은 cache_control: {type: 'ephemeral'} 마커를 기준으로 prefix를 캐싱한다. TTL은 5분이며, 캐시는 마커 이전 전체 prefix가 동일할 때만 적중된다. 흔한 실패 모드는 세 가지다.
- 마커를 너무 늦게 배치 — system prompt 끝이 아닌 user turn 직전에 두면, 매 요청마다 user 메시지가 prefix에 포함되어 적중 불가.
- 동적 콘텐츠를 prefix 앞에 삽입 — 타임스탬프, 요청 ID, 사용자 이름을 system 블록 상단에 넣으면 prefix가 매번 달라진다.
- TTL 5분을 초과하는 idle 트래픽 — 저트래픽 시간대에 캐시가 만료되면 다음 요청이 캐시 미스로 full 비용을 부담한다.
캐시 경계 설계 원칙
정적 → 준정적 → 동적 순으로 블록을 쌓고, 각 경계에만 마커를 둔다.
import anthropic
client = anthropic.Anthropic()
STATIC_SYSTEM = """당신은 금융 분석 AI입니다. [2000토큰 분량의 도메인 지식]"""
DOC_CONTEXT = """[검색된 문서 500토큰 — 세션당 고정]"""
def call_with_cache(user_query: str, session_docs: str = DOC_CONTEXT):
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": STATIC_SYSTEM,
"cache_control": {"type": "ephemeral"} # 경계 1: 정적
},
{
"type": "text",
"text": session_docs,
"cache_control": {"type": "ephemeral"} # 경계 2: 준정적
}
],
messages=[{"role": "user", "content": user_query}] # 동적
)
usage = response.usage
cache_hit_ratio = usage.cache_read_input_tokens / max(
usage.cache_read_input_tokens + usage.cache_creation_input_tokens, 1
)
return response, cache_hit_ratio
cache_creation_input_tokens이 0이고 cache_read_input_tokens이 양수면 완전 적중이다. 이 두 필드를 로깅하지 않으면 적중률을 알 수 없으므로 반드시 usage를 계측해야 한다.
비용 계산과 트레이드오프
claude-opus-4-5 기준(2026-05 가격):
- 일반 입력: $15 / 1M tokens
- cache write: $18.75 / 1M tokens (25% 할증)
- cache read: $1.50 / 1M tokens (90% 할인)
손익분기: 동일 prefix로 2회 이상 요청하면 이득. 1500토큰 prefix를 100회 요청하면 cache 없이 $2.25, cache 사용 시 약 $0.25(write 1회 + read 99회). 89% 절감.
단, TTL 5분 내 재요청이 보장되지 않는 배치성 워크플로우에서는 캐시 write 비용만 추가 발생하므로 요청 간격 분포를 먼저 측정해야 한다.
운영 체크리스트
- [ ]
cache_read_input_tokens/(cache_read + cache_creation)를 Datadog/CloudWatch에 전송, 알림 임계값 70% - [ ] 동적 값(타임스탬프, 사용자 ID)은 반드시 user turn 또는 마지막 system 블록 이후에 배치
- [ ] 저트래픽 시간대에는 워밍 요청(더미 쿼리)을 5분 간격으로 전송해 TTL 유지
- [ ] 캐시 경계 변경 시 배포 직후 5분간 cache_creation 급증 여부 모니터링
- [ ] 준정적 문서가 세션 중 변경될 경우 새 session_id로 분리해 별도 캐시 라인 유지