Tầng Classify là trái tim của agent. Bài này dạy bạn viết prompt để LLM phân loại chính xác và trả về JSON đọc máy được — mọi lần.
Ba nguyên tắc của prompt phân loại tốt
- Đóng khung lựa chọn — cho LLM danh sách category cố định, cấm bịa loại mới.
- Ép định dạng đầu ra — yêu cầu JSON đúng schema, dùng structured output nếu API hỗ trợ.
- Cho ví dụ (few-shot) — 2–3 ví dụ mẫu tăng độ chính xác vượt trội so với chỉ mô tả suông.
Cấu trúc prompt hệ thống mẫu
Bạn là bộ phân loại email cho một shop thời trang online.
Phân loại email vào ĐÚNG MỘT category trong danh sách:
- don_hang: hỏi/đặt/theo dõi đơn
- khieu_nai: lỗi sản phẩm, giao sai/thiếu, đòi hoàn tiền
- hoa_don: hóa đơn nhà cung cấp, thanh toán
- noi_bo: email từ đồng nghiệp @congty.vn
- spam: quảng cáo, newsletter không liên quan
Priority: khan | binh_thuong | cho_duoc
Quy tắc khẩn: có deadline < 48h, khách giận, hoặc mất tiền/mất khách.
CHỈ trả về JSON theo schema, KHÔNG giải thích thêm:
{"category":"","priority":"","action":"","owner":"","confidence":0.0,"reason":""}
Ví dụ few-shot nhúng vào prompt
Email: "Áo giao bị rách, tôi muốn đổi trong hôm nay"
→ {"category":"khieu_nai","priority":"khan","action":"draft_reply",
"owner":"cskh","confidence":0.93,"reason":"lỗi sản phẩm + gấp"}
Email: "Giảm giá 50% cuối tuần này!"
→ {"category":"spam","priority":"cho_duoc","action":"archive",
"owner":"none","confidence":0.97,"reason":"quảng cáo"}
Dùng structured output / function calling
Nếu API hỗ trợ (Anthropic tool use, OpenAI JSON mode), hãy định nghĩa schema và bắt buộc model tuân theo. Điều này loại bỏ hoàn toàn lỗi parse:
tools = [{
"name": "classify_email",
"input_schema": {
"type": "object",
"properties": {
"category": {"enum": ["don_hang","khieu_nai","hoa_don","noi_bo","spam"]},
"priority": {"enum": ["khan","binh_thuong","cho_duoc"]},
"confidence": {"type": "number"}
},
"required": ["category","priority","confidence"]
}
}]
Dùng enum khiến model KHÔNG THỂ trả loại ngoài danh sách — an toàn hơn nhiều so với tin vào văn bản.
Các bước xây prompt
- Viết danh sách category kèm mô tả 1 dòng mỗi loại (từ Bài 1).
- Viết quy tắc priority thành câu rõ ràng, có ngưỡng thời gian.
- Ép JSON schema với enum cho các trường phân loại.
- Thêm 3–5 ví dụ few-shot phủ các trường hợp khó (mơ hồ, đa loại).
- Yêu cầu confidence + reason để phục vụ tầng Decide và audit.
- Đặt nhiệt độ (temperature) thấp (0–0.2) cho ổn định, ít "sáng tạo".
Checklist prompt
- [ ] Category đóng (enum), không cho bịa.
- [ ] Quy tắc priority có ngưỡng cụ thể.
- [ ] Bắt buộc JSON schema.
- [ ] Có few-shot phủ ca khó.
- [ ] Có confidence + reason.
- [ ] Temperature thấp.
Xử lý ca mơ hồ
Email vừa là đơn hàng vừa khiếu nại ("tôi đặt đơn mới và cả than phiền đơn cũ")? Hãy dạy prompt: ưu tiên category có action mạnh hơn (khiếu nại > đơn hàng), và ghi reason nêu rõ tính hai mặt để người duyệt biết. Đừng để model tự ý tạo category "hỗn hợp".
Sai lầm thường gặp
- Category mở, để model tự nghĩ ra loại. Kết quả: mỗi lần một tên khác nhau, không thể tự động hóa bước sau. Luôn dùng enum.
- Không cho ví dụ. Chỉ mô tả suông khiến model đoán sai các ca biên. Few-shot rẻ và hiệu quả nhất.
- Để temperature cao, model trả kết quả dao động — cùng email hai lần ra hai category. Hạ về 0–0.2.
- Parse văn xuôi bằng regex. Mong manh, vỡ khi model thêm một câu. Dùng structured output.
- Nhồi cả email 5000 từ vào prompt. Cắt còn 1500–2000 ký tự quan trọng nhất; tiêu đề + đoạn đầu thường đủ để phân loạ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