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.

13 phút đọcCập nhật 2026-05-19
Đang tải audio...
Mục lục bài viết(28)
Sơ đồ flow prompt engineering — user prompt → LLM → output

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:

PromptKế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émTask 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ỗiHậ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ạnChọ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ữaCắt context xuống chỉ phần liên quan task
Prompt cuối session dài → AI quên đầuQuên constraint quan trọngLặp lại constraint quan trọng ở cuối
Không cho ví dụ output mong muốnAI guess format saiFew-shot 1-2 ví dụ
Hỏi cho mê tín ("AI có nhớ session trước?")Confusion, hallucinationAI 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

Câu hỏi thường gặp

Prompt engineer có phải là một nghề thật không?
Có, từ 2023. Lương VN 2026: 15-40 triệu cho junior, 50-100 triệu cho senior (chuyên về RAG + agent + fine-tune). Nhưng đang dần MERGE vào các nghề khác — dev biết prompt tốt, marketer biết prompt tốt, BA biết prompt tốt. 'Pure prompt engineer' sẽ ít phổ biến vào 2027-2028 khi AI tự hiểu yêu cầu mơ hồ tốt hơn.
Tôi prompt sai, AI code sai. Lỗi do AI hay do tôi?
80% do prompt, 20% do AI. Quy tắc: nếu AI sinh code sai cú pháp/lỗi đơn giản → AI yếu (đổi model mạnh hơn). Nếu AI sinh code chạy được nhưng sai ý → prompt chưa đủ rõ. Trước khi đổi model, thử rewrite prompt với role + context + format cụ thể. 80% case rewriting prompt solve được vấn đề.
Tôi nên prompt bằng tiếng Việt hay tiếng Anh?
AI 2026 (Claude, GPT, Gemini) hiểu tiếng Việt rất tốt — không cần switch sang tiếng Anh. Lợi của tiếng Việt: nhanh hơn để bạn viết, ít sai nghĩa do dịch. Lợi của tiếng Anh: training data nhiều hơn nên AI có thể sinh code chính xác hơn 5-10% cho task phức tạp. Pattern thực tế: prompt 'hỏi/yêu cầu' viết tiếng Việt, technical specifications viết bilingual. Wiki này tôi dùng 100% tiếng Việt — chất lượng output bạn đang đọc.
Few-shot và Zero-shot prompt khác nhau ở đâu?
**Zero-shot**: bạn yêu cầu, không cho ví dụ. AI suy luận từ kiến thức training. **Few-shot**: bạn cho 2-5 ví dụ về input/output mong muốn, AI bắt chước pattern. Few-shot work tốt cho task có pattern rõ (format JSON, classification, transformation). Zero-shot đủ cho task thông thường (generate code, summarize, translate). 2026 model mạnh: zero-shot work cho 90% task, few-shot chỉ cần cho output có format đặc thù.
Chain-of-thought (CoT) prompt là gì?
CoT = ép AI 'suy nghĩ từng bước' trước khi trả lời. Câu kích hoạt: 'Let's think step by step' hoặc 'Hãy suy luận từng bước'. Lợi: AI giải bài toán phức tạp chính xác hơn 30-50% (đặc biệt math, logic, multi-step). Claude Opus 4.7 + GPT-5 đã có CoT 'built-in' cho task khó — bạn không cần ép. Vẫn hữu ích cho debug logic phức tạp: 'Phân tích từng bước tại sao bug này xảy ra trước khi đề xuất fix'.
Tại sao có lúc AI bỏ qua phần của prompt mà tôi viết rõ ràng?
3 lý do: (1) Prompt quá dài (> 50.000 token) — AI 'lost in middle', quên phần giữa; (2) Yêu cầu mâu thuẫn — vd: 'ngắn gọn' + 'chi tiết đầy đủ'; (3) Format prompt rối — yêu cầu lẫn vào context dài. Fix: (1) Cấu trúc prompt rõ ràng (heading, bullet); (2) Quan trọng nhất đặt ở ĐẦU hoặc CUỐI; (3) Lặp lại constraint quan trọng 2 lần ở các vị trí khác nhau.
Có template prompt mẫu nào tốt cho coding không?
Có. Template VietCodex dùng: '**Role:** Bạn là [senior dev/architect]. **Context:** [stack tech, code base hiện có]. **Task:** [yêu cầu cụ thể]. **Constraint:** [phải có, không có gì]. **Output:** [format mong muốn, vd: code Next.js TypeScript, có comment, có test].' Template này áp dụng cho 80% task code. Phức tạp hơn thì thêm 'Examples:' (few-shot) hoặc 'Think step by step:' (CoT).
Tôi có nên 'spam' AI với nhiều prompt biến thể đến khi ra kết quả tốt?
Có nhưng có giới hạn. 2-3 lần thử-sai để fine-tune prompt là OK. Quá đó → bạn đang 'lương lựu' AI hơn là viết prompt tốt. Better pattern: sau lần thử thứ 2, dừng + viết lại prompt từ đầu với learnings. Cost cũng tăng nhanh — mỗi try ~$0.01-0.10 token. 10 try lãng phí gấp 5x so với 1 prompt tốt.