Prompt Engineering — cách 'nói chuyện' với AI để nó code đúng
Prompt là yêu cầu bạn gửi cho AI. Prompt kém → AI sinh code sai, lan man. Prompt tốt → AI làm đúng ý ngay lần đầu. Bài này dạy 5 thành phần của prompt tốt + 8 pattern phổ biến + ví dụ thực tế từ wiki bạn đang đọc.
Mục lục bài viết(28)
Flow prompt engineering: user (người dùng) viết prompt (yêu cầu) → gửi tới LLM (Mô hình Ngôn ngữ Lớn) → LLM xử lý + sinh output (kết quả) → user review (xem xét) + iterate (lặp lại điều chỉnh). Chất lượng output phụ thuộc 80% vào chất lượng prompt. Nguồn: Wikimedia Commons (CC BY-SA 4.0).
Hiểu đơn giản nhất
Prompt = yêu cầu bạn gửi cho AI để nó làm việc gì đó. Cùng AI Claude, cùng task code, nhưng prompt khác nhau cho kết quả khác xa nhau.
Tương tự như khi bạn thuê thợ làm tủ:
| Yêu cầu cho thợ | Kết quả |
|---|---|
| "Làm cho tôi cái tủ" | Thợ làm bất kỳ loại tủ nào — có thể không vừa nhà |
| "Tủ gỗ sồi 3 ngăn, 1m8 × 1m × 50cm, có khoá, lót ván nhung đỏ, giao tuần sau" | Đúng ý ngay lần đầu |
Code AI cũng vậy:
| Prompt | Kết quả AI |
|---|---|
| "Viết web bán hàng" | AI gen 1 template chung chung, không khớp nhu cầu |
| "Viết landing page (trang đích) bán cà phê đặc sản. Stack: Next.js 15 + Tailwind CSS + TypeScript. 5 sections: hero ảnh fullscreen, 6 sản phẩm grid 3 cột, story brand, testimonials 4 reviews, contact form gửi email. Color brand: amber-700 (nâu cà phê) + cream-50 (kem). Responsive (giao diện co dãn) mobile-first. SEO meta đủ." | AI gen sản phẩm chạy được, đúng yêu cầu |
Prompt engineering = kỹ thuật viết prompt sao cho AI làm đúng ý ngay lần đầu, tiết kiệm 5-10 lần thử-sai.
Tại sao bạn cần biết
- Tiết kiệm thời gian + tiền AI. Mỗi lần "thử lại" tốn 5-30 giây + cost (chi phí) token. 1 prompt tốt tiết kiệm 10 prompt kém — 10x hiệu suất.
- Kết quả tốt hơn đáng kể. Prompt cụ thể → code đúng cú pháp, đúng yêu cầu, có comment, có test. Prompt mơ hồ → code generic không dùng được.
- Apply được cho mọi tool AI. Claude Code, Cursor, ChatGPT, v0.dev — kỹ thuật prompt giống nhau, chỉ khác interface (giao diện).
- Định hướng nghề nghiệp. Marketer biết prompt tốt làm việc nhanh 3-5x. Dev biết prompt tốt tăng output 2-5x. Là kỹ năng phổ biến nhất trong văn phòng 2026.
5 thành phần của một prompt tốt
Template mặc định cho coding task (tác vụ lập trình):
1. Role (vai trò AI)
2. Context (bối cảnh, stack tech, code hiện có)
3. Task (yêu cầu cụ thể)
4. Constraint (giới hạn, phải có / không có)
5. Output (format mong muốn của kết quả)
1. Role — bạn muốn AI đóng vai ai
Cùng câu hỏi, AI là "senior developer" trả lời khác AI là "designer". Role định hình giọng văn + chiều sâu kỹ thuật.
Ví dụ:
Bạn là senior fullstack developer (lập trình viên cấp cao biết cả frontend + backend) chuyên Next.js + PostgreSQL.Bạn là kiến trúc sư hệ thống có 10 năm kinh nghiệm scale SaaS đa người dùng.Bạn là tutor (gia sư) lập trình kiên nhẫn dạy người mới bắt đầu.
2. Context — AI biết gì về tình huống
Mỗi AI session (phiên làm việc) bắt đầu "trắng tinh" — không biết dự án bạn đang làm gì. Context cho AI bức tranh đầy đủ.
Cần include (đưa vào):
- Stack (bộ công nghệ): Next.js 15 + Tailwind + Supabase
- Code base hiện có (đoạn liên quan)
- Convention (quy ước) đang dùng: TypeScript strict mode, conventional commits
- Database schema (cấu trúc bảng) nếu task liên quan DB
Ví dụ:
Context:
- Dự án: SaaS quản lý phòng khám nha khoa
- Stack: Next.js 15 App Router + Drizzle ORM + Supabase Postgres
- Có sẵn: table `patients` (id, name, phone), `appointments` (id, patient_id, datetime, status)
- Style: shadcn/ui + Tailwind + Vietnamese UI
3. Task — yêu cầu cụ thể
Phần quan trọng nhất. CỤ THỂ + HÀNH ĐỘNG RÕ.
| Task kém | Task tốt |
|---|---|
| "Sửa bug login" | "Sửa bug trong app/login/page.tsx: khi user nhập password sai, error message không hiện. Phải hiện <p class="text-red">Sai mật khẩu</p> dưới input." |
| "Thêm tính năng đặt lịch" | "Tạo trang /admin/appointments/new với form 4 field: chọn patient (select có search), datetime (input datetime-local), dropdown bác sĩ, ghi chú. Submit POST /api/appointments với JSON body." |
4. Constraint — giới hạn
Nói cho AI những thứ KHÔNG nên làm, để tránh AI vượt scope.
Ví dụ:
KHÔNG đổi component <Button> hiện có.KHÔNG thêm dependency (thư viện) mới ngoài đã có trong package.json.KHÔNG xoá file nào, chỉ thêm/sửa.Code tối đa 100 dòng. Nếu lớn hơn, tách thành component nhỏ.Phải tương thích với TypeScript strict mode.
5. Output — định dạng kết quả
Bạn muốn AI trả về cái gì?
Ví dụ:
Trả về full code 1 file duy nhất (1 file thôi).Trả về JSON với keys: filename, content, action ("create"/"modify"/"delete").Giải thích bằng tiếng Việt 3 câu, sau đó là code.Output dạng diff (chênh lệch giữa 2 phiên bản) thay vì code đầy đủ.
8 prompt pattern phổ biến
1. Zero-shot — không cho ví dụ
Bạn yêu cầu, AI tự suy luận. Phù hợp 80% task thông thường:
Viết function tính tổng tiền đơn hàng (subtotal + tax 8% + shipping 30.000đ).
Stack: TypeScript. Trả về number.
2. Few-shot — cho 2-5 ví dụ
Khi cần AI bắt chước pattern cụ thể (format, style):
Convert (chuyển đổi) tiếng Việt có dấu sang slug URL không dấu, có dấu gạch ngang.
Ví dụ:
- "Bún chả Hà Nội" → "bun-cha-ha-noi"
- "Cà phê sữa đá" → "ca-phe-sua-da"
- "Phở bò tái nạm" → "pho-bo-tai-nam"
Convert: "Bánh mì kẹp thịt"
3. Chain-of-thought — ép AI suy luận từng bước
Khi task phức tạp cần lý luận:
Tôi có lỗi 500 khi gọi API POST /orders. Phân tích từng bước:
1. Đọc code endpoint (điểm cuối — URL của một API) hiện có
2. Xem schema database (cấu trúc bảng database) bảng orders
3. Tìm dòng có thể throw error
4. Đề xuất fix
Hãy đi từng bước, không nhảy thẳng tới kết luận.
4. Persona — đóng vai chuyên gia
Đóng vai chuyên gia bảo mật web. Review (xem xét) đoạn code login dưới và list (liệt kê) mọi lỗ hổng có thể có. Sắp xếp theo mức độ nghiêm trọng.
[code login...]
5. Iterative refinement — tinh chỉnh dần
Lần 1: prompt tổng quát → review output → lần 2: bổ sung yêu cầu chi tiết.
Lần 1: "Viết landing page bán cà phê"
[AI gen v1]
Lần 2: "Đẹp rồi nhưng đổi hero ảnh sang background video, section testimonials sang carousel slider, thêm sticky nav (thanh điều hướng dính lên đầu)"
[AI gen v2]
6. Constrained output — ép định dạng
Trả về CHÍNH XÁC JSON sau, không thêm comment, không markdown:
{
"title": "...",
"tags": ["...", "..."],
"summary": "..."
}
7. Self-critique — AI tự review
Viết function X.
Sau khi viết, tự review code và list (liệt kê) 3 vấn đề có thể (bug tiềm tàng, performance, edge case).
Cuối cùng, đề xuất fix cho từng vấn đề.
8. Reference + Anchor — bám vào ví dụ cụ thể
Viết bài blog SEO về "DNS là gì" theo CÙNG STYLE với bài này (URL https://wiki.vietcodex.com/co-ban/internet-la-gi):
- Cùng cấu trúc 7 sections
- Cùng độ dài (~1500 từ)
- Cùng tone "bạn", analogy đời thường
- FAQ 7-8 câu cuối bài
Examples: prompt kém vs prompt tốt cho cùng task
Task: Build form đăng ký user.
❌ Prompt kém
Làm form đăng ký
AI sinh ra: form generic, không biết stack gì, không có validation (kiểm tra dữ liệu), không có error handling (xử lý lỗi). Bạn phải fix 80%.
✅ Prompt tốt
Role: Bạn là senior Next.js developer.
Context:
- Stack: Next.js 15 App Router + TypeScript + shadcn/ui + Supabase Auth
- Brand color: teal-700 (xanh ngọc)
Task: Tạo file `app/(auth)/register/page.tsx` với form đăng ký 4 field:
- Email (input type="email", required)
- Password (input type="password", min 8 ký tự)
- Full name (input text, required)
- Phone (input tel, optional)
Submit:
1. Validate (kiểm tra) ở client với react-hook-form + Zod
2. Gọi Supabase auth.signUp()
3. Nếu thành công → redirect /welcome
4. Nếu thất bại → hiện error message bằng tiếng Việt
Constraint:
- KHÔNG dùng useState — dùng react-hook-form
- KHÔNG inline style — dùng Tailwind class
- Phải có loading state (đang xử lý) khi submit
- Phải có error message dưới mỗi field
Output: 1 file TypeScript đầy đủ, có import, có "use client" directive nếu cần.
AI sinh ra: code chạy được ngay, đúng convention, có loading + error, dùng đúng stack. 5 phút thay vì 30 phút.
Prompt cho 3 task coding phổ biến
Generate code mới
Role: Bạn là full-stack developer Next.js + Supabase.
Context: Dự án SaaS quản lý phòng khám. Stack Next.js 15 + Drizzle ORM.
Task: Tạo endpoint POST `/api/appointments` nhận body:
{
patientId: number,
datetime: ISO string,
doctorId: number,
note: string (optional)
}
Logic:
1. Validate input với Zod
2. Check patient + doctor tồn tại trong DB
3. Check không trùng giờ với appointment khác của cùng bác sĩ
4. Insert vào table appointments
5. Return JSON { id, status: "scheduled" } với HTTP 201
Constraint:
- Auth (xác thực) bắt buộc — lấy userId từ session
- Wrap trong try/catch, trả 400 cho validation error, 500 cho DB error
Output: file `app/api/appointments/route.ts` đầy đủ.
Debug code cũ
Role: Senior backend developer + debug expert.
Context:
- Stack: Node.js + Express + PostgreSQL
- File `routes/orders.js` (paste code ở dưới)
- Bug: khi nhiều user đặt cùng 1 sản phẩm cuối cùng, đôi khi inventory thành -1 (số âm)
Task:
1. Phân tích từng bước tại sao bug xảy ra (chain-of-thought)
2. Đề xuất fix với code mới
3. Giải thích tại sao fix này solve race condition (xung đột truy cập đồng thời)
[paste code ở đây]
Refactor code có sẵn
Role: Senior React developer focus on clean code.
Context: Component `<UserDashboard>` hiện có 450 dòng (paste code dưới), chứa cả UI + data fetching + state management + business logic.
Task: Refactor (Tái cấu trúc — sửa code không đổi hành vi) thành:
1. `<UserDashboard>` chỉ giữ UI structure
2. Custom hook `useUserData()` cho data fetching
3. `<UserStats>`, `<UserOrders>`, `<UserSettings>` 3 component con
4. Logic business chuyển vào file `lib/user.ts`
Constraint:
- KHÔNG đổi behavior (hành vi) hiện có
- KHÔNG đổi props external API của <UserDashboard>
- TypeScript strict
Output: List file thay đổi với code mới.
Common mistakes (lỗi phổ biến)
| Lỗi | Hậu quả | Cách fix |
|---|---|---|
| Prompt quá ngắn ("viết web") | AI gen generic, không khớp ý | Thêm 4 thành phần còn lại (role, context, constraint, output) |
| Yêu cầu mâu thuẫn ("ngắn nhưng chi tiết") | AI confused, output hỗn loạn | Chọn 1 — ngắn hoặc chi tiết, không cả hai |
| Quá nhiều context ("đây là 5000 dòng code, fix bug") | AI "lost in middle", quên phần giữa | Cắt context xuống chỉ phần liên quan task |
| Prompt cuối session dài → AI quên đầu | Quên constraint quan trọng | Lặp lại constraint quan trọng ở cuối |
| Không cho ví dụ output mong muốn | AI guess format sai | Few-shot 1-2 ví dụ |
| Hỏi cho mê tín ("AI có nhớ session trước?") | Confusion, hallucination | AI không nhớ — luôn cho context đầy đủ |
Ví dụ thực tế: prompt tôi dùng để viết bài wiki này
Đây là prompt thực tế (đã edit ngắn lại) tôi gửi Claude Opus 4.7 cho bài "Prompt Engineering" mà bạn đang đọc:
Role: Bạn là kỹ thuật viên content marketing biết deep về AI Coding + LLM.
Context:
- Wiki wiki.vietcodex.com đang viết Cluster 2 (AI Coding Workflow) 8 bài
- Đã có bài 1 (ai-coding-la-gi) + bài 2 (llm-la-gi) — pattern style đã thiết lập
- Audience: non-tech VN — founder, marketer, BA, junior dev
Task: Viết bài 3 "Prompt Engineering — cách viết prompt tốt cho AI".
Constraint:
- Length 1900-2200 từ tiếng Việt
- Pronoun: "bạn", không "anh"
- Mỗi đoạn ≤ 3 câu
- Analogy (so sánh đời thường) trước thuật ngữ technical
- Inline Vietnamese note cho English term lần đầu xuất hiện (vd "Refactor (Tái cấu trúc)")
- Cross-link với bài 1, bài 2 đã có
- Có bảng so sánh + bảng "prompt kém vs tốt"
- "Ví dụ thực tế" section bắt buộc, dùng VietCodex/Shopee/Supabase
- FAQ 7-8 câu cuối bài
- Schema frontmatter giống bài 1, 2
Output: Toàn bộ file `content/wiki/ai-coding/prompt-engineering.mdx` từ frontmatter đến bài cuối, sẵn sàng deploy.
Cost cụ thể của bài này:
- Input (prompt + context bài 1, 2): ~12.000 token × $15/1M = $0.18
- Output (bài này, ~2000 từ): ~3.500 token × $75/1M = $0.26
- Tổng: ~$0.44 cho 1 bài 2000 từ chất lượng cao
So với thuê content writer 100-500k VND/bài: rẻ hơn 1.000-10.000 lần, nhanh hơn 50-100 lần.
Tóm tắt 1 dòng
Prompt = yêu cầu cho AI. Prompt engineering = kỹ thuật viết prompt sao cho AI làm đúng ý lần đầu. Template 5 thành phần: Role + Context + Task + Constraint + Output. 8 pattern phổ biến: zero-shot / few-shot / chain-of-thought / persona / iterative / constrained output / self-critique / reference. Prompt tốt tiết kiệm 5-10x thời gian + cost so với prompt kém.
Đọc tiếp
- AI Coding là gì? Tổng quan AI viết code — bài đầu cluster, anchor terminology
- LLM là gì? Cách 'bộ não' AI dự đoán từ tiếp theo — hiểu LLM giúp viết prompt tốt hơn
- Claude Code, Cursor, GitHub Copilot — khác nhau ra sao — mỗi tool có prompt UX khác (sắp có)
- Spec-driven development với AI — viết spec dài thay vì prompt ngắn cho dự án lớn (sắp có)