Pratik: Kötü %5 Hit → İyi %92 Hit Dönüşümü
Gerçek bir kod örneği: %5 cache hit rate gösteren bir asistanı %92'ye çıkarmak için 5 değişiklik yapacağız. Her adımda telemetri ve cost gösterimi.
Şükrü Yusuf KAYA
18 min read
IntermediateLab #6: %5 → %92 Cache Hit Rate
Bu lab'de bir Türkçe bankacılık asistanını refactor edeceğiz. Başlangıçta %5 hit rate (felaket), bitirdiğimizde %92.
Senaryo: Banka müşterilerine kart işlemleri yardımı yapan asistan.
Başlangıç — Kötü Versiyon#
python
# ❌ KÖTÜ — Başlangıç durumuimport anthropicfrom datetime import datetimeimport uuid client = anthropic.Anthropic() def handle_user_query(user, query): session_id = uuid.uuid4() # Hatamız 1 current_time = datetime.now().isoformat() # Hatamız 2 system = f"""Bugün: {current_time}Session: {session_id}Kullanıcı: {user.name} ({user.account_type}) Sen XYZ Bankası'nın müşteri hizmetleri asistanısın. Görevin müşterilerekart işlemleri, hesap sorguları ve genel banka soruları konusunda yardımetmek. KURALLAR:1. Müşterinin TCKN'sini doğrulamadan hesap detaylarını paylaşma.2. Her zaman saygılı ve net ol.3. Şüpheli işlem varsa anında müşteri temsilcisine yönlendir. BANKA BİLGİLERİ:[10K token: ürün katalogu, faiz oranları, kampanyalar] KART İŞLEM KURALLARI:[5K token: limit artırma, taksitlendirme, iptal işlemleri]""" tools = [ {"name": "get_account_balance", "description": f"Hesap bakiyesi sorgular. Created: {current_time}", "input_schema": {...}}, # Hatamız 3 # ... 5 tool daha (timestamp'leri var) ] response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=[{"type": "text", "text": system, "cache_control": {"type": "ephemeral"}}], tools=tools, messages=[{"role": "user", "content": query}], ) return response # 100 user sorgu için test# Cache hit rate: ~5% (felaket)Kötü versiyon — birden çok hata bir arada
Hataları Tespit Et#
Bu kodda 5 cache-killer var. Bulabilir misin?
Adım 1 Refactor — Timestamp'i Çıkar#
python · diff modu
Senin kodun
Hedefe karşı diff
+ system = """Sen XYZ Bankası'nın müşteri hizmetleri asistanısın.+ KURALLAR: ...+ BANKA BİLGİLERİ: [10K token]+ KART İŞLEM KURALLARI: [5K token]- system = f"""Bugün: {current_time}- Session: {session_id}- Kullanıcı: {user.name} ({user.account_type})- ..."""++ # Dinamik veriyi user mesajına taşı+ user_msg = f"[User: {user.name}, type: {user.account_type}, time: {current_time}]\n\nSoru: {query}"
Adım 1: Dinamik veriyi user mesajına taşı
Adım 1 Sonucu
Etki: Cache hit rate %5 → %75. System artık stabil, sadece user mesajları dinamik.
Adım 2 — Tool Description'ları Temizle#
python · diff modu
Senin kodun
Hedefe karşı diff
tools = [+ {"name": "get_account_balance", "description": "Hesap bakiyesi sorgular."},- {"name": "get_account_balance", "description": f"Created: {current_time}, ..."},...]
Adım 2: Tool description'ları statikleştir
Adım 2 Sonucu
Etki: Tools artık cache'lenebilir. Hit rate %75 → %82.
Adım 3 — Multi-Breakpoint#
python · diff modu
Senin kodun
Hedefe karşı diff
+ system=[+ # Breakpoint 1: Banka bilgileri + kart kuralları (15K token, 1h TTL)+ {"type": "text", "text": BANK_KB + CARD_RULES, "cache_control": {"type": "ephemeral", "ttl": "1h"}},+ # Breakpoint 3: System instructions (500 token, 5m TTL)+ {"type": "text", "text": ASSISTANT_INSTRUCTIONS, "cache_control": {"type": "ephemeral", "ttl": "5m"}},+ ],+ tools=[+ *TOOLS[:-1],+ # Breakpoint 2: tools cache+ {**TOOLS[-1], "cache_control": {"type": "ephemeral", "ttl": "1h"}},+ ],- system=[{"type": "text", "text": ALL_SYSTEM, "cache_control": {"type": "ephemeral"}}]
Adım 3: 3 breakpoint mimarisi
Adım 3 Sonucu
Etki: Hit rate %82 → %88. Her katman ayrı yaşar, ortak değişimlerden bağımsız.
Adım 4 — Conversation History Cache'i#
python
# Multi-turn senaryoda history'yi cache'ledef handle_turn(user, conversation_history, new_query): if conversation_history: last = conversation_history[-1] history_with_cache = [ *conversation_history[:-1], { **last, "content": [{ "type": "text", "text": last["content"], "cache_control": {"type": "ephemeral", "ttl": "5m"}, # ← Breakpoint 4 }], }, ] else: history_with_cache = [] messages = [ *history_with_cache, {"role": "user", "content": new_query} ] # ... rest of the callAdım 4: 4'üncü breakpoint history için
Adım 4 Sonucu
Etki: Multi-turn senaryolarda hit rate %88 → %92. Conversation büyüse de incremental cache.
Adım 5 — Cache Miss Monitoring#
python
# Cache miss alarmı: hit rate düşerse hemen bilclass CacheTelemetry: def __init__(self): self.cache_creation = 0 self.cache_read = 0 self.input = 0 self.alert_threshold = 0.85 # %85 altına düşerse alarm def record(self, usage): self.cache_creation += usage.cache_creation_input_tokens or 0 self.cache_read += usage.cache_read_input_tokens or 0 self.input += usage.input_tokens @property def hit_rate(self) -> float: total = self.cache_read + self.cache_creation return self.cache_read / total if total > 0 else 0 def check_alert(self): if self.hit_rate < self.alert_threshold: # Slack notification, Sentry, log, vb. print(f"🚨 Hit rate düştü: {self.hit_rate*100:.1f}%") print(f" Cache create: {self.cache_creation}") print(f" Cache read: {self.cache_read}") # Kullanımtel = CacheTelemetry()for query in queries: response = handle_user_query(user, query) tel.record(response.usage)print(f"Toplam hit rate: {tel.hit_rate*100:.1f}%")Adım 5: Monitoring, regression'ları erken yakala
Sonuç Karşılaştırma#
| Adım | Değişiklik | Hit Rate | Maliyet (100 sorgu) |
|---|---|---|---|
| Başlangıç | Hiç refactor yok | %5 | ~$5.20 (felaket) |
| Adım 1 | Timestamp/UUID system'den temizle | %75 | $1.40 |
| Adım 2 | Tool desc'leri statikleştir | %82 | $0.95 |
| Adım 3 | Multi-breakpoint (3) | %88 | $0.62 |
| Adım 4 | Conversation cache (4 BP) | %92 | $0.43 |
| Adım 5 | Monitoring (regression'a karşı) | %92+ kalıcı | $0.43 |
Toplam tasarruf: %92 — 100 sorguda $4.77 → 160 TL tasarruf. Ayda 100K sorgu yapan bir ürün için ayda ~160.000 TL fark.
Aksiyon
Bu 5 adımı senin production'unda da uygula. Çoğu sistem %50-70 cache hit rate'te. Sistematik refactor ile %90+'a çıkarmak 1-2 günlük iş.
✓ Pekiştir#
Bir Sonraki Derste#
Tool definition'ları derinleştireceğiz: 50 tool olan bir agent'ta caching nasıl, hangi sırada, hangi yapıyla?
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
Related Content
1. Temeller — Context Penceresi Ekonomisi
Bu Eğitim Hakkında ve Prompt Caching Neden Önemli?
Start Learning1. Temeller — Context Penceresi Ekonomisi
Token Ekonomisi 101: Input vs Output Cost Asimetrisi
Start Learning1. Temeller — Context Penceresi Ekonomisi