İçeriğe geç

Memory Management: Context Limit'e Yaklaşan Conversation

Conversation 100 turn'e ulaştı, context 100K oldu. Eski mesajları silmeli ama cache'i bozmadan. Memory eviction stratejileri.

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

Memory Management: Context Limit'e Yaklaştığında

Bir conversation uzun yaşadıkça context büyür:
  • Turn 1: 15K (system + tools + 1 mesaj)
  • Turn 50: 40K
  • Turn 100: 70K
  • Turn 200: 130K
  • Turn 300: 200K (context limit!)
Ne yapacaksın? Üç strateji var.

Strateji 1: Naif Truncation (Yapma)#

# ❌ KÖTÜ — ilk N mesajı sil if len(conversation) > 200: conversation = conversation[100:] # ilk 100'ü at
Etki:
  • Cache prefix değişti → tüm cache invalid
  • Sonraki turn full cache write
  • Cache hit rate baseline'a düşer
Truncation = cache killer.

Strateji 2: Summarization-Based Compression#

python
def summarize_old_turns(conversation, keep_last=20):
"""İlk N-keep_last turn'ü özetle, son keep_last'ı tut."""
if len(conversation) <= keep_last:
return conversation
 
to_summarize = conversation[:-keep_last]
summary_text = quick_summarize(to_summarize) # küçük model ile
 
# Yeni conversation: özet + son turn'ler
return [
{
"role": "user",
"content": f"[Önceki konuşmanın özeti]\n\n{summary_text}\n\n[Buradan itibaren güncel konuşma]"
},
{
"role": "assistant",
"content": "Anladım, özeti dikkate alarak devam ediyorum."
},
*conversation[-keep_last:],
]
Summarization-based memory compression
Etki:
  • Eski bilgi yoğunlaştırılmış ama korunmuş
  • Yeni conversation cache prefix stabil (summary stabil)
  • Bir sonraki turn cache hit (özet ekleme bir kez)
Maliyet: Summarization için ekstra LLM call. Küçük model (Haiku, gpt-4o-mini) kullan.

Strateji 3: Sliding Window + Attention Sinks#

Modül 5 Ders 34'te attention sinks öğrendik. Multi-turn'de uygulaması:
python
def sliding_window_with_sinks(conversation, keep_initial=2, keep_last=20):
"""İlk N turn (sinks) + son M turn. Ortadakileri at."""
if len(conversation) <= keep_initial + keep_last:
return conversation
 
initial = conversation[:keep_initial] # attention sinks gibi
last = conversation[-keep_last:]
 
# Orta atılıyor — bilgi kaybı var, summarization ile yedeklenebilir
middle_summary = quick_summarize(conversation[keep_initial:-keep_last])
 
return [
*initial,
{"role": "user", "content": f"[Önceki orta kısım özeti]\n{middle_summary}"},
{"role": "assistant", "content": "Özet alındı."},
*last,
]
Sliding window + sinks + summarization
Standart Pattern
Bu pattern'in adı "Memory of Memories" veya "Mem0 pattern". Mem0, LangChain Memory, LlamaIndex Memory hepsi varyasyonlarını kullanıyor.

Karar Matrisi#

Summarization#

✅ Cache-friendly (summary stabil) ✅ Bilgi yoğunlaştırılır ❌ Summarization LLM call cost
Ne zaman: Conversation 100-300 turn'de

Sliding window + sinks#

✅ Daha agresif memory eviction ✅ Çok uzun conversation için tek pratik yol ❌ Detay kaybı yüksek
Ne zaman: Conversation 300+ turn'de

Production Tavsiyeler#

  1. Threshold belirle — context'in %80'i dolunca compress (200K × 0.8 = 160K)
  2. Tetikleyici — context yaklaşırsa otomatik özetle
  3. Frequency — özet üzerine özet yapma; rotation patterns
  4. User awareness — kullanıcı bilsin "5dk önce konuştuklarımız özetlendi" (UI mesajı)

✓ Pekiştir#

Bir Sonraki Derste#

Summarization tekniğini detayda göreceğiz: hangi model, hangi prompt, hangi frequency.

Yorumlar & Soru-Cevap

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

İlgili İçerikler