The "CAV" Framework
Tại sao cùng một con AI, người này dùng ra app xịn, người kia dùng ra đống code rác? Khác biệt nằm ở Kỹ nghệ ra lệnh (Prompt Engineering).
Đừng nói chuyện với Agent như nói với bạn bè ("Ê làm cái nút này đẹp đẹp tí nhé"). Hãy nói chuyện như một Kiến trúc sư giao việc cho Kỹ sư trưởng.
Tôi giới thiệu với bạn Framework CAV: Context - Action - Verification.
Layer 1: Context (Bối cảnh - What & Who & Why)
Trước khi bảo Agent làm cái gì, hãy cho nó biết nó đang ở đâu.
- Project Context: "Chúng ta đang build một ứng dụng E-learning bằng Next.js 14, Supabase và Tailwind CSS."
- Role: "Bạn là một Senior Frontend Developer chuyên về UI/UX."
- Constraint: "Lưu ý: Chúng ta dùng Shadcn/UI, không dùng CSS thuần. Mobile-first design."
Tại sao quan trọng? Nếu không có context, Agent sẽ random chọn công nghệ (ví dụ: tự nhiên cài Bootstrap vào dự án Tailwind).
Layer 2: Action (Hành động - The Task)
Mô tả công việc cụ thể, rõ ràng, không mơ hồ.
- ❌ Bad: "Làm cho tôi cái trang Login." (Quá chung chung).
- ✅ Good: "Hãy tạo trang Login tại route
/login. Trang này cần form gồm Email vả Password. Sử dụnglucide-reactcho icons. Kết nối với Supabase Auth thông qua server actionloginUser."
Dùng động từ mạnh: Create, Update, Refactor, Delete.
Layer 3: Verification (Tiêu chí nghiệm thu - Definition of Done)
Làm sao để biết Agent đã làm xong? Hãy đưa ra bài test.
- "Sau khi xong, hãy đảm bảo rằng nếu user nhập sai password, một Toast error màu đỏ sẽ hiện ra."
- "Hãy verify rằng nút Submit bị disable (loading state) khi đang gọi API."
Cung cấp tiêu chí nghiệm thu giúp Agent có mục tiêu để tự kiểm tra (Self-reflection).
Template Prompt Mẫu (Copy & Paste)
# CONTEXT
Project: [Tên Project]
Tech Stack: [Next.js, Supabase, Tailwind]
Goal: [Mục tiêu của task hiện tại]
# ACTION
Tôi cần bạn thực hiện các bước sau:
1. Tạo file [X] tại đường dẫn [Y].
2. Implement logic [Z].
3. Đảm bảo sử dụng components có sẵn trong folder `components/ui`.
# VERIFICATION
Kết quả mong đợi:
- Giao diện phải giống với [Mô tả/Ảnh đính kèm].
- Chức năng [A] phải hoạt động được khi click.
- Không có lỗi type TypeScript (`any` is forbidden).
🎓 Pro Tip: Lưu template này vào một file text (thậm chí lưu vào Rules của Cursor/Replit nếu có thể) để tái sử dụng. Prompt càng chi tiết, code càng sạch.
