Giải mã Function Calling trong OpenAI (Phần 4)

4 min read

function calling phần 4

Trong bài viết trước chúng ta đã tìm hiểu về ‘Best Practices’ của Function Call trong OpenAi (Đọc lại phần trước tại đây). Trong bài viết này chúng ta sẽ xem xét một số ví dụ thực tế về việc gọi hàm trong OpenAI.

Ví dụ về Function Calling trong OpenAI

Để thực sự hiểu sức mạnh và tính linh hoạt của việc gọi hàm trong OpenAI, hãy đi qua một ví dụ từng bước sử dụng Python. Trong ví dụ này, chúng ta sẽ sử dụng mô hình GPT của OpenAI để thực hiện hai nhiệm vụ: dịch văn bản từ tiếng Anh sang tiếng Việt và lấy thông tin thời tiết hiện tại cho một địa điểm cụ thể. Chúng ta sẽ sử dụng API của OpenAI, cùng với hai API bên ngoài cho dịch và thông tin thời tiết. Bạn có thể tìm mã đầy đủ cho ví dụ này trên GitHub.

Thiết Lập Môi Trường

Trước tiên, chúng ta cần thiết lập môi trường. Chúng ta sẽ sử dụng một số thư viện Python, bao gồm openai, requests và pydantic. Chúng ta cũng cần thiết lập các biến môi trường cho khóa API của OpenAI, URL cơ sở của API và phiên bản API. Điều này có thể được thực hiện bằng cách sử dụng một tệp .env.

import os
import openai
from dotenv import load_dotenv

GPT_MODEL = os.getenv("MODEL_CONFIG_DEPLOYMENT")


def load_config():
    load_dotenv(dotenv_path=".env", override=True, verbose=True)
    openai.api_type = "azure"
    openai.api_key = os.getenv("MODEL_CONFIG_KEY")
    openai.api_base = os.getenv("MODEL_CONFIG_BASE")
    openai.api_version = os.getenv("MODEL_CONFIG_VERSION")

Định Nghĩa Các Hàm API Bên Ngoài

Tiếp theo, chúng ta định nghĩa các hàm sẽ tương tác với các API bên ngoài. Trong trường hợp này, chúng ta có hai hàm: translate() và get_weather(). Hàm translate() nhận một chuỗi văn bản làm đầu vào và trả về bản dịch của nó sang tiếng Việt. Hàm get_weather() nhận một địa điểm làm đầu vào và trả về thông tin thời tiết hiện tại cho địa điểm đó.

def translate(text):
    url = "https://text-translator2.p.rapidapi.com/translate"

    payload = {
        "source_language": "en",
        "target_language": "vi",
        "text": text
    }
    headers = {
        "content-type": "application/x-www-form-urlencoded",
        "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY"),
        "X-RapidAPI-Host": "text-translator2.p.rapidapi.com"
    }

    response = requests.post(url, data=payload, headers=headers)

    body = response.json()
    if body["status"] == "success":
        return body["data"]["translatedText"]
    else:
        return "can not translate"


def get_weather(location):
    url = "https://visual-crossing-weather.p.rapidapi.com/forecast"

    querystring = {"aggregateHours": "24", "location": location, "contentType": "json", "unitGroup": "us",
                   "shortColumnNames": "0"}

    headers = {
        "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY"),
        "X-RapidAPI-Host": "visual-crossing-weather.p.rapidapi.com"
    }

    response = requests.get(url, headers=headers, params=querystring)
    if response.status_code != 200:
        return "Can not get weather"
    data = response.json()
    return data["locations"][location]["values"][0]

Định Nghĩa Mô Hình Gọi Hàm

Tiếp theo, chúng ta định nghĩa mô hình gọi hàm bằng cách sử dụng lớp BaseModel của Pydantic. Mô hình này mô tả các tham số mà hàm chấp nhận.

class GetCurrentWeather(BaseModel):
    location: str = Field(..., description="The city and state, e.g. San Francisco, CA")


class Translate(BaseModel):
    text: str = Field(..., description="The text to translate")

Thực Hiện Cuộc Gọi Hàm

Cuối cùng, chúng ta thực hiện cuộc gọi hàm. Chúng ta bắt đầu bằng cách thiết lập các tin nhắn hệ thống và người dùng ban đầu. Sau đó, chúng ta gọi hàm chat_completion_request(), which gửi một yêu cầu đến API của OpenAI và trả về một phản hồi. Nếu tin nhắn của trợ lý trong phản hồi chứa một cuộc gọi hàm, chúng ta thực thi cuộc gọi hàm bằng cách sử dụng hàm execute_function_call() và thêm kết quả vào tin nhắn. Sau đó, chúng ta in ra cuộc trò chuyện bằng cách sử dụng hàm pretty_print_conversation().

def main():
    load_config()
    functions = [
        {
            "name": "get_current_weather",
            "description": "Get the current weather",
            "parameters": GetCurrentWeather.model_json_schema(),
        },
        {
            "name": "translate",
            "description": "Translate from English to Vietnamese",
            "parameters": Translate.model_json_schema(),
        },
    ]

    messages = []
    messages.append({"role": "system",
                     "content": "Don't make assumptions about what values to plug into functions. Ask for clarification if a user request is ambiguous."})
    messages.append({"role": "user",
                     "content": "Translate 'How are you' to Vietnamese"})
    chat_response = chat_completion_request(
        messages, functions=functions, function_call="auto"
    )
    assistant_message = chat_response["choices"][0]["message"]
    messages.append(assistant_message)
    if assistant_message.get("function_call"):
        results = execute_function_call(assistant_message)
        messages.append({"role": "function", "name": assistant_message["function_call"]["name"], "content": results})
    pretty_print_conversation(messages)


if __name__ == "__main__":
    main()

Ví dụ này minh họa sức mạnh và tính linh hoạt của việc gọi hàm trong OpenAI. Bằng cách tận dụng tính năng này, các nhà phát triển có thể tạo ra các ứng dụng tương tác và động đáng mê mẩn hơn, hoàn toàn tích hợp với các công cụ và API bên ngoài.

Trong phần tiếp theo, chúng tôi sẽ tìm hiểu về Tương lai của việc gọi hàm trong OpenAI và phần kết luận

Đọc thêm về Function OpenAI tại đây.

Avatar photo

BigQuery vs Google Cloud SQL – P2

Ở bài viết trước tôi đã tổng quan về khái niệm, các tính năng chính và so sánh sự khác biệt chính của GCP...
Avatar photo Toai Nguyen Cong
11 min read

BigQuery vs Google Cloud SQL – P1

Trong bối cảnh điện toán đám mây không ngừng phát triển, các doanh nghiệp bị ngập trong các lựa chọn khi nói đến việc...
Avatar photo Toai Nguyen Cong
5 min read

One Reply to “Giải mã Function Calling trong OpenAI (Phần 4)”

Leave a Reply

Your email address will not be published. Required fields are marked *