Büyük Dil Modelleri (LLM'ler) otonom temsilcilerin omurgası haline geldikçe, en kalıcı mühendislik zorluklarından biri bağlam penceresini yönetmektir. Modern modeller giderek daha büyük bağlamları desteklese de, sürekli büyüyen bir geçmişi isteme (prompt) beslemek hesaplama açısından pahalıdır ve genellikle kritik detayların gürültü tarafından sulandırıldığı "ortada kaybolma" (lost in the middle) olgusuna yol açar. Gerçekten durum bilgili (stateful) temsilciler oluşturmak için basit birleştirme yöntemlerinin ötesine geçip akıllı bellek yönetim sistemleri uygulamamız gerekir. Bu yazı, iki kritik stratejiyi inceler: dinamik bellek çürümesi ve özyinelemeli özetleme.
Dinamik Bellek Çürümesini Anlamak
İnsan belleği statik değildir; pekiştirilmedikçe zamanla soluklaşır. Benzer şekilde, AI temsilci mimarilerinde geçmişteki her bilgi parçası eşit ağırlığa sahip değildir. Üç saat önce yaşanan bir konuşma, genellikle üç dakika önce yaşanan bir konuşmadan daha az alakalıdır. Dinamik bellek çürümesi, her bellek öğesine bir "yarı ömür" veya çürüme faktörü atayarak zaman geçtikçe etkisini azaltmayı içerir.
Tüm bağlam vektörlerini eşit şekilde ele almak yerine, eski belleklerin daha düşük ağırlıkla değerlendirildiği bir puanlama sistemi uygulayabiliriz. Bu, temsilcinin yakın geçmişteki etkileşimleri önceliklendirmesini sağlarken, geçmiş olayların silik bir izini de muhafaza etmesine olanak tanır; bu da bağlam penceresini şişirmeden nüanslı uzun vadeli muhakeme yapmayı mümkün kılar.
Python'da Çürüme Uygulaması
Aşağıda, bellek öğeleri için bir çürüme puanının nasıl hesaplanacağına dair basitleştirilmiş bir örnek bulunmaktadır. İlgililik puanını belirlemek için zaman serisi analizinde standart olan bir üstel çürüme fonksiyonu kullanıyoruz.
import time
from typing import List, Dict
class MemoryManager:
def __init__(self, decay_rate: float = 0.99):
self.decay_rate = decay_rate
self.memory_store = []
def add_memory(self, content: str, timestamp: float = None):
if timestamp is None:
timestamp = time.time()
self.memory_store.append({
"content": content,
"timestamp": timestamp,
"score": 1.0
})
def get_context(self) -> str:
current_time = time.time()
context_parts = []
for mem in self.memory_store:
# Çürüme puanını hesapla
time_diff = current_time - mem["timestamp"]
# Üstel çürüme: puan = başlangıç_puanı * (çürüme_oranı ^ zaman_farkı)
decayed_score = mem["score"] * (self.decay_rate ** time_diff)
mem["score"] = decayed_score
if decayed_score > 0.1: # Önemli bellekleri korumak için eşik
context_parts.append(f"[Puan: {decayed_score:.2f}] {mem['content']}")
return "\n".join(context_parts)
# Örnek Kullanım
manager = MemoryManager()
manager.add_memory("Kullanıcı merhaba dedi")
time.sleep(1) # Zamanın geçtiğini simüle et
manager.add_memory("Kullanıcı karmaşık bir soru sordu")
print(manager.get_context())
Uzun Süreli Koruma İçin Özyinelemeli Özetleme
Çürüme, alakayı yönetirken hacim sorununu çözmez. Bellek deposu çok büyük hale geldiğinde, çürüme olsa bile bağlam token sınırlarını aşabilir. İşte burada özyinelemeli özetleme ön plana çıkar. Eski bellekleri silmek yerine, geçmiş etkileşimlerin semantik özünü yakalayan kısa özetlere sıkıştırırız.
Eski veya en az alakalı bellek parçalarını özetlemek için periyodik olarak bir LLM çağırmak, uzun açıklamalı günlükleri yoğun ve bilgilendirici kapsüllere dönüştürmemizi sağlar. Bu strateji, genellikle "bellek yoğunlaştırması" olarak adlandırılır ve temsilcinin tüm ham geçmişi taşımaya gerek kalmadan geçmiş olaylar hakkında soruları yanıtlama yeteneğini korumasını sağlar.
Etkili bir uygulama, geri bildirim döngüsü gerektirir: yeni bilgiler geldiğinde sistem, bellek arabelleğinin bir eşiği aşıp aşmadığını kontrol eder. Aşıyorsa, tekrarlayan girdileri birleştirmek için bir özetleme motoru tetiklenir. Örneğin, "pizza siparişi vermek" hakkında üç ayrı mesaj, "Kullanıcı saat 19:00'da pepperoni pizza siparişi verdi" şeklinde tek bir özetle sıkıştırılabilir.
Sonuç
Güçlü AI temsilcileri oluşturmak, yalnızca bir LLM'yi bir veritabanına bağlamaktan daha fazlasını gerektirir. Durum yönetimine yönelik sofistike bir yaklaşım gerektirir. Dinamik bellek çürümesi uygulayarak, temsilcilerin zamanında bilgileri önceliklendirmesini ve insan dikkat sürelerini taklit etmesini sağlarız. Özyinelemeli özetlemeyi bunun üzerine katmanlayarak, ölçeklenebilirlik sorununu çözer ve temsilcilerin token sınırlarına takılmadan veya aşırı gecikme maliyeti ödemeden uzun oturumlar boyunca çalışmasına olanak tanır.
Temsilci çerçevelerini geliştirmek isteyen geliştiriciler için bu kalıplarla denemeler yapmak öncelik olmalıdır. Basit üstel çürüme ile başlayın ve uygulamanızın bağlam ihtiyaçları büyüdükçe özetleme katmanlarını kademeli olarak ekleyin. Elde edilecek sonuç, yalnızca daha zeka dolu değil, aynı zamanda daha verimli ve maliyet etkin olan temsilciler olacaktır.