İçeriğe geç

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
Cache-Friendly Mimari: Statik Baş, Dinamik Kuyruk Prensibi
🏛 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