Apa Itu OpenAI Function Calling?
OpenAI API sangat andal untuk menghasilkan respons secara sistematis. Anda dapat mengelola prompt, mengoptimalkan keluaran model, serta membuat dan menjalankan aplikasi berbasis bahasa hanya dengan beberapa baris kode.
Meski memiliki banyak kelebihan, OpenAI API bisa menjadi mimpi buruk bagi pengembang dan insinyur. Mengapa? Mereka terbiasa bekerja dengan tipe data terstruktur, sedangkan bekerja dengan data tidak terstruktur seperti string itu sulit.
Untuk mendapatkan hasil yang konsisten, pengembang harus menggunakan regular expressions (RegEx) atau prompt engineering untuk mengekstrak informasi dari string teks.
Di sinilah kemampuan function calling dari OpenAI berperan. Fitur ini memungkinkan model GPT-3.5 dan GPT-4 menerima fungsi yang ditentukan pengguna sebagai input dan menghasilkan output terstruktur. Dengan ini, Anda tidak perlu menulis RegEx atau melakukan prompt engineering.
Dalam tutorial ini, saya akan menjelaskan langkah demi langkah bagaimana function calling OpenAI dapat membantu mengatasi masalah umum yang dihadapi pengembang akibat keluaran model yang tidak teratur.
Menggunakan OpenAI Tanpa Function Calling
Pada bagian ini, kita akan menghasilkan respons menggunakan model GPT-3.5-Turbo tanpa function calling untuk melihat apakah kita mendapatkan output yang konsisten atau tidak.
Sebelum memasang OpenAI Python API, Anda harus memperoleh kunci API dan mengaturnya di sistem lokal Anda. Ikuti tutorial GPT-3.5 dan GPT-4 melalui OpenAI API di Python untuk mempelajari cara mendapatkan kunci API dan menyiapkannya. Tutorial tersebut juga mencakup contoh penyiapan variabel lingkungan di DataLab, notebook data bertenaga AI dari DataCamp.
Untuk bantuan lebih lanjut, lihat kodenya di buku kerja OpenAI Function Calling di DataLab.
Tingkatkan OpenAI Python API ke V1 menggunakan:
pip install --upgrade openai -q
Setelah itu, inisialisasi klien OpenAI menggunakan kunci API.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY'],
)
Catatan: OpenAI tidak lagi menawarkan kredit gratis untuk pengguna baru, jadi Anda harus membelinya untuk menggunakan API.
Kita akan menulis deskripsi siswa acak. Anda bisa membuat teks sendiri atau menggunakan ChatGPT untuk menghasilkannya.
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."
Berikutnya, kita akan menulis prompt untuk mengekstrak informasi siswa dari teks dan mengembalikan output sebagai objek JSON. Kita akan mengekstrak nama, jurusan, sekolah, nilai, dan klub dari deskripsi siswa.
# 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}
'''
Tambahkan prompt ke modul chat completion OpenAI API untuk menghasilkan respons.
# 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
Responsnya cukup baik. Mari kita ubah menjadi JSON agar lebih mudah dipahami.
'{\n "name": "David Nguyen",\n "major": "computer science",\n "school": "Stanford University",\n "grades": "3.8 GPA",\n "club": "Robotics Club"\n}'
Kita akan menggunakan pustaka `json` untuk mengonversi teks menjadi objek JSON.
import json
# Loading the response as a JSON object
json_response = json.loads(openai_response.choices[0].message.content)
json_response
Hasil akhirnya hampir sempurna. Lalu, mengapa kita memerlukan Function Calling?
{'name': 'David Nguyen',
'major': 'computer science',
'school': 'Stanford University',
'grades': '3.8 GPA',
'club': 'Robotics Club'}
Mari coba prompt yang sama, tetapi menggunakan deskripsi siswa yang berbeda.
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."
Kita hanya akan mengubah teks deskripsi siswa di dalam prompt.
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}
'''
Lalu, jalankan fungsi chat completion menggunakan prompt kedua.
# 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
Seperti yang Anda lihat, hasilnya tidak konsisten. Alih-alih mengembalikan satu klub, ia mengembalikan daftar klub yang diikuti Ravi. Ini juga berbeda dari siswa pertama.
{'name': 'Ravi Patel',
'major': 'computer science',
'school': 'University of Michigan',
'grades': '3.7 GPA',
'club': ['Chess Club', 'South Asian Student Association']}
Contoh OpenAI Function Calling
Untuk mengatasi masalah ini, kita akan menggunakan fitur yang baru diperkenalkan bernama Function Calling. Penting untuk membuat fungsi kustom guna menambahkan informasi yang diperlukan ke dalam daftar dictionary agar OpenAI API dapat memahami fungsionalitasnya.
- name: tuliskan nama fungsi Python yang baru saja Anda buat.
- description: fungsionalitas dari fungsi tersebut.
- parameters: di dalam “properties”, kita akan menuliskan nama argumen, tipe, dan deskripsinya. Ini akan membantu OpenAI API mengidentifikasi hal yang kita cari.
Catatan: Pastikan Anda mengikuti pola yang benar. Pelajari lebih lanjut tentang function calling dengan membaca dokumentasi resmi.
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. '
}
}
}
}
]
Berikutnya, kita akan menghasilkan respons untuk dua deskripsi siswa menggunakan fungsi kustom yang ditambahkan ke argumen "functions". Setelah itu, kita akan mengonversi respons teks menjadi objek JSON dan mencetaknya.
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)
Seperti yang kita lihat, kita mendapatkan output yang seragam. Kita bahkan mendapatkan nilai dalam bentuk numerik alih-alih string. Output yang konsisten sangat penting untuk membangun aplikasi AI yang bebas bug.
{'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'}
Beberapa Fungsi Kustom
Anda dapat menambahkan beberapa fungsi kustom ke fungsi chat completion. Pada bagian ini, kita akan melihat kemampuan luar biasa OpenAI API dan bagaimana ia secara otomatis memilih fungsi yang tepat dan mengembalikan argumen yang benar.
Di dalam list Python yang berisi dictionary, kita akan menambahkan fungsi lain bernama “extract_school_info,” yang akan membantu kita mengekstrak informasi universitas dari teks.
Untuk melakukan ini, Anda harus menambahkan dictionary fungsi lain dengan name, description, dan parameters.
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.'
}
}
}
}
]
Kita akan membuat deskripsi “Stanford University” menggunakan ChatGPT untuk menguji fungsi kita.
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. "
Buat daftar deskripsi siswa dan sekolah lalu teruskan melalui fungsi chat completion OpenAI untuk menghasilkan respons. Pastikan Anda telah memberikan fungsi kustom yang diperbarui.
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)
Model GPT-3.5-Turbo telah secara otomatis memilih fungsi yang benar untuk tipe deskripsi yang berbeda. Kita mendapatkan output JSON yang sempurna untuk siswa dan sekolah.
{'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}
Kita bahkan dapat melihat di bawah nama bahwa respons tersebut dihasilkan menggunakan fungsi “extract_school_info”.

Aplikasi Function Calling
Pada bagian ini, kita akan membangun peringkas teks yang stabil untuk meringkas informasi sekolah dan siswa dengan cara tertentu.
Pertama, kita akan membuat dua fungsi Python, extract_student_info dan extract_school_info, yang mengambil argumen dari function calling dan mengembalikan string ringkasan.
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."
- Buat list Python yang berisi deskripsi siswa pertama, prompt acak, dan deskripsi sekolah pertama. Prompt acak ditambahkan untuk memvalidasi mekanisme function calling otomatis.
- Kita akan menghasilkan respons menggunakan setiap teks dalam list `descriptions`.
- Jika function call digunakan, kita akan mendapatkan nama fungsi dan, berdasarkan itu, menerapkan argumen yang relevan ke fungsi menggunakan respons. Jika tidak, kembalikan respons biasa.
- Cetak output dari ketiga sampel.
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: Model GPT telah memilih “extract_student_info,” dan kita mendapatkan ringkasan singkat tentang siswa tersebut.
- Sample#2: Model GPT tidak memilih fungsi apa pun dan memperlakukan prompt sebagai pertanyaan biasa, sehingga kita mendapatkan biografi Abraham Lincoln.
- Sample#3: Model GPT telah memilih “extract_school_info,” dan kita mendapatkan ringkasan singkat tentang Stanford University.
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.
Kesimpulan
Dalam tutorial ini, kita mempelajari function calling dari OpenAI. Kita juga mempelajari cara menggunakannya untuk menghasilkan output yang konsisten, membuat beberapa fungsi, dan membangun peringkas teks yang andal.
Jika Anda ingin mempelajari lebih lanjut tentang OpenAI API, pertimbangkan untuk mengikuti kursus Working with OpenAI API dan menggunakan lembar contekan OpenAI API in Python untuk membuat proyek bertenaga AI pertama Anda.
FAQ
Bagaimana OpenAI function calling menangani output JSON bersarang yang kompleks?
OpenAI function calling memungkinkan Anda mendefinisikan struktur JSON bertingkat di dalam skema fungsi. Dengan menentukan hubungan hierarkis dalam properti parameters, Anda dapat memastikan model menghasilkan output JSON yang tersarang dan terstruktur dengan benar untuk kebutuhan data yang kompleks.
Apakah OpenAI function calling dapat digunakan dengan API atau database eksternal?
Ya, OpenAI function calling dapat diintegrasikan dengan API atau database eksternal dengan membuat fungsi kustom yang mengeksekusi pemanggilan API atau kueri database berdasarkan argumen yang diteruskan dari model. Ini memungkinkan interaksi dinamis dengan sistem eksternal sambil mempertahankan respons yang konsisten dan terstruktur.
Apa yang terjadi jika function call model tidak cocok dengan fungsi mana pun yang didefinisikan?
Jika function call model tidak cocok dengan fungsi yang didefinisikan atau skema yang disediakan, function call tidak dipicu, dan model memperlakukan input sebagai prompt berbasis teks standar, lalu mengembalikan respons berbasis teks biasa. Ini memastikan fleksibilitas dalam menangani berbagai jenis input.
Sebagai data scientist tersertifikasi, saya bersemangat memanfaatkan teknologi mutakhir untuk menciptakan aplikasi machine learning yang inovatif. Dengan latar belakang kuat di pengenalan ucapan, analisis dan pelaporan data, MLOps, conversational AI, dan NLP, saya mengasah keterampilan dalam mengembangkan sistem cerdas yang berdampak nyata. Selain keahlian teknis, saya juga komunikator andal yang mampu menyederhanakan konsep kompleks menjadi bahasa yang jelas dan ringkas. Karena itu, saya menjadi blogger yang dicari di bidang data science, membagikan wawasan dan pengalaman kepada komunitas profesional data yang terus berkembang. Saat ini, saya berfokus pada pembuatan dan penyuntingan konten, bekerja dengan large language model untuk mengembangkan konten yang kuat dan menarik agar membantu bisnis dan individu memaksimalkan data mereka.

