İçeriğe geç

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

Altı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
messages
array'i kullanır. Aynı kural uygulanır:
python
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üksek
OpenAI'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Ü YAPILANDIRMA
def 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...

İlgili İçerikler