1. Fonksiyon Çağrısına Giriş

GPT modelinde, Fonksiyon Çağrısı, bir API aracılığıyla modele açıklamalı işlevler sağlayarak, modelin akıllıca bir şekilde bir veya daha fazla işlevi çağırmak için kullanabileceği ve parametreleri içeren bir JSON nesnesi üretebileceği anlamına gelir. Önemli bir not olarak, Sohbet Tamamlama API'sı doğrudan işlev çağrıları gerçekleştirmez, ancak kod içindeki işlevleri çalıştırmak için kullanılabilecek bir JSON üretir.

Basitçe, Fonksiyon Çağrısı özelliği, GPT modeline bir dizi işlev tanımı (işlev açıklamaları ve parametre açıklamaları dahil) sağlamayı içerir. Model daha sonra kullanıcının sorgusuna bağlı olarak hangi işlevi çağıracağına karar verir. Model harici işlevleri çalıştıramadığı için yalnızca hangi işlevi çağırması gerektiğini (işlev çağrısı parametreleriyle birlikte) yanıtlayabilir. Modelin istek sonucunu aldıktan sonra, programımız işlev çağrısını yerel olarak çalıştırır. İşlev çağrısının sonucu ardından prompt ile birleştirilir ve sonucu kullanıcıya ulaşmadan önce model'e geri gönderilir.

2. Fonksiyon Çağrısının Uygulama Senaryoları

İşte pratik uygulamalarının bazı örnekleri:

  • Harici API'ları çağırarak soruları yanıtlayan bir asistan oluşturmak, örneğin send_email(to: string, body: string) veya get_current_weather(location: string, unit: 'celsius' | 'fahrenheit') gibi işlev tanımları oluşturmak.
  • Doğal dilin API çağrılarına dönüştürülmesi, örneğin "En iyi müşterilerim kim?" ifadesinin get_customers(min_revenue: int, created_before: string, limit: int) çevrilmesi ve ardından iç API çağrısının yapılması.
  • Metinden yapılandırılmış verilerin çıkarılması, örneğin extract_data(name: string, birthday: string) veya sql_query(query: string) gibi işlevleri tanımlama.

Fonksiyon Çağrısı özelliğini kullanarak, yerel sistemlerimiz ve veritabanlarımızla etkileşimde bulunan yapay zeka ajanları uygulayabiliriz, örneğin yapay zekanın son hava durumunu sorması, stok fiyatlarını kontrol etmesi, paket yemek siparişi vermesi ya da uçuş rezervasyonu yapması gibi.

3. Fonksiyon Çağrısını Destekleyen Modeller

Tüm model sürümleri fonksiyon çağrısı verileri ile eğitilmemiştir. Şu anda, fonksiyon çağrısını destekleyen modeller şunlardır: gpt-4, gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview, gpt-4-0613, gpt-3.5-turbo, gpt-3.5-turbo-1106 ve gpt-3.5-turbo-0613.

Ayrıca, gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview ve gpt-3.5-turbo-1106 modelleri paralel fonksiyon çağrısını destekler, böylece aynı anda birden fazla fonksiyonu çalıştırabilir ve bu fonksiyon çağrılarını eş zamanlı olarak işleyerek etkili ve verimli sonuçlar üretebilir.

Not: Fonksiyon Çağrısı özelliğinin potansiyel riski, modelin yanlış parametreler üretmesine (yani hayalet parametreler) yol açabileceğidir. Bu nedenle, e-posta gönderme, çevrimiçi yayınlama, alışveriş yapma vb. gibi gerçek dünyayı etkileyen herhangi bir eylemi gerçekleştirmeden önce, kullanıcı onay sürecini ürün düzeyinde dahil etmek, işlevlerin yalnızca kullanıcı onayından sonra yürütülmesini sağlamak tavsiye edilir.

4. Fonksiyon Çağrısı Örnekleri

4.1 Python Örneği

OpenAI platformunda Fonksiyon Çağrısını uygulamak genellikle aşağıda belirtilen temel adımları izler. Aşağıdaki, Python kodu örneği kullanarak adımların tüm sürecini detaylandıracaktır. Bu örnek, hava durumunu sorgulama odaklı olup, aşağıda temel adımlar yer almaktadır.

Adım 1: Model için çağrılabilir işlevleri ve işlev tanımlarını hazırlama

İlk olarak, GPT modeli tarafından çağrılabilecek bir işlev tanımlamamız gerekmektedir. Genellikle bu, üçüncü taraf bir API ile iletişim kurabilen belirli işlemleri gerçekleştirebilen kendi işlevimizi hazırlamayı gerektirir.

import json

def get_current_weather(location, unit="fahrenheit"):
    return json.dumps({
        "location": location, 
        "temperature": "18", 
        "unit": unit
    })

Adım 2: Sorguya ve araç parametresine dayalı olarak modeli çağırma

Sıradaki adım, Kullanıcı Sorgusu (örneğin: "Mevcut hava durumu nedir") ve hemen önce tanımladığımız get_current_weather işlevinin açıklamasını içeren tools parametresini içeren Chat Tamamlama API'si aracılığıyla GPT modelini çağırmaktır.

from openai import OpenAI

client = OpenAI()

tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Belirli bir konum için mevcut hava durumunu al",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Örneğin şehir adı: 'İstanbul'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["santigrat", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
}]

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "kullanıcı", "content": "San Francisco'da mevcut hava durumu nedir?"}],
    tools=tools
)

Adım 3: İşlevi yerel olarak çalıştırma

Model tarafından döndürülen sonuç, genellikle tool_calls yanıt parametresinde açıklanan işlevi çağırmak için kullanılabilir. Ardından, tool_calls parametresinde tanımlanan işlev çağrı bilgilerine göre ilgili işlev çağrısını yerel olarak gerçekleştirebiliriz.

tool_calls = response.choices[0].message.tool_calls

if tool_calls:
    arguments = json.loads(tool_calls[0].function.arguments)
    weather_info = get_current_weather(**arguments)
    print(weather_info) # Burada işlev çağrısı ile sorgulanan hava bilgilerini görebiliriz

Adım 4: İşlevin dönüş sonucu ile tekrar modeli çağırma

Şimdi, işlevin dönüş sonucunu modeldeki yeni bir mesaj olarak gönderebiliriz, böylece model bu sonuçları işleyebilir ve kullanıcıya özel bir yanıt üretebilir.

follow_up_response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "kullanıcı", "content": "San Francisco'da mevcut hava durumu nedir?"},
        {"role": "fonksiyon", "name": "get_current_weather", "content": weather_info}
    ],
    tools=tools
)

Açıklama: Yukarıdaki örnekte, işlev dönüş içeriği aşağıdaki gibi işlev mesajı aracılığıyla GPT modeline gönderilir:

{"role": "fonksiyon", "name": "get_current_weather", "content": weather_info}

Pratikte, AI'nın soruları yanıtlarken kullanacağı referans içeriği olarak işlevin dönüş içeriğini basitçe sistem mesajı önerisine yerleştirebilirsiniz.

Adım 5: Modelden nihai yanıtı alın

Son olarak, modelin nihai yanıtını alabilir ve kullanıcıya sunabiliriz. Bu adımda, model verdiğimiz hava durumu bilgilerine dayalı olarak kullanıcı dostu bir yanıt çıkaracaktır.

final_output = follow_up_response.choices[0].message.content
print(final_output) # Bu çıktı, kullanıcıya göstermek istediğimiz hava durumu bilgisidir

Yukarıdaki adımları takip ederek, GPT modelini ve işlev çağrılarını kullanarak hava durumunu sorgulamanın tam bir örneğini tamamlamış olduk.

4.2. İşlev çağrısı işlev tanımı açıklaması

4.2.1 'Araçlar' Parametre Alanlarının Anlamı

Bir işlev çağrısı yaparken, araçlar parametresinde işlevle ilgili bilgileri tanımlamanız gerekmektedir. araçlar parametresi, çoklu işlev tanımlarını içeren bir dizi olarak tanımlanmaktadır; her işlev tanımı aşağıdaki alanları içermektedir:

  1. tip: Bu alan, aracın tipini temsil etmektedir. Bir işlev çağrısında bu alan "işlev" olarak ayarlanmalıdır.
  2. işlev: Bu alan, işlevin detaylı bilgilerini içermekte olup aşağıdaki belirli alanlara sahip bir nesnedir:
    • ad: İşlevin adı, bir dizedir.
    • açıklama: İşlevin amacını açıklayan bir açıklama; bu, modelin kullanıcı beklentilerini karşılayan parametreler oluşturmasına yardımcı olabilir.
    • parametreler: İşlevin parametre tanımlarını açıklayan ve aşağıdaki alt alanları içeren bir nesnedir:
      • tip: Parametrenin tipini tanımlar; çoğunlukla "nesne" olarak ayarlanmalıdır.
      • özellikler: Her işlev parametresinin belirli tanımları, genellikle aşağıdaki alt alanları içeren bir nesne olarak tanımlanmaktadır:
        • tip: Parametrenin veri tipi ("dize", "tamsayı", "mantıksal" vb.).
        • açıklama: Parametrenin amacını modelin anlamasına yardımcı olacak açıklama.
        • enum (isteğe bağlı): tip "dize" olduğunda, enum alanı geçerli değerler kümesini temsil eden bir dize dizisini belirleyebilir.
      • gereken: Gerekli parametrelerin adlarını içeren bir dize dizisi.

4.2.2 Araçlar Tanımı Örnekleri

Şimdi, her alanın nasıl kullanıldığını anlamak için bazı araçlar tanımları örneklerini sağlayalım.

Örnek 1: Mevcut Hava Durumu Bilgisi Al

{
    "tip": "işlev",
    "işlev": {
        "ad": "mevcut_hava_durumu_al",
        "açıklama": "Belirtilen konum için mevcut hava durumu bilgisini al",
        "parametreler": {
            "tip": "nesne",
            "özellikler": {
                "konum": {
                    "tip": "dize",
                    "açıklama": "Sorgulanmak istenen şehir, ör. 'San Francisco, CA'"
                },
                "birim": {
                    "tip": "dize",
                    "enum": ["santigrat", "fahrenheit"],
                    "açıklama": "Sıcaklık birimi, 'santigrat' için Celsius, 'fahrenheit' için Fahrenheit"
                }
            },
            "gereken": ["konum", "birim"]
        }
    }
}

Yukarıdaki örnekte, belirli bir konumun mevcut hava durumunu almak için mevcut_hava_durumu_al adında bir işlev tanımladık. Parametreler, konum ve birim olup, birim alanında iki geçerli değer: "santigrat" (Celsius) ve "fahrenheit" (Fahrenheit) bulunmaktadır.

Örnek 2: Belirli Bir Sanatçı İçin Albümleri Bul

{
    "tip": "işlev",
    "işlev": {
        "ad": "sanatçı_albümlerini_bul",
        "açıklama": "Belirli bir sanatçı için tüm albümleri bul",
        "parametreler": {
            "tip": "nesne",
            "özellikler": {
                "sanatçı_adı": {
                    "tip": "dize",
                    "açıklama": "Sanatçının adı"
                }
            },
            "gereken": ["sanatçı_adı"]
        }
    }
}

Bu örnekte, belirli bir sanatçı için tüm albümleri bulmak için sanatçı_albümlerini_bul adında bir işlev oluşturduk. Bu işlev yalnızca bir parametre olan sanatçı_adını (sanatçının adı) gerektirmektedir.

4.3. Bir HTTP İstek İşlev Çağrısı Örneği

OpenAI, HTTP protokolü aracılığıyla erişilebilen bir API sağlamaktadır. Aşağıda, HTTP API üzerinden işlev çağrısı özelliğini nasıl kullanılacağını açıklayacağız. Diğer programlama dillerinin geliştiricileri bu örneğe başvurabilir.

4.3.1. Adım 1: Kullanıcı Sorgusu ve Fonksiyon Tanımıyla Modeli Arama

İlk olarak, kullanıcının sorgusunu ve desteklediğimiz fonksiyonların listesini GPT modeline göndermemiz gerekiyor, böylece model kullanıcının sorusuna göre hangi fonksiyonu arayarak kullanıcının sorgusunu cevaplayacağını otomatik olarak analiz edebilir.

Aşağıdaki örnekte, GPT'ye belirli bir şehrin hava durumu bilgisini sorgulamak için kullanılabilecek get_current_weather fonksiyonuna sahip olduğumuzu bildiriyoruz.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {OPENAI_KEY}' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Shanghai'da bugün hava nasıl?"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Belirtilen konum için mevcut hava durumu bilgisini al",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Hava sorgulanacak şehir, ör. 'İstanbul, Türkiye'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Sıcaklık birimi, 'celsius' için Celsius, 'fahrenheit' için Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

İstek parametreleri açıklaması:

{
    "model": "gpt-3.5-turbo", // Aranacak GPT modeli
    "messages": [ // Bu, GPT için kullanıcı sorgusunu içeren mesaj listesi
        {
            "role": "user",
            "content": "Shanghai'da bugün hava nasıl?"
        }
    ],
    "tools": [
	  // Bu, kullanılabilir fonksiyonları GPT'ye bildiren fonksiyon tanımınız
    ]
}

tools parametresinin tanımı için 4.2.2 bölümüne bakınız.

GPT modeli tarafından normal işleme alındığında, benzer bir API yanıtı alırsınız:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 122,
        "completion_tokens": 27,
        "total_tokens": 149
    },
    "id": "chatcmpl-8mL4hS4zNMocyR2ajKyAvSTcbNaao",
    "created": 1706531447,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "tool_calls": [ // tool_calls parametresi, GPT'nin çağırmak istediği fonksiyon listesini temsil eder
                    {
                        "id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
                        "type": "function",
                        "function": {
                            "name": "get_current_weather",  // GPT'nin kullanıcının sorgusunu cevaplamak için get_current_weather fonksiyonunu çağırmak istediğini gösterir
                            "arguments": "{\n  \"location\": \"Shanghai, Çin\",\n  \"unit\": \"celsius\"\n}" // Bu, get_current_weather fonksiyonunu çağırmak için giriş parametresidir
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls"
        }
    ]
}

4.3.2. Adım 2: Yerel Fonksiyon Çağrısı Yürütme

Çünkü GPT modeli kendisi belirli fonksiyon çağrılarını yürütemez, yalnızca hangi fonksiyonu çağırmak istediğini bildirir, yerel programımızın model tarafından döndürülen tool_calls parametresine dayanarak belirli fonksiyon çağrısını gerçekleştirmesi gerekmektedir. Yerel fonksiyonları yürütme şekli farklı programlama dillerinde farklılık gösterir. Örneğin, Python'da daha önceki bölüme bakabilirsiniz.

4.3.3. Adım 3: Fonksiyonun Dönüş Sonucunu Kullanarak Modeli Yeniden Çağırma

Fonksiyon çağrısı yerel olarak yürütüldüğü için, fonksiyonun yürütme sonucunu ve kullanıcının sorusunu GPT modeline geri iletmemiz gerekiyor. Böylece nihai yanıtı alabiliriz.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sk-Roc5MX1zEuVxiuaMaETV6wZ2jXcCehjUCzwP9AcNErUiwppQ' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Bugün Şanghay'da hava nasıl?"
        },
        {
            "role": "function",
            "name": "get_current_weather",
            "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 derece Santigrat\"}"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Belirtilen konum için mevcut hava durumu bilgisini alır",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Hava durumunu sorgulamak için şehir, örn., 'İstanbul, Türkiye'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "santigrat",
                                "fahrenheit"
                            ],
                            "description": "Sıcaklık birimi, 'santigrat' için Santigrat, 'fahrenheit' için Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Not: Yukarıdaki istek ek bir fonksiyon iletişimini içerir ve GPT modeline fonksiyonun dönüş değerini bildirir. GPT, fonksiyonun dönüş bilgilerine dayanarak kullanıcının sorusunu doğrudan cevaplayacak ve fonksiyonu tekrar çağırmayacaktır.

Fonksiyon iletişimi, fonksiyonun dönüş değerini temsil eder ve aşağıdaki formata uygun olarak gelir:

{
    "role": "function", // Mesaj tipi fonksiyon, fonksiyonun dönüş değerini temsil eder
    "name": "get_current_weather", // Mevcut iletişimin get_current_weather fonksiyonunun dönüş değeri olduğunu GPT'ye bildirir
    "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 derece Santigrat\"}" // Fonksiyonun dönüş içeriği, JSON formatında veya diğer metin içeriği olabilir.
}

Aşağıda GPT tarafından oluşturulan nihai yanıt bulunmaktadır:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 144,
        "completion_tokens": 17,
        "total_tokens": 161
    },
    "id": "chatcmpl-8mLmvvKAjSql7rGF8fvQeddKhWYvr",
    "created": 1706534189,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "content": "Bugün Şanghay'da hava 25 derece Santigrat."
            },
            "finish_reason": "stop"
        }
    ]
}