OpenAI Function Calling Nedir?
OpenAI API, yanıtları sistematik bir şekilde üretmede oldukça başarılıdır. İstemlerinizi yönetebilir, model çıktısını optimize edebilir ve birkaç satır kodla dil uygulamaları oluşturup çalıştırabilirsiniz.
Tüm bu artılarına rağmen, OpenAI API geliştiriciler ve mühendisler için bir kabusa dönüşebiliyordu. Neden? Çünkü onlar yapılandırılmış veri tipleriyle çalışmaya alışık; string gibi yapılandırılmamış verilerle çalışmak ise zordur.
Tutarlı sonuçlar almak için geliştiriciler, metin dizelerinden bilgi çıkarmak adına düzenli ifadeler (RegEx) ya da prompt engineering kullanmak zorundaydı.
İşte bu noktada OpenAI’nin function calling yeteneği devreye giriyor. Bu özellik, GPT-3.5 ve GPT-4 modellerinin kullanıcı tanımlı işlevleri girdi olarak alıp yapılandırılmış çıktı üretmesini sağlar. Böylece RegEx yazmanıza veya prompt engineering uygulamanıza gerek kalmaz.
Bu eğitimde, OpenAI function calling’in düzensiz model çıktılarının neden olduğu yaygın geliştirici sorunlarını adım adım nasıl çözebileceğini açıklayacağım.
Yapay Zeka Uygulamaları Geliştirin
Function Calling Olmadan OpenAI Kullanımı
Bu bölümde, tutarlı bir çıktı alıp almadığımızı görmek için GPT-3.5-Turbo modelini function calling olmadan kullanarak yanıtlar üreteceğiz.
OpenAI Python API’sini kurmadan önce bir API anahtarı almalı ve yerel sisteminizde yapılandırmalısınız. API anahtarının nasıl alınacağı ve kurulacağı hakkında bilgi edinmek için Python’da OpenAI API üzerinden GPT-3.5 ve GPT-4 eğitimini izleyin. Eğitim ayrıca DataCamp’in yapay zekâ özellikli veri defteri DataLab’de ortam değişkenlerinin kurulumu örneklerini de içerir.
Daha fazla yardım için, DataLab’deki OpenAI Function Calling çalışma kitabındaki koda göz atın.
OpenAI Python API’sini V1’e şu komutla yükseltin:
pip install --upgrade openai -q
Ardından, API anahtarını kullanarak OpenAI istemcisini başlatın.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY'],
)
Not: OpenAI artık yeni kullanıcılara ücretsiz kredi sunmuyor; API’yi kullanmak için kredi satın almanız gerekiyor.
Rastgele bir öğrenci açıklaması yazacağız. Kendi metninizi yazabilir veya ChatGPT’den sizin için bir tane oluşturmasını isteyebilirsiniz.
student_1_description = "David Nguyen is a sophomore majoring in computer science at Stanford University. He is Asian American and has a 3.8 GPA. David is known for his programming skills and is an active member of the university's Robotics Club. He hopes to pursue a career in artificial intelligence after graduating."
Sonraki adımda, metinden öğrenci bilgilerini çıkarıp çıktıyı bir JSON nesnesi olarak döndürecek bir istem yazacağız. Öğrenci açıklamasından ad, bölüm, okul, notlar ve kulüpleri çıkaracağız.
# A simple prompt to extract information from "student_description" in a JSON format.
prompt1 = f'''
Please extract the following information from the given text and return it as a JSON object:
name
major
school
grades
club
This is the body of text to extract the information from:
{student_1_description}
'''
İstemi OpenAI API’nin chat completion modülüne ekleyerek yanıt üretin.
# Generating response back from gpt-3.5-turbo
openai_response = client.chat.completions.create(
model = 'gpt-3.5-turbo',
messages = [{'role': 'user', 'content': prompt_1}]
)
openai_response.choices[0].message.content
Yanıt oldukça iyi. Daha iyi anlamak için bunu JSON’a dönüştürelim.
'{\n "name": "David Nguyen",\n "major": "computer science",\n "school": "Stanford University",\n "grades": "3.8 GPA",\n "club": "Robotics Club"\n}'
Metni bir JSON nesnesine dönüştürmek için `json` kütüphanesini kullanacağız.
import json
# Loading the response as a JSON object
json_response = json.loads(openai_response.choices[0].message.content)
json_response
Nihai sonuç oldukça kusursuz. Peki, o zaman Function Calling’e neden ihtiyaç var?
{'name': 'David Nguyen',
'major': 'computer science',
'school': 'Stanford University',
'grades': '3.8 GPA',
'club': 'Robotics Club'}
Aynı istemi, farklı bir öğrenci açıklamasıyla deneyelim.
student_2_description="Ravi Patel is a sophomore majoring in computer science at the University of Michigan. He is South Asian Indian American and has a 3.7 GPA. Ravi is an active member of the university's Chess Club and the South Asian Student Association. He hopes to pursue a career in software engineering after graduating."
İstemde sadece öğrenci açıklaması metnini değiştireceğiz.
prompt2 = f'''
Please extract the following information from the given text and return it as a JSON object:
name
major
school
grades
club
This is the body of text to extract the information from:
{student_2_description}
'''
Ve ikinci istemi kullanarak chat completion işlevini çalıştırın.
# Generating response back from gpt-3.5-turbo
openai_response = client.chat.completions.create(
model = 'gpt-3.5-turbo',
messages = [{'role': 'user', 'content': prompt_2}]
)
# Loading the response as a JSON object
json_response = json.loads(openai_response.choices[0].message.content)
json_response
Gördüğünüz gibi, tutarlı değil. Tek bir kulüp döndürmek yerine, Ravi’nin üye olduğu kulüplerin listesini döndürdü. Bu da ilk öğrenciden farklı.
{'name': 'Ravi Patel',
'major': 'computer science',
'school': 'University of Michigan',
'grades': '3.7 GPA',
'club': ['Chess Club', 'South Asian Student Association']}
OpenAI Function Calling Örneği
Bu sorunu çözmek için, yakın zamanda tanıtılan Function Calling özelliğini kullanacağız. OpenAI API’nin işlevini anlayabilmesi için, gereken bilgileri sözlük listesine ekleyen özel bir işlev oluşturmak önemlidir.
- name: yeni oluşturduğunuz Python işlevinin adını yazın.
- description: işlevin ne yaptığı.
- parameters: “properties” içinde argüman adlarını, türünü ve açıklamasını yazacağız. Bu, OpenAI API’nin aradığımız kavramları tanımlamasına yardımcı olur.
Not: Doğru deseni izlediğinizden emin olun. Function calling hakkında daha fazla bilgi için resmi belgelere göz atın.
student_custom_functions = [
{
'name': 'extract_student_info',
'description': 'Get the student information from the body of the input text',
'parameters': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': 'Name of the person'
},
'major': {
'type': 'string',
'description': 'Major subject.'
},
'school': {
'type': 'string',
'description': 'The university name.'
},
'grades': {
'type': 'integer',
'description': 'GPA of the student.'
},
'club': {
'type': 'string',
'description': 'School club for extracurricular activities. '
}
}
}
}
]
Sonraki adımda, "functions" argümanına eklediğimiz özel işlevi kullanarak iki öğrenci açıklaması için yanıtlar üreteceğiz. Ardından, metin yanıtını bir JSON nesnesine dönüştürüp yazdıracağız.
student_description = [student_1_description,student_2_description]
for i in student_description:
response = client.chat.completions.create(
model = 'gpt-3.5-turbo',
messages = [{'role': 'user', 'content': i}],
functions = student_custom_functions,
function_call = 'auto'
)
# Loading the response as a JSON object
json_response = json.loads(response.choices[0].message.function_call.arguments)
print(json_response)
Görüldüğü üzere, tekdüze bir çıktı aldık. Hatta notları string yerine sayısal olarak elde ettik. Tutarlı çıktı, hatasız yapay zekâ uygulamaları geliştirmek için kritik öneme sahiptir.
{'name': 'David Nguyen', 'major': 'computer science', 'school': 'Stanford University', 'grades': 3.8, 'club': 'Robotics Club'}
{'name': 'Ravi Patel', 'major': 'computer science', 'school': 'University of Michigan', 'grades': 3.7, 'club': 'Chess Club'}
Birden Fazla Özel İşlev
Chat completion işlevine birden fazla özel işlev ekleyebilirsiniz. Bu bölümde, OpenAI API’nin büyüleyici yeteneklerini ve doğru işlevi otomatik olarak seçip doğru argümanları nasıl döndürdüğünü göreceğiz.
Python sözlük listesinin içine, metinden üniversite bilgilerini çıkarmaya yardımcı olacak “extract_school_info” adlı başka bir işlev ekleyeceğiz.
Bunu başarmak için, adı, açıklaması ve parametreleri olan başka bir işlev sözlüğü eklemelisiniz.
custom_functions = [
{
'name': 'extract_student_info',
'description': 'Get the student information from the body of the input text',
'parameters': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': 'Name of the person'
},
'major': {
'type': 'string',
'description': 'Major subject.'
},
'school': {
'type': 'string',
'description': 'The university name.'
},
'grades': {
'type': 'integer',
'description': 'GPA of the student.'
},
'club': {
'type': 'string',
'description': 'School club for extracurricular activities. '
}
}
}
},
{
'name': 'extract_school_info',
'description': 'Get the school information from the body of the input text',
'parameters': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': 'Name of the school.'
},
'ranking': {
'type': 'integer',
'description': 'QS world ranking of the school.'
},
'country': {
'type': 'string',
'description': 'Country of the school.'
},
'no_of_students': {
'type': 'integer',
'description': 'Number of students enrolled in the school.'
}
}
}
}
]
İşlevimizi test etmek için ChatGPT kullanarak “Stanford University” açıklaması oluşturacağız.
school_1_description = "Stanford University is a private research university located in Stanford, California, United States. It was founded in 1885 by Leland Stanford and his wife, Jane Stanford, in memory of their only child, Leland Stanford Jr. The university is ranked #5 in the world by QS World University Rankings. It has over 17,000 students, including about 7,600 undergraduates and 9,500 graduates23. "
Öğrenci ve okul açıklamalarının listesini oluşturup yanıt üretmek için OpenAI chat completion işlevinden geçirin. Güncellenmiş özel işlevi sağladığınızdan emin olun.
description = [student_1_description, school_1_description]
for i in description:
response = client.chat.completions.create(
model = 'gpt-3.5-turbo',
messages = [{'role': 'user', 'content': i}],
functions = custom_functions,
function_call = 'auto'
)
# Loading the response as a JSON object
json_response = json.loads(response.choices[0].message.function_call.arguments)
print(json_response)
GPT-3.5-Turbo modeli, farklı açıklama türleri için doğru işlevi otomatik olarak seçti. Hem öğrenci hem de okul için kusursuz JSON çıktısı elde ettik.
{'name': 'David Nguyen', 'major': 'computer science', 'school': 'Stanford University', 'grades': 3.8, 'club': 'Robotics Club'}
{'name': 'Stanford University', 'ranking': 5, 'country': 'United States', 'no_of_students': 17000}
Hatta yanıtın “extract_school_info” işlevi kullanılarak üretildiğini ada bakarak görebiliriz.

Function Calling’in Kullanım Alanları
Bu bölümde, okul ve öğrenci bilgilerini belirli bir biçimde özetleyen kararlı bir metin özetleyici oluşturacağız.
Önce, function calling’den gelen argümanları alan ve özet bir dize döndüren extract_student_info ve extract_school_info adlı iki Python işlevi oluşturacağız.
def extract_student_info(name, major, school, grades, club):
"""Get the student information"""
return f"{name} is majoring in {major} at {school}. He has {grades} GPA and he is an active member of the university's {club}."
def extract_school_info(name, ranking, country, no_of_students):
"""Get the school information"""
return f"{name} is located in the {country}. The university is ranked #{ranking} in the world with {no_of_students} students."
- Öğrenci bir açıklaması, rastgele bir istem ve okul bir açıklamasından oluşan Python listesini oluşturun. Otomatik function calling mekanizmasını doğrulamak için rastgele istem eklenmiştir.
- `descriptions` listesindeki her metin için yanıt üreteceğiz.
- Bir function call kullanıldıysa, işlevin adını alacağız ve buna göre yanıttan ilgili argümanları işleme uygulayacağız. Aksi halde normal yanıtı döndürün.
- Üç örneğin çıktısını yazdırın.
descriptions = [
student_1_description,
"Who was a Abraham Lincoln?",
school_1_description
]
for i, sample in enumerate(descriptions):
response = client.chat.completions.create(
model = 'gpt-3.5-turbo',
messages = [{'role': 'user', 'content': sample}],
functions = custom_functions,
function_call = 'auto'
)
response_message = response.choices[0].message
if dict(response_message).get('function_call'):
# Which function call was invoked
function_called = response_message.function_call.name
# Extracting the arguments
function_args = json.loads(response_message.function_call.arguments)
# Function names
available_functions = {
"extract_school_info": extract_school_info,
"extract_student_info": extract_student_info
}
fuction_to_call = available_functions[function_called]
response_message = fuction_to_call(*list(function_args .values()))
else:
response_message = response_message.content
print(f"\nSample#{i+1}\n")
print(response_message)
- Sample#1: GPT modeli “extract_student_info”yu seçti ve öğrenci hakkında kısa bir özet aldık.
- Sample#2: GPT modeli herhangi bir işlev seçmedi, istemi normal bir soru olarak ele aldı ve sonuç olarak Abraham Lincoln’ün biyografisini verdi.
- Sample#3: GPT modeli “extract_school_info”yu seçti ve Stanford University hakkında kısa bir özet aldık.
Sample#1
David Nguyen is majoring in computer science at Stanford University. He has 3.8 GPA and he is an active member of the university's Robotics Club.
Sample#2
Abraham Lincoln was the 16th President of the United States. He served as president from March 1861 until his assassination in April 1865. Lincoln led the country through its greatest internal crisis, the American Civil War, and his Emancipation Proclamation declared slaves in Confederate territory to be free. He is known for his leadership, his commitment to preserving the Union, and his efforts to abolish slavery. Lincoln's presidency is widely regarded as one of the most transformative in American history.
Sample#3
Stanford University is located in the United States. The university is ranked #5 in the world with 17000 students.
Sonuç
Bu eğitimde, OpenAI’nin function calling özelliğini öğrendik. Ayrıca bunu tutarlı çıktılar üretmek, birden çok işlev oluşturmak ve güvenilir bir metin özetleyici inşa etmek için nasıl kullanacağımızı gördük.
OpenAI API hakkında daha fazla bilgi edinmek istiyorsanız, OpenAI API ile Çalışma kursunu almayı ve ilk yapay zekâ destekli projenizi oluşturmak için Python’da OpenAI API kılavuz sayfasını kullanmayı düşünün.
SSS
OpenAI function calling, karmaşık iç içe geçmiş JSON çıktıları nasıl işler?
OpenAI function calling, işlev şemasında iç içe geçmiş JSON yapılarını tanımlamanıza olanak tanır. parameters özelliği içinde hiyerarşik ilişkileri belirterek, modelin karmaşık veri gereksinimleri için doğru şekilde iç içe ve yapılandırılmış JSON çıktıları üretmesini sağlayabilirsiniz.
OpenAI function calling, harici API’ler veya veritabanlarıyla birlikte kullanılabilir mi?
Evet, OpenAI function calling, modelden iletilen argümanlara göre API çağrılarını veya veritabanı sorgularını çalıştıran özel işlevler oluşturarak harici API’ler veya veritabanlarıyla entegre edilebilir. Bu, tutarlı ve yapılandırılmış yanıtları korurken harici sistemlerle dinamik etkileşimleri mümkün kılar.
Modelin işlev çağrısı tanımlı herhangi bir işleve uymuyorsa ne olur?
Modelin işlev çağrısı tanımlı bir işleve veya sağlanan şemaya uymuyorsa, işlev çağrısı tetiklenmez ve model girdiyi standart bir metin istemi olarak ele alır; bunun yerine tipik bir metin yanıtı döndürür. Bu, çeşitli girdi türlerini esnek şekilde ele almayı sağlar.

Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.