Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 5 — Trang bị "Tay" cho agent: tra giá, tồn kho, ghi đơn

Đã đọc 0/9 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

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.
Khóa này dùng Google Sheet vì rẻ và ai cũng làm được.

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_kho trướ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.
Bài sau: tự động hóa hóa đơn điện tử — phần nhạy cảm nhất về pháp lý.

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