Xin chào! Mình là Minh, một developer đã sử dụng AI để hỗ trợ lập trình được hơn 2 năm. Hôm nay mình muốn chia sẻ với các bạn một kỹ năng cực kỳ quan trọng nhưng nhiều người mới bỏ qua: Cách viết prompt để nhận được code chất lượng cao từ AI.
Bạn có biết rằng cùng một câu hỏi, chỉ cần thay đổi cách diễn đạt một chút, kết quả AI trả về có thể khác nhau đến 80% không? Đây là bí quyết mình đã đúc kết qua hàng trăm dự án thực tế.
Tại sao prompt engineering lại quan trọng cho lập trình viên?
Khi mới bắt đầu sử dụng AI, mình cũng như nhiều bạn — cứ hỏi đại kiểu "viết code Python đi", "fix lỗi này giúp mình". Kết quả? Code nhận được thường:
- Thiếu xử lý lỗi (error handling)
- Không theo convention của project
- Không có documentation
- Chạy được nhưng không tối ưu
Sau khi học cách viết prompt chuẩn, mình tiết kiệm được trung bình 40% thời gian debug vì code từ AI gần như sử dụng được ngay. Thậm chí code còn sạch hơn nhiều senior developer mình từng làm việc cùng!
Cấu trúc prompt hoàn hảo cho lập trình viên
Theo kinh nghiệm của mình, một prompt tốt cho code cần có 5 thành phần chính:
┌─────────────────────────────────────────────────────┐
│ CẤU TRÚC PROMPT TỐI ƯU CHO CODE │
├─────────────────────────────────────────────────────┤
│ 1. Ngữ cảnh (Context) → Project/framework gì? │
│ 2. Nhiệm vụ (Task) → Cần làm gì? │
│ 3. Ràng buộc (Constraint) → Yêu cầu kỹ thuật? │
│ 4. Ví dụ (Example) → Input/output mẫu? │
│ 5. Định dạng (Format) → Code style mong muốn? │
└─────────────────────────────────────────────────────┘
Không phải lúc nào cũng cần đủ 5 phần, nhưng càng đủ thì kết quả càng chính xác.
Hướng dẫn từng bước: Viết prompt đầu tiên của bạn
Bước 1: Xác định ngữ cảnh rõ ràng
Đây là phần quan trọng nhất mà 90% người mới bỏ qua. AI không đọc được suy nghĩ của bạn. Bạn phải mô tả:
- Ngôn ngữ lập trình (Python, JavaScript, Go...)
- Framework đang dùng (React, Django, Express...)
- Version của thư viện (nếu quan trọng)
- Mục đích của code
Bước 2: Mô tả nhiệm vụ cụ thể
Thay vì hỏi chung chung, hãy nói chính xác bạn cần gì:
❌ BAD: "Viết hàm xử lý mảng"
✅ GOOD: "Viết hàm filter mảng objects theo property 'status' = 'active',
trả về array mới, không mutate array gốc, dùng vanilla JS"
Bước 3: Thêm ràng buộc kỹ thuật
Đây là điểm mình hay quên nhất. Các ràng buộc phổ biến:
- Yêu cầu error handling
- Type annotations (cho TypeScript)
- Performance constraints (Big-O mong muốn)
- Tuân thủ coding convention (ESLint rules, PEP8...)
- Security requirements
Bước 4: Cung cấp ví dụ (nếu có)
Ví dụ là cách nhanh nhất để AI hiểu bạn muốn gì. Mình luôn đính kèm:
Ví dụ:
Input: [1, 2, 3, 4, 5]
Output: [2, 4] // Chỉ số chẵn
Input: [{name: 'A', age: 20}, {name: 'B', age: 25}]
Output: [{name: 'B', age: 25}] // age > 22
Bước 5: Chỉ định format đầu ra
Bạn muốn code có gì thêm?
- Comments giải thích từng dòng
- Unit tests kèm theo
- Usage example
- Documentation (JSDoc, docstring)
Ví dụ thực tế: Prompt hoàn chỉnh
Đây là prompt mình dùng thực tế khi cần viết API endpoint:
Ngữ cảnh:
- Ngôn ngữ: Python 3.11
- Framework: FastAPI
- Database: PostgreSQL với SQLAlchemy ORM
Nhiệm vụ:
Viết API endpoint để lấy danh sách users với phân trang.
Ràng buộc:
- Tham số: page (int, default=1), limit (int, default=20, max=100)
- Response phải có format: {"data": [...], "total": int, "page": int, "limit": int}
- Thêm error handling cho trường hợp page không hợp lệ
- Dùng async/await cho database query
- Validate input bằng Pydantic
Format đầu ra:
- Code + docstring
- Ví dụ request/response
- 3 unit test cases (valid, invalid page, empty result)
Code mẫu: Kết nối HolySheep AI API
Để các bạn thực hành ngay, đây là cách kết nối với HolyShehe AI — nền tảng mình đang dùng với chi phí chỉ bằng 15% so với OpenAI, độ trễ dưới 50ms:
import requests
import json
Cấu hình API - HolySheep AI
Giá: DeepSeek V3.2 chỉ $0.42/MTok (so với $15 của Claude)
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1/chat/completions"
def ask_coding_assistant(prompt: str, model: str = "deepseek-chat") -> str:
"""
Gửi prompt đến AI và nhận response về code.
Models khả dụng:
- gpt-4.1 ($8/MTok)
- claude-sonnet-4.5 ($15/MTok)
- gemini-2.5-flash ($2.50/MTok)
- deepseek-v3.2 ($0.42/MTok) ← Giá rẻ nhất!
"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": model,
"messages": [
{
"role": "system",
"content": "Bạn là một senior developer với 15 năm kinh nghiệm. "
"Viết code sạch, có error handling, type safety, và comments."
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3, # Thấp để code nhất quán hơn
"max_tokens": 2000
}
response = requests.post(BASE_URL, headers=headers, json=data, timeout=30)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
raise Exception(f"API Error: {response.status_code} - {response.text}")
Ví dụ sử dụng
if __name__ == "__main__":
my_prompt = """
Viết hàm Python để đọc file JSON và trả về dictionary.
Yêu cầu:
- Handle file not found error
- Handle JSON decode error
- Validate input là string
- Type hints đầy đủ
- Có unit test
"""
result = ask_coding_assistant(my_prompt, model="deepseek-v3.2")
print(result)
Với mã này, bạn có thể thực hành viết prompt ngay. Chỉ cần thay YOUR_HOLYSHEEP_API_KEY bằng key từ tài khoản của bạn.
So sánh chi phí thực tế
Mình làm bảng so sánh chi phí để bạn thấy rõ sự khác biệt:
┌────────────────────────────────────────────────────────────────────┐
│ SO SÁNH CHI PHÍ API (2026) │
├──────────────────────┬─────────────┬──────────────┬─────────────────┤
│ Model │ Giá/MTok │ 10K tokens │ Chênh lệch │
├──────────────────────┼─────────────┼──────────────┼─────────────────┤
│ Claude Sonnet 4.5 │ $15.00 │ $0.15 │ Cao nhất │
│ GPT-4.1 │ $8.00 │ $0.08 │ Trung bình │
│ Gemini 2.5 Flash │ $2.50 │ $0.025 │ Rẻ │
│ DeepSeek V3.2 ⭐ │ $0.42 │ $0.0042 │ Rẻ nhất (-97%) │
└──────────────────────┴─────────────┴──────────────┴─────────────────┘
💡 Với HolySheep AI: Tỷ giá ¥1 = $1 (không phí chuyển đổi!)
📊 Tiết kiệm: 85%+ so với OpenAI/Anthropic
📝 Ví dụ thực tế:
- Viết 1000 dòng code ≈ 4000 tokens
- DeepSeek V3.2: $0.0042 (≈ 0.1 ¥)
- GPT-4.1: $0.08 (≈ 1.8 ¥)
→ Tiết kiệm: 98 ¥/tháng cho 1 developer
Kỹ thuật nâng cao: Chain of Prompting
Với những task phức tạp, mình không hỏi một lần mà chia thành nhiều bước. Gọi là Chain of Prompting:
# Bước 1: Yêu cầu phân tích
prompt_1 = """
Phân tích yêu cầu sau và liệt kê các thành phần cần thiết:
"Xây dựng REST API cho hệ thống quản lý thư viện với các chức năng:
thêm/sửa/xóa sách, mượn/trả sách, tìm kiếm theo tiêu đề/tác giả"
Trả lời dạng bullet points, mỗi thành phần 1 dòng.
"""
Bước 2: Yêu cầu thiết kế database
prompt_2 = """
Dựa trên phân tích ở trên, thiết kế database schema:
- Tables cần thiết
- Relationships
- Indexes nên tạo
Format: SQLAlchemy models
"""
Bước 3: Implement từng phần
prompt_3 = """
Dựa trên schema đã thiết kế, implement API endpoints cho:
1. CRUD sách (Create, Read, Update, Delete)
2. Mượn/trả sách
3. Tìm kiếm
Dùng FastAPI, async, có validation và error handling.
"""
Cách này giúp code ra chuẩn hơn vì AI tập trung vào từng phần nhỏ thay vì ôm đồm cả dự án.
Lỗi thường gặp và cách khắc phục
Qua kinh nghiệm 2 năm sử dụng AI coding assistant, đây là những lỗi mình và đồng nghiệp hay mắc phải nhất:
1. Lỗi: Code không chạy được ngay
Nguyên nhân: Không cung cấp đủ ngữ cảnh về environment.
# ❌ BAD - AI sẽ guess lung tung
"Viết hàm kết nối database"
✅ FIX - Cung cấp đầy đủ thông tin
"""
Viết hàm kết nối PostgreSQL bằng Python.
- Dùng asyncpg driver
- Connection string từ biến môi trường DATABASE_URL
- Pool size: min=5, max=20
- Handle connection timeout (5s), graceful shutdown
- Dùng context manager
"""
2. Lỗi: AI tạo code không theo convention của project
Nguyên nhân: Không cho AI biết style guide của bạn.
# ❌ BAD - AI dùng style mặc định
"Viết function xử lý user authentication"
✅ FIX - Paste convention và yêu cầu tuân thủ
"""
Viết function login cho Django project, tuân theo:
- PEP 8 (max line length: 100)
- DRY principle
- Django best practices
- Sử dụng @login_required decorator
- Messages framework cho feedback
Đây là convention hiện tại của project:
def get_user(user_id: int) -> Optional[User]:
"""Get user by ID or return None."""
try:
return User.objects.get(id=user_id)
except User.DoesNotExist:
return None
"""
3. Lỗi: Code thiếu error handling, crash khi production
Nguyên nhân: Không yêu cầu explicit về error handling.
# ❌ BAD - AI bỏ qua edge cases
"Viết function đọc file config"
✅ FIX - Liệt kê rõ ràng edge cases cần handle
"""
Viết function đọc file config.json, xử lý các trường hợp:
1. File không tồn tại → raise FileNotFoundError với message rõ ràng
2. JSON không hợp lệ → raise JSONDecodeError với line number
3. Thiếu required keys → raise KeyError liệt kê keys thiếu
4. Value không đúng type → raise TypeError với expected type
5. File rỗng → raise ValueError("Config file is empty")
Trả về: dict với type annotation đầy đủ
"""
4. Lỗi: Prompt quá dài, AI bỏ qua một số yêu cầu
Nguyên nhân: Prompt dài quá 2000 tokens, phần sau bị cắt.
# ❌ BAD - Quá nhiều thông tin cùng lúc
"Viết REST API cho blog, có authentication, authorization,
rate limiting, caching, database schema, migrations,
unit tests, docker deployment, CI/CD pipeline, monitoring..."
✅ FIX - Chia thành nhiều prompts nhỏ
Prompt 1: Database schema
Prompt 2: Authentication + Authorization
Prompt 3: API endpoints (từng nhóm)
Prompt 4: Testing strategy
Prompt 5: Deployment (sau khi code stable)
Hoặc dùng structured format:
"""
PRIORITY 1 (BẮT BUỘC):
- CRUD users với JWT auth
- Validation với Pydantic
PRIORITY 2 (NẾU CÓ THỜI GIAN):
- Rate limiting
- Refresh token
PRIORITY 3 (TÙY CHỌN):
- Logging
- Metrics
"""
Mẹo cá nhân từ kinh nghiệm thực chiến
Sau 2 năm dùng AI coding assistant hàng ngày, đây là những "bí kíp" mình rút ra được:
- Dùng "Act as..." để set persona: "Act as a Python expert specializing in async programming" → Code tốt hơn nhiều
- Yêu cầu code tự kiểm tra: "Sau khi viết code, hãy đề xuất 3 test cases và tự chạy mental check"
- Iterative refinement: Nhận code → copy vào