1. Giới thiệu về Gọi Hàm (Function Calling)
Trong mô hình GPT, Gọi Hàm (Function Calling) đề cập đến việc cung cấp các hàm mô tả cho mô hình thông qua một API, cho phép nó lựa chọn thông minh và đầu ra một đối tượng JSON chứa các tham số để gọi một hoặc nhiều hàm. Điều quan trọng cần lưu ý là API Hoàn Thành Trò Chuyện (Chat Completions) không thực hiện trực tiếp việc gọi hàm, mà là tạo ra JSON có thể được sử dụng để thực thi hàm trong mã nguồn.
Một cách đơn giản, tính năng Gọi Hàm liên quan đến việc cung cấp một tập hàm định nghĩa (bao gồm mô tả hàm và mô tả tham số) cho mô hình GPT. Mô hình sau đó quyết định hàm nào để gọi dựa trên truy vấn của người dùng. Vì mô hình không thể thực thi các hàm bên ngoài, nó chỉ có thể phản hồi với một yêu cầu để gọi hàm (bao gồm tham số gọi hàm). Sau khi nhận kết quả yêu cầu của mô hình, chương trình của chúng ta thực thi việc gọi hàm cục bộ. Kết quả của việc gọi hàm sau đó được nối với đoạn gợi ý và gửi trở lại cho mô hình để xử lý tiếp trước khi trả kết quả cuối cùng cho người dùng.
2. Các Kịch Bản Ứng Dụng của Gọi Hàm (Function Calling)
Dưới đây là một số ví dụ về các ứng dụng thực tế của nó:
- Tạo một trợ lý để trả lời câu hỏi bằng cách gọi các API bên ngoài, như việc định nghĩa các hàm như
send_email(to: string, body: string)
hoặcget_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
. - Chuyển đổi ngôn ngữ tự nhiên thành cuộc gọi API, ví dụ chuyển đổi "Ai là khách hàng hàng đầu của tôi?" thành
get_customers(min_revenue: int, created_before: string, limit: int)
sau đó thực hiện một cuộc gọi API nội bộ. - Trích xuất dữ liệu có cấu trúc từ văn bản, ví dụ như định nghĩa các hàm như
extract_data(name: string, birthday: string)
hoặcsql_query(query: string)
.
Bằng cách sử dụng tính năng Gọi Hàm, chúng ta có thể triển khai các tác nhân trí tuệ nhân tạo tương tác với hệ thống và cơ sở dữ liệu của chúng ta, chẳng hạn như cho phép Trí tuệ nhân tạo truy vấn thời tiết mới nhất, kiểm tra giá cổ phiếu, đặt đồ ăn mang về, hoặc đặt vé máy bay.
3. Các Mô hình Hỗ Trợ Gọi Hàm (Function Calling)
Không phải tất cả các phiên bản của mô hình đã được huấn luyện với dữ liệu gọi hàm. Hiện tại, các mô hình hỗ trợ gọi hàm là: 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
, và gpt-3.5-turbo-0613
.
Hơn nữa, các mô hình gpt-4-turbo-preview
, gpt-4-0125-preview
, gpt-4-1106-preview
, và gpt-3.5-turbo-1106
hỗ trợ gọi hàm song song, cho phép chúng thực thi nhiều cuộc gọi hàm cùng một lúc và có thể xử lý những cuộc gọi hàm này đồng thời để đạt được kết quả hiệu quả và hiệu suất cao.
Lưu ý: Rủi ro tiềm ẩn liên quan đến tính năng Gọi Hàm có thể dẫn đến mô hình sản xuất ra các tham số không đúng (tức là các tham số ảo). Do đó, trước khi thực hiện bất kỳ hành động nào ảnh hưởng đến thế giới thực (như gửi email, công bố trực tuyến, mua sắm, v.v.), nên tích hợp quy trình xác nhận từ người dùng ở mức sản phẩm, đảm bảo rằng các chức năng chỉ được thực thi sau khi người dùng xác nhận.
4. Ví dụ về Gọi Hàm
4.1 Ví dụ Python
Triển khai Gọi Hàm trên nền tảng OpenAI thường tuân theo các bước cơ bản được mô tả dưới đây. Phần sau sẽ mô tả toàn bộ quá trình bằng ví dụ mã Python, tập trung vào việc truy vấn thời tiết.
Bước 1: Chuẩn bị các hàm có thể gọi và định nghĩa hàm cho mô hình
Trước hết, chúng ta cần định nghĩa một hàm có thể được gọi bởi mô hình GPT. Điều này thường có nghĩa là chuẩn bị chức năng của chúng ta có thể thực hiện các hoạt động cụ thể dựa trên các tham số đầu vào, chẳng hạn như giao tiếp với API bên thứ ba.
import json
def get_current_weather(location, unit="fahrenheit"):
return json.dumps({
"location": location,
"temperature": "18",
"unit": unit
})
Bước 2: Gọi mô hình dựa trên tham số truy vấn và công cụ
Tiếp theo, chúng ta cần gọi mô hình GPT thông qua API Hoàn thiện Trò chuyện và truyền vào truy vấn của người dùng (ví dụ: "Thời tiết hiện tại là gì") cũng như tham số tools
, bao gồm mô tả của chức năng get_current_weather
mà chúng ta vừa định nghĩa.
from openai import OpenAI
client = OpenAI()
tools = [{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Lấy thông tin thời tiết hiện tại của một địa điểm cụ thể",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Tên thành phố, ví dụ: 'San Francisco, CA'"
},
"unit": {
"type": "string",
"enum": ["độ C", "độ F"]
}
},
"required": ["location"]
}
}
}]
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Thời tiết hiện tại ở San Francisco là gì?"}],
tools=tools
)
Bước 3: Thực thi chức năng cục bộ
Kết quả trả về từ mô hình sẽ bao gồm thông tin về chức năng mà mô hình muốn gọi, thường chứa trong tham số phản hồi tool_calls
. Chúng ta sau đó có thể thực hiện cuộc gọi chức năng tương ứng tại địa phương dựa trên thông tin gọi chức năng được mô tả trong tham số 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) # Ở đây, chúng ta có thể thấy thông tin thời tiết được truy vấn bởi cuộc gọi chức năng
Bước 4: Gọi mô hình lại với kết quả trả về từ chức năng
Bây giờ, chúng ta có thể gửi kết quả trả về từ chức năng như một tin nhắn mới đến mô hình, để mô hình có thể xử lý kết quả này và tạo ra một phản hồi phù hợp với người dùng.
follow_up_response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Thời tiết hiện tại ở San Francisco là gì?"},
{"role": "function", "name": "get_current_weather", "content": weather_info}
],
tools=tools
)
Giải thích: Trong ví dụ trên, nội dung trả về của chức năng được gửi đến mô hình GPT thông qua tin nhắn chức năng như sau:
{"role": "function", "name": "get_current_weather", "content": weather_info}
Trong thực tế, bạn cũng có thể đơn giản đưa nội dung trả về của chức năng vào trong lời nhắc của hệ thống để máy trí tuệ có thể tham khảo khi trả lời câu hỏi.
Bước 5: Nhận phản hồi cuối cùng từ mô hình
Cuối cùng, chúng ta có thể nhận phản hồi cuối cùng từ mô hình và cung cấp nó cho người dùng. Ở bước này, mô hình sẽ đưa ra một câu trả lời thân thiện với người dùng dựa trên thông tin thời tiết mà chúng ta cung cấp.
final_output = follow_up_response.choices[0].message.content
print(final_output) # Kết quả này là thông tin thời tiết chúng ta muốn hiển thị cho người dùng
Theo các bước trên, chúng ta đã hoàn thành một ví dụ hoàn chỉnh về truy vấn thời tiết bằng cách sử dụng mô hình GPT và cuộc gọi chức năng.
4.2.1 Ý nghĩa của Các Trường Tham Số 'Tools'
Khi thực hiện một cuộc gọi hàm, bạn cần xác định thông tin liên quan của hàm trong tham số tools
. Tham số tools
là một mảng chứa nhiều định nghĩa hàm, và mỗi định nghĩa hàm bao gồm các trường sau:
-
type
: Trường này đại diện cho loại công cụ. Trong một cuộc gọi hàm, trường này nên được đặt thành"function"
. -
function
: Trường này chứa thông tin chi tiết về hàm và là một đối tượng với các trường cụ thể sau:-
name
: Tên của hàm, là một chuỗi. -
description
: Mô tả mục đích của hàm, có thể giúp mô hình tạo ra các tham số phù hợp với mong đợi của người dùng. -
parameters
: Mô tả các định nghĩa tham số của hàm và là một đối tượng chứa các trường con sau:-
type
: Xác định loại của tham số, thường nên được đặt là"object"
. -
properties
: Các định nghĩa cụ thể của mỗi tham số của hàm, trong đó mỗi định nghĩa tham số là một đối tượng thông thường chứa các trường con sau:-
type
: Kiểu dữ liệu của tham số (như"string"
,"integer"
,"boolean"
, vv.). -
description
: Mô tả của tham số nhằm giúp mô hình hiểu mục đích của nó. -
enum
(tùy chọn): Khitype
là"string"
, trườngenum
có thể chỉ định một mảng chuỗi đại diện cho tập hợp các giá trị hợp lệ.
-
-
required
: Một mảng chuỗi chứa tên các tham số bắt buộc.
-
-
4.2.2 Ví dụ Định nghĩa Công cụ
Bây giờ hãy cung cấp một số ví dụ về định nghĩa tools
để giúp hiểu cách sử dụng từng trường.
Ví dụ 1: Lấy Thông Tin Thời Tiết Hiện Tại
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Lấy thông tin thời tiết hiện tại cho địa điểm cụ thể",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Thành phố cần truy vấn thông tin thời tiết, ví dụ: 'San Francisco, CA'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Đơn vị nhiệt độ, 'celsius' cho Celsius, 'fahrenheit' cho Fahrenheit"
}
},
"required": ["location", "unit"]
}
}
}
Trong ví dụ trên, chúng ta đã định nghĩa một hàm có tên get_current_weather
để lấy thông tin thời tiết hiện tại của một địa điểm cụ thể. Các tham số bao gồm location
và unit
, trong đó unit
có hai giá trị hợp lệ: "celsius" (Celsius) và "fahrenheit" (Fahrenheit).
Ví dụ 2: Tìm Album của Một Nghệ sĩ Cụ Thể
{
"type": "function",
"function": {
"name": "find_artist_albums",
"description": "Tìm tất cả album của một nghệ sĩ cụ thể",
"parameters": {
"type": "object",
"properties": {
"artist_name": {
"type": "string",
"description": "Tên của nghệ sĩ"
}
},
"required": ["artist_name"]
}
}
}
Trong ví dụ này, chúng ta đã tạo một hàm có tên find_artist_albums
để tìm tất cả album của một nghệ sĩ cụ thể. Hàm này chỉ yêu cầu một tham số: artist_name
(tên của nghệ sĩ).
4.3. Ví dụ về Cuộc Gọi Hàm Yêu Cầu HTTP
OpenAI cung cấp một API có thể truy cập qua giao thức HTTP. Bên dưới, chúng tôi sẽ giải thích cách sử dụng tính năng cuộc gọi hàm thông qua API HTTP. Các nhà phát triển ngôn ngữ lập trình khác có thể tham khảo ví dụ này.
4.3.1. Bước 1: Gọi Mô hình với Truy vấn của Người Dùng và Khai báo Hàm
Đầu tiên, chúng ta cần gửi truy vấn của người dùng và danh sách các chức năng mà chúng ta hỗ trợ cho mô hình GPT, để mô hình có thể tự động phân tích xem chức năng nào sẽ được gọi để trả lời truy vấn của người dùng dựa trên câu hỏi của người dùng.
Trong ví dụ sau, chúng ta thông báo với GPT rằng chúng ta có một chức năng get_current_weather
có thể được sử dụng để truy vấn thông tin thời tiết cho một thành phố cụ thể.
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": "Thời tiết ở Shanghai như thế nào hôm nay?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Lấy thông tin thời tiết hiện tại cho địa điểm cụ thể",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Thành phố mà muốn truy vấn thời tiết, ví dụ 'San Francisco, CA'"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Đơn vị nhiệt độ, 'celsius' cho độ Celsius, 'fahrenheit' cho độ Fahrenheit"
}
},
"required": [
"location",
"unit"
]
}
}
}
]
}'
Giải thích tham số yêu cầu:
{
"model": "gpt-3.5-turbo", // Mô hình GPT sẽ được gọi
"messages": [ // Đây là danh sách các tin nhắn cho GPT, bao gồm truy vấn của người dùng
{
"role": "user",
"content": "Thời tiết ở Shanghai như thế nào hôm nay?"
}
],
"tools": [
// Đây là định nghĩa chức năng của bạn, thông báo cho GPT về các chức năng có sẵn
]
}
Xem phần 4.2.2 để biết định nghĩa của tham số tools
.
Trong quá trình xử lý bình thường bởi mô hình GPT, bạn sẽ nhận được một phản hồi API tương tự như sau:
{
"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": [ // Tham số tool_calls đại diện cho danh sách các chức năng mà GPT muốn gọi
{
"id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
"type": "function",
"function": {
"name": "get_current_weather", // Chỉ ra rằng GPT muốn trả lời truy vấn của người dùng bằng cách gọi chức năng get_current_weather
"arguments": "{\n \"location\": \"Shanghai, China\",\n \"unit\": \"celsius\"\n}" // Đây là tham số đầu vào cho việc gọi chức năng get_current_weather
}
}
]
},
"finish_reason": "tool_calls"
}
]
}
4.3.2. Bước 2: Thực hiện Gọi chức năng Cục bộ
Vì mô hình GPT chính nó không thể thực thi các cuộc gọi chức năng cụ thể và chỉ thông báo cho chúng ta biết chức năng nào mà nó muốn gọi, chương trình cục bộ của chúng ta cần thực hiện cuộc gọi chức năng cụ thể dựa trên tham số tool_calls
mà mô hình trả về. Cách thực thi các chức năng cục bộ thay đổi tùy thuộc vào ngôn ngữ lập trình khác nhau. Ví dụ, trong Python, bạn có thể tham khảo phần trước đó.
4.3.3. Bước 3: Gọi Lại Mô Hình với Kết Quả Trả về của Hàm
Do cuộc gọi hàm được thực thi cục bộ, chúng ta cần truyền kết quả của việc thực thi hàm và câu hỏi của người dùng trở lại mô hình GPT để tạo ra phản hồi cuối cùng.
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": "Thời tiết ở Thượng Hải hôm nay như thế nào?"
},
{
"role": "function",
"name": "get_current_weather",
"content": "{\"city\":\"Shanghai\", \"temperature\":\"25 độ C\"}"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Lấy thông tin thời tiết hiện tại cho địa điểm cụ thể",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Thành phố cần tra cứu thời tiết, ví dụ, 'San Francisco, CA'"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "Đơn vị nhiệt độ, 'celsius' cho Celsius, 'fahrenheit' cho Fahrenheit"
}
},
"required": [
"location",
"unit"
]
}
}
}
]
}'
Lưu ý: Yêu cầu trên bao gồm một tin nhắn hàm bổ sung để thông báo về giá trị trả về của hàm. GPT sẽ trả lời trực tiếp câu hỏi của người dùng dựa trên thông tin trả về của hàm và sẽ không gọi lại hàm một lần nữa.
Tin nhắn hàm đại diện cho giá trị trả về của hàm và tuân theo định dạng dưới đây:
{
"role": "function", // Loại tin nhắn là hàm, chỉ ra giá trị trả về của hàm
"name": "get_current_weather", // Thông báo với GPT là tin nhắn hiện tại là giá trị trả về của hàm get_current_weather
"content": "{\"city\":\"Shanghai\", \"temperature\":\"25 độ C\"}" // Nội dung trả về của hàm, có thể ở định dạng JSON hoặc nội dung văn bản khác.
}
Dưới đây là phản hồi cuối cùng được tạo ra bởi 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": "Thời tiết ở Thượng Hải hôm nay là 25 độ C."
},
"finish_reason": "stop"
}
]
}