TROISINH
Context EngineeringTool Use & Structured Output

Function Calling: Cho AI dùng tools

Hướng dẫn Function Calling - cách cho AI gọi API, truy vấn database và thực hiện hành động thay vì chỉ trả về text. Từ lý thuyết đến code OpenAI, Anthropic.

Định nghĩa

Function Calling là cơ chế cho phép Large Language Model (LLM) "gọi" hàm (function) bên ngoài — từ API thời tiết đến truy vấn database — thay vì chỉ trả về text. Đây là bước ngoặt biến AI từ "nhà triết học chỉ biết nói" thành "nhân viên có thể thực hiện hành động".

Giải thích chi tiết

Vòng đời một lời gọi hàm

Quan niệm sai lầm phổ biến: AI tự chạy code Python hoặc gọi API. Thực tế, AI chỉ yêu cầu bạn chạy hộ. Quy trình chuẩn gồm 6 bước:

  1. Khai báo: Developer đăng ký danh sách hàm (tools) cho AI biết qua JSON Schema
  2. Yêu cầu: Người dùng đưa prompt ("Thời tiết Hà Nội thế nào?")
  3. Quyết định: AI phân tích và chọn hàm phù hợp (get_weather)
  4. Trả arguments: AI trả về JSON mô tả tham số ({"location": "Hà Nội"}) — chưa có hành động thực sự
  5. Thực thi: Code của developer nhận JSON, tự tay gọi API thật, lấy kết quả
  6. Hoàn thiện: Kết quả API được đẩy lại vào context, AI viết câu trả lời cuối cho người dùng

Bước 4-5 tạo ra "vòng lặp" (loop) giữa AI và code — đây là nền tảng của Agent Architecture ở Level 2.

Schema: Bản hợp đồng giữa AI và code

Để AI biết "có những công cụ gì", bạn mô tả bằng JSON Schema với ba trường cốt lõi:

  • name: Tên hàm viết dạng snake_case, không dấu cách (ví dụ: search_products, không phải Search Products)
  • description: Quyết định AI có chọn đúng tool không. Phải mô tả rõ khi nào dùng, không chỉ là cái gì (ví dụ: "Dùng khi người dùng hỏi về thời tiết hiện tại hoặc dự báo")
  • parameters: Định nghĩa kiểu dữ liệu (string, number, boolean, array) và trường bắt buộc (required)

Parallel Function Calling

Modern LLM (GPT-4o, Claude 3.5, Gemini Pro) không gọi từng hàm một. Khi phát hiện nhiều tác vụ độc lập, chúng trả về mảng (array) các lời gọi cùng lúc.

Ví dụ: User hỏi "So sánh thời tiết Hà Nội và TP.HCM". Thay vì gọi get_weather hai lần tuần tự (tốn 2 lượt inference), AI trả về hai object trong cùng một tool_calls array. Code của bạn chạy song song hai API call, tiết kiệm đáng kể thời gian.

Cách tiếp cận của từng nhà cung cấp

Mặc dù concept giống nhau, triển khai có khác biệt đáng kể:

OpenAI (GPT-4, GPT-3.5)

  • Dùng tham số tools trong API request
  • Response có trường tool_calls chứa mảng các lời gọi
  • Hỗ trợ tool_choice để ép buộc AI dùng tool cụ thể (hữu ích cho testing)

Anthropic (Claude 3/3.5)

  • Dùng tools tương tự nhưng response trả về tool_use blocks
  • Có xu hướng "suy nghĩ" kỹ hơn trước khi gọi hàm, đôi khi cần prompt ép buộc rõ ràng hơn OpenAI
  • Hỗ trợ streaming tốt hơn cho tool use (trả về từng phần của arguments)

Open Source (Llama 3, Mistral, Qwen)

  • Thường không native JSON như OpenAI
  • Sử dụng định dạng text thuần với tag đặc biệt như <tool>, <function>, hoặc to=default
  • Cần parsing thủ công bằng regex hoặc grammar constraints

Ví dụ thực tế

Truy vấn database doanh thu

# Khai báo tool cho AI
tools = [{
    "name": "query_sales_db",
    "description": "Truy vấn SQL để lấy dữ liệu doanh thu. Chỉ đọc, không UPDATE/DELETE.",
    "parameters": {
        "type": "object",
        "properties": {
            "sql": {
                "type": "string",
                "description": "Câu lệnh SQL SELECT hợp lệ"
            }
        },
        "required": ["sql"]
    }
}]

# Workflow thực tế
user_input = "Doanh thu tháng 3 của team Marketing là bao nhiêu?"

# AI trả về tool_call:
# {
#   "name": "query_sales_db",
#   "arguments": {"sql": "SELECT SUM(revenue) FROM sales WHERE team='Marketing' AND month=3"}
# }

# Code bạn thực thi SQL, được kết quả: 150000000
# Đưa kết quả vào context, AI trả lời: "Doanh thu tháng 3 của team Marketing là 150 triệu đồng."

Máy tính cho phép tính chính xác

LLM thường sai phép tính số học phức tạp (hallucination số liệu). Function calling khắc phục bằng cách outsource phép tính:

{
    "name": "calculator",
    "description": "Dùng cho mọi phép tính toán học, công thức vật lý, hoặc chuyển đổi đơn vị. Không tự tính trong đầu.",
    "parameters": {
        "type": "object",
        "properties": {
            "expression": {"type": "string", "description": "Biểu thức toán học như 234*456/3"}
        }
    }
}

Khi user hỏi "234 nhân 456 rồi chia 3 bằng mấy", AI sẽ gọi calculator thay vì tự tính nhầm thành 35,000.

Tích hợp Calendar API

{
    "name": "create_calendar_event",
    "parameters": {
        "title": {"type": "string"},
        "datetime": {"type": "string", "format": "date-time", "description": "ISO 8601 format"},
        "attendees": {"type": "array", "items": {"type": "string", "format": "email"}}
    }
}

User nói: "Họp với An và Bình vào 3h chiều mai tại văn phòng". AI parse ngữ cảnh, xác định datetime là "2024-01-16T15:00:00" (tự động bổ sung ngày tháng từ context), và gọi hàm với attendees trích xuất từ danh bạ.

Ứng dụng

Sinh viên & Researcher

  • Tự động research: AI tìm kiếm Semantic Scholar API, lọc paper theo tiêu chí, và lưu trực tiếp vào Zotero hoặc Notion database
  • Trích xuất dữ liệu: Đọc PDF báo cáo, gọi hàm trích bảng số liệu, và tính toán thống kê qua Python executor

Người đi làm (PM, Marketing, Sales)

  • Chatbot nội bộ: Tra cứu KPI real-time từ Google Sheets API, trả lời câu hỏi "Doanh số hôm nay đạt bao nhiêu % chỉ tiêu?" mà không cần mở Excel
  • Tự động gửi mail: Sau khi soạn nội dung, AI gọi SendGrid API để gửi email với template đã duyệt
  • Tạo ticket tự động: Từ mô tả lỗi trong Slack, AI gọi Jira API tạo bug ticket với đầy đủ thông tin environment

Doanh nghiệp & Developer

  • AI Agent thương mại điện tử: Nhận yêu cầu khách hàng → truy vấn Shopify API kiểm tra tồn kho → gọi Stripe API tạo đơn hàng → gửi confirmation qua Twilio SMS
  • RAG nâng cao: Không chỉ trả text từ vector DB, mà gọi API cập nhật "knowledge gap" vào database (ví dụ: ghi nhận câu hỏi mới chưa có câu trả lời)
  • DevOps tự động: AI đọc log lỗi từ CloudWatch → quyết định gọi API restart service → gửi thông báo Slack kèm incident report

So sánh

Đặc điểmFunction CallingStructured Output (JSON Mode)RAG
Mục đích chínhThực hiện hành động (action)Trả về dữ liệu có cấu trúcLấy thông tin từ tài liệu
Hướng tương tácHai chiều: AI → Code → AIMột chiều: AI → JSONMột chiều: Database → AI
Thay đổi trạng tháiCó thể ghi database, gửi mailChỉ trả dữ liệu, không side effectChỉ đọc, không thay đổi hệ thống
Ví dụ thực tếĐặt hàng, xóa file, chuyển tiềnTrả danh sách sản phẩm dạng JSONTìm đoạn văn liên quan trong tài liệu

Function Calling và Structured Output thường bị nhầm lẫn vì cả hai đều ép AI trả về JSON. Điểm khác biệt then chốt nằm ở ý định: Function Calling ngụ ý sẽ có thực thi ngoài (API call, database write), còn Structured Output chỉ là định dạng lại thông tin có sẵn. RAG thì bổ sung dữ liệu vào input context, không phải cơ chế gọi hàm từ output.

Bài viết liên quan

On this page