Một LLM đơn thuần chỉ biết sinh chữ. Nó không biết tỷ giá USD/VND hôm nay, không đọc được database của bạn, không gửi được email. Tool use (hay function calling) là cơ chế cho phép model yêu cầu hệ thống của bạn chạy một hàm cụ thể với tham số cụ thể, rồi nhận kết quả về để suy luận tiếp. Đây là thứ biến một chatbot thành một agent làm được việc.
Vòng lặp cốt lõi (bạn phải thuộc)
Hãy nhớ vòng lặp này — mọi agent tool-use đều chạy theo nó:
- Bạn gửi cho model: câu hỏi người dùng + danh sách tool (kèm schema).
- Model trả về một trong hai: (a) câu trả lời chữ, hoặc (b) một tool call — tên hàm + tham số dạng JSON.
- Nếu là tool call: code của bạn (không phải model) thực thi hàm đó thật sự.
- Bạn gửi kết quả của hàm trở lại model.
- Model đọc kết quả, rồi lặp lại bước 2 — hoặc chốt câu trả lời cuối.
Ví dụ cụ thể
Người dùng hỏi: "Thời tiết Đà Nẵng hôm nay thế nào?"
Bạn khai báo một tool get_weather(city). Model không biết thời tiết, nên nó trả về:
{
"tool": "get_weather",
"arguments": { "city": "Da Nang" }
}
Code của bạn nhận cái này, gọi API thời tiết thật, được { "temp_c": 31, "cond": "nắng" }, gửi lại cho model. Model kết luận: "Đà Nẵng hôm nay 31°C, trời nắng."
Khung tư duy: khi nào cần tool?
Dùng checklist này để quyết định một tác vụ có cần tool hay không:
- [ ] Cần dữ liệu thời gian thực hoặc riêng tư (giá, tồn kho, hồ sơ khách)? → Cần tool.
- [ ] Cần thực hiện hành động thay đổi trạng thái (đặt hàng, gửi mail, ghi DB)? → Cần tool.
- [ ] Cần tính toán chính xác (LLM tính toán hay sai)? → Cần tool (máy tính/SQL).
- [ ] Chỉ cần diễn giải, tóm tắt, viết lại từ thông tin đã có? → Không cần tool.
Ba loại tool thường gặp
- Read tool (chỉ đọc): tra cứu, tìm kiếm, đọc DB. Rủi ro thấp.
- Write/Action tool (thay đổi trạng thái): gửi mail, tạo đơn, xóa record. Rủi ro cao — cần xác nhận và phân quyền.
- Compute tool: chạy code, tính toán, gọi công cụ chuyên dụng.
Pseudocode vòng lặp tối giản
messages = [user_question]
while True:
resp = model.generate(messages, tools=TOOLS)
if resp.type == "text":
return resp.text # xong
call = resp.tool_call
result = execute(call.name, call.args) # code CỦA BẠN chạy
messages.append(resp) # ghi lại lời gọi
messages.append(result) # ghi lại kết quả
Toàn bộ khóa học sẽ đào sâu từng dòng: cách khai báo TOOLS, cách viết execute, và cách sống sót khi mọi thứ hỏng.
Sai lầm thường gặp
- Tưởng model tự chạy hàm. Nó chỉ đề nghị; bạn phải viết bộ thực thi và kết nối kết quả trở lại.
- Nhét mọi thứ thành tool. Cho model 40 tool sẽ khiến nó chọn sai và tốn token. Chỉ khai báo tool thực sự cần cho tác vụ.
- Quên gửi kết quả tool trở lại. Nếu bạn chạy hàm nhưng không append kết quả vào messages, model "mù" và bịa ra câu trả lời.
- Không phân biệt read vs write. Đối xử với một tool
delete_usergiống nhưsearchlà công thức của thảm họa. - Kỳ vọng model luôn gọi đúng. Nó sẽ chọn sai, thiếu tham số, gọi lặp. Các bài sau dạy bạn xử lý những tình huống này.