Skip to content

Summarization-Based Memory: Pratik Uygulama

Conversation özetleme tekniğinin production uygulaması. Hangi model, hangi prompt template, ne sıklıkta? Cache friendly summary tasarımı.

Şükrü Yusuf KAYA
11 min read
Intermediate

Summarization-Based Memory

Önceki derste konsept; şimdi production-grade uygulama. 3 karar var:
  1. Hangi model? — summarization için ucuz vs kaliteli
  2. Prompt nasıl? — neyi koru, neyi at
  3. Frequency? — her N turn'de bir mi, threshold'a göre mi?

Karar 1: Hangi Model?#

ModelCost/MKalite (subjective)Latency
Claude Haiku 4.5$1A0.8s
GPT-4o-mini$0.15A1.0s
Gemini 2.5 Flash$0.30A0.5s
Claude Sonnet 4.6$3A+1.5s
Tavsiye: GPT-4o-mini (en ucuz, yeterli kalite) veya Claude Haiku (kaliteli + cache friendly).

Karar 2: Summarization Prompt Template#

python
SUMMARIZATION_PROMPT = """Aşağıdaki müşteri destek diyaloğunun özetini çıkar.
 
YAPMASI GEREKEN:
- Kullanıcının ana taleplerini kısaca listele
- Asistanın verdiği önemli bilgileri kaydet
- Sipariş numaraları, tarihler gibi spesifik bilgileri tut
- Çözülen ve çözülmeyen konuları ayırt et
 
YAPMAMASI GEREKEN:
- Selamlama/küçük talkları özetleme
- Asistanın söylediği jenerik cümleleri (örn. "Yardımcı olabilirim") özetleme
- Markdown veya formatlama (basit metin)
 
Diyalog:
---
{conversation}
---
 
Özet (maksimum 200 token):"""
 
def quick_summarize(conversation):
formatted = "\n".join([f"{m['role']}: {m['content']}" for m in conversation])
response = client.messages.create(
model="claude-haiku-4-5", # ucuz model
max_tokens=300,
messages=[{"role": "user", "content": SUMMARIZATION_PROMPT.format(conversation=formatted)}],
)
return response.content[0].text
Production summarization prompt

Karar 3: Frequency#

İki yaklaşım:

a) Threshold-based#

def maybe_compress(conversation, max_tokens=160_000): current = count_tokens(conversation) if current > max_tokens: return summarize_old_turns(conversation, keep_last=20) return conversation
Avantaj: Sadece gerektiğinde compress. Dezavantaj: Compress anında latency spike.

b) Periodic#

def maybe_compress_periodic(conversation): if len(conversation) > 0 and len(conversation) % 20 == 0: # Her 20 turn'de compress return summarize_old_turns(conversation, keep_last=10) return conversation
Avantaj: Predictable, latency stabil. Dezavantaj: Belki gereksiz compress.
Pratik tavsiye: Threshold + buffer.
max_tokens=140K
ile başlat, threshold aşılınca compress.

Cache Friendly Summary Pattern#

Summary'nin stable olması kritik. Eğer her compress'te summary değişirse cache miss.
# ❌ KÖTÜ — summary her seferinde farklı (random sampling) summary = llm.summarize(conversation, temperature=0.7) # ✅ İYİ — deterministik summary summary = llm.summarize(conversation, temperature=0.0)
temperature=0
ile aynı input → aynı output. Compress 1 kez yapılır, sonraki turn'ler cache hit.
One-Time Cost
Conversation 50 turn'e ulaştı, compress edip cache yeniden inşa ettin. Bu bir kerelik cost. Sonraki 50 turn cache hit. Toplam savings %85+ kalır.

Real-World Pattern: Mem0 Library#

Mem0 açık kaynak memory library:
  • Episodic memory (conversations)
  • Semantic memory (facts extracted)
  • User profile (long-term)
  • LangChain/LlamaIndex integration
İncelemen önerilir — production-grade implementation referansı.

✓ Pekiştir#

Bir Sonraki Derste#

Modül 8 bitirme sınavı.

Yorumlar & Soru-Cevap

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

Related Content