Trong thế giới của lập trình viên, chúng ta đã quá quen với việc đối thoại cùng những cỗ máy. Ngôn ngữ của chúng ta là code, là logic, là những mệnh lệnh rành mạch. Nhưng giờ đây, một “giống loài” mới đã xuất hiện trong hệ sinh thái của chúng ta: những Mô hình Ngôn ngữ Lớn (LLM). Cuộc đối thoại cùng chúng không còn là những mệnh lệnh khô cứng, mà đã trở thành một nghệ thuật – nghệ thuật của việc “gợi mở”, hay còn gọi là Prompt Engineering.
Việc bạn nhận được một câu trả lời tầm thường hay một giải pháp thiên tài từ AI, đôi khi, không nằm ở năng lực của AI, mà ở chính cách bạn đặt câu hỏi. Một prompt tốt không chỉ là một yêu cầu; nó là một hạt mầm gieo vào mảnh đất trí tuệ nhân tạo, để từ đó nảy lên những ý tưởng mà chính bạn cũng không ngờ tới.
Dựa trên nghiên cứu sâu rộng “An Empirical Investigation of Prompting Techniques for Software Engineering Tasks”, chúng tôi đã chắt lọc và phân tích 14 kỹ thuật prompting đỉnh cao. Đây không chỉ là lý thuyết, mà là những chiến thuật thực chiến giúp bạn biến AI từ một công cụ thụ động trở thành một người đồng đội, một “pair programmer” thông thái.
Hãy cùng nhau khám phá nghệ thuật này.
Nhóm 1: Nền Tảng Vững Chắc – Dạy AI Bằng Ngữ Cảnh
Trước khi yêu cầu AI suy nghĩ, hãy cho nó “đọc sách”. Những kỹ thuật này tập trung vào việc cung cấp cho AI những ví dụ và dữ liệu liên quan nhất.
1. Exemplar Selection KNN (ES-KNN) – Người Thủ Thư Mẫn Cán
Hãy tưởng tượng bạn đang cố sửa một bug lạ. Thay vì mô tả bug cho một người đồng nghiệp mới, bạn đưa cho anh ta xem 3 đoạn code về những bug tương tự đã được sửa trong quá khứ. Đó chính là triết lý của ES-KNN. Kỹ thuật này sử dụng thuật toán để tìm kiếm và đưa những ví dụ (exemplars) tương đồng nhất vào prompt, giống như một người thủ thư mẫn cán tìm đúng cuốn sách bạn cần.
- Cách hoạt động: Hệ thống “đọc” toàn bộ kho dữ liệu của bạn (ví dụ, các commit message và đoạn code sửa lỗi), biến chúng thành các vector ngữ nghĩa. Khi bạn có một yêu cầu mới, ES-KNN sẽ tìm ra những “vector” gần nhất – những ví dụ liên quan nhất – và tự động đính kèm vào prompt.
- Ví dụ thực tế (Sửa lỗi):
- Prompt đơn giản:
Tôi gặp lỗi “TypeError: ‘NoneType’ object is not iterable” trong đoạn code Python sau. Hãy sửa nó:
def get_user_names(user_ids):
users = db.fetch_users(user_ids) # Hàm này có thể trả về None nếu không tìm thấy user
return [user.name for user in users]
- Prompt với ES-KNN (AI tự động thêm vào):
Hãy sửa lỗi trong đoạn code sau.
—
VÍ DỤ TƯƠNG TỰ 1:
Hỏi: Sửa lỗi “TypeError” trong hàm này:
`items = get_items()`
`for item in items: …`
Trả lời: Phải kiểm tra xem `items` có phải `None` không trước khi lặp.
`items = get_items()`
`if items:`
` for item in items: …`
—
YÊU CẦU CỦA TÔI:
Tôi gặp lỗi “TypeError: ‘NoneType’ object is not iterable” trong đoạn code Python sau. Hãy sửa nó:
def get_user_names(user_ids):
users = db.fetch_users(user_ids)
return [user.name for user in users]
- Kết quả: Prompt đơn giản có thể chỉ thêm vào if users is not None:, nhưng prompt ES-KNN sẽ học theo “best practice” từ ví dụ, có thể đề xuất một giải pháp an toàn hơn như trả về một danh sách rỗng, điều này nhất quán với kiểu dữ liệu trả về của hàm: if not users: return [].
2. Self-Generated In-Context Learning (SG-ICL) – AI Tự Học, Tự Dạy
Đây là kỹ thuật “mì ăn liền” của học trong ngữ cảnh. Thay vì bạn phải tự tay chọn ví dụ, bạn chỉ cần ra lệnh, và AI sẽ tự mình tạo ra các ví dụ để dạy chính nó trước khi giải quyết vấn đề của bạn. Nó giống như một sinh viên thông minh, tự mình tìm các bài tập tương tự để giải thử trước khi làm bài thi thật.
- Cách hoạt động: Bạn yêu cầu AI: “Hãy tạo ra 2 ví dụ về việc chuyển đổi JSON sang một lớp Python, sau đó áp dụng để chuyển đổi JSON này cho tôi.”
- Ví dụ thực tế (Code Generation):
- Prompt với SG-ICL:
Tôi muốn chuyển đổi một chuỗi JSON thành một đối tượng dataclass trong Python.
Hãy tạo ra 2 ví dụ (một đơn giản, một phức tạp hơn) về cách làm điều này.
Sau đó, dựa vào đó, hãy viết code để chuyển đổi chuỗi JSON sau:
json_data = ‘{“transaction_id”: “txn_123”, “amount”: 99.9, “currency”: “USD”, “items”: [{“id”: 1, “name”: “AI Book”}, {“id”: 2, “name”: “Prompting Guide”}]}’
- Kết quả: AI sẽ tự tạo ra 2 ví dụ về dataclass và json.loads, sau đó áp dụng một cách hoàn hảo cho json_data phức tạp của bạn, bao gồm cả việc xử lý danh sách đối tượng lồng nhau, điều mà một prompt đơn giản có thể bỏ qua.
Nhóm 2: Tư Duy Bậc Cao – Khai Mở Trí Tuệ AI
Đây là nhóm kỹ thuật tinh vi nhất, không chỉ yêu cầu AI “làm”, mà còn dạy nó “suy nghĩ” như thế nào.
3. Tree of Thoughts (TroT) – Bậc Thầy Cờ Vua Đa Lộ Trình
Nếu Chain of Thought (Chuỗi tư duy) là đi theo một con đường thẳng, thì Tree of Thoughts (Cây tư duy) là việc AI chơi cờ vua với chính vấn đề. Tại mỗi bước, nó không chỉ nghĩ đến nước đi tiếp theo, mà còn vẽ ra nhiều nhánh (nhiều kịch bản) khác nhau, đánh giá chúng, và chọn ra con đường hứa hẹn nhất để đi tiếp.
- Cách hoạt động: Prompt sẽ hướng dẫn AI: “Hãy xem xét 3 cách tiếp cận khác nhau để giải quyết vấn đề này. Với mỗi cách, hãy phân tích ưu và nhược điểm. Cuối cùng, chọn cách tốt nhất và triển khai nó.”
- Ví dụ thực tế (Thiết kế hệ thống):
- Prompt với TroT:
Thiết kế một hệ thống caching đơn giản cho một web API.
Hãy khám phá ít nhất 2 chiến lược sau:
- 1. Time–To–Live (TTL): Cache tự hết hạn sau một khoảng thời gian.
- 2. Least Recently Used (LRU): Khi cache đầy, xóa item ít được sử dụng nhất.
Với mỗi chiến lược, hãy suy nghĩ về:
– Độ phức tạp khi triển khai.
– Trường hợp sử dụng nào là phù hợp nhất.
– Vấn đề tiềm ẩn (ví dụ: dữ liệu cũ).
Sau khi phân tích, hãy đề xuất một chiến lược và viết code Python cơ bản cho một lớp `Cache` sử dụng chiến lược đó.
- Kết quả: Thay vì chỉ đưa ra một lớp Cache đơn giản, AI sẽ cung cấp một bản phân tích thiết kế nhỏ, giúp bạn hiểu tại sao một lựa chọn lại tốt hơn lựa chọn kia trong ngữ cảnh cụ thể, một năng lực vô giá của một kỹ sư senior.
4. Self-Ask – Triết Gia Tò Mò
Một người giải quyết vấn đề giỏi không chỉ tìm câu trả lời, họ đặt ra những câu hỏi đúng. Kỹ thuật Self-Ask biến AI thành một triết gia tò mò, tự mình đặt ra các câu hỏi phụ để làm rõ vấn đề trước khi trả lời.
- Cách hoạt động: Prompt sẽ chứa một chỉ dẫn đặc biệt, yêu cầu AI chia nhỏ câu hỏi lớn và tự trả lời chúng.
- Ví dụ thực tế (Debug một vấn đề phức tạp):
- Prompt với Self-Ask: Người dùng báo cáo rằng trang thanh toán của tôi thỉnh thoảng bị treo khi họ nhấn nút “Xác nhận”. Tôi nên bắt đầu gỡ lỗi từ đâu? Hãy sử dụng phương pháp Self-Ask. Đặt ra các câu hỏi phụ, sau đó trả lời chúng để đi đến kết luận.
- Kết quả: AI có thể tạo ra một chuỗi như sau: > Follow-up: Việc “bị treo” có nghĩa là gì? Giao diện không phản hồi, hay đang hiển thị spinner mãi mãi? > Intermediate answer: Có thể là spinner mãi mãi. Điều này gợi ý một vấn đề ở backend hoặc mạng. > > Follow-up: Lời gọi API nào được thực hiện khi nhấn nút “Xác nhận”? > Intermediate answer: API /api/process_payment. > > Follow-up: API /api/process_payment có phụ thuộc vào dịch vụ bên thứ ba nào không (ví dụ: cổng thanh toán)? > Intermediate answer: Có, nó gọi đến Stripe API. > > So, the final answer is: Bạn nên bắt đầu kiểm tra log của API /api/process_payment. Hãy xem xét các request gửi đến Stripe có bị timeout hay trả về lỗi không. Kiểm tra cả tình trạng của dịch vụ Stripe và log lỗi ở phía client để xem có thông báo lỗi mạng nào không.
5. Step-Back Prompting – Nhìn Rừng Thấy Cây
Khi đối mặt với một vấn đề kỹ thuật rối rắm, chúng ta thường có xu hướng lao ngay vào chi tiết. Kỹ thuật Step-Back dạy AI làm điều ngược lại: lùi lại một bước, nhìn vào bức tranh toàn cảnh, rút ra các nguyên tắc cốt lõi, rồi mới quay lại giải quyết.
- Cách hoạt động: Yêu cầu AI “Trước khi viết code, hãy lùi lại và mô tả nguyên tắc cơ bản đằng sau giải pháp này.”
- Ví dụ thực tế (Viết một thuật toán):
- Prompt với Step-Back:
Viết một hàm Python để kiểm tra xem một cây nhị phân có phải là một Cây tìm kiếm nhị phân (Binary Search Tree – BST) hay không.
Trước tiên, hãy lùi lại và trả lời câu hỏi: “Nguyên tắc cơ bản để một cây là BST là gì?” Sau đó, sử dụng nguyên tắc đó để viết hàm.
- Kết quả:
Step-back answer: Nguyên tắc cơ bản của một Cây tìm kiếm nhị phân là: với mọi nút, tất cả các giá trị trong cây con bên trái của nó phải nhỏ hơn giá trị của nút đó, và tất cả các giá trị trong cây con bên phải phải lớn hơn. Điều này phải đúng một cách đệ quy cho tất cả các nút.
Code: (AI sẽ viết một hàm đệ quy, truyền vào khoảng giá trị min-max hợp lệ, một giải pháp rất chuẩn mực mà nó suy ra từ chính nguyên tắc đã nêu).
6. Chain of Thought (CoT), Few-Shot Contrastive CoT & Thread of Thought (ToT)
(Lưu ý: Bài báo phân loại Thread of Thought (ToT) như một kỹ thuật riêng, mang tính tuần tự, trong khi Tree of Thought (TroT) có tính song song. CCoT là một biến thể nâng cao của CoT).
- CoT: Là nền tảng, yêu cầu AI “Hãy suy nghĩ từng bước một.”
- CCoT (Contrastive CoT): Cung cấp cả ví dụ suy luận đúng VÀ sai. Ví dụ: “Đây là cách giải đúng… và đây là một lỗi sai phổ biến, đừng làm thế…” Điều này giúp AI tránh các cạm bẫy logic.
- ToT (Thread of Thought): Yêu cầu AI tập trung vào một “dòng” suy luận, thường là bằng cách tóm tắt và phân tích từng bước. “OK, chúng ta đã xác định được vấn đề. Bước tiếp theo là gì? Hãy tóm tắt lại những gì chúng ta đã làm.” Nó giống như việc bạn tự ghi chú lại trong một buổi debug dài.
Nhóm 3: Tinh Chỉnh & Hoàn Thiện – Đi Tìm Sự Hoàn Hảo
Viết code đúng thôi chưa đủ. Code còn phải hiệu quả, đáng tin cậy.
7. Self-Refine – Vòng Lặp Phản Hồi Của Chính AI
Kỹ thuật này biến AI thành một người đánh giá code khó tính của chính nó. Sau khi đưa ra giải pháp ban đầu, AI sẽ được yêu cầu “tự phê bình” và cải thiện nó.
- Cách hoạt động: Một quy trình 2 bước. Bước 1: “Hãy viết code.” Bước 2: “Bây giờ, hãy xem lại đoạn code bạn vừa viết. Nó có thể được làm cho dễ đọc hơn, hiệu quả hơn, hoặc an toàn hơn không? Hãy viết lại phiên bản cải tiến.”
- Ví dụ thực tế (Refactor Code):
- Prompt Bước 1: Viết một hàm Python đọc nội dung của một file.
- AI trả lời (có thể là phiên bản đơn giản): python def read_file(filename): file = open(filename, ‘r’) content = file.read() file.close() return content
- Prompt Bước 2 (Self-Refine): Xem lại hàm trên. Sử dụng context manager (khối “with”) có phải là cách tốt hơn để đảm bảo file luôn được đóng, ngay cả khi có lỗi không? Hãy cải tiến nó.
- AI trả lời (phiên bản tốt hơn): python def read_file(filename): “””Reads the content of a file safely using a context manager.””” try: with open(filename, ‘r’, encoding=’utf-8′) as file: return file.read() except FileNotFoundError: return “Error: File not found.” except Exception as e: return f”An error occurred: {e}”
8. Universal Self-Consistency (USC) – Sức Mạnh Của Trí Tuệ Tập Thể
Thay vì tin vào câu trả lời đầu tiên, USC yêu cầu AI tạo ra nhiều câu trả lời khác nhau (bằng cách đi theo các “chuỗi tư duy” khác nhau), sau đó tổ chức một cuộc “bỏ phiếu” để chọn ra câu trả lời cuối cùng, nhất quán nhất.
- Cách hoạt động: “Hãy giải quyết vấn đề này 3 lần, mỗi lần theo một cách khác nhau. Sau đó, so sánh 3 kết quả và cho tôi câu trả lời mà bạn tin tưởng nhất.”
- Ví dụ thực tế (Trả lời câu hỏi về Code phức tạp):
- Prompt với USC:
Trong thư viện ‘requests’ của Python, sự khác biệt chính giữa `params` và `data` trong một yêu cầu POST là gì?
Hãy trả lời câu hỏi này 2 lần theo 2 cách tiếp cận khác nhau. Cuối cùng, tổng hợp lại một câu trả lời duy nhất, rõ ràng nhất.
- Kết quả: AI có thể tạo một câu trả lời tập trung vào URL encoding (params -> query string) và một câu trả lời khác tập trung vào body của request (data -> request body). Câu trả lời cuối cùng sẽ tổng hợp cả hai, mang lại sự hiểu biết đầy đủ và chính xác hơn nhiều.
Nhóm 4: Cá Nhân Hóa – Thổi Hồn Vào Con Chữ Của AI
AI không chỉ là một cỗ máy logic, nó còn có thể là một nhà văn, một người giao tiếp tài ba.
9. Role Prompting (RP) – “Nhập Vai” Chuyên Gia
Đây là một trong những kỹ thuật đơn giản mà hiệu quả nhất. Bạn yêu cầu AI đóng một vai trò cụ thể. Tư duy và ngôn ngữ của nó sẽ ngay lập tức thay đổi để phù hợp với vai trò đó.
- Cách hoạt động: Bắt đầu prompt của bạn bằng: “Hãy hành động như một…”
- Ví dụ thực tế (Code Review):
- Prompt với RP:
Hãy hành động như một Kỹ sư An ninh Ứng dụng (Application Security Engineer) cao cấp. Đánh giá đoạn code xử lý đăng nhập sau đây và chỉ ra các lỗ hổng bảo mật tiềm ẩn.
def login(username, password):
# WARNING: Example of bad code
query = “SELECT * FROM users WHERE username = ‘” + username + “‘ AND password = ‘” + password + “‘”
db.execute(query)
# …
- Kết quả: AI sẽ ngay lập tức chỉ ra lỗ hổng SQL Injection nghiêm trọng, giải thích tại sao nó nguy hiểm và đề xuất sử dụng các câu lệnh tham số hóa (parameterized queries) để vá lỗi. Một prompt thông thường có thể không tập trung vào khía cạnh bảo mật.
10. Emotional Prompting (EP) – Chạm Đến Trái Tim Người Dùng
Một chút cảm xúc có thể tạo ra sự khác biệt lớn. Thêm những câu thể hiện cảm xúc hoặc sự cấp thiết vào prompt có thể thúc đẩy AI nỗ lực hơn và tạo ra các phản hồi đồng cảm hơn.
- Cách hoạt động: Thêm những câu như “Điều này rất quan trọng với sự nghiệp của tôi” hoặc “Hãy viết một thông báo lỗi thật sự thân thiện và trấn an người dùng.”
- Ví dụ thực tế (Viết thông báo lỗi):
- Prompt đơn giản: Viết một thông báo khi người dùng không thể kết nối tới server.
- Prompt với EP: Hãy viết một thông báo lỗi thật sự hữu ích và đồng cảm khi người dùng không thể kết nối tới server của chúng ta. Họ có thể đang lo lắng. Hãy trấn an họ và đưa ra các bước khắc phục khả thi.
- Kết quả: > (Đơn giản): “Lỗi: Không thể kết nối tới máy chủ.” > (Cảm xúc): “Ôi, có vẻ như chúng ta đang gặp một chút trục trặc kết nối. Đừng lo, đội ngũ kỹ thuật của chúng tôi đang kiểm tra. Trong lúc đó, bạn có thể thử kiểm tra lại kết nối Internet của mình hoặc thử lại sau vài phút nhé!”
11. Style Prompting (SP) – Bậc Thầy Ngôn Ngữ
Yêu cầu AI tuân theo một phong cách viết cụ thể. Điều này cực kỳ hữu ích để duy trì sự nhất quán trong tài liệu, commit message, hay bất cứ sản phẩm ngôn ngữ nào.
- Cách hoạt động: “Hãy viết tài liệu cho hàm này theo phong cách Google Python Style Guide.”
- Ví dụ thực tế (Viết Commit Message):
- Prompt với SP: Tôi vừa refactor hàm `calculate_price` để xử lý thuế. Hãy viết một commit message cho thay đổi này theo quy ước “Conventional Commits”.
- Kết quả:
feat: add tax calculation to price logic
The `calculate_price` function now correctly incorporates regional tax rates based on user profile. This resolves issue #123.
BREAKING CHANGE: The function signature has changed from `calculate_price(base_price)` to `calculate_price(base_price, user_id)`.
Nhóm 5: Giao Tiếp Hiệu Quả – Xây Dựng Sự Thấu Hiểu
Cuối cùng, để có một cuộc đối thoại hiệu quả, cả hai bên cần phải hiểu nhau.
12. Rephrase and Respond (RR) – “Để Tôi Nhắc Lại Xem Có Đúng Ý Bạn Không”
Đây là kỹ thuật của một người lắng nghe giỏi. Bạn yêu cầu AI diễn đạt lại vấn đề bằng từ ngữ của chính nó trước khi trả lời. Điều này đảm bảo AI đã thực sự hiểu yêu cầu của bạn, giảm thiểu sai lệch.
- Cách hoạt động: “Trước khi trả lời, hãy diễn đạt lại câu hỏi của tôi để chắc chắn rằng bạn đã hiểu đúng.”
- Ví dụ thực tế (Yêu cầu phức tạp):
- Prompt với RR: Tôi cần một kịch bản shell tự động backup cơ sở dữ liệu PostgreSQL vào S3 mỗi đêm, nén lại, chỉ giữ lại 7 bản backup gần nhất, và gửi email thông báo khi thành công hoặc thất bại. Trước khi viết kịch bản, hãy tóm tắt lại các yêu cầu chính bạn đã hiểu.
- Kết quả: AI sẽ tóm tắt: “Được thôi. Vậy tôi hiểu là bạn cần một kịch bản làm 4 việc: 1. Dùng pg_dump để backup database. 2. Nén file backup. 3. Upload lên S3 và xóa các bản cũ hơn 7 ngày. 4. Gửi email thông báo trạng thái. Có đúng không ạ?” Việc xác nhận này đảm bảo kịch bản cuối cùng sẽ đáp ứng đầy đủ các yêu cầu.
13. Analogical Prompting (AP) – Kể Chuyện Qua Phép Loại Suy
Những khái niệm trừu tượng nhất cũng trở nên dễ hiểu qua những câu chuyện so sánh. Kỹ thuật này yêu cầu AI giải thích một khái niệm kỹ thuật phức tạp bằng cách sử dụng một phép loại suy (analogy) từ đời thực.
- Cách hoạt động: “Hãy giải thích khái niệm async/await trong JavaScript bằng cách sử dụng một phép loại suy về việc đặt đồ ăn tại một nhà hàng.”
- Ví dụ thực tế (Giải thích khái niệm):
- Prompt với AP: Hãy giải thích sự khác biệt giữagit mergevàgit rebasebằng một phép loại suy.
- Kết quả: > Chắc chắn rồi! > > Hãy tưởng tượng lịch sử commit của bạn là một cuốn tiểu thuyết. > > git merge giống như việc bạn viết một chương mới: “Ở chương 10, nhân vật chính từ nhánh truyện phụ đã gặp nhân vật chính ở nhánh truyện chính.” Nó tạo ra một “commit hợp nhất” mới, ghi lại chính xác thời điểm hai nhánh gặp nhau. Lịch sử vẫn còn nguyên vẹn, bạn có thể thấy rõ hai con đường riêng biệt đã nhập lại làm một. Nó trung thực nhưng đôi khi làm rối mạch truyện. > > git rebase lại giống như một người biên tập du hành thời gian. Bạn quay lại quá khứ, lấy những chương bạn viết ở nhánh phụ, và viết lại chúng như thể chúng luôn xảy ra nối tiếp sau nhánh chính. Kết quả là một mạch truyện thẳng tắp, sạch sẽ, không có ngã rẽ. Nó đẹp hơn, dễ theo dõi hơn, nhưng nó đã “viết lại lịch sử”.
14. Contrastive Chain-of-Thought (CCoT)
(Đã được giới thiệu ở nhóm 2, nhưng cũng có thể được xem là một kỹ thuật giao tiếp hiệu quả bằng cách làm rõ ‘cái đúng’ và ‘cái sai’).
Nó không chỉ dạy AI cách làm đúng mà còn chỉ ra những cạm bẫy cần tránh. Bằng cách so sánh, sự thấu hiểu trở nên sâu sắc hơn.
Lời Kết: Cuộc Đối Thoại Chỉ Mới Bắt Đầu
14 kỹ thuật trên không phải là những công thức ma thuật, mà là những cây cọ vẽ để bạn phác họa nên những ý tưởng của mình trên bức toan của trí tuệ nhân tạo. Việc làm chủ chúng sẽ biến bạn từ một người “dùng” AI thành một “nghệ sĩ” đối thoại cùng AI.
AI không thay thế tư duy của lập trình viên. Nó khuếch đại tư duy đó. Và chìa khóa của sự khuếch đại nằm ở chất lượng của cuộc đối thoại.
Hãy bắt đầu thử nghiệm. Hãy kết hợp chúng. Hãy tìm ra “khẩu vị” prompt của riêng mình. Bởi vì khi chúng ta đặt câu hỏi tốt hơn, chúng ta sẽ cùng nhau xây dựng một tương lai tốt hơn.
Bạn tâm đắc với kỹ thuật nào nhất? Hãy chia sẻ bên dưới nhé!