Function Calling: Tuyệt chiêu giúp AI “vượt rào” kết nối với thế giới thực

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Khi AI “thông thái” nhưng lại… mù tin tức

Anh em chắc hẳn từng gặp cảnh này: Hỏi ChatGPT về giá Bitcoin sáng nay hoặc nhờ Claude kiểm tra server đang sống hay chết. Câu trả lời thường là lời xin lỗi lịch sự vì dữ liệu cũ, hoặc tệ hơn là AI tự “chế” ra một con số nghe rất thuyết phục nhưng sai bét.

Thực tế, LLM (Large Language Models) giống như những bộ não siêu việt bị nhốt trong lồng kính. Chúng có thể làm thơ, viết code thần tốc nhưng lại thiếu “tay chân” để chạm vào thế giới thực. AI không biết hôm nay Hà Nội mưa hay nắng, cũng chẳng thể tự truy cập database để lấy báo cáo doanh số cho bạn.

Qua nhiều dự án automation, mình thấy đây là rào cản lớn nhất. Nếu chỉ dừng lại ở việc chat qua lại, AI mãi chỉ là một món đồ chơi cao cấp chứ chưa phải một cộng sự đắc lực.

Tại sao AI lại bị giới hạn như vậy?

Gốc rễ nằm ở cách huấn luyện. Các model như GPT-4 hay Claude 3.5 Sonnet học từ kho dữ liệu khổng lồ nhưng là dữ liệu tĩnh. Ngay khi kết thúc training, kiến thức của chúng bị đóng băng, biến AI thành một “mọt sách” chỉ biết chuyện quá khứ.

Giải pháp phổ biến là dùng RAG (copy-paste dữ liệu vào prompt). Tuy nhiên, cách này làm token tăng vọt và AI vẫn không thể thực hiện hành động. Để AI có thể tự gọi API, xóa bản ghi DB hay gửi email, chúng ta cần một cơ chế để nó hiểu và điều khiển các công cụ xung quanh. Đó là lúc Function Calling (hay Tool Use) tỏa sáng.

Giải pháp: Biến AI thành người điều hành công cụ

Hiện nay, OpenAI và Anthropic đều cho phép chúng ta mô tả các hàm (function) cho AI. Lưu ý rằng AI không trực tiếp chạy code. Nó sẽ trả về một file JSON chứa tên hàm và tham số, sau đó server của chúng ta mới là bên thực thi lệnh.

1. Triển khai với OpenAI API

Với OpenAI, bạn cần định nghĩa danh sách tools trong request. Đây là cách mình tích hợp tra cứu thời tiết thực tế với độ trễ chỉ khoảng 1-2 giây:

import openai

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Lấy thời tiết thực tế tại một thành phố cụ thể",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string", "description": "Ví dụ: Hà Nội"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["location"]
            }
        }
    }
]

response = openai.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hà Nội hôm nay có mưa không?"}],
    tools=tools,
    tool_choice="auto"
)

Thay vì trả về văn bản, GPT sẽ yêu cầu gọi hàm get_current_weather(location="Hà Nội"). Bạn chỉ cần lấy dữ liệu từ API thời tiết thật rồi đưa ngược lại cho AI tổng hợp câu trả lời cho người dùng.

2. Triển khai với Claude API (Anthropic)

Bên phía Claude, khái niệm này được gọi là Tool Use. Cú pháp có chút khác biệt nhưng logic tương đương. Claude 3.5 Sonnet hiện được đánh giá rất cao nhờ khả năng suy luận tham số cực kỳ chặt chẽ, ít khi bị nhầm lẫn dữ liệu.

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-3-5-sonnet-20240620",
    max_tokens=1024,
    tools=[
        {
            "name": "query_database",
            "description": "Truy vấn đơn hàng từ hệ thống nội bộ",
            "input_schema": {
                "type": "object",
                "properties": {
                    "order_id": {"type": "string", "description": "Mã đơn hàng định dạng #ITFZ-xxx"}
                },
                "required": ["order_id"]
            }
        }
    ],
    messages=[{"role": "user", "content": "Kiểm tra tình trạng đơn #ITFZ-123"}]
)

Mẹo thực chiến: Để AI không “ngáo” khi gọi hàm

Dùng Function Calling không khó, nhưng để nó chạy ổn định trong môi trường production là một câu chuyện khác. Dưới đây là 3 bài học xương máu mình rút ra được:

Phần mô tả (Description) là chìa khóa

Đừng bao giờ viết mô tả hời hợt kiểu "get data". AI chọn hàm dựa hoàn toàn vào đây. Hãy viết thật chi tiết: “Dùng hàm này khi khách hỏi trạng thái vận chuyển. Input phải là mã bắt đầu bằng ITFZ”. Một mô tả tốt có thể giảm tỉ lệ gọi nhầm hàm xuống dưới 5%.

Luôn xử lý lỗi từ Tool

Nếu API của bạn trả về lỗi 404 hoặc 500, đừng quăng nguyên cục lỗi đó cho AI. Hãy format lại: “Lỗi: Không tìm thấy đơn hàng, hãy yêu cầu khách kiểm tra lại mã”. AI sẽ biết cách trả lời khách hàng tinh tế hơn thay vì đưa ra các dòng thông báo hệ thống khô khan.

Tử huyệt bảo mật (Security First)

Tuyệt đối không để AI tự ý thực hiện các lệnh hủy diệt như DROP TABLE. AI có thể bị tấn công Prompt Injection, khiến nó tự gọi các hàm nguy hiểm. Mình luôn áp dụng nguyên tắc: AI chỉ được đọc dữ liệu. Mọi thao tác ghi/xóa phải có admin nhấn nút “Confirm” trên dashboard mới được thực thi.

Kiểm soát chi phí Token

Mỗi Tool bạn định nghĩa đều tiêu tốn token trong mọi request. Nhồi nhét 50 cái tool cùng lúc vừa tốn tiền, vừa làm AI dễ bị loạn. Mẹo của mình là phân loại Tool theo nhóm. Chỉ khi khách hỏi về tài chính, hệ thống mới load bộ Tool tài chính vào context của AI.

Hy vọng những chia sẻ này giúp anh em tự tin hơn khi xây dựng ứng dụng AI. Function Calling chính là cầu nối biến chatbot thông thường thành một trợ lý ảo thực thụ!

Share: