+1

Tích hợp Function Calling vào hệ thống Chatbot.

1. Giới thiệu

Ngày nay, các hệ thống chatbot đang ngày càng phổ biến với mục tiêu giải quyết nhiều bài toán thực tế như chăm sóc khách hàng tự động, hỗ trợ bán hàng, và nhiều lĩnh vực khác. Điểm mạnh của chatbot là khả năng tạo ra các cuộc hội thoại tự nhiên, thay thế cách tương tác thông qua các lệnh cứng nhắc. Điều này giúp người dùng dễ dàng trao đổi thông tin với hệ thống hơn, và từ đó cải thiện trải nghiệm tổng thể.

2. Vấn đề khi xây dựng hệ thống chatbot

Một hệ thống chatbot không chỉ đơn thuần là tương tác với người dùng, mà còn phải xử lý nhiều tầng logic phức tạp, từ thuật toán đến việc kết nối với cơ sở dữ liệu. Tuy nhiên, các ngôn ngữ lập trình là ngôn ngữ có cấu trúc, yêu cầu tuân thủ nghiêm ngặt các quy tắc về cú pháp. Điều này tạo ra thách thức lớn khi phải chuyển đổi những câu hỏi hay yêu cầu tự nhiên từ người dùng thành các lệnh mà hệ thống có thể hiểu và xử lý.

Ví dụ, khi khách hàng nói “Tôi muốn mua món đồ A” hoặc “Bán cho anh món đồ A này nhé”, hệ thống cần phải hiểu được và chuyển những yêu cầu này thành lệnh như buy(item_name='A'). Tuy nhiên, sự đa dạng trong cách người dùng diễn đạt khiến việc chuẩn hóa và hiểu đúng trở nên khó khăn.

3. Giải pháp

Hiện nay, các Mô hình Ngôn ngữ Lớn (LLM) đã tích hợp thêm một tính năng quan trọng: Function Calling. Đây là một đột phá giúp các mô hình không chỉ phản hồi dựa trên dữ liệu đã được huấn luyện mà còn có khả năng tương tác với các hàm và API bên ngoài để thực hiện các tác vụ chuyên sâu hoặc truy xuất thông tin từ các nguồn khác.

Với tính năng Function Calling, thay vì chỉ xử lý ngôn ngữ tự nhiên, mô hình có thể tự động gọi các hàm cụ thể và trích xuất chính xác tham số từ yêu cầu của người dùng. Điều này mở rộng đáng kể phạm vi ứng dụng của LLM, cho phép hệ thống thực hiện các tác vụ như tìm kiếm thông tin theo thời gian thực, tính toán, và thậm chí thực hiện các hành động theo yêu cầu.

Một số mô hình ngôn ngữ tiên tiến đã tích hợp tính năng này bao gồm:

  • OpenAI: GPT-3.5 Turbo, GPT-4, …
  • Google AI: Gemini 1.0, 1.5 Pro, 1.5 Flash, …

4. Cách sử dụng Function calling

4.1. Tạo các hàm để giao tiếp với hệ thống

Giả sử bạn đang phát triển một hệ thống chatbot phục vụ cho việc bán hàng online, các trường hợp sử dụng (use cases) cơ bản của hệ thống này bao gồm "Tạo đơn hàng""Hủy đơn hàng". Để xử lý hai yêu cầu này, ta cần tạo hai hàm:

# Hàm tạo đơn hàng
def create_orders(product_name: str, quantity: int, address: str, phone_number: str):
    ''' Các tham số nhận vào:
        -   product_name: Tên sản phẩm người dùng cần mua.
        -   quantity: Số lượng sản phẩm
        -   address: địa chỉ giao đến
        -   phone_number: Số điện thoại người dùng
    '''
    # Xử lý logic ở đây

# Hàm hủy đơn hàng
def cancel_orders(order_code: str):
    ''' Các tham số nhận vào:
        -   orders_code: mã của đơn hàng
    '''
    # Xử lý logic ở đây 

4.2. Mô tả các hàm

Để các Mô hình Ngôn ngữ Lớn (LLM) có thể hiểu và gọi đúng các hàm trong hệ thống, ta cần mô tả các hàm và các tham số của chúng. Đây là bước quan trọng giúp LLM biết được chính xác hành động cần thực hiện khi nhận yêu cầu từ người dùng.

Hàm create_orders: Đây là hàm dùng để tạo đơn hàng mới khi người dùng gửi yêu cầu mua sản phẩm. Khi hàm này được gọi, nó nhận vào các thông tin cần thiết để tạo một đơn hàng bao gồm:

  • product_name: Tên của sản phẩm mà người dùng muốn mua.
  • quantity: Số lượng sản phẩm người dùng muốn đặt.
  • address: Địa chỉ giao hàng của người dùng, nơi sản phẩm sẽ được chuyển đến.
  • phone_number: Số điện thoại của người dùng để liên hệ trong quá trình giao hàng.

Sau khi nhận được các tham số này, hệ thống sẽ xử lý logic để tạo đơn hàng dựa trên yêu cầu của người dùng.

Ví dụ về mô tả hàm create_orders cho việc Tạo đơn hàng:

create_orders_declaration = genai.protos.FunctionDeclaration(
    name='create_orders',
    description='This is the function used to create a new order when a user requests an order',
    parameters= genai.protos.Schema(
        type=genai.protos.Type.OBJECT,
        properties={
            'product_name': genai.protos.Schema(
                type=genai.protos.Type.STRING,
                description='Name of the product',
            ),
            'quantity': genai.protos.Schema(
                type=genai.protos.Type.INTEGER,
                description='Number of products the user wants to buy',
            ),
            'address': genai.protos.Schema(
                type=genai.protos.Type.STRING,
                description= 'Address the user wants to deliver to',
            ),
            'phone_number': genai.protos.Schema(
                type=genai.protos.Type. STRING,
                description= 'Phone number of the user',
            ),
        },
    ),
)

Hàm cancel_orders: Hàm này được sử dụng để hủy một đơn hàng đã được tạo. Khi người dùng yêu cầu hủy đơn hàng, hàm sẽ nhận vào tham số:

  • order_code: Mã đơn hàng mà người dùng muốn hủy.

Hệ thống sẽ kiểm tra đơn hàng với mã đơn hàng này và thực hiện quy trình hủy đơn hàng theo yêu cầu.

Ví dụ về mô tả hàm cancel_orders cho việc Hủy đơn hàng:

cancel_orders_declaration = genai.protos.FunctionDeclaration(
    name='cancel_orders',
    description='This function is used to cancel an order that the user has created',
    parameters= genai.protos.Schema(
        type=genai.protos.Type.OBJECT,
        properties={
            'order_code': genai.protos.Schema(
                type=genai.protos.Type.STRING,
                description= 'Order code created',
            ),
        },
    ),
)

4.3. Tích hợp vào LLM

Chúng ta đã định nghĩa hai hàm quan trọng cho hệ thống chatbot bán hàng trực tuyến. Tiếp theo, chúng ta cần tích hợp hai hàm này vào hệ thống chatbot thông qua tham số tools, giúp chatbot có khả năng hiểu được các hàm đó và thực hiện các tác vụ liên quan đến bán hàng một cách linh hoạt.

tools = genai.protos.Tool(
    function_declarations=[
        create_orders_declaration,
        cancel_orders_declaration
    ],
)

INSTRUCTION = """You are a chatbot that helps users perform basic tasks related to online sales, \
such as creating orders and canceling orders. Based on the user's command, extract the necessary \
information to meet the user's request.
If any information is unclear, ask for clarification instead of filling in the information yourself. 
Ask the user if the information is correct before performing the function. If feedback is needed, use Vietnamese."""

model = genai.GenerativeModel(
    model_name='gemini-1.5-flash',
    tools=tools,
    system_instruction=INSTRUCTION,
    safety_settings={
        HarmCategory.HARM_CATEGORY_HATE_SPEECH:
        HarmBlockThreshold.BLOCK_NONE,
        HarmCategory.HARM_CATEGORY_HARASSMENT:
        HarmBlockThreshold.BLOCK_NONE,
        HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT:
        HarmBlockThreshold.BLOCK_NONE,
    },
)

4.4. Triển khai thử nghiệm

Sau khi hoàn tất các bước xây dựng, tôi đã tiến hành triển khai và thử nghiệm hệ thống để đánh giá hiệu suất hoạt động. Chúng tôi đã xây dựng một bộ các bài kiểm tra nhằm kiểm tra khả năng hiểu yêu cầu của người dùng của mô hình gemini-1.5-flash, đồng thời xác định xem nó có thể đưa ra các hàm và tham số tương ứng hay không.

Dưới đây là các kịch bản cho việc tạo đơn và hủy đơn hàng:

  • Tạo đơn hàng:

Bạn: Tôi muốn mua hàng

Bot: Bạn muốn mua sản phẩm gì?

Bạn: Tôi muốn mua 2 áo sơ mi trắng

Bot: Bạn muốn đặt hàng giao đến địa chỉ nào?

Bạn: Tôi muốn giao đến Đại học Quốc Gia Hà Nội

Bot: Số điện thoại của bạn là gì?

Bạn: 012345678

Bot: Bạn có chắc chắn muốn đặt mua 2 áo sơ mi trắng, giao đến Đại học Quốc Gia Hà Nội, số điện thoại 012345678?

Bạn: có

Bot: Hàm được gọi: name: "create_orders"
args {
fields {
key: "product_name"
value {
string_value: "áo sơ mi trắng"
},
key: " quantity"
value {
value: 2
},
key: "address"
value {
string_value: "Đại học Quốc Gia Hà Nội"
},
key: "phone_number"
value {
string_value: "012345678"
}
}
}

  • Hủy đơn hàng:

Bạn: tôi muốn hủy đơn

Bot: Bạn có thể cho tôi biết mã đơn hàng bạn muốn hủy không?

Bạn: mã là ABC123

Bot: Bạn có chắc chắn muốn hủy đơn hàng mã ABC123?

Bạn: có

Bot: Hàm được gọi: name: "cancel_orders"
args {
fields {
key: "order_code"
value {
string_value: "ABC123"
}
}
}

Mọi người có thể thấy, mô hình đã có khả năng trích xuất hàm phù hợp cùng với các tham số tương ứng khi đã có đủ thông tin cần thiết. Chiến lược mà chúng tôi đã đề ra trong phần INSTRUCTION là yêu cầu chatbot đặt câu hỏi để làm rõ những thông tin còn thiếu và xác nhận lại các thông tin mà người dùng đã cung cấp.

5. Ưu điểm - nhược điểm

5.1. Ưu điểm

Function calling có một số ưu điểm như sau:

  • Tăng cường khả năng tự động hóa: Function calling cho phép các mô hình ngôn ngữ tự động thực hiện các tác vụ cụ thể khi có nhu cầu, như gọi API, truy xuất dữ liệu, hoặc tương tác với các hệ thống khác. Điều này giúp tăng cường tính linh hoạt và khả năng tự động hóa.
  • Tối ưu hóa luồng hội thoại: Thay vì chỉ phản hồi bằng văn bản, function calling cho phép mô hình gọi các hàm thực hiện nhiệm vụ, từ đó tạo ra các phản hồi có tính năng động và phù hợp hơn trong các tình huống phức tạp.
  • Giảm tải xử lý của người dùng: Người dùng không cần phải thực hiện các thao tác thủ công, mà mô hình có thể tự động hiểu và thực hiện các lệnh theo yêu cầu. Điều này giúp tiết kiệm thời gian và công sức.

5.2. Nhược điểm

Function calling mang đến nhiều lợi ích vượt trội, tuy nhiên, nó cũng tồn tại một số hạn chế nhất định:

  • Tốn khá nhiều tài nguyên: Đối với các mô hình không có Context Caching như LLM của OpenAI, việc sử dụng Function calling sẽ tốn rất nhiều tokens. Nguyên nhân là do mỗi lần gửi request đến mô hình, chúng ta cần gửi toàn bộ phần mô tả các hàm cùng với câu yêu cầu của người dùng.
  • Khả năng còn hạn chế: Các mô hình miễn phí như Gemini-1.5-Flash chỉ trả về tối đa 1 function cho 1 lần query. Điều này khiến mô hình không thể xử lý các câu chứa nhiều yêu cầu.
  • Tăng độ trễ phản hồi: Khi function calling đòi hỏi gọi các API bên ngoài hoặc xử lý các tác vụ phức tạp, thời gian phản hồi có thể bị chậm đi, làm giảm trải nghiệm người dùng.
  • Bảo mật và quyền riêng tư: Khi gọi các hàm bên ngoài, dữ liệu có thể phải được gửi qua các mô hình của bên thứ ba, làm tăng rủi ro bảo mật và quyền riêng tư nếu không được xử lý cẩn thận.

6. Kết luận

Function calling mang lại nhiều lợi ích vượt trội, đặc biệt trong việc nâng cao tính tự động hóa và khả năng tương tác của các hệ thống sử dụng mô hình ngôn ngữ lớn (LLM). Nhờ tính năng này, các mô hình không chỉ phản hồi theo cách thụ động mà còn có khả năng gọi và thực hiện các hàm cụ thể, tạo ra các trải nghiệm động và thông minh hơn cho người dùng.

Function calling ngoài việc sử dụng trực tiếp với các mô hình ngôn ngữ lớn hiện nay, nó còn có thể tích hợp vào các hệ thống khác. Một ví dụ điển hình cho việc liên hệ function calling với các hệ thống khác là tích hợp Function Calling trong hệ thống RAG (Retrieval-Augmented Generation). Trong hệ thống RAG, mô hình ngôn ngữ sẽ kết hợp khả năng truy xuất thông tin từ các nguồn dữ liệu bên ngoài với việc tạo ra văn bản dựa trên các thông tin đó. FC có thể giúp tối ưu hóa và mở rộng thêm khả năng của RAG.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.