Context Window Doldu, Şimdi Ne
Sessizce düşen mesaj en eski olanı

Uzun bir deneme turunda istek birden 400 verdi. Başka bir yerde verdi, ama model ilk kararı unuttu; kullanıcı 'demiştin' dedi, pencere o cümleyi taşımıyordu. İkisi de aynı sınıra çarpıyor.
Pencere bir bellek değil, bir bütçe. Bütçe dolunca bir şey dışarı çıkar. Çıkanı model seçmesin diye ben seçiyorum.
Kırpma sırası
Sistem kalır. Son kullanıcı mesajı kalır. Araç çıktısının ham hali şişmansa özetlenir veya atılır. Ortadaki sohbet turları ilk aday. Bunu tersine çevirip eski sistemi atmak, kişiliği değil, kuralı kaybettirir.
from dataclasses import dataclass
@dataclass
class Msg:
role: str
content: str
def trim(messages: list[Msg], budget: int, estimate=len) -> list[Msg]:
system = [m for m in messages if m.role == "system"][:1]
tail = [m for m in messages if m.role != "system"]
kept = list(system)
acc = sum(estimate(m.content) for m in kept)
for msg in reversed(tail):
cost = estimate(msg.content)
if acc + cost > budget:
continue
kept.insert(len(system), msg)
acc += cost
return kept
estimate burada karakter. Gerçek yolda token sayacı durur. Önemli olan sıra: sondan doldur, sisteme dokunma, bütçeyi aşanı at. Atılanı log'luyorum. Kullanıcıya 'erken mesajlar düştü' demek, modelin uydurmasından dürüst.
Özet tuzağı
Düşen turları özetletmek yer kazandırır. Özet, bir karar cümlesini ters çevirebilir. Karar içeren turu özetletmiyorum; olduğu gibi tutuyorum veya kullanıcıya 'bu kuralı tekrar yaz' diyorum. Özet, renk ve küçük tercih için. Sözleşme için değil.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap