Altın Kural: Static-First, Dynamic-Last
Prompt yapısının golden rule'u. En statik olanı üstte, en dinamik olanı altta. Bu kural caching'in temel pratik kuralı — basit ama her yere uygulanır. Bu derste pratik örneklerle nasıl uygulayacağını göreceksin.
Şükrü Yusuf KAYA
12 min read
IntermediateAltın Kural: Static-First, Dynamic-Last
Tek cümlede tüm caching mühendisliğinin altın kuralı:
En sık değişmeyen kısmı en üste, en sık değişen kısmı en alta yerleştir.
Bu kuralı kavradıysan, %90 caching uzmanı sayılırsın.
Neden Bu Kural Çalışıyor?#
Modül 2 Ders 10'da kanıtladığımız şey: cache prefix-based. Yani prompt'un başından itibaren ne kadarı aynıysa, o kadarı cache'leniyor.
Eğer ilk 100 token aynıysa: 100 token cache hit.
İlk 50K token aynıysa: 50K token cache hit.
İlk karakterde fark varsa: 0 cache hit.
Yani statik kısmı en üste koymak = cache prefix'i uzatmak.
❌ Kötü Yapılandırma#
[User query: dinamik] [Conversation history: değişken] [Tool definitions: stabil] [Knowledge base: statik]
Sonuç: prompt'un EN BAŞINDA dinamik veri → cache miss her istekte.
✅ İyi Yapılandırma#
[Knowledge base: statik] ← cache'lenebilir [Tool definitions: stabil] ← cache'lenebilir [Conversation history] ← incremental cache [User query: dinamik] ← cache yok, OK
Sonuç: prompt'un ilk %95'i cache'lenebilir.
Anthropic Mesaj Yapısı: Doğru Sıra#
Anthropic'te bu kuralı API yapısı zaten zorluyor:
client.messages.create( model="claude-sonnet-4-6", system=[ # 1. en statik (KB, system instructions) {"text": KB, "cache_control": ...}, {"text": INSTRUCTIONS, "cache_control": ...}, ], tools=[ # 2. stabil ama nadir değişir *TOOLS[:-1], {**TOOLS[-1], "cache_control": ...}, ], messages=[ # 3. büyür ama incremental *history[:-1], {"role": "user", "content": [ {"text": history[-1].content, "cache_control": ...} ]}, {"role": "user", "content": NEW_QUERY}, # 4. en dinamik ], )
Bu sıralama "doğal" çünkü Anthropic'in API'si bu pattern'i öneriyor.
OpenAI'da Doğru Sıra#
OpenAI array'i kullanır. Aynı kural uygulanır:
messagespython
messages = [ { "role": "system", "content": KB + "\n\n" + INSTRUCTIONS, # ← statik, en başta }, *conversation_history, # ← büyür ama incremental {"role": "user", "content": NEW_QUERY}, # ← dinamik, en sonda] # OpenAI automatic caching ilk N token'ı hash'leyip cache lookup yapar# Statik üstte olduğu için cache hit rate yüksekOpenAI'da static-first yapısı
Gerçek Örnek: Türkçe E-Ticaret#
İşte gerçek bir e-ticaret asistanının prompt yapısı:
text
═══════════════════════════════════════KATMAN 1 — Knowledge Base (50K token)═══════════════════════════════════════- Ürün kategorileri ve özellikleri- İade politikası (TR yasası)- Kargo süresi & ücret tablosu- SSS dökümanı- Şirket bilgileri[değişim: ayda 1-2 kez] ═══════════════════════════════════════KATMAN 2 — Tool Definitions (2K token)═══════════════════════════════════════- search_orders, track_shipment, ...- 8 tool tanımı[değişim: 3 ayda 1] ═══════════════════════════════════════KATMAN 3 — System Instructions (500 token)═══════════════════════════════════════- "Sen müşteri destek asistanısın..."- Davranış kuralları- Tone of voice[değişim: haftada 1-2 kez] ═══════════════════════════════════════KATMAN 4 — Conversation History═══════════════════════════════════════- User: Sipariş #X- Assistant: ...- User: ...[değişim: her turn] ═══════════════════════════════════════KATMAN 5 — Current User Query═══════════════════════════════════════- Henüz işlenen kullanıcı mesajı[değişim: her istek]Production prompt yapısı — 5 katmanlı
Statik Olmayan Şeyi Statik Hale Getirme#
Bazen "statik gibi görünen" şey dinamik. Çözüm: abstraction.
Örnek: User'a göre kişiselleştirilmiş selamlama:
# ❌ Statik gibi ama dinamik: system = f"Selam {user.name}! Sen bir müşteri destek asistanısın..." # ✅ Gerçek statik: system = "Müşteri destek asistanısın. Kullanıcı bilgilerini her mesajda göreceksin." # Her istekte: messages = [ {"role": "user", "content": f"[Ben: {user.name}, locale: tr-TR]\n\nSoru: ..."} ]
Kullanıcı bilgisini user mesajının başına koyman cache'i kırmaz çünkü user mesajı zaten dinamik.
Pratik: Kötü Prompt'u Yeniden Yapılandır#
python · diff modu
Senin kodun
Hedefe karşı diff
+ # İYİ YAPILANDIRMA- # KÖTÜ YAPILANDIRMAdef make_request(user, query):- current_time = datetime.now().isoformat()return client.messages.create(model="claude-sonnet-4-6",system=[{"type": "text",+ "text": KB,- "text": f"Bugün: {current_time}\nUser: {user.name}\n\n{KB}","cache_control": {"type": "ephemeral"},}],+ messages=[{+ "role": "user",+ "content": (+ f"[User: {user.name}, locale: {user.locale}, "+ f"timestamp: {datetime.now().isoformat()}]\n\n"+ f"Soru: {query}"+ )+ }],- messages=[{"role": "user", "content": query}],)+ # Cache hit rate: ~%95 (KB stabil, dinamik veri user mesajında)- # Cache hit rate: ~%0 (her saniye prompt değişiyor)
Aynı uygulama, %0 vs %95 hit rate
✓ Pekiştir#
Bir Sonraki Derste#
System + tools + few-shot examples sıralaması: hangi sırada koymalı, neden, hangi katmanın değişim hızı diğerlerinden farklı?
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