Prompt code khác prompt chat
Với coding agent, prompt tốt không phải văn hoa mà là đặc tả kỹ thuật gọn: mục tiêu, ràng buộc, phạm vi, tiêu chí nghiệm thu. Model đã giỏi viết code; việc của bạn là khử mơ hồ để nó không đoán sai.
Khung TCREV cho prompt code
T - Task (mục tiêu): làm gì, chính xác
C - Context (bối cảnh): file/hàm liên quan (đã nạp)
R - Ràng buộc: quy ước, thư viện được/không được dùng
E - Example (mẫu): mẫu output hoặc code tương tự đã đúng
V - Verify (nghiệm thu): làm sao biết là xong
Ví dụ: prompt mơ hồ vs prompt tốt
Mơ hồ: "Viết chức năng gửi email." → agent tự chọn thư viện, tự đặt tên, không xử lý lỗi.
Tốt (TCREV):
Task: Thêm hàm send_welcome_email(user_id) gửi email chào mừng.
Context: dùng EmailClient trong services/email.py (đã đọc).
Ràng buộc:
- Dùng EmailClient hiện có, KHÔNG thêm thư viện mới.
- Template lấy từ templates/welcome.html.
- Retry 3 lần nếu SMTP lỗi; log qua logger hiện có.
Example: theo mẫu send_reset_email() cùng file.
Verify: thêm test giả lập EmailClient, pytest tests/test_email.py pass.
Agent gần như không còn gì để đoán sai.
Kỹ thuật quan trọng
- Ràng buộc phủ định — nói rõ điều KHÔNG được làm ("không đổi API public", "không thêm dependency"). Chặn cả lớp lỗi.
- Chỉ tới ví dụ trong repo — "làm theo
send_reset_email" mạnh hơn mọi mô tả, vì agent bắt chước phong cách thật. - Phạm vi rõ (scope) — "chỉ sửa
email.py, không đụng route" tránh agent refactor lan man. - Tiêu chí nghiệm thu bằng lệnh — "pytest ... pass" cho agent mục tiêu tự kiểm chứng.
- Chia nhỏ tác vụ lớn — một prompt = một thay đổi mạch lạc, dễ review.
Các bước soạn một prompt code tốt
- Viết một câu mục tiêu duy nhất, cụ thể.
- Liệt kê file liên quan (và đảm bảo đã nạp).
- Ghi 2-4 ràng buộc, gồm ít nhất một điều CẤM.
- Chỉ tới một ví dụ mẫu nếu có.
- Ghi tiêu chí nghiệm thu bằng lệnh chạy được.
- Giới hạn phạm vi file được phép sửa.
Checklist trước khi bấm gửi
- [ ] Mục tiêu một câu, không mơ hồ
- [ ] File liên quan đã nạp vào context
- [ ] Có ít nhất một ràng buộc phủ định
- [ ] Có ví dụ mẫu để bắt chước (nếu có)
- [ ] Tiêu chí "xong" là một lệnh chạy được
- [ ] Phạm vi sửa được giới hạn
Mẫu prompt tái sử dụng được
Bạn không cần viết lại từ đầu mỗi lần. Hãy giữ một khung mẫu và điền vào chỗ trống:
[Task] ...
[Files] đọc: ... (chỉ sửa: ...)
[Rules] tuân: ... | KHÔNG: ...
[Model] làm theo: <hàm/mẫu đã đúng>
[Done] <lệnh test/lint> phải pass
Ví dụ điền: Task = "thêm phân trang cho GET /orders"; Files = đọc routes/orders.py, services/order.py, chỉ sửa 2 file này; Rules = dùng tham số page, size; KHÔNG đổi schema response cũ; Model = theo GET /users đã có phân trang; Done = pytest tests/test_orders.py pass. Một prompt như vậy gần như không để agent chỗ nào để đoán sai, và bạn tái dùng khung cho mọi tác vụ.
Sai lầm thường gặp
- Prompt một dòng cho tác vụ lớn — "làm hệ thống thanh toán" → agent đi lung tung. Chia nhỏ.
- Quên ràng buộc phủ định — agent tự thêm thư viện, đổi API, refactor ngoài ý muốn.
- Không có tiêu chí nghiệm thu — agent "báo xong" nhưng chưa chạy gì; bạn không có cơ sở kiểm.
- Mô tả dài dòng thay vì chỉ ví dụ — một mẫu code đúng trong repo đáng giá hơn ba đoạn văn.
- Trộn nhiều mục tiêu vào một prompt — khó review, dễ lỗi chồng lỗi.
- Không cố định phạm vi sửa — quên nói "chỉ sửa file X" khiến agent lan man sang chỗ khác.