7.1 KiB
7.1 KiB
id, title, category, status, source_trust_level, verification_status, created_at, updated_at, tags, tech_stack, applied_in, aliases
| id | title | category | status | source_trust_level | verification_status | created_at | updated_at | tags | tech_stack | applied_in | aliases | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ai-prompt-caching | Prompt Caching — Anthropic / OpenAI / 비용 50-90% 감소 | Coding | draft | B | conceptual | 2026-05-09 | 2026-05-09 |
|
|
|
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)
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, ... }
// 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
// 큰 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)
// 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
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 이득 더 큼.
cache_control: { type: 'ephemeral', ttl: '1h' }
Cache invalidation
Prefix 변경 = miss.
중간 글자 변경 = miss.
순서 변경 = miss.
→ Stable prefix 가 핵심.
// ❌ 매번 다른 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)
// 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
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)
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
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.