Cache-Friendly Mimari: Statik Baş, Dinamik Kuyruk Prensibi
Cache verimi prompt'un yapısına bağlı: hangi parça nerede? Bu derste evrensel "static prefix → dynamic suffix" pattern'i, conversation history yönetimi, RAG chunks placement ve tool definitions sıralaması.
Şükrü Yusuf KAYA
18 dakikalık okuma
Orta🏛 Bir mimari prensibi
Cache verimliliği için evrensel bir kural var: "Statik kısımlar başta, dinamik kısımlar sonda." Cümle basit, ama uygulamada nuans'lar var. Bu derste pattern'i derinlemesine.
Temel Prensip#
Cache, prompt'un başından başlayarak en uzun ortak prefix'i bulur. Statik kısım başta = cache hit; dinamik kısım başta = cache miss.
Yanlış sıralama#
messages = [ {"role": "user", "content": user_query}, # ← DİNAMİK, en başta {"role": "system", "content": SYSTEM}, # ← statik, ama prompt'ta kullanıcıdan sonra ]
Her istekte cache miss.
Doğru sıralama#
messages = [ {"role": "system", "content": SYSTEM + STATIC_KB}, # ← STATİK, başta {"role": "user", "content": user_query}, # ← dinamik, sonda ]
Her istekte system kısmı cache hit.
Conversation History — En Karmaşık Senaryo#
Multi-turn chatbot:
messages = [ {"role": "system", "content": SYSTEM}, {"role": "user", "content": turn1_user}, {"role": "assistant", "content": turn1_assistant}, {"role": "user", "content": turn2_user}, {"role": "assistant", "content": turn2_assistant}, # ... 10 turn {"role": "user", "content": current_query}, ]
Her yeni turn, önceki turn'ler statik (zaten oluştu). Yeni turn dinamik. Doğru sıralama otomatik!
Cache pattern#
İlk istek (turn 1): System cache write
Turn 2: System cache hit, turn 1 dynamic (count olarak küçük)
Turn 3: System + turn 1 cache hit, turn 2 dynamic
...
Her turn, bir önceki tüm history'yi cache'ten alır. Maliyet sadece yeni turn kadar.
Anthropic'te explicit cache_control#
messages = [ { "role": "system", "content": [ {"type": "text", "text": SYSTEM, "cache_control": {"type": "ephemeral"}}, ], }, # History — her assistant turn'ünde cache_control ekle {"role": "user", "content": turn1_user}, { "role": "assistant", "content": [ {"type": "text", "text": turn1_assistant, "cache_control": {"type": "ephemeral"}}, # ← cache after this ], }, {"role": "user", "content": current_query}, # dinamik ]
Bu, "her turn'ün ardından cache breakpoint" pattern'i. Multi-turn cost'u %95 düşer.
RAG Pattern — Statik Kbase + Dinamik Retrieval#
RAG'da iki cache layer'ı var:
Layer 1 — Statik knowledge base (FAQ, manuallar)#
Bu cache'lenir, sürekli yeniden gönderilmez.
Layer 2 — Retrieved chunks#
Per-query farklı. Cache'lenemez (her sorgu farklı chunks).
messages = [ { "role": "system", "content": [ # Cache layer 1 — STATİK {"type": "text", "text": SYSTEM_PROMPT, "cache_control": {"type": "ephemeral"}}, {"type": "text", "text": COMPANY_FAQ + GENERAL_KB, "cache_control": {"type": "ephemeral"}}, ], }, { "role": "user", "content": ( # Layer 2 — DİNAMİK (cache yok) f"RETRIEVED CONTEXT:\n{retrieved_chunks}\n\n" f"QUESTION: {user_query}" ), }, ]
Optimum split#
Retrieved chunks'ı user message'a koy (system'e değil) — böylece cache hit pattern bozulmaz.
Tool Definitions — Cache'in Kara Atı#
Tool definitions input'ta saçma yer kaplar. Cache'leme stratejisi:
Anti-pattern — Conditional tools (cache breaker)#
# YANLIŞ — her isteğin tool listesi farklı, cache miss tools = get_user_specific_tools(user_id) # 5-10 tool, user'a göre değişir response = anthropic.messages.create( tools=tools, messages=[...], )
Doğru pattern — Static tool universe#
# Tüm tool'ları her zaman gönder, model permission'a göre kullanmıyor ALL_TOOLS = sorted([...], key=lambda t: t["name"]) # alfabetik response = anthropic.messages.create( tools=ALL_TOOLS, system=[ {"type": "text", "text": "Permission: " + user_permission, "cache_control": {"type": "ephemeral"}}, {"type": "text", "text": SYSTEM_PROMPT, "cache_control": {"type": "ephemeral"}}, ], messages=[...], )
Permission system prompt'unda yönetilir. Tools list cache hit yapar.
Trade-off#
- Static tool universe: cache hit ✅, ama 5-10 ekstra tool token (model conditional yapsa daha az olurdu)
- Conditional tools: cache miss ❌, ama tool token tasarrufu
Hesap: Multi-turn pattern'lerde cache hit kazanıyor. Tek-turn'lerde conditional tools daha ucuz.
Few-Shot Examples — Statik mi Dinamik mi?#
İki yaklaşım:
A — Statik few-shot (cache-friendly)#
Sabit 3-5 örnek system prompt'unda.
SYSTEM = """... Örnekler: Soru: A → Cevap: A' Soru: B → Cevap: B' Soru: C → Cevap: C' """
✅ Cache-friendly
❌ Dynamic similarity-based not
B — Dynamic few-shot (cache-hostile)#
Embedding-based retrieval ile per-query farklı 3 örnek.
examples = retrieve_similar_examples(user_query, k=3) SYSTEM_FOR_THIS_REQUEST = template.format(examples=examples)
❌ Cache miss her seferinde
✅ Quality lift
Kompromis — Statik few-shot for cache + dynamic supplement in user message#
messages = [ { "role": "system", "content": [ {"type": "text", "text": SYSTEM_WITH_STATIC_EXAMPLES, "cache_control": {"type": "ephemeral"}}, ], }, { "role": "user", "content": ( f"İlgili örnek 1: {dynamic_example_1}\n" f"İlgili örnek 2: {dynamic_example_2}\n\n" f"Sorum: {user_query}" ), }, ]
System part cache'lenir, dinamik examples user message'da kalır. En iyisi her iki dünyadan.
Cache Anti-Pattern'leri — Sakın Yapma#
1. Tarih/saat sistem prompt'unda#
SYSTEM = f"Şu an: {datetime.now()}\n\n..." # her saniye değişir!
Her isteği cache miss. Tarihi user message'a koy ya da modelin built-in capability'sini kullan.
2. Random ID prompt'ta#
SYSTEM = f"Request: {uuid.uuid4()}\n\n..." # her uuid farklı
3. User-specific bilgi system'da#
SYSTEM = f"User name: {user.name}\n\n..." # her user farklı
User bilgisi user message'a koy ya da metadata'ya.
4. Whitespace değişikliği#
SYSTEM = "Sen asistansın.\n\nKurallar..." # \n\n # vs SYSTEM = "Sen asistansın.\n\n\nKurallar..." # \n\n\n — cache miss!
Whitespace'i normalize et.
5. List sıralaması#
tools = [...] # sıralı değil — her dict orderı bozar cache tools = sorted(tools, key=lambda t: t["name"]) # ← her zaman sırala
▶️ Sıradaki ders
7.5 — Cache Hit-Rate Ölçümü ve Optimizasyon Pattern'leri. Cache koydun. %50 hit alıyorsun. %80'e çıkarmak için nasıl debug, nasıl iterate? Dashboard, alarms, A/B test pattern'leri.
Sık Sorulan Sorular
Anthropic'te max 4 breakpoint var. Yaklaşım: en eski turn'leri **summarize** edip system prompt'a koy, son 10 turn'ü literal tut. Modül 14'te agent context management.
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?