Chức năng gọi hàm với LLM (Function Calling)

Gọi hàm là khả năng kết nối LLM với các công cụ bên ngoài một để cho phép sử dụng và tương tác công cụ hiệu quả với các API được cung cấp.

Các mô hình ngôn ngữ như GPT-4 và GPT-3.5 đã được tinh chỉnh để phát hiện khi nào một hàm cần được gọi và sau đó xuất ra JSON chứa các đối số để gọi hàm. Các hàm đang được gọi bằng lệnh gọi hàm sẽ hoạt động như các công cụ trong ứng dụng AI của bạn và bạn có thể xác định nhiều hàm trong một yêu cầu.

Gọi hàm là một khả năng quan trọng để xây dựng các chatbot hoặc tác nhân được hỗ trợ bởi LLM cần truy xuất ngữ cảnh cho LLM hoặc tương tác với các công cụ bên ngoài bằng cách chuyển đổi ngôn ngữ tự nhiên thành lệnh gọi API.

Gọi chức năng cho phép các nhà phát triển tạo ra:

  • Tác nhân đàm thoại có thể sử dụng hiệu quả các công cụ bên ngoài để trả lời câu hỏi. Ví dụ: truy vấn “Thời tiết ở Belize như thế nào?” sẽ được chuyển đổi thành một lệnh gọi hàm như get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
  • Các giải pháp được hỗ trợ bởi LLM để trích xuất và gắn thẻ dữ liệu (ví dụ: trích xuất tên người từ một bài viết trên Wikipedia)
  • Các ứng dụng có thể giúp chuyển đổi ngôn ngữ tự nhiên sang lệnh gọi API hoặc truy vấn cơ sở dữ liệu hợp lệ
  • Công cụ truy xuất kiến ​​thức đàm thoại tương tác với các cơ sở tri thức bên ngoài.

Trong hướng dẫn này, chúng tôi trình bày cách nhắc các mô hình như GPT-4 để thực hiện lệnh gọi hàm cho các trường hợp sử dụng khác nhau.

Gọi hàm bằng GPT-4

Ví dụ cơ bản, giả sử chúng tôi đã yêu cầu mô hình kiểm tra thời tiết ở một địa điểm nhất định.

Nếu chỉ với LLM riêng rẽ sẽ không thể đáp ứng yêu cầu này vì nó đã được đào tạo trên tập dữ liệu trong đó đã được lược bỏ các điểm gọi hàm cố định. Để giải quyết vấn đề này, chúng ta cần kết hợp LLM với một công cụ bên ngoài. Bạn có thể tận dụng khả năng gọi hàm của mô hình để xác định hàm bên ngoài sẽ gọi cùng với các đối số của nó và sau đó yêu cầu hàm đó trả về phản hồi cuối cùng. Dưới đây là một ví dụ đơn giản về cách bạn có thể đạt được điều này bằng API OpenAI.

Giả sử người dùng đang đặt câu hỏi sau cho mô hình:

What is the weather like in London?

Để xử lý yêu cầu này bằng cách gọi hàm, bước đầu tiên là xác định hàm thời tiết hoặc tập hợp hàm mà bạn sẽ chuyển đi như một phần của yêu cầu API OpenAI:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {
                        "type": "string", 
                        "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        },   
    }
]

Hàm get_current_weather trả về thời tiết hiện tại ở một vị trí nhất định. Khi bạn chuyển định nghĩa hàm này như một phần của yêu cầu, nó không thực sự thực thi một hàm mà chỉ trả về một đối tượng JSON chứa các đối số cần thiết để gọi hàm. Dưới đây là một số đoạn mã về cách đạt được điều này.

Bạn có thể định nghĩa hàm hoàn thành như sau:

def get_completion(messages, model="gpt-3.5-turbo-1106", temperature=0, max_tokens=300, tools=None):
    response = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
        max_tokens=max_tokens,
        tools=tools
    )
    return response.choices[0].message

Đây là cách bạn có thể soạn câu hỏi của người dùng:

messages = [
    {
        "role": "user",
        "content": "What is the weather like in London?"
    }
]

Cuối cùng, bạn có thể gọi ở get_completion trên và chuyển cả messages và tools:

response = get_completion(messages, tools=tools)

response chứa những nội dung sau đây:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='...', function=Function(arguments='{"location":"London","unit":"celsius"}', name='get_current_weather'), type='function')])

Đặc biệt, arguments đối tượng chứa các đối số quan trọng được mô hình trích xuất và những đối số đó sẽ cần thiết để hoàn thành yêu cầu.

Sau đó, bạn có thể chọn gọi API thời tiết bên ngoài cho thời tiết thực tế. Sau khi có sẵn thông tin thời tiết, bạn có thể chuyển nó trở lại mô hình để tóm tắt câu trả lời cuối cùng cho câu hỏi ban đầu của người dùng.

Các trường hợp sử dụng gọi hàm

Dưới đây là danh sách các trường hợp sử dụng có thể hưởng lợi từ khả năng gọi hàm của LLM:

  • Tác nhân đàm thoại: Việc gọi hàm có thể được sử dụng để tạo các tác nhân đàm thoại hoặc chatbot phức tạp trả lời các câu hỏi phức tạp bằng cách gọi các API bên ngoài hoặc cơ sở kiến ​​thức bên ngoài và cung cấp các phản hồi hữu ích và phù hợp hơn.
  • Hiểu ngôn ngữ tự nhiên: Nó có thể chuyển đổi ngôn ngữ tự nhiên thành dữ liệu JSON có cấu trúc, trích xuất dữ liệu có cấu trúc từ văn bản và thực hiện các tác vụ như nhận dạng thực thể được đặt tên, phân tích cảm tính và trích xuất từ ​​khóa.
  • Giải quyết vấn đề toán học: Việc gọi hàm có thể được sử dụng để xác định các hàm tùy chỉnh nhằm giải quyết các vấn đề toán học phức tạp yêu cầu nhiều bước và các loại phép tính nâng cao khác nhau.
  • Tích hợp API: Nó có thể được sử dụng để tích hợp hiệu quả LLM với API bên ngoài để tìm nạp dữ liệu hoặc thực hiện các hành động dựa trên đầu vào. Điều này có thể hữu ích để xây dựng hệ thống QA hoặc trợ lý sáng tạo. Nói chung, việc gọi hàm có thể chuyển đổi ngôn ngữ tự nhiên thành các lệnh gọi API hợp lệ.
  • Trích xuất thông tin: Việc gọi hàm được sử dụng một cách hiệu quả để trích xuất thông tin cụ thể từ một đầu vào nhất định, chẳng hạn như truy xuất các câu chuyện tin tức hoặc tài liệu tham khảo có liên quan từ một bài báo.