---
id: ai-prompt-caching
title: Prompt Caching — Anthropic / OpenAI / 비용 50-90% 감소
category: Coding
status: draft
source_trust_level: B
verification_status: conceptual
created_at: 2026-05-09
updated_at: 2026-05-09
tags: [ai, llm, cache, vibe-coding]
tech_stack: { language: "TS", applicable_to: ["Backend"] }
applied_in: []
aliases: [prompt cache, ephemeral cache, cache_control, KV cache, context cache]
---

# Prompt Caching

> 큰 system / context 반복 = 비용 폭발. **Anthropic explicit (cache_control), OpenAI implicit (자동), Gemini context cache**. 50-90% 비용 절감 + latency 대폭 감소.

## 📖 핵심 개념
- KV cache: GPU 안 attention values cache.
- 5min TTL (Anthropic ephemeral) / 1h optional.
- 같은 prefix = cached.
- Cache write > read (조금) — 1번 사용해도 보통 이득.

## 💻 코드 패턴

### Anthropic (explicit)
```ts
const r = await anthropic.messages.create({
  model: 'claude-opus-4-7',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: hugeSystemPrompt,  // 10,000 tokens
      cache_control: { type: 'ephemeral' },  // cache 표시
    },
  ],
  messages: [{ role: 'user', content: 'Hello' }],
});

console.log(r.usage);
// { cache_creation_input_tokens: 10000, cache_read_input_tokens: 0, ... }
```

```ts
// 5분 안 다시 호출
const r2 = await anthropic.messages.create({
  model: 'claude-opus-4-7',
  system: [
    { type: 'text', text: hugeSystemPrompt, cache_control: { type: 'ephemeral' } },
  ],
  messages: [{ role: 'user', content: 'New question' }],
});
// usage: { cache_read_input_tokens: 10000, cache_creation_input_tokens: 0 }
// 90% 할인 cached portion
```

### Cache 가능 위치
```
1. system (거대 instruction)
2. tools (큰 list)
3. messages (긴 history) — 마지막 cache_control
```

```ts
// 큰 history 의 마지막 message 에 cache_control
messages: [
  { role: 'user', content: 'first' },
  { role: 'assistant', content: 'response 1' },
  // ... 많은 messages
  {
    role: 'user',
    content: [{ type: 'text', text: 'recent' }],
    // 옛 메시지 (이 위치까지) 모두 cache
    cache_control: { type: 'ephemeral' },
  },
  { role: 'user', content: 'newest question' },
];
```

### Anthropic 가격 (2026 기준)
```
Cache write:  base × 1.25 (write 비용 25% 추가)
Cache read:   base × 0.10 (90% 할인)

→ 2번 이상 사용 = 이득.
   N번 사용 = (N + 0.25) × 0.1 × N×base 절감.
```

### 전형 비용
```
Without cache:
  10K tokens × 100 calls = 1M tokens × $15/M = $15

With cache (1 write + 99 read):
  Write:  10K × $18.75/M = $0.19
  Read:   10K × 99 × $1.5/M = $1.49
  Total:  $1.68

→ 89% 절감.
```

### OpenAI (자동, implicit)
```ts
// 1024+ token prefix 자동 cache (조건 충족 시)
// 자동 50% 할인 cached portion

// 응답
console.log(r.usage);
// { prompt_tokens: 10000, prompt_tokens_details: { cached_tokens: 9000 }, ... }
```

→ 신경 안 써도 자동. 단 Anthropic 만큼 강력 X.

### Gemini context cache
```python
import google.generativeai as genai

cache = genai.caching.CachedContent.create(
    model='gemini-1.5-pro',
    system_instruction='...',
    contents=[Part(text='Long context')],
    ttl='1h',
)

model = genai.GenerativeModel.from_cached_content(cache)
response = model.generate_content('Question')
```

→ 명시적 cache + 1h TTL.

### 활용 case
```
1. RAG context (긴 문서들):
   - System 안 retrieved chunks 큰 → cache
   - 후속 question 에 같은 context

2. Long conversation:
   - 옛 messages cache + 새 message 추가

3. Tool definitions (큰 list):
   - 같은 tools 매번 — cache

4. Few-shot examples:
   - 큰 example set — cache

5. Code review (전체 file):
   - File 큰 → cache
   - 여러 review 질문
```

### TTL 전략
```
Default: 5min
Long: 1h (Anthropic)

→ 5min 안 reuse 가능 = ephemeral.
→ 자주 사용 + 일관 = 1h 이득 더 큼.
```

```ts
cache_control: { type: 'ephemeral', ttl: '1h' }
```

### Cache invalidation
```
Prefix 변경 = miss.
중간 글자 변경 = miss.
순서 변경 = miss.

→ Stable prefix 가 핵심.
```

```ts
// ❌ 매번 다른 timestamp
const system = `Today: ${new Date()}\n${hugePrompt}`;  // 항상 miss

// ✅ Prefix stable
const system = [
  { type: 'text', text: hugePrompt, cache_control: { type: 'ephemeral' } },
  { type: 'text', text: `Today: ${new Date()}` },  // dynamic 끝
];
```

### Multi-cache (4 break points)
```ts
// Anthropic 4 cache_control max
system: [
  { type: 'text', text: companyKnowledge, cache_control: { type: 'ephemeral' } },  // L1
],
tools: [
  ...allTools,
  // 마지막 tool 에 cache_control = 모든 tools cache
],
messages: [
  { role: 'user', content: longHistory, cache_control: { type: 'ephemeral' } },  // L2
  { role: 'user', content: latest },
],
```

→ 다양 layer cache.

### Monitoring
```ts
function logCache(usage: any) {
  metrics.gauge('llm.cache_hit_rate', usage.cache_read_input_tokens / (usage.cache_read_input_tokens + usage.input_tokens));
  metrics.counter('llm.cache_creation_tokens', usage.cache_creation_input_tokens);
}
```

### Semantic cache 와 차이
```
Prompt cache:  같은 prefix (textual) → KV cache 재사용
Semantic cache: 비슷한 query → 답 cache (embedding 비교)

→ 다른 layer. 둘 다 사용 가능.
```

### When NOT to cache
```
- 매번 다른 prompt: 의미 X.
- 작은 prompt (< 1024 token Anthropic): 의미 적음.
- Single-shot (재사용 X): write cost 만.
- 매우 가끔 사용 (5min TTL 만료): miss.
```

### Common 패턴 (Anthropic)
```ts
async function chatWithKnowledge(userMsg: string) {
  return await anthropic.messages.create({
    model: 'claude-opus-4-7',
    max_tokens: 1024,
    system: [
      {
        type: 'text',
        text: COMPANY_KNOWLEDGE,  // 큰 (50K tokens)
        cache_control: { type: 'ephemeral', ttl: '1h' },
      },
    ],
    messages: [{ role: 'user', content: userMsg }],
  });
}

// 첫 호출:    50K write = $0.94
// 후속 호출:  50K read = $0.075
```

### Cost calculator
```ts
function calcCost(usage: Usage, model: string): number {
  const rates = MODEL_RATES[model];
  return (
    usage.cache_creation_input_tokens * rates.cacheWrite +
    usage.cache_read_input_tokens * rates.cacheRead +
    usage.input_tokens * rates.input +
    usage.output_tokens * rates.output
  );
}
```

## 🤔 의사결정 기준
| 상황 | 사용 |
|---|---|
| 큰 system 반복 | Cache (90% 절감) |
| RAG context 다시 | Cache |
| Long conversation | Cache 옛 messages |
| 1회성 prompt | No cache |
| Test eval 매번 다름 | No cache |
| Code review 한 file | Cache file content |

## ❌ 안티패턴
- **매번 다른 prefix (timestamp 시작)**: 항상 miss.
- **1번 사용 + cache write**: 비용 손해.
- **Cache_control 4개 초과 시도 (Anthropic)**: 에러.
- **Cache 가정 + miss 무관심**: bill 이상.
- **Short TTL + 가끔 사용**: 매번 miss.
- **OpenAI 자동 cache 가정 + 1024 미만**: cache X.

## 🤖 LLM 활용 힌트
- Anthropic = explicit (큰 절감).
- OpenAI = 자동 (1024+ 자동).
- Stable prefix 디자인.
- Hit rate monitoring + alert.

## 🔗 관련 문서
- [[AI_LLM_Cost_Optimization]]
- [[AI_RAG_Pattern_Basics]]
- [[AI_Prompt_Engineering_Patterns]]
