Teknik not

Yapay Zekâda Function Calling: AI Ajanları Araçları Nasıl Güvenli Kullanır?

Function calling ile AI ajanlarının güvenli araç kullanımı akışı

Yapay zekâ uygulamalarının yalnızca metin üretmesi çoğu zaman yeterli değildir. Bir asistanın hava durumu sorgulaması, sipariş durumunu kontrol etmesi veya takvimde uygun saat bulması için dış sistemlerle iletişim kurması gerekir. Function calling, dil modelinin hangi araca ihtiyaç duyduğunu yapılandırılmış biçimde belirtmesini ve uygulamanın bu çağrıyı güvenli şekilde çalıştırmasını sağlayan mimari yaklaşımdır.

Yapay zekâda function calling ve güvenli araç kullanımı akışı
AI ajanı; aracı seçer, parametreler sunucuda doğrulanır, sonuç modele döner ve son yanıt oluşturulur.

Bu rehberde function calling nedir, AI ajanı araçları nasıl seçer, parametre doğrulaması neden sunucu tarafında yapılmalıdır ve üretim ortamında hangi güvenlik kontrolleri kurulmalıdır sorularını adım adım inceleyeceğiz.

Function calling nedir?

Function calling, modele uygulamanızda kullanılabilecek fonksiyonları veya araçları tanıtma yöntemidir. Model, kullanıcı isteğini analiz eder; cevap vermek yerine bir araca ihtiyaç duyarsa fonksiyon adını ve parametrelerini yapılandırılmış olarak döndürür. Fonksiyonun gerçekten çalıştırılması ise sizin uygulama sunucunuzun sorumluluğundadır.

Örneğin kullanıcı “İstanbul’da yarın hava nasıl?” diye sorduğunda model şu tür bir çağrı önerebilir:

{
  "name": "get_weather",
  "arguments": {
    "location": "İstanbul",
    "date": "yarın",
    "unit": "celsius"
  }
}

Uygulama bu çağrıyı alır, parametreleri kontrol eder, hava durumu servisini çağırır ve sonucu tekrar modele iletir. Model de araç sonucunu kullanarak kullanıcıya doğal dilde yanıt verir. Yani model fonksiyonu doğrudan çalıştırmaz; uygulama, modelin önerdiği çağrıyı politika ve yetki kontrollerinden geçirdikten sonra yürütür.

Bir function calling akışı nasıl çalışır?

  1. Araçları tanımla: Fonksiyon adı, amacı, parametreleri ve parametre türleri modele sunulur.
  2. Kullanıcı isteğini al: Model, isteğin normal yanıtla mı yoksa araçla mı karşılanacağına karar verir.
  3. Fonksiyon çağrısını üret: Model, seçtiği aracın adını ve yapılandırılmış argümanlarını döndürür.
  4. Sunucuda doğrula: Uygulama, fonksiyonun izinli olup olmadığını ve argümanların geçerli olup olmadığını kontrol eder.
  5. Aracı çalıştır: Harici API veya iç servis çağrısı yapılır.
  6. Sonucu modele gönder: Araç çıktısı, yeni bağlam olarak modele verilir.
  7. Son yanıtı üret: Model, doğrulanmış araç sonucunu kullanıcıya anlaşılır biçimde aktarır.

Bu döngü, basit bir sohbet botunu araç kullanan bir AI ajanına dönüştürür. Ancak her ek araç, ajanın yapabileceği işlerin ve yanlış kullanım ihtimalinin artması anlamına gelir. Bu yüzden function calling tasarımında “model hangi aracı çağırabilir?” kadar “hangi koşullarda çağırmasına izin verilir?” sorusu da önemlidir.

İyi bir araç tanımı nasıl yazılır?

Fonksiyon adını ve amacını netleştir

Model, araç seçimini büyük ölçüde fonksiyon adı ve açıklamasına göre yapar. process_data gibi belirsiz bir isim yerine search_order_status veya create_support_ticket gibi amacı açık adlar kullanın.

Açıklamada aracın ne yaptığını, ne zaman kullanılacağını ve hangi durumda kullanılmaması gerektiğini yazın. Bir aracın yalnızca “müşteri kendi siparişini soruyorsa” kullanılabildiğini belirtmek, modelin yanlış bağlamda çağrı üretme riskini azaltır.

Parametre sözleşmesini küçük tut

Bir fonksiyona ihtiyaç duymadığı onlarca parametreyi vermeyin. Her parametrenin türünü, zorunlu olup olmadığını, kabul edilen aralığı ve örnek biçimini tanımlayın. Serbest metin alanı mümkün olduğunca sınırlı olsun; kategori veya işlem türü gibi alanlarda enum değerleri kullanın.

{
  "name": "search_order_status",
  "description": "Kimliği doğrulanmış kullanıcının kendi sipariş durumunu getirir.",
  "parameters": {
    "type": "object",
    "properties": {
      "orderId": {
        "type": "string",
        "pattern": "^[A-Z0-9-]{6,24}$"
      }
    },
    "required": ["orderId"],
    "additionalProperties": false
  }
}

Bu yapı modelin doğru formatta argüman üretmesine yardımcı olur. Fakat şemaya uyan bir orderId değerinin gerçekten bu kullanıcıya ait olduğunu model bilemez. Kimlik ve sahiplik kontrolü her zaman sunucu tarafında yapılmalıdır.

Function calling güvenliği için 7 temel kural

1. Allowlist kullan

Modelin çağırabileceği araçları açık bir allowlist ile sınırlayın. Uygulamanızda tanımlı olan her fonksiyonu her oturumda modele göndermek zorunda değilsiniz. Kullanıcının amacı ve mevcut ekran için gereken araçları seçerek sunmak, yanlış çağrı ihtimalini azaltır.

2. En az ayrıcalık ilkesini uygula

Salt okunur bir destek asistanına kayıt silme, para transferi veya e-posta gönderme yetkisi vermeyin. Araç kimlik bilgilerini modelin görebileceği prompt içine koymayın; sunucu tarafındaki güvenli yapılandırmadan okuyun. Her aracın yalnızca ihtiyaç duyduğu veri ve işlem kapsamına erişmesini sağlayın.

3. Parametreleri sunucuda tekrar doğrula

Modelin ürettiği argümanlar yapılandırılmış görünse bile güvenilir kullanıcı girdisi sayılmamalıdır. Tür, uzunluk, enum, URL alan adı, tarih aralığı ve kaynak sahipliği kontrollerini sunucuda yapın. SQL sorgusu, shell komutu veya HTML çıktısı gibi alanları doğrudan çalıştırmayın.

4. Kritik işlemlerde insan onayı iste

E-posta gönderme, sipariş iptali, ödeme başlatma, dosya silme ve erişim değiştirme gibi işlemleri modelin tek adımda tamamlamasına izin vermeyin. Kullanıcıya hedefi, parametreleri ve beklenen sonucu gösteren bir onay ekranı sunun. “Model istedi” bir yetki değildir; son karar uygulama politikası ve kullanıcı onayıyla verilmelidir.

5. İdempotency ve tekrar sınırı ekle

Ağ hatası sonrasında aynı function call yeniden gönderilebilir. Sipariş oluşturma veya ödeme başlatma gibi işlemlerde idempotency anahtarı kullanın. Ajanın tek turda kaç araç çağırabileceğine sınır koyun; sonsuz döngüleri ve gereksiz maliyeti engelleyin.

6. Araç sonuçlarını da güvenilmeyen veri kabul et

Bir aracın döndürdüğü içerik, özellikle web araması veya harici dokümanlardan geliyorsa yeni talimatlar içerebilir. Araç sonucu modele aktarılırken kaynak ve güven seviyesini belirtin. Modelin araç çıktısındaki komutları otomatik olarak uygulamasına izin vermeyin.

7. Kayıt ve gözlemleme kur

Hangi kullanıcı isteğinde hangi aracın çağrıldığını, hangi parametrelerin reddedildiğini, ne kadar sürdüğünü ve sonucun başarılı olup olmadığını loglayın. Hassas değerleri maskeleyin. Beklenmedik araç seçimi, art arda başarısız deneme veya olağandışı çağrı sayısı için alarm üretin.

Function calling ile Structured Outputs arasındaki fark

Structured Outputs, modelin belirli bir JSON Schema’ya uyan çıktı üretmesine yardımcı olur. Function calling ise modelin uygulamadaki bir aracı çağırma niyetini ve argümanlarını iletmesini sağlar. Birlikte kullanılabilirler; ancak ikisi de yetkilendirme katmanının yerine geçmez.

Geçerli JSON biçiminde gelen bir araç çağrısı yine de yetkisiz olabilir. Örneğin orderId alanı doğru formatta olsa bile sipariş başka bir kullanıcıya ait olabilir. Bu nedenle çıktı şeması, uygulama yetkisi ve iş kuralları ayrı katmanlar olarak tasarlanmalıdır.

Hata yönetimi nasıl yapılmalı?

Her araç çağrısı başarılı olmayabilir. Servis zaman aşımına uğrayabilir, kullanıcı yetkili olmayabilir veya parametreler iş kuralına aykırı olabilir. Hatanın tamamını modele olduğu gibi vermek yerine, sınıflandırılmış ve sınırlı bir sonuç döndürün.

  • Geçici hata: Kısa bir bekleme ve sınırlı yeniden deneme uygulanabilir.
  • Yetki hatası: İşlem durdurulur ve kullanıcıdan uygun doğrulama istenir.
  • Geçersiz parametre: Modelden düzeltme istenir veya işlem insan incelemesine gönderilir.
  • Kalıcı servis hatası: Kullanıcıya kesin olmayan bir sonuç vermek yerine açıkça başarısızlık bildirilir.

Modelin hatayı gizleyip başarılı olmuş gibi davranmasını istemeyin. Kullanıcıya “işlem tamamlandı” demeden önce uygulamanızın gerçekten başarılı sonuç aldığını kontrol edin.

Yayına almadan önce test listesi

Test senaryosu Beklenen davranış
Model tanımsız bir araç çağırır Çağrı reddedilir ve olay loglanır
Zorunlu parametre eksiktir Fonksiyon çalışmadan doğrulama hatası döner
Kullanıcı başka hesaba ait kayıt ister Sahiplik kontrolü işlemi durdurur
Aynı ödeme çağrısı iki kez gelir Idempotency anahtarı ikinci işlemi engeller
Araç sonucu kötü niyetli talimat içerir Sonuç veri olarak ele alınır, komut çalıştırılmaz
Servis zaman aşımına uğrar Sınırlı retry ve anlaşılır hata mesajı kullanılır

Sonuç: AI ajanı yetenek değil, kontrollü yetki sistemi olmalı

Function calling, yapay zekâ uygulamalarını dış servislerle konuşturmanın güçlü bir yoludur. Fakat aracı modele tanımlamak, araca sınırsız erişim vermek anlamına gelmez. Sağlam bir mimaride model niyeti üretir; uygulama ise allowlist, parametre doğrulama, kimlik kontrolü, insan onayı ve işlem kayıtlarıyla bu niyeti değerlendirir.

Yeni bir araç eklerken şu soruyu sorun: “Model kandırılır veya yanlış karar verirse bu araç en fazla ne yapabilir?” Etki alanını sınırlayabiliyor, hataları görünür kılıyor ve kritik işlemlerde son kararı uygulamaya bırakıyorsanız, daha güvenilir bir AI ajanı tasarlayabilirsiniz.

Teknik ayrıntılar ve güncel API örnekleri için OpenAI Function Calling rehberine göz atabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir