AI Agents

Gelişmiş Araç Kullanımı: Üretim Ortamındaki Agent'lar İçin Durum Yönetimi, Hata Kurtarma ve Çok Adımlı Araç Zincirleme

Büyük Dil Modeli (LLM) uygulamalarının erken dönemlerinde, araç kullanımı genellikle basit bir fonksiyon çağrısı mekanizması olarak görülürdü. Ancak deneysel prototiplerden sağlam, üretim seviyesinde AI agent'larına geçiş yaptıkça karmaşıklık katlanarak artar. Bir üretim agent'ı, sadece birkaç eklenmiş fonksiyonu olan bir modelden ibaret değildir; bağlam kaymasını, ağ hatalarını ve karmaşık mantıksal bağımlılıkları yönetmesi gereken durum bilgisi taşıyan bir sistemdir.

Bu yazı, olgun agent mimarilerinin üç temel direğine derinlemesine iniyor: hassas durum yönetimi, dayanıklı hata kurtarma ve güvenilir çok adımlı araç zincirleme. Basit istek-cevap kalıplarının ötesine geçerek, deterministik, hataya dayanıklı ve verimli agent'lar oluşturmanın yollarını keşfedeceğiz.

Belirsiz Ortamlarda Durum Yönetimi

Agent'lar oluşturulurken karşılaşılan en büyük zorluklardan biri, LLM'lerin doğası gereği belirsiz (non-deterministik) olmasıdır. Sabit bir sıcaklık değeri bile kullanılsa, model bir istemi biraz farklı yorumlayabilir; bu da araç argümanlarında veya yürütme sırasındaki varyasyonlara yol açabilir. Bunu azaltmak için durum yönetimini dışsal olarak ele almamız gerekir.

Karmaşık çoklu dönüş etkileşimlerini hatırlamak için LLM'nin bağlam penceresine güvenmek hem maliyetli hem de "ortada kaybolma" (lost in the middle) olgusuna yatkındır. Bunun yerine, agent'ın durumunun yapılandırılmış bir veritabanında veya hafıza deposunda saklandığı, LLM'nin ise öncelikle bir akıl yürütme motoru olarak hizmet verdiği bir "Durum Öncelikli" mimari benimseyin.

Aşağıdaki desende agent'ın mevcut durumunu açıkça seri hale getirmeyi ele alalım:

class AgentState:
    def __init__(self):
        self.session_id = None
        self.current_step = "INITIALIZATION"
        self.tool_results = {}
        self.user_intent = None

    def update_step(self, new_step, result=None):
        self.current_step = new_step
        if result:
            self.tool_results[new_step] = result
        # Durumu hemen veritabanına kaydet
        save_state_to_db(self.session_id, self)

Her araç çağrısından sonra durumu kalıcı hale getirerek, bir agent çöker veya zaman aşımına uğrarsa tüm süreci yeniden başlatmak yerine kaldığı yerden devam edebileceğini garanti altına alırız.

Güçlü Hata Kurtarma Kalıpları

Üretim ortamında ağ zaman aşımı, API hız sınırlamaları ve hatalı araç çıktılarla yaygındır. İlk hatada başarısız olan bir agent işe yaramaz. Agent'ın kendini düzeltebilmesini sağlayan granüler hata işleme stratejileri uygulamamız gerekir.

Dış API çağrıları için üstel geri çekilme (exponential-backoff) ile yeniden deneme mekanizması uygulayın. Daha da önemlisi, "kendini yansıtma" döngüleri uygulayın. Bir araç başarısız olursa, agent hata mesajını analiz edip farklı bir yaklaşım denemeli; örneğin farklı parametrelerle yeniden denemeli veya yedek bir aracı çağırmalıdır.

import time
import requests

def call_tool_with_recovery(tool_name, args, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = tool_registry.execute(tool_name, args)
            return response
        except requests.exceptions.Timeout:
            wait_time = 2 ** attempt
            time.sleep(wait_time)
        except ToolValidationError as e:
            # Kritik hata, düzeltmeyi LLM'ye bırak
            return {"error": str(e), "type": "validation_error"}
    
    raise RuntimeError(f"{max_retries} denemeden sonra {tool_name} yürütülemedi")

Çok Adımlı Araç Zincirlemenin Orkestrasyonu

Basit agent'lar bir araç çağırır ve sonuç döner. Gelişmiş agent'lar, mantıksal bağımlılıklara dayalı olarak araçları birbirine zincirler. Örneğin, bir agent kullanıcının verilerini alıp, bunları işleyip ardından bir veritabanını güncellemesi gerekebilir. Buradaki zorluk, bir aracın çıktısının bir sonraki aracın girdisini doğru şekilde biçimlendirdiğinden emin olmaktır.

Bunu yönetmek için bir bağımlılık grafiği veya durum makinesi yaklaşımı kullanın. Agent, araçları körlemesine zincirlememeli; ara çıktaların şemasını doğrulamalıdır. LangGraph veya AutoGen gibi modern çerçeveler, düğümler arasında koşullu kenarlar tanımlamanıza izin vererek bu süreci kolaylaştırır.

Araçları zincirlerken her zaman sıkı giriş/çıkış sözleşmelerini uygulayın. Her aracın girdisi ve çıktısı için tür güvenliğini sağlamak amacıyla Pydantic modelleri tanımlayın. Bu, LLM'nin aşağı akıştaki araçları bozabilecek hatalı veri türlerini uydurmasını engeller.

Sonuç

Üretim ortamına hazır AI agent'ları oluşturmak, temel "istemi ve araç" paradigmalarının ötesine geçmeyi gerektirir. Sıkı durum yönetimi, dayanıklı hata kurtarma ve mantıksal araç zincirleme uygulayarak, yalnızca zeki değil aynı zamanda güvenilir sistemler oluşturabiliriz. AI agent'larının manzarası gelişmeye devam ettikçe, bu temel uygulamalar kurumsal seviyedeki uygulamalar için standart haline gelecektir.

Share: