Cache Invalidation: System Prompt, Tools, FAQ Güncellenirken Stale Cache'ten Kaçınmak
Production'da cache açtın. Bir gün system prompt'u güncellemen lazım — eski cache geçersiz. Bu derste dual-write pattern, gradual rollout, cache versioning ve emergency invalidation.
Şükrü Yusuf KAYA
16 dakikalık okuma
İleri🔄 "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ün | V2 % |
|---|---|
| Day 0 | 5% |
| Day 1 | 25% |
| Day 2 | 50% |
| Day 3 | 80% |
| Day 4 | 100% (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#
- Eski cache'in TTL'i biter (5dk veya 1h içinde)
- Bu sırada maliyet sıçramasını kabul et (kısa süreli)
- 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ı: ~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.
Sık Sorulan Sorular
Hafif. Cache hit ~5ms ekleniyor, cache miss prompt'u tamamen process etmek gerekiyor (~+200-500ms). Update sırasında bir saatlik average latency belki +10-20% artar, kısa süreli normal.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Modül 0: Neden Maliyet, Neden Şimdi?
AI Maliyet Patlaması: 2022'den 2026'ya Token Fiyatları Neden %96 Düştü Ama Faturalar Neden 40 Kat Arttı?
Öğrenmeye BaşlaModül 0: Neden Maliyet, Neden Şimdi?
Birim Ekonomisi Sözlüğü: COGS, Gross Margin, $/User, Contribution Margin — Mühendisin Bilmesi Gereken 9 Finansal Kavram
Öğrenmeye BaşlaModül 0: Neden Maliyet, Neden Şimdi?
Atölyemizin Aletleri: Kurs Boyunca Kullanacağımız 11 Aracın Hızlı Turu
Öğrenmeye BaşlaBağlantılı Pillar Konular