Files
2nd/10_Wiki/Topics/Coding/AI_Prompt_Caching.md
T
2026-05-09 21:08:02 +09:00

7.1 KiB
Raw Blame History

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
ai
llm
cache
vibe-coding
language applicable_to
TS
Backend
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)

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.

🔗 관련 문서