Güvenilir sohbet ajanları oluşturmak, mükemmel ilk istemi tasarlamaktan çok, bağlamın zaman içindeki kaotik evrimini yönetmekle ilgilidir. Uzun süreli oturumlarda, Büyük Dil Modelleri (LLM'ler), modelin orijinal kısıtlamalar üzerindeki odağını kademeli olarak kaybetmesine veya kullanıcının değişen niyetini yanlış anlamasına neden olan "bağlam kayması" (context drift) sorunundan mustarip hale gelir. Bu teknik rehber, bu sorunları azaltmak için durum yönetimi ve istem tasarımı konusunda ileri düzey stratejileri ele alır.
Bağlam Kaymasını Anlama
Bağlam kayması, önceki etkileşimlerin kümülatif ağırlığının, modeli kritik başlangıç talimatları yerine son zamanlarda, daha az ilgili jetonları önceliklendirmesine neden olduğu durumda ortaya çıkar. Örneğin, 50 tur süren bir kodlama asistanı oturumunda, model son beş turun belirli bir Python parçasını hata ayıklamaya odaklanması nedeniyle TypeScript strict mode kullanma şeklindeki orijinal gereksinimi unutabilir.
Temel zorluk, LLM'lerin durumdan bağımsız (stateless) olmasıdır. Tüm geçmiş bağlam penceresine geri beslenmedikçe önceki etkileşimleri hatırlamazlar. Bu geçmiş büyüdükçe, dikkat mekanizmaları tutarlılığı korumakta zorlanır ve bu da tutarsız çıktılara yol açar.
Durum Tabanlı İstem Stratejileri
Sadece ham geçmişe güvenmek yerine, yapılandırılmış durum yönetimi uygulamalıyız. Bu, mevcut sohbet bağlamını, kullanıcı tercihlerini ve aktif kısıtlamaları özetleyen ayrı, hafif bir "durum nesnesi"ni sürdürmeyi içerir.
Durum Enjeksiyonu Deseni
Her istemin başına özetlenmiş bir durum enjekte ederek, kritik bilgilerin dikkat çekici kalmasını sağlarız. İşte Python'da pratik bir uygulama:
class ConversationState:
def __init__(self):
self.user_role = "developer"
self.active_constraints = ["use_apis_v2", "python_3.9"]
self.last_topic = "authentication"
def construct_prompt(state: ConversationState, user_input: str, history: list):
# Token sınırlarını aşmamak için geçmişi kısalt
recent_history = history[-3:] if len(history) > 3 else history
state_summary = f"""
[SYSTEM STATE]
Role: {state.user_role}
Constraints: {', '.join(state.active_constraints)}
Last Topic: {state.last_topic}
[/SYSTEM STATE]
"""
# Statik sistem istemini, durumu, son geçmişi ve yeni girdiyi birleştir
prompt_parts = [
"You are a helpful AI assistant. Adhere strictly to the provided state constraints.",
state_summary,
"Recent Dialogue:",
*[f"{h['role']}: {h['content']}" for h in recent_history],
f"User: {user_input}"
]
return "\n".join(prompt_parts)
Dönemsel Özetleme ile Kaymayı Azaltma
Çok uzun oturumlarda, sadece durum enjekte etmek yeterli değildir. Geçmişin kendisi gürültülü hale gelebilir. Sağlam bir çözüm, dönemsel özetlemedir. Her N turda, LLM'i kullanarak tüm sohbet geçmişini öz bir öze sıkıştırın.
Bu özet, bağlam penceresindeki ham geçmişi değiştirir, semantik anlamı korurken jeton sayısını dramatik bir şekilde azaltır. Özet açıkça şunları içermelidir:
- Kullanıcının aldığı ana kararlar.
- Çözülmemiş sorular veya bekleyen görevler.
- Orijinal kısıtlamalardaki herhangi bir değişiklik.
Pratik Örnek: "Çapa" Tekniği
Çapalama (Anchoring), çekirdek talimatların düzenli aralıklarla tekrarlanmasını içerir. Sistem isteminiz belirli bir çıktı formatı tanımlıyorsa, her 5 turda kısa bir hatırlatma tekrarlayın. Bu, modelin dikkatini birincil göreve geri çeken bir "yeniden çapalama" işlevi görür.
# Her 5 turda bir çapa enjeksiyonu örneği
if turn_count % 5 == 0:
prompt += "\n\n[REMINDER: Always output valid JSON. Do not include markdown formatting.]"
Sonuç
Durum ve bağlam kaymasını yönetmek, üretim düzeyi LLM uygulamalarının temel taşıdır. Basit geçmiş birleştirmesinin ötesine geçerek yapılandırılmış durum enjeksiyonu, dönemsel özetleme ve stratejik çapalama kullanarak, geliştiriciler uzatılmış etkileşimler boyunca odaklı, tutarlı ve güvenilir kalan sohbet ajanları oluşturabilir. Modeller daha güçlü hale geldikçe, istem mühendisliği tekniklerimizin inceliğinin paralel olarak evrilmesi gerekir.