İçeriğe geç

Conversation Cache: Growing-Prefix Yapısı + Incremental Caching

Multi-turn chat'lerin doğal yapısı: her turn'de history büyüyor. Bu derste growing-prefix mantığını ve Anthropic incremental caching'i öğreneceksin.

Şükrü Yusuf KAYA
14 dakikalık okuma
Orta

Multi-Turn Conversation: Growing Prefix

Chat asistanları multi-turn. Her turn'de history büyüyor. Naif yaklaşımla her turn'de tüm history yeniden işlenir. Caching ile incremental yapılır.
Bu modülde chat'lerde cache hit rate'i %95+ tutmanın inceliklerini öğreneceğiz.

Growing-Prefix Anatomisi#

Bir chat 5 turn'de geldiyse, context şöyle:
Turn 5'te: [System (statik)] [Tools (statik)] [User msg 1] [Assistant msg 1] [User msg 2] [Assistant msg 2] [User msg 3] [Assistant msg 3] [User msg 4] [Assistant msg 4] [User msg 5] ← dinamik (yeni)
Turn 6'da bu büyür:
[System] ← cache hit [Tools] ← cache hit [User 1] [Asst 1] ← cache hit [User 2] [Asst 2] ← cache hit ... [User 4] [Asst 4] ← cache hit (5 cache write yapılmıştı) [User 5] [Asst 5] ← yeni breakpoint [User 6] ← dinamik
Growing prefix: Her turn'de mevcut prefix'e yeni içerik ekleniyor. Eski prefix değişmiyor.
Doğal Pattern
Bu yapı caching için doğal. Cache prefix sadece büyür, asla shrink veya modify edilmez. Bu nedenle multi-turn caching diğer pattern'lerden daha kolay yüksek hit rate verir.

Anthropic Incremental Cache: Breakpoint Kaydırma#

Her turn'de yeni bir cache_control breakpoint ekleyebilir misin? Hayır — 4 breakpoint limit var.
Çözüm: Breakpoint'i en son tamamlanmış turn'e koy. Her turn breakpoint'i kaydır.
python
def make_request(conversation, new_query):
"""Multi-turn cache: history'nin son turn'üne breakpoint."""
 
# System + tools cache (sabit)
system_blocks = [
{"type": "text", "text": KB, "cache_control": {"type": "ephemeral", "ttl": "1h"}},
]
tools = [*TOOLS[:-1], {**TOOLS[-1], "cache_control": {"type": "ephemeral", "ttl": "1h"}}]
 
# History — son assistant cevabına breakpoint
if conversation:
last_msg = conversation[-1]
history_with_cache = [
*conversation[:-1],
{
**last_msg,
"content": [
{
"type": "text",
"text": last_msg["content"] if isinstance(last_msg["content"], str) else last_msg["content"][0]["text"],
"cache_control": {"type": "ephemeral", "ttl": "5m"},
}
],
},
]
else:
history_with_cache = []
 
# Yeni user query (dinamik)
messages = [*history_with_cache, {"role": "user", "content": new_query}]
 
return client.messages.create(
model="claude-sonnet-4-6",
system=system_blocks,
tools=tools,
messages=messages,
)
Incremental cache: her turn breakpoint kaydır

Telemetri Beklentisi#

Turn 5 sorgu için (önceki 4 turn cache'te):
cache_creation_input_tokens: ~200 (sadece turn 4 assistant cevabı + ufak şeyler) cache_read_input_tokens: ~50.000 (system + tools + ilk 3 turn) input_tokens: 30 (yeni query)
Cache hit rate:
50.000 / (50.000 + 200) = %99.6
. Çok yüksek.

Önemli Nüans: Her Turn 5m TTL Reset#

Anthropic'te cache'in TTL'i her hit'le reset olur:
  • Turn 1: cache write, 5m sayaç başlar
  • Turn 2 (1dk sonra): cache hit, sayaç 5m'ye reset
  • Turn 3 (1dk sonra): hit, reset
  • ...
Yani aktif conversation'da cache hep canlı. Conversation 5dk inaktif kalırsa cache expire ve sonraki turn cache miss.
Inactive User
Inactive timeout problemi: Kullanıcı 5dk düşünüp döndüyse cache miss. Çözüm: 1h TTL (Anthropic 'extended cache'). Modül 11'de break-even hesabı yapacağız.

✓ Pekiştir#

Bir Sonraki Derste#

OpenAI'da multi-turn caching nasıl çalışıyor? Implicit ama farklı pattern.

Yorumlar & Soru-Cevap

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

İlgili İçerikler