Skip to content

Cache Invalidation: Avoiding Stale Cache When Updating System Prompt, Tools, FAQ

You enabled cache in production. One day you need to update the system prompt — old cache is stale. This lesson covers dual-write pattern, gradual rollout, cache versioning, and emergency invalidation.

Şükrü Yusuf KAYA
16 min read
Advanced
Cache Invalidation: System Prompt, Tools, FAQ Güncellenirken Stale Cache'ten Kaçınmak
🔄 "Cache invalidation" — Phil Karlton'ın dediği gibi
"CS'in en zor iki şeyi: cache invalidation ve naming things." Production'da cache kurduğun anda, ileri tarihte invalidation problemiyle karşılaşacaksın. Bu ders sıfır downtime cache update rehberi.

Sorun#

Senaryo:
T=0 : SYSTEM_PROMPT_V1 deploy edildi, cache yazılıyor T=1 : 1000 cache hit, harika T=2 : Bug fix gerekli — SYSTEM_PROMPT_V2 deploy T=3 : Cache hash değişti — tüm istekler cache miss, write yapıyor T=4 : 1 saat boyunca %120 maliyet artışı (cache write storm)
Eğer dikkat etmezsen, bir update maliyeti 2× yapabilir geçici olarak.

Pattern 1 — Dual Write (Aşamalı Geçiş)#

Yeni prompt'u paralel olarak deploy et, eski cache'i tüketirken yeni cache'i ısıt.
ROLLOUT_PCT = int(os.environ.get("V2_ROLLOUT_PCT", "0")) def get_system_prompt(user_id: str): if hash(user_id) % 100 < ROLLOUT_PCT: return SYSTEM_PROMPT_V2 # yeni return SYSTEM_PROMPT_V1 # eski (cache'lenmiş)

Rollout schedule#

GünV2 %
Day 05%
Day 125%
Day 250%
Day 380%
Day 4100% (V1 retired)
Her aşamada hit-rate metriklerini izle. Eski cache'in hit-rate'i düşüyor ama yeni cache'inin hit-rate'i artıyor — kombine maliyet stabil kalır.

Pattern 2 — Prompt Versioning#

System prompt'larını version'lı tut:
# prompts/system_v1.txt # prompts/system_v2.txt # prompts/system_v3.txt class PromptManager: def __init__(self): self.versions = { "v1": open("prompts/system_v1.txt").read(), "v2": open("prompts/system_v2.txt").read(), "v3": open("prompts/system_v3.txt").read(), } self.current = "v3" def get(self, version=None): return self.versions[version or self.current] pm = PromptManager() # Cache hit-rate metric'ı per-version def chat(query, user_id): version = "v3" if hash(user_id) % 100 < 80 else "v2" # gradual sys = pm.get(version) response = anthropic.messages.create( system=[{"type": "text", "text": sys, "cache_control": {"type": "ephemeral"}}], ... ) log_metric(f"cache_hit_{version}", ...) return response

Langfuse Prompt Management#

Langfuse built-in prompt versioning sağlıyor:
from langfuse import Langfuse langfuse = Langfuse() prompt = langfuse.get_prompt("system-assistant", version=3, label="production") SYSTEM_V3 = prompt.compile()
Production label'i v3'e atadığında, tüm istekler v3 alır. v2'de feature-flag rollout yaparsan kontrollü transition.

Pattern 3 — Emergency Invalidation#

Cache'lenmiş bir prompt'ta kritik bug var. Hemen değiştirmek lazım. Aşamalı rollout zamanı yok.

Strateji#

  1. Eski cache'in TTL'i biter (5dk veya 1h içinde)
  2. Bu sırada maliyet sıçramasını kabul et (kısa süreli)
  3. Yeni cache hızla ısınır
# Deploy yeni SYSTEM_V_FIXED # Sleep 0 sec — tüm trafik anında yeni # Cache write storm 5-60dk sürer, sonra normal

Pre-warm ile yumuşat#

Deploy hemen öncesi pre-warmup script çalıştır:
# warmup_after_fix.py async def warmup(): SYSTEM = open("prompts/system_v_fixed.txt").read() for i in range(5): await anthropic.messages.create( model="claude-sonnet-4-6", system=[{"type": "text", "text": SYSTEM, "cache_control": {"type": "ephemeral"}}], messages=[{"role": "user", "content": "test"}], max_tokens=5, ) # Deploy: # 1. Run warmup.py (yeni cache yazıldı) # 2. Flip feature flag/env to V_FIXED # 3. Production trafiği immediately cache hit yapıyor
Maliyet sıçraması: ~0.50(warmup)yerine0.50 (warmup) yerine **50-200** (organik write storm). 100× tasarruf.

Knowledge Base Update Pattern#

FAQ, product catalog gibi statik bilgi günde 1 kez güncelleniyor. Cache pattern:
KB_VERSION = open("kb/version.txt").read().strip() # "2026-05-13" def get_kb_for_today(): """KB'yi günlük yenile, cache'i otomatik refresh.""" today = date.today().isoformat() if today != KB_VERSION: # Rebuild KB new_kb = build_kb_from_source() open("kb/system.txt", "w").write(new_kb) open("kb/version.txt", "w").write(today) def chat(query): kb = open("kb/system.txt").read() response = anthropic.messages.create( system=[ {"type": "text", "text": SYSTEM, "cache_control": {"type": "ephemeral"}}, {"type": "text", "text": kb, "cache_control": {"type": "ephemeral"}}, # ← gün içi sabit ], ... )
Cache 24 saat süresince hit. Gece KB update sonrası cache yenilenir — düşük-trafik saatte cache write storm minimum.

Monitoring — Cache Update Sırasında Ne İzle?#

Update sırasında bu metric'ler crucial:

1. Cache write rate#

SELECT toStartOfMinute(ts) AS minute, sum(cache_creation_input_tokens) AS write_tokens, count() AS requests_with_cache_write FROM llm_telemetry.requests WHERE ts >= now() - INTERVAL 1 HOUR GROUP BY minute ORDER BY minute
Normal: dakika başına az write Update sırasında: spike — beklenen

2. Cost per minute spike#

SELECT toStartOfMinute(ts) AS minute, sum(cost_total_usd) AS cost FROM llm_telemetry.requests WHERE ts >= now() - INTERVAL 2 HOUR GROUP BY minute
Update sırasında 2-3× spike olabilir. 1 saat içinde normalize olmazsa alarm.

3. Hit rate per minute#

SELECT toStartOfMinute(ts) AS minute, sum(cache_read_input_tokens) / (sum(cache_read_input_tokens) + sum(cache_creation_input_tokens) + sum(input_tokens)) * 100 AS hit_pct FROM llm_telemetry.requests WHERE ts >= now() - INTERVAL 2 HOUR GROUP BY minute
Update sırasında hit % düşer, sonra geri yükselir (15-30 dakikada).
🎉 Modül 7 Tamamlandı
Bu modülün özeti: Prompt caching production LLM optimizasyonunun #1 tekniği. 3 sağlayıcı, multi-layer pattern, hit-rate optimization, dual-write update pattern. Doğru uygulanırsa %70-90 maliyet düşüşü, kalite kaybı sıfır. Kursun en güçlü kaldıracı bu modül.
▶️ Modül 8'e geçiyoruz
Modül 8: Doğru Model, Doğru İş — Model Routing & Kaskat. Pahalı modeli her isteğe yollamak yerine: ucuz model dene, başarısızsa pahalıya. %50-70 maliyet düşüşü, accuracy kaybı %1-2. RouteLLM, cascade patterns, embedding-based routing.

Frequently Asked Questions

Slightly. Cache hit adds ~5ms, cache miss requires full prompt processing (~+200-500ms). During update, average latency may increase 10-20% for one hour — short-term normal.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content

Connected pillar topics

Pillar topics this article maps to