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:
- Khai báo: Developer đăng ký danh sách hàm (tools) cho AI biết qua JSON Schema
- Yêu cầu: Người dùng đưa prompt ("Thời tiết Hà Nội thế nào?")
- Quyết định: AI phân tích và chọn hàm phù hợp (
get_weather) - Trả arguments: AI trả về JSON mô tả tham số (
{"location": "Hà Nội"}) — chưa có hành động thực sự - Thực thi: Code của developer nhận JSON, tự tay gọi API thật, lấy kết quả
- 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ảiSearch 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ố
toolstrong API request - Response có trường
tool_callschứ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
toolstương tự nhưng response trả vềtool_useblocks - 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ặcto=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ểm | Function Calling | Structured Output (JSON Mode) | RAG |
|---|---|---|---|
| Mục đích chính | Thực hiện hành động (action) | Trả về dữ liệu có cấu trúc | Lấy thông tin từ tài liệu |
| Hướng tương tác | Hai chiều: AI → Code → AI | Một chiều: AI → JSON | Một chiều: Database → AI |
| Thay đổi trạng thái | Có thể ghi database, gửi mail | Chỉ trả dữ liệu, không side effect | Chỉ đọc, không thay đổi hệ thống |
| Ví dụ thực tế | Đặt hàng, xóa file, chuyển tiền | Trả danh sách sản phẩm dạng JSON | Tì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
Structured Output: Bắt AI trả JSON
So sánh chi tiết giữa trả về JSON thuần và gọi hàm — khi nào dùng cái nào cho đúng
Thiết kế Tool cho AI
Cách viết description và đặt tên hàm để AI không bị nhầm lẫn giữa các tool
MCP Protocol
Tiêu chuẩn kết nối AI với tools — từ function calling riêng lẻ đến universal adapter
Multi-tool Orchestration
Khi AI cần gọi nhiều tool liên tiếp (chain) hoặc phối hợp chúng để giải quyết task phức tạp
Đọc tiếp: Tool & Permission Design (Level 2)
Từ gọi hàm đơn giản đến thiết kế hệ thống Agent với phân quyền, sandbox và bảo mật
Context Pruning & Summarization: Cắt tỉa thông minh
Khi AI bị quá tải thông tin, Context Pruning và Summarization giúp giữ lại điều quan trọng. Khám phá cách cắt tỉa ngữ cảnh thông minh để tối ưu hiệu suất.
Structured Output: Bắt AI trả JSON, schema chuẩn
Hướng dẫn ép buộc AI trả về JSON chuẩn xác với schema, giúp kết nối API và xây dựng ứng dụng production mà không cần regex parsing.