Kırılgan yapay zeka ajanlarının çağı sona eriyor. Geleneksel LLM geliştirmede, başarısız bir API çağrısı veya halüsinasyonlu bir yanıt genellikle sert bir çökme veya sessiz bir hataya yol açar. Ancak modern ajan çerçeveleri, bu kesintileri zarif bir şekilde yönetecek şekilde evrim geçiriyor. DSPy (Declarative Self-improving Programming in Python), istem mühendisliğini bir optimizasyon sorunu olarak ele alarak çalışma zamanı hatalarına gerçek zamanlı olarak uyum sağlayan kendini onaran ajanların oluşturulmasını sağlayan güçlü bir kütüphane olarak öne çıkıyor.
Bu gönderi, DSPy'nin beyan edici yaklaşımını kullanarak sağlam hata kurtarma mekanizmaları ve uyarlanabilir istemleme stratejileri uygulamak için nasıl kullanılabileceğini, ajanlarınızın üretim ortamlarında güvenilir kalmasını sağlamak için inceliyor.
Dinamik Ortamlarda Geleneksel İstemlemenin Neden Başarısız Olduğu
Statik istemler kırılgandır. Bir LLM, açıkça eğitilmediği veya istemlenmediği bir kenar durumuyla karşılaştığında halüsinasyon üretebilir, biçimsiz JSON döndürebilir veya doğru aracı çağırmada başarısız olabilir. Ajan zincirinde, bu tek bir başarısızlık tüm iş akışını bozacak şekilde kaskat etkisi yaratabilir. Manuel hata ayıklama, try-catch blokları ve yeniden deneme mantığını sabit kodlamayı içerir; bu da ölçeklendirmede sürdürülebilir değildir. DSPy, sistemi performans metriklerine dayalı olarak uygulamayı optimize etmesine olanak tanıyarak mantığı (imza) uygulamadan (istem) ayırarak bunu çözer.
DSPy'de Dayanıklı İmzaların Tanımlanması
DSPy'nin çekirdeğinde, bir modülün girdi-çıktı arayüzünü tanımlayan Signature (İmza) bulunur. Kendini onaran ajanlar oluşturmak için, yalnızca açıklayıcı değil, aynı zamanda belirsizliğe karşı dayanıklı imzalar tanımlamalıyız.
import dspy
class ExtractCodeSnippet(dspy.Signature):
"""Yapısız metinden geçerli Python kodu çıkarın. Kod yoksa None döndürün."""
raw_text = dspy.InputField(desc="Ham girdi metni")
code_snippet = dspy.OutputField(desc="Geçerli Python kodu veya None")
class AgentErrorRecovery(dspy.Module):
def __init__(self, model):
super().__init__()
self.extractor = dspy.ChainOfThought(ExtractCodeSnippet, model=model)
self.validator = dspy.Predict("code_snippet -> is_valid: bool")
def forward(self, raw_text):
# Çıkarma denemesi
result = self.extractor(raw_text=raw_text)
snippet = result.code_snippet
# Uyarlanabilir doğrulama döngüsü
if snippet:
validation = self.validator(code_snippet=snippet)
if validation.is_valid:
return snippet
else:
# Kendini onarmayı tetikle: Belirli hata bağlamıyla yeniden dene
error_context = f"Önceki deneme: {snippet}\nHata: Geçersiz sözdizimi. Tekrar dene."
retry_result = self.extractor(raw_text=f"{raw_text}\n{error_context}")
return retry_result.code_snippet
return None
Çalışma Zamanı Hata Kurtarma Uygulaması
Yukarıdaki parça, temel bir kendini onarma döngüsünü göstermektedir. validator (doğrulayıcı) geçersiz kodu belirlediğinde, ajan çökmez. Bunun yerine, hata bağlamını extractor (çıkarıcı) içine geri enjekte eder. Bu, uyarlanabilir istemlemenin bir biçimidir: istem, çalışma zamanı durumuna göre dinamik olarak değişir.
Daha karmaşık senaryolar için DSPy, bu modülleri dspy.BootstrapFewShot veya dspy.MIPROv2 kullanarak derlemenize olanak tanır. Derleme sırasında DSPy, birden fazla istem örnekler ve bir metriği (örneğin, yürütme başarı oranı) en üst düzeye çıkaranı seçer. Bu, "kendini onarma" davranışının yalnızca bir çalışma zamanı yeniden denemesi değil, geçmiş başarısızlıklardan öğrenilen optimize edilmiş bir strateji olduğu anlamına gelir.
Uyarlanabilir İstemleme Stratejileri
Basit yeniden denemelerin ötesinde, DSPy sofistike uyarlanabilir stratejilere olanak tanır:
- Kendine Yansıtma: Yeniden denemeden önce önceki çıktıyı eleştirmek için ayrı bir modül kullanın.
- Dinamik Araç Seçimi: Bir araç çağrısı başarısız olursa, uyarlanabilir bir istem, önceden tanımlanmış bir listeden alternatif araçlar önerebilir.
- Güven Eşikleri: Modelin güveni (logprobs veya sezgisel puanlama yoluyla) düşükse, ek kısıtlamalarla daha muhafazakâr bir istem tetikleyin.
class AdaptiveToolSelector(dspy.Module):
def __init__(self, model):
super().__init__()
self.selector = dspy.ChainOfThought("query, available_tools -> selected_tool, reason", model=model)
def forward(self, query, available_tools, last_error=None):
context = query
if last_error:
context += f"\nÖnceki araç başarısız oldu: {last_error}. Farklı bir yaklaşım seçin."
result = self.selector(query=context, available_tools=available_tools)
return result.selected_tool
Sonuç
Kendini onaran ajanlar oluşturmak, statik istemlerin ötesine geçerek dinamik, metrik odaklı sistemlere geçmeyi gerektirir. DSPy, LLM istemlerini çalışma zamanında optimize edilebilir, doğrulanabilir ve uyarlanabilir birincil sınıf bileşenler olarak ele almak için altyapı sağlar. Hata kurtarma döngüleri ve uyarlanabilir istemleme stratejileri uygulayarak, yalnızca daha akıllı değil, aynı zamanda üretimde önemli ölçüde daha dayanıklı yapay zeka ajanları oluşturabilirsiniz. İmzalarınızı tanımlamaya başlayın, bunları başarısızlık metriklerinizle derleyin ve ajanlarınızın kendilerini onarmayı öğrenmesini izleyin.