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 min read
IntermediateMemory 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#
- Threshold belirle — context'in %80'i dolunca compress (200K × 0.8 = 160K)
- Tetikleyici — context yaklaşırsa otomatik özetle
- Frequency — özet üzerine özet yapma; rotation patterns
- 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...
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