1.3. Tools: Công Cụ Của Agent
Agenda
Thời gian đọc ước tính: ~15 phút
Learning outcome:
- Định nghĩa được Tool là gì và tại sao agent không thể thiếu nó.
- Tạo được custom tool với Zod schema và 3 kiểu return value khác nhau.
- Giải thích được sự khác biệt giữa string, object, và Command return.
- Phân biệt được static tools và dynamic tool selection — khi nào dùng cái nào.
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| Tool | Công cụ — callable function với input/output được định nghĩa rõ ràng, LLM gọi khi cần. |
| Tool Schema | Lược đồ công cụ — Zod schema định nghĩa tên, mô tả, và kiểu dữ liệu của input. |
| ToolMessage | Kết quả trả về của tool sau khi thực thi, gửi ngược lại cho LLM. |
| ToolNode | Prebuilt node trong LangGraph — thực thi tools song song, xử lý lỗi tự động. |
| bindTools() | Phương thức gắn tool schema vào LLM để nó "biết" có những tools nào. |
| tool_calls | Mảng trong AIMessage — chứa danh sách tool LLM muốn gọi kèm arguments. |
| Command | Object trong LangGraph cho phép tool cập nhật trực tiếp graph state. |
| Dynamic Tool Selection | Cơ chế lọc tools tại runtime dựa trên quyền, context, hoặc feature flags. |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context |
|---|---|
| Callable (adj) | Có thể gọi được — nói về function hoặc object có thể thực thi như một function. |
| Schema (n) | Lược đồ — cấu trúc dữ liệu được khai báo trước, dùng để validate input/output. |
| Invoke (v) | Gọi thực thi — chạy một function hoặc tool với arguments cụ thể. |
| Middleware (n) | Lớp trung gian — code chạy trước/sau một operation để transform hoặc filter. |
| Short-circuit (v) | Dừng sớm — bỏ qua các bước còn lại khi một điều kiện đã thỏa mãn. |
1. Vấn đề & Giải pháp
Vấn đề (Problem Statement):
- LLM thuần túy bị giới hạn trong context window — không truy cập được dữ liệu real-time (giá cổ phiếu, thời tiết, database).
- LLM không thực thi được code, không ghi file, không gọi API bên ngoài.
- Không có cơ chế chuẩn hóa để LLM "biết" khi nào và cách nào tương tác với hệ thống bên ngoài.
Giải pháp (Solution):
Tools là cầu nối giữa LLM và thế giới bên ngoài. Mỗi tool là một function được mô tả bằng schema — LLM đọc name và description để quyết định có cần gọi tool không, đọc schema để biết phải truyền argument gì.
Ai thực thi tool?
LLM chỉ quyết định gọi tool nào với argument gì — phát ra tool_calls trong AIMessage. Việc thực thi function thực tế là do ứng dụng của bạn (hoặc ToolNode) đảm nhiệm. Tách biệt này là thiết kế có chủ ý để kiểm soát side effects.
2. Kiến Trúc Tool Trong Agent Loop
Chuỗi sự kiện:
- LLM nhận câu hỏi, quyết định cần thông tin thời tiết.
- LLM phát ra
tool_callstrongAIMessage— đây là ý định, không phải lệnh thực thi. ToolNodenhậnAIMessage, gọi function thực tế.- Kết quả được đóng gói thành
ToolMessagevà gửi lại cho LLM. - LLM tổng hợp và trả lời người dùng.
3. Tạo Tool Cơ Bản
3.1. Basic Tool Definition
// filename: tools/basic.ts
import * as z from "zod";
import { tool } from "@langchain/core/tools";
// Schema Zod = "hợp đồng" giữa LLM và function
// LLM đọc description để biết WHEN để gọi tool này
const searchDatabase = tool(
({ query, limit }) => `Found ${limit} results for '${query}'`,
{
name: "search_database",
// description QUAN TRỌNG: LLM dùng để quyết định có nên gọi không
description: "Search the customer database for records matching the query.",
schema: z.object({
query: z.string().describe("Search terms to look for"),
limit: z.number().describe("Maximum number of results to return"),
}),
}
);
Hai thành phần bắt buộc:
- Function implementation: Logic thực tế (gọi API, query DB, tính toán...)
- Tool metadata:
name,description,schema— LLM chỉ thấy phần này
3.2. Gắn Tools Vào LLM
// filename: agent/setup.ts
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
const model = new ChatGoogleGenerativeAI({
model: "gemini-2.5-flash",
temperature: 0,
});
// bindTools = gửi tool schema cho LLM qua system prompt ẩn
// LLM sẽ output tool_calls khi cần dùng tool
const modelWithTools = model.bindTools([searchDatabase]);
const response = await modelWithTools.invoke("Tìm 5 khách hàng tên Nguyễn");
console.log(response.tool_calls);
// [{ name: "search_database", args: { query: "Nguyễn", limit: 5 }, id: "..." }]
4. Ba Kiểu Return Value
Lựa chọn return type ảnh hưởng trực tiếp đến cách LLM xử lý kết quả tiếp theo.