İçeriğe geç

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 dakikalık okuma
Orta

Lab #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ıç durumu
import anthropic
from datetime import datetime
import 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üşterilere
kart işlemleri, hesap sorguları ve genel banka soruları konusunda yardım
etmek.
 
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'le
def 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 call
Adı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 bil
class 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ım
tel = 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ımDeğişiklikHit RateMaliyet (100 sorgu)
BaşlangıçHiç refactor yok%5~$5.20 (felaket)
Adım 1Timestamp/UUID system'den temizle%75$1.40
Adım 2Tool desc'leri statikleştir%82$0.95
Adım 3Multi-breakpoint (3)%88$0.62
Adım 4Conversation cache (4 BP)%92$0.43
Adım 5Monitoring (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...

İlgili İçerikler