---
title: "Function Calling: Giao tiếp có cấu trúc giữa LLM và Hệ thống Phần mềm"
description: "Hướng dẫn toàn diện về Function Calling: Cơ chế trích xuất tham số JSON Schema, gọi API song song (Parallel Tool Calling) và các tiêu chuẩn bảo mật cho lập trình viên AI."
date: "2026-09-19"
author:
  name: "Nguyen Pham"
  role: "Xin chào. Mình thích lập trình và công nghệ. Đây là blog mình chia sẻ lại các kiến thức về lập trình, công nghệ."
  avatar: "http://0.gravatar.com/avatar/6fb61398e24046b34e13870dd6c357b9?s=128&d=mm&r=g"
category: "AI"
tags: ["AI", "Function Calling", "API", "Structured Outputs", "LLM"]
coverImage: "/blog/covers/function-calling.png"
featured: false
readingTime: "6 min read"
---

Nếu như ngôn ngữ tự nhiên là phương thức giao tiếp tự nhiên giữa con người với nhau, thì **dữ liệu có cấu trúc (Structured Data như JSON)** là ngôn ngữ chung giữa các hệ thống phần mềm.

**Function Calling (Gọi hàm)** là tính năng cốt lõi cho phép các mô hình ngôn ngữ lớn (LLM) phát hiện khi nào cần gọi một hàm ngoại vi, trích xuất chính xác các đối số từ ngôn ngữ tự nhiên của người dùng và định dạng chúng theo đúng chuẩn **JSON Schema** đã khai báo trước.

---

## 1. Cơ chế hoạt động của Function Calling

Function Calling thực chất không trực tiếp chạy mã nguồn trên máy chủ của nhà cung cấp AI. Thay vào đó, quy trình diễn ra theo 4 bước khép kín:

1. **Khai báo hàm (Function Declaration):** Kỹ sư gửi kèm danh sách các hàm khả dụng (tên hàm, mô tả công dụng, các tham số bắt buộc và kiểu dữ liệu) trong lời gọi API tới LLM.
2. **LLM quyết định và sinh tham số:** Mô hình đọc câu hỏi của người dùng, nhận thấy câu hỏi cần sự trợ giúp của một hàm cụ thể. Mô hình dừng sinh văn bản tự do và xuất ra một đối tượng JSON chứa tên hàm và các tham số tương ứng.
3. **Ứng dụng thực thi cục bộ (Client Execution):** Ứng dụng phía backend của bạn nhận đối tượng JSON từ mô hình, gọi hàm hoặc API thực tế với các tham số đó và thu thập kết quả trả về.
4. **LLM tổng hợp phản hồi:** Ứng dụng gửi kết quả thực thi trở lại cho LLM dưới dạng tin nhắn vai trò `tool` hoặc `function`. Mô hình đọc kết quả và tạo ra câu trả lời bằng ngôn ngữ tự nhiên gửi tới người dùng.

---

## 2. Các kỹ thuật Nâng cao trong Function Calling

### 2.1. Strict Mode & Structured Outputs
Trước đây, LLM đôi khi sinh ra chuỗi JSON bị lỗi cú pháp (thiếu dấu ngoặc kép, sai kiểu dữ liệu `string` thay vì `int`). Với tính năng **Structured Outputs** (như `strict: true` của OpenAI và Gemini), mô hình áp dụng thuật toán ép mặt nạ ngữ pháp (*grammar-constrained decoding*), cam kết 100% kết quả đầu ra tuân thủ tuyệt đối schema định sẵn.

### 2.2. Parallel Function Calling (Gọi hàm song song)
Khi người dùng đặt câu hỏi: *"Cho tôi biết thời tiết hôm nay ở Hà Nội, Tokyo và Paris?"*, mô hình hiện đại có khả năng sinh ra đồng thời 3 lệnh gọi hàm `get_weather` khác nhau trong một lần sinh duy nhất. Hệ thống backend có thể dispatch 3 cuộc gọi này song song, rút ngắn thời gian xử lý xuống 3 lần.

### 2.3. Tool Choice Control (Kiểm soát chế độ chọn công cụ)
Kỹ sư có thể điều khiển hành vi của mô hình thông qua tham số `tool_choice`:
- `auto`: Mô hình tự quyết định trả lời bình thường hay gọi hàm.
- `none`: Ép buộc mô hình không được gọi bất kỳ hàm nào.
- `required`: Bắt buộc mô hình phải chọn và gọi ít nhất một hàm bất kỳ.
- `{"type": "function", "function": {"name": "xác_định"}}`: Ép buộc mô hình phải gọi chính xác hàm chỉ định.

---

## 3. Bảng thực hành Tốt nhất (Best Practices)

| Tiêu chí | Khuyến nghị thực tế |
| :--- | :--- |
| **Mô tả hàm (Descriptions)** | Hãy viết mô tả hàm rõ ràng, chi tiết như viết tài liệu API cho một đồng nghiệp mới. Mô tả càng cụ thể, mô hình càng chọn hàm chính xác. |
| **Tên tham số** | Đặt tên tham số mang tính biểu đạt cao (ví dụ `city_name` thay vì `param1`). |
| **Kiểm tra kiểu dữ liệu (Pydantic / Zod)** | Luôn xác thực lại tham số ở phía backend bằng các thư viện như Pydantic trước khi thực thi để phòng ngừa các giá trị bất thường. |
| **Xử lý ngoại lệ** | Nếu hàm thực thi gặp lỗi, hãy trả về mã lỗi JSON có nội dung giải thích rõ ràng để mô hình đọc và thử lại với tham số mới. |
