1. Pengenalan tentang Pemanggilan Fungsi

Pada model GPT, Pemanggilan Fungsi mengacu pada penyediaan fungsi deskriptif ke model melalui API, memungkinkannya untuk secara cerdas memilih dan menghasilkan objek JSON yang berisi parameter untuk memanggil satu atau lebih fungsi. Penting untuk dicatat bahwa API Penyelesaian Obrolan tidak langsung menjalankan pemanggilan fungsi, melainkan menghasilkan JSON yang dapat digunakan untuk menjalankan fungsi dalam kode.

Secara sederhana, fitur Pemanggilan Fungsi melibatkan penyediaan kumpulan definisi fungsi (termasuk deskripsi fungsi dan deskripsi parameter) ke model GPT. Model kemudian memutuskan fungsi mana yang akan dipanggil berdasarkan pertanyaan pengguna. Karena model tidak dapat menjalankan fungsi eksternal, ia hanya dapat merespons dengan permintaan untuk memanggil fungsi (termasuk parameter pemanggilan fungsi). Setelah menerima hasil permintaan model, program kita menjalankan panggilan fungsi secara lokal. Hasil panggilan fungsi kemudian digabungkan dengan prompt dan dikirim kembali ke model untuk pemrosesan lebih lanjut sebelum mengembalikan hasil akhir kepada pengguna.

2. Skenario Aplikasi Pemanggilan Fungsi

Berikut adalah beberapa contoh aplikasi praktisnya:

  • Membuat asisten untuk menjawab pertanyaan dengan memanggil API eksternal, seperti mendefinisikan fungsi-fungsi seperti send_email(to: string, body: string) atau get_current_weather(location: string, unit: 'celsius' | 'fahrenheit').
  • Mengonversi bahasa alami menjadi panggilan API, misalnya menerjemahkan "Siapa pelanggan terbaik saya?" menjadi get_customers(min_revenue: int, created_before: string, limit: int) dan kemudian melakukan panggilan API internal.
  • Mengekstraksi data terstruktur dari teks, misalnya mendefinisikan fungsi seperti extract_data(name: string, birthday: string) atau sql_query(query: string).

Dengan memanfaatkan fitur Pemanggilan Fungsi, kita dapat mengimplementasikan agen kecerdasan buatan yang berinteraksi dengan sistem dan basis data lokal kita, seperti memiliki kecerdasan buatan menanyakan cuaca terkini, memeriksa harga saham, memesan makanan, atau memesan penerbangan.

3. Model yang Mendukung Pemanggilan Fungsi

Tidak semua versi model telah dilatih dengan data pemanggilan fungsi. Saat ini, model yang mendukung pemanggilan fungsi adalah: 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, dan gpt-3.5-turbo-0613.

Selain itu, model gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview, dan gpt-3.5-turbo-1106 mendukung pemanggilan fungsi paralel, memungkinkan mereka untuk menjalankan beberapa pemanggilan fungsi sekaligus dan dapat menangani pemanggilan fungsi tersebut secara bersamaan untuk menghasilkan hasil yang efektif dan efisien.

Catatan: Risiko potensial yang terkait dengan fitur Pemanggilan Fungsi adalah bahwa hal itu dapat menyebabkan model menghasilkan parameter yang salah (misalnya, parameter palsu). Oleh karena itu, sebelum melakukan tindakan yang berdampak pada dunia nyata (seperti mengirim email, publikasi online, melakukan pembelian, dll.), disarankan untuk menyertakan proses konfirmasi pengguna di tingkat produk, memastikan bahwa fungsi-fungsi hanya dieksekusi setelah konfirmasi pengguna.

4. Contoh Pemanggilan Fungsi

4.1 Contoh Python

Menerapkan Pemanggilan Fungsi pada platform OpenAI umumnya mengikuti langkah dasar yang dijelaskan di bawah ini. Berikut akan menjelaskan seluruh proses menggunakan contoh kode Python, berfokus pada menanyakan cuaca.

Langkah 1: Menyiapkan fungsi yang dapat dipanggil dan definisi fungsi untuk model

Pertama, kita perlu mendefinisikan fungsi yang dapat dipanggil oleh model GPT. Umumnya hal ini berarti menyiapkan fungsi kita sendiri yang dapat melakukan operasi tertentu berdasarkan parameter masukan, seperti berkomunikasi dengan API pihak ketiga.

import json

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

Langkah 2: Memanggil model berdasarkan parameter query dan tools

Selanjutnya, kita perlu memanggil model GPT melalui API Pengisian Obrolan dan menyertakan query pengguna (misalnya "Bagaimana cuaca saat ini") serta parameter tools, yang mencakup deskripsi dari fungsi get_current_weather yang baru saja kita definisikan.

from openai import OpenAI

client = OpenAI()

tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Mendapatkan informasi cuaca saat ini untuk lokasi tertentu",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Nama kota, misalnya: 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
}]

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Bagaimana cuaca saat ini di San Francisco?"}],
    tools=tools
)

Langkah 3: Melaksanakan fungsi secara lokal

Hasil yang dikembalikan oleh model akan mencakup informasi tentang fungsi yang ingin dipanggil oleh model, biasanya terdapat dalam parameter respons tool_calls. Kita kemudian dapat menjalankan panggilan fungsi yang sesuai secara lokal berdasarkan informasi panggilan fungsi yang dijelaskan dalam parameter tool_calls.

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) # Di sini kita dapat melihat informasi cuaca yang ditanyakan oleh panggilan fungsi

Langkah 4: Memanggil model kembali dengan hasil kembalian fungsi

Sekarang, kita dapat mengirimkan hasil kembalian fungsi sebagai pesan baru ke model, sehingga model dapat memproses hasil ini dan menghasilkan respons yang disesuaikan dengan pengguna.

follow_up_response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Bagaimana cuaca saat ini di San Francisco?"},
        {"role": "function", "name": "get_current_weather", "content": weather_info}
    ],
    tools=tools
)

Penjelasan: Dalam contoh di atas, isi kembalian fungsi dikirimkan ke model GPT melalui pesan fungsi sebagai berikut:

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

Dalam praktiknya, Anda juga dapat dengan mudah menyertakan isi kembalian fungsi sebagai konten referensi ke dalam prompt pesan sistem agar KI dapat merujuk saat menjawab pertanyaan.

Langkah 5: Memperoleh respons akhir dari model

Akhirnya, kita dapat mengambil respons akhir dari model dan menyajikannya kepada pengguna. Pada langkah ini, model akan menghasilkan jawaban yang ramah pengguna berdasarkan informasi cuaca yang kita sediakan.

final_output = follow_up_response.choices[0].message.content
print(final_output) # Output ini adalah informasi cuaca yang ingin kita tampilkan kepada pengguna

Dengan mengikuti langkah-langkah di atas, kita telah menyelesaikan contoh lengkap tentang menanyakan cuaca menggunakan model GPT dan panggilan fungsi.

4.2. Penjelasan definisi fungsi panggilan fungsi

4.2.1 Arti dari Bidang Parameter 'Tools'

Saat melakukan pemanggilan fungsi, Anda perlu mendefinisikan informasi terkait fungsi dalam parameter tools. Parameter tools adalah sebuah array yang berisi beberapa definisi fungsi, dan setiap definisi fungsi mencakup bidang-bidang berikut:

  1. type: Bidang ini mewakili tipe dari alat. Dalam pemanggilan fungsi, bidang ini harus diatur menjadi "function".
  2. function: Bidang ini berisi informasi detail tentang fungsi dan merupakan objek dengan bidang-bidang spesifik berikut:
    • name: Nama fungsi, yang merupakan string.
    • description: Deskripsi tujuan fungsi, yang dapat membantu model menghasilkan parameter yang sesuai dengan harapan pengguna.
    • parameters: Mendeskripsikan definisi parameter fungsi dan merupakan objek yang berisi sub-bidang berikut:
      • type: Mendefinisikan tipe dari parameter, yang sebagian besar harus diatur menjadi "object".
      • properties: Definisi spesifik dari setiap parameter fungsi, di mana setiap definisi parameter merupakan objek yang biasanya berisi sub-bidang berikut:
        • type: Tipe data dari parameter (seperti "string", "integer", "boolean", dll.).
        • description: Deskripsi parameter untuk membantu model memahami tujuannya.
        • enum (opsional): Ketika type adalah "string", bidang enum dapat menentukan array string yang mewakili himpunan nilai valid.
      • required: Sebuah array string yang berisi nama-nama parameter yang diperlukan.

4.2.2 Contoh Definisi Alat

Sekarang mari berikan beberapa contoh definisi tools untuk membantu memahami bagaimana setiap bidang digunakan.

Contoh 1: Dapatkan Informasi Cuaca Saat Ini

{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Dapatkan informasi cuaca saat ini untuk lokasi yang ditentukan",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Kota untuk mana cuaca perlu ditanyakan, misalnya, 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "Unit suhu, 'celsius' untuk Celsius, 'fahrenheit' untuk Fahrenheit"
                }
            },
            "required": ["location", "unit"]
        }
    }
}

Pada contoh di atas, kami telah mendefinisikan fungsi bernama get_current_weather untuk mendapatkan cuaca saat ini dari lokasi yang ditentukan. Parameter termasuk location dan unit, di mana unit memiliki dua nilai yang valid: "celsius" (Celsius) dan "fahrenheit" (Fahrenheit).

Contoh 2: Temukan Album untuk Seorang Artis Tertentu

{
    "type": "function",
    "function": {
        "name": "find_artist_albums",
        "description": "Temukan semua album untuk seorang artis tertentu",
        "parameters": {
            "type": "object",
            "properties": {
                "artist_name": {
                    "type": "string",
                    "description": "Nama dari artis"
                }
            },
            "required": ["artist_name"]
        }
    }
}

Pada contoh ini, kami telah membuat sebuah fungsi bernama find_artist_albums untuk menemukan semua album untuk seorang artis tertentu. Fungsi ini hanya memerlukan satu parameter: artist_name (nama artis).

4.3. Contoh Pemanggilan Fungsi Permintaan HTTP

OpenAI menyediakan API yang dapat diakses melalui protokol HTTP. Berikut, kami akan menjelaskan cara menggunakan fitur pemanggilan fungsi melalui API HTTP. Pengembang bahasa pemrograman lain dapat merujuk pada contoh ini.

4.3.1. Langkah 1: Memanggil Model dengan Pertanyaan Pengguna dan Deklarasi Fungsi

Pertama, kita perlu mengirim pertanyaan pengguna dan daftar fungsi yang kami dukung ke model GPT, sehingga model dapat secara otomatis menganalisis fungsi mana yang harus dipanggil untuk menjawab pertanyaan pengguna berdasarkan pertanyaan pengguna.

Pada contoh berikut, kita memberitahukan GPT bahwa kita memiliki fungsi get_current_weather yang dapat digunakan untuk menanyakan informasi cuaca untuk kota tertentu.

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": "Bagaimana cuaca di Shanghai hari ini?"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Dapatkan informasi cuaca saat ini untuk lokasi yang spesifik",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Kota untuk melakukan kueri cuaca, contohnya 'Bandung, Indonesia'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Unit suhu, 'celsius' untuk Celsius, 'fahrenheit' untuk Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Penjelasan parameter permintaan:

{
    "model": "gpt-3.5-turbo", // Model GPT yang akan dipanggil
    "messages": [ // Ini adalah daftar pesan untuk GPT, termasuk pertanyaan pengguna
        {
            "role": "user",
            "content": "Bagaimana cuaca di Shanghai hari ini?"
        }
    ],
    "tools": [
	  // Ini adalah definisi fungsi Anda, memberi tahu GPT tentang fungsi yang tersedia
    ]
}

Harap merujuk ke bagian 4.2.2 untuk definisi parameter tools.

Dalam pemrosesan normal oleh model GPT, Anda akan menerima respons API yang mirip dengan contoh berikut:

{
    "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": [ // Parameter tool_calls mewakili daftar fungsi yang ingin dipanggil oleh GPT
                    {
                        "id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
                        "type": "function",
                        "function": {
                            "name": "get_current_weather",  // Menunjukkan bahwa GPT ingin menjawab pertanyaan pengguna dengan memanggil fungsi get_current_weather
                            "arguments": "{\n  \"location\": \"Shanghai, China\",\n  \"unit\": \"celsius\"\n}" // Ini adalah parameter masukan untuk memanggil fungsi get_current_weather
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls"
        }
    ]
}

4.3.2. Langkah 2: Eksekusi Panggilan Fungsi Lokal

Karena model GPT itu sendiri tidak dapat mengeksekusi panggilan fungsi spesifik dan hanya memberitahu kita fungsi mana yang ingin dipanggil, program lokal kita perlu mengeksekusi panggilan fungsi spesifik berdasarkan parameter tool_calls yang dikembalikan oleh model. Cara mengeksekusi fungsi lokal bervariasi dalam berbagai bahasa pemrograman. Sebagai contoh, dalam Python, Anda dapat merujuk ke bagian sebelumnya.

4.3.3. Langkah 3: Memanggil Model Lagi dengan Hasil Kembalian Fungsi

Karena panggilan fungsi dieksekusi secara lokal, kita perlu meneruskan hasil eksekusi fungsi dan pertanyaan pengguna kembali ke model GPT untuk membuat respons akhir.

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": "Cuaca di Shanghai hari ini bagaimana?"
        },
        {
            "role": "function",
            "name": "get_current_weather",
            "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 derajat Celsius\"}"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Dapatkan informasi cuaca saat ini untuk lokasi yang ditentukan",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Kota untuk mencari cuaca, contohnya 'Jakarta, ID'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Satuan suhu, 'celsius' untuk Celsius, 'fahrenheit' untuk Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Catatan: Permintaan di atas termasuk pesan fungsi tambahan untuk memberitahu model GPT tentang nilai kembalian fungsi. GPT akan langsung menjawab pertanyaan pengguna berdasarkan informasi kembalian fungsi dan tidak akan memanggil fungsi lagi.

Pesan fungsi mewakili nilai kembalian fungsi dan mengikuti format di bawah ini:

{
    "role": "function", // Tipe pesannya adalah fungsi, menunjukkan nilai kembalian dari fungsi get_current_weather
    "name": "get_current_weather", // Memberitahu GPT bahwa pesan saat ini adalah nilai kembalian dari fungsi get_current_weather
    "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 derajat Celsius\"}" // Konten kembalian fungsi, bisa dalam format JSON atau konten teks lainnya.
}

Berikut ini adalah respons akhir yang dihasilkan oleh GPT:

{
    "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": "Cuaca di Shanghai hari ini adalah 25 derajat Celsius."
            },
            "finish_reason": "stop"
        }
    ]
}