Prompt Engineering

Aralığı Kapatmak: Büyük Dil Modellerinde Fonksiyon Çağırma İçin Teknik Kılavuz

Yıllar boyunca, Büyük Dil Modelleri'nin (LLM'ler) temel sınırlaması, gerçek dünyada eylem gerçekleştirememeleriydi. Temelde gelişmiş papaganlar gibi davranıyor, metin üretebiliyor ama veritabanına erişemiyor, karmaşık toplamlar hesaplayamıyor veya harici bir API'yi sorgulayamıyorlardı. Fonksiyon Çağırma (veya Araç Kullanımı) kavramının tanıtılması, bu paradigma kökten değiştirdi; LLM'leri pasif metin üreticilerinden harici sistemlerle etkileşime girebilen aktif ajanlara dönüştürdü.

Orta ve ileri düzey geliştiriciler için fonksiyon çağırmanın mekaniklerini anlamak artık bir seçenek değil; sağlam, üretim seviyesinde AI uygulamaları oluşturmak için temel bir gerekliliktir. Bu yazı, fonksiyon çağırmanın teknik mimarisini, uygulama desenlerini ve iş akışlarınıza entegre ederken izlenmesi gereken en iyi uygulamaları derinlemesine incelemektedir.

Mimariyi Anlamak

Fonksiyon çağırma bir sihir değildir; LLM ile arka uç altyapınız arasında kurulu yapılandırılmış bir iletişim protokolüdür. Süreç genellikle sıkı bir yaşam döngüsünü takip eder:

  1. Tanımlama: Geliştirici, modele bir dizi fonksiyon tanımı (şema) sağlar; bunlar genellikle JSON formatındadır. Bu şemalar, fonksiyon adını, açıklamasını ve beklenen parametreleri tanımlar.
  2. Çağırma: Kullanıcı bir istek (prompt) gönderir. LLM isteği analiz eder ve gerekirse, soruyu yanıtlamak için bir fonksiyon çağrısına ihtiyaç duyulduğunu belirler. Metin üretmek yerine, model fonksiyon adını ve argümanlarını içeren yapılandırılmış bir JSON yükü döndürür.
  3. Yürütme: Uygulamanın arka ucu bu JSON yükünü yakalar, ana kod tabanında (örneğin Python, JavaScript) gerçek fonksiyonu yürütür ve sonucu alır.
  4. Yanıt: Sonuç, bir sonraki mesajda LLM'e geri gönderilir; bu sayede model kullanıcı için nihai ve doğru bir yanıt sentezleyebilir.

Uygulama Örneği

OpenAI API'sini kullanarak pratik bir örneğe bakalım. Bir hava durumu asistanı oluşturduğumuzu hayal edelim. Hava durumu verilerini alan bir fonksiyon tanımlamamız gerekir.

import openai

# Fonksiyon şemasını tanımla
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Belirli bir konumdaki mevcut hava durumunu getir",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "Şehir ve eyalet, örn. San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# Kullanıcı sorgusu
messages = [{"role": "user", "content": "Tokyo'da hava durumu nasıl?"}]

# API'yi çağır
response = openai.chat.completions.create(
    model="gpt-4-turbo",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

# Modelin bir fonksiyon çağırıp çağırmak istediğini kontrol et
response_message = response.choices[0].message
tool_calls = response_message.tool_calls

if tool_calls:
    # Model bir fonksiyon çağrısı talep etti
    available_functions = {
        "get_weather": get_weather_from_api
    }
    
    # Fonksiyonu yürüt
    function_name = tool_calls[0].function.name
    function_args = json.loads(tool_calls[0].function.arguments)
    function_response = available_functions[function_name](**function_args)
    
    # Yanıtı modele geri gönder
    messages.append(response_message) # Asistan mesajını ekle
    messages.append({
        "tool_call_id": tool_calls[0].id,
        "role": "tool",
        "name": function_name,
        "content": function_response
    })
    
    # Nihai yanıtı al
    second_response = openai.chat.completions.create(
        model="gpt-4-turbo",
        messages=messages
    )
    print(second_response.choices[0].message.content)

Güçlülük İçin En İyi Uygulamalar

Kavram basit olsa da, üretim ortamı uygulaması dikkatli bir ayrıntı gerektirir:

  • Anlamsal Şema Tasarımı: JSON şemalarınız kesin olmalıdır. Kısıtlı değerler için enum kullanın ve detaylı description alanları sağlayın. LLM, bir fonksiyonu ne zaman çağırması gerektiğini belirlemek için tamamen bu açıklamalara güvenir.
  • Hata Yönetimi: Harici API'lere yapılan ağ istekleri başarısız olabilir. Arka uçunuzun bu hataları yakaladığından ve bunları bir hata durumu ile birlikte role: "tool" mesajı olarak LLM'e ilettiğinden emin olun. Bu, modelin yeniden deneme yapmasına veya kullanıcıya zarif bir şekilde bilgi vermesine olanak tanır.
  • Güvenlik Temizliği: LLM'den alınan fonksiyon argümanlarını körü körüne asla yürütme. Enjeksiyon saldırılarını önlemek için yürütmeden önce tüm girdileri dahili türleriniz ve kısıtlamalarınız doğrultusunda doğrulayın.

Sonuç

Fonksiyon çağırma, AI kullanılabilirliğinde önemli bir sıçramayı temsil eder. Modellerin, statik eğitim setlerinin ötesinde gerçek zamanlı verilere erişerek ve hesaplamalar gerçekleştirerek gerçeklikle bağlantılarını korumalarını sağlar. Araç kullanımının uygulanmasını ustalaşan geliştiriciler, yalnızca konuşma yeteneğine sahip değil, aynı zamanda eylem gerçekleştirebilen uygulamalar oluşturabilir; bu da bir sonraki nesil akıllı ajanların yolunu açar.

Share: