Một agent trả lời "bánh trung thu 320k" trong khi giá đã đổi thành 350k sẽ làm mất uy tín. Agent phải lấy dữ liệu từ nguồn sự thật, không bịa. Bài này xây các "tool" — phần biến agent từ tư vấn viên thành người làm được việc.
Nguồn sự thật của SME Việt
- Google Sheet: phổ biến nhất, miễn phí, dễ sửa. Tốt cho SME nhỏ.
- Phần mềm bán hàng (KiotViet, Sapo, Nhanh.vn): có API, phù hợp khi đã dùng sẵn.
- DB riêng: khi cần kiểm soát cao.
Thiết kế bảng dữ liệu
Sheet SanPham:
| ma_sp | ten_sp | gia | ton_kho | dang_ban |
| SP01 | Bánh trung thu | 350000 | 40 | TRUE |
| SP02 | Bánh bông lan | 45000 | 200 | TRUE |
Sheet DonHang:
| ma_don | userId | sp | sl | tong | dia_chi | can_hd | trang_thai | tao_luc |
Tool 1: Tra giá + tồn kho
// n8n: đọc Sheet, lọc theo tên gần đúng
const rows = $json.rows;
const q = $json.query.toLowerCase();
const hit = rows.find(r => r.ten_sp.toLowerCase().includes(q) && r.dang_ban === 'TRUE');
return [{ json: hit
? { found:true, ten:hit.ten_sp, gia:Number(hit.gia), con:Number(hit.ton_kho) }
: { found:false } }];
Nếu con <= 0 → agent báo hết hàng thay vì chốt đơn ảo.
Tool 2: Ghi đơn (append row)
const don = {
ma_don: 'DH' + Date.now(),
userId: $json.userId,
sp: $json.cart.map(i => `${i.sp} x${i.sl}`).join(', '),
sl: $json.cart.reduce((s,i)=>s+i.sl,0),
tong: $json.cart.reduce((s,i)=>s+i.sl*i.gia,0),
dia_chi: $json.dia_chi,
can_hd: $json.can_hoa_don ? 'TRUE' : 'FALSE',
trang_thai: 'MOI',
tao_luc: new Date().toISOString()
};
// → Google Sheets "Append Row" node
Nguyên tắc thiết kế tool (rất quan trọng)
- Một tool làm một việc rõ ràng (tra giá, ghi đơn) — dễ test, dễ sửa.
- Đầu vào/ra có cấu trúc (JSON), không phụ thuộc văn phong LLM.
- Tool tự kiểm tra: ghi đơn phải kiểm
tong > 0, códia_chi, cósp. - Trả lỗi rõ ràng để agent xử lý (ví dụ
{error:"het_hang"}). - Idempotent khi có thể: tránh ghi đơn 2 lần nếu webhook retry (dùng khóa chống trùng theo userId + timestamp gần).
Các bước lắp tool vào agent
- Tạo 2 Sheet:
SanPham,DonHang, cấp quyền cho service account n8n. - Dựng tool tra giá, test với 10 câu hỏi đời thực.
- Dựng tool ghi đơn, kiểm tra dữ liệu bắt buộc trước khi append.
- Nối tool vào router intent:
HOI_GIA→ tra giá;DAT_HANG(đủ state) → ghi đơn. - Sau khi ghi đơn, gửi Zalo xác nhận kèm
ma_donđể khách tra cứu. - Thêm thông báo cho chủ shop (tin Zalo/Telegram) mỗi khi có đơn mới.
Khung kiểm thử tool
- Sản phẩm có thật → trả đúng giá?
- Sản phẩm hết hàng → báo hết, không chốt?
- Tên viết sai/viết tắt → vẫn tìm ra?
- Ghi đơn thiếu địa chỉ → bị chặn?
- Webhook gọi 2 lần → chỉ 1 đơn?
Sai lầm thường gặp
- Để LLM tự bịa giá: giá phải đến từ tool, không bao giờ để model tự nói số. Trong prompt: "chỉ dùng giá do tool trả về".
- Không kiểm tồn kho: chốt đơn hàng đã hết. Luôn check
ton_khotrước khi xác nhận. - Ghi đơn trùng khi retry: thiếu chống trùng. Thêm khóa idempotent.
- Quyền Sheet sai: service account không có quyền edit → tool im lặng thất bại. Test quyền ghi thật.
- Không báo chủ shop: đơn vào Sheet nhưng không ai biết giao hàng. Luôn có kênh thông báo đơn mới.
Học xong bài này rồi?
Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu,
và học hết khóa thì có chứng chỉ.
Lưu tiến độ của tôi