AI Agents

Aralığı Kapatmak: AI Ajanları İçin Fonksiyon Çağırma Derinlemesine İnceleme

Güçlü AI ajanları oluşturmada tarihsel olarak en büyük engellerden biri, Büyük Dil Modelleri (LLM'ler)nin akıcı, olasılıksal doğası ile harici sistemlerin deterministik, yapılandırılmış gereksinimleri arasındaki kopukluktur. Bir model, bir sonraki tokeni tahmin ederek bir REST API'siyle, bir SQL veritabanını sorgulayarak veya belirli bir iş akışını tetikleyerek nasıl doğru şekilde etkileşime girer ve parametreleri uydurmaz (hallucinates)? Cevap Fonksiyon Çağırma (Araç Kullanımı veya Aksiyonlar olarak da bilinir) mekanizmasında yatmaktadır.

Orta ve ileri düzey geliştiriciler için, basit sohbet tamamlamalarının ötesine geçerek işlevsel ajanlar oluşturmak bir zihniyet değişikliği gerektirir. Artık sadece bir modele istem (prompt) göndermiyorsunuz; yürütülebilir bir arayüz tanımlıyorsunuz. Bu yazı, fonksiyon çağırmanın mimarisini inceler, uygulama stratejilerini gösterir ve güvenilirliği sağlamak için en iyi uygulamaları vurgular.

Mekanizmayı Anlamak

Özünde fonksiyon çağırma, LLM'nin doğal dil metni yerine, bir fonksiyon adını ve argümanlarını temsil eden yapılandırılmış veriyi (genellikle JSON) çıkış olarak vermesini sağlar. Uygulama bu yanıtı yakalar, gerçek kodu yürütür ve sonucu modele geri besler.

Bu süreç, LLM'yi statik bir metin üretecinden, durum değişiklikleri ve veri çekme hakkında akıl yürütebilen aktif bir ajana dönüştürür. İş akışı genellikle şu döngüyü izler:

  1. Kullanıcı Girdisi: Kullanıcı bir istek gönderir.
  2. Model Kararı: LLM, harici bir araca ihtiyaç duyduğunu belirler ve bir fonksiyon çağrı nesnesi çıkış verir.
  3. Yürütme: Arka uç (backend) JSON'u ayrıştırır, belirli fonksiyonu çağırır ve çıktıyı yakalar.
  4. Yanıt: Fonksiyon sonucu konuşma geçmişine eklenir.
  5. Nihai Çıktı: LLM, aracın çıktısına dayanarak doğal dilde bir yanıt üretir.

Şemanın Tanımlanması: Sözleşme

Ajanınızın başarısı, fonksiyonlarınızı nasıl tanımladığınıza büyük ölçüde bağlıdır. Modern API'ler (OpenAI, Anthropic ve Mistral gibi) mevcut her araç için bir JSON Şema tanımı sağlamanıza olanak tanır. Bu şema, sıkı bir sözleşme görevi görür.

AI ajanının hava durumu verilerini alması gereken bir senaryoyu ele alalım. Fonksiyon adını, ne yaptığını açıklayan bir açıklamayı ve beklenen parametreleri tanımlamanız gerekir. İşte OpenAI'nin yapısına benzer bir sahte-API yapısı kullanılarak hazırlanmış pratik bir örnek:


const tools = [
  {
    type: "function",
    function: {
      name: "get_weather",
      description: "Belirli bir konumdaki mevcut hava durumunu alın",
      parameters: {
        type: "object",
        properties: {
          location: {
            type: "string",
            description: "Şehir ve eyalet, örn. San Francisco, CA"
          },
          unit: {
            type: "string",
            enum: ["celsius", "fahrenheit"],
            description: "Kullanılacak sıcaklık birimi"
          }
        },
        required: ["location"]
      }
    }
  }
];

Birim için enum kullanımına dikkat edin. Bu, modelin arama alanını sınırlamak ve hataları azaltmak için hayati önem taşır. Parametreleri çok belirsiz bırakırsanız, model arka ucunuzun işleyemeyeceği keyfi dizeler iletebilir.

Döngünün Yönetilmesi: Sağlam Uygulama

Yürütme döngüsünü uygulamak, birçok geliştiricinin kenar durumlarla (edge cases) karşılaştığı yerdir. Özellikle karmaşık çok adımlı akıl yürütme ile LLM'nin ilk denemede her şeyi doğru yapması nadirdir. Hatalı JSON veya başarısız API çağrıları için hata yönetimi uygulamanız gerekir.

Model bir fonksiyon çağrısı çıkış verdiğinde, kodunuz şu şekilde görünmelidir:


async function handleModelResponse(response) {
  if (response.choices[0].finish_reason === 'function_call') {
    const call = response.choices[0].message.function_call;
    
    // 1. Fonksiyonu yürüt
    let result;
    try {
      result = await executeTool(call.name, call.arguments);
    } catch (error) {
      result = { error: "Fonksiyon yürütülemedi" };
    }

    // 2. Sonucu konuşma geçmişine ekle
    const conversationHistory = [
      ...previousMessages,
      response.choices[0].message,
      {
        role: "function",
        name: call.name,
        content: JSON.stringify(result)
      }
    ];

    // 3. Nihai cevap için modele geri gönder
    return await getModelFinalAnswer(conversationHistory);
  }
}

role: "function" değerini modele açıkça geri geçirerek döngüyü kapatmış olursunuz. Model, şimdi çekilen verilerin bağlamına sahiptir ve "San Francisco'daki mevcut hava durumu 72 derece Fahrenheit'tir" gibi tutarlı bir yanıt formüle edebilir.

Sonuç

Fonksiyon çağırma, modern AI ajanının omurgasıdır. LLM'lerin metin üretiminin ötesine geçerek dijital dünya ile etkili bir şekilde etkileşim kurmasını sağlar. Geliştiriciler için temel çıkarım şudur: Yapılandırma her şeydir. Net şemalar, sağlam hata yönetimi ve iyi tanımlanmış bir yürütme döngüsü sağlayarak, sadece etkileyici demosu olan değil, aynı zamanda güvenilir ve üretim ortamına hazır araçlar olan ajanlar oluşturabilirsiniz.

Modeller akıl yürütme yeteneklerinde ilerledikçe, fonksiyon çağırmanın sürtünmesi azalacaktır ancak temel mimari aynı kalacaktır: Aracı tanımla, niyeti yürüt ve sonucu sentezle.

Share: