Product Management
Đăng nhập
ESC

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

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

Bài 6 — Logic nâng cao: điều kiện, rẽ nhánh, lặp và lọc dữ liệu

Đã đọ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.

Agent thật hiếm khi là đường thẳng. "Đơn VIP thì báo sếp", "gửi từng khách trong danh sách", "bỏ qua email spam" — tất cả cần logic. Bài này trang bị bốn công cụ logic cốt lõi.

1. Filter — chốt chặn cho luồng đi tiếp

Filter đứng giữa luồng và nói: "chỉ cho tiếp nếu điều kiện đúng". Nếu sai, luồng dừng, không chạy các bước sau.

Ví dụ: chỉ xử lý đơn có giá trị trên 500k.

Filter: {{gia}}  greater than  500000
-> Đúng: chạy tiếp gửi thông báo.
-> Sai : dừng im lặng, không làm gì.

2. Router / Điều kiện rẽ nhánh — chia nhiều hướng

Router chia luồng thành nhiều nhánh, mỗi nhánh có điều kiện riêng. Khác filter (chặn/không), router định tuyến sang đúng nhánh.

Router theo {{loai_khach}}:
  Nhánh A (VIP)      : gửi Slack cho sếp + tặng voucher
  Nhánh B (thường)   : gửi email cảm ơn tiêu chuẩn
  Nhánh C (mặc định) : ghi log, không làm gì thêm

Mẹo: luôn có một nhánh mặc định (fallback) để dữ liệu "lạ" không bị rơi vào hư không.

3. Iterator / Loop — lặp qua danh sách

Khi một bước trả về một mảng (nhiều dòng, nhiều file), iterator tách mảng ra và chạy các bước sau một lần cho mỗi phần tử.

Ví dụ: đọc 20 khách nợ quá hạn → lặp → gửi email từng người.

List: 20 dòng công nợ quá hạn
Iterator -> với mỗi dòng:
     Gửi email tới {{dong.email}} nội dung nhắc {{dong.so_tien}}
     Ghi cột "da_nhac = TRUE"

4. Data transform — dọn dữ liệu trước khi dùng

Dữ liệu thật hay bẩn: SĐT có dấu cách, tên viết hoa lộn xộn, ngày sai định dạng. Các hàm text/date giúp chuẩn hóa:

trim({{sdt}})                -> bỏ khoảng trắng thừa
lower({{email}})             -> đồng nhất email
formatDate({{ngay}}, "DD/MM/YYYY")
replace({{sdt}}, " ", "")    -> bỏ dấu cách trong số

Khung tư duy thiết kế logic

Với mỗi bước, hỏi:
1. CÓ CẦN CHẶN không? -> dùng Filter.
2. CÓ NHIỀU HƯỚNG không? -> dùng Router (nhớ nhánh mặc định).
3. ĐANG XỬ NHIỀU MỤC không? -> dùng Iterator.
4. DỮ LIỆU CÓ SẠCH không? -> transform trước khi dùng.
5. NẾU DỮ LIỆU RỖNG/LỖI thì sao? -> luôn có phương án dự phòng.

Ví dụ tổng hợp: agent duyệt đơn hàng

Trigger : Đơn mới
Transform: chuẩn hóa sdt, tên
Filter  : bỏ đơn test (email chứa "test@")
Router theo {{gia}}:
  > 5.000.000  : gửi Slack sếp duyệt + ghi "chờ duyệt"
  1-5 triệu    : tự xác nhận + nhắn khách
  < 1 triệu    : tự xác nhận, không báo ai
Iterator (nếu đơn nhiều sản phẩm): trừ tồn kho từng SP

Một agent như vậy thay thế cả một quy trình duyệt tay nhiều tầng.

Các bước thực hành

  • Nhìn lại agent của bạn, tìm chỗ "tùy trường hợp" — đó là nơi cần logic.
  • Xác định mỗi chỗ cần Filter, Router hay Iterator.
  • Thêm module tương ứng, đặt điều kiện rõ ràng bằng dữ liệu thật.
  • Thêm nhánh mặc định và bước transform cho dữ liệu đầu vào.
  • Test với các ca biên: giá = 0, tên rỗng, danh sách trống.

Sai lầm thường gặp

  • Quên nhánh mặc định: dữ liệu không khớp điều kiện nào sẽ biến mất lặng lẽ — bug rất khó phát hiện.
  • So sánh sai kiểu dữ liệu: so "500000" (chuỗi) với 500000 (số) cho kết quả sai; ép kiểu trước khi so.
  • Lặp lồng lặp không giới hạn: iterator qua danh sách nghìn phần tử gọi AI mỗi vòng = hóa đơn khổng lồ + chậm. Đặt giới hạn.
  • Không transform dữ liệu bẩn: filter theo SĐT mà số có dấu cách sẽ trượt hết.
  • Logic nhồi vào một luồng khổng lồ: tách thành các luồng con để dễ đọc, dễ sửa.
Bài sau: kiểm thử, xử lý lỗi và giám sát để agent không âm thầm chết giữa đêm.

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