Kỹ thuật Prompt Engineering: Tối ưu hóa tương tác với AI

Trong lĩnh vực phát triển ứng dụng AI, cách chúng ta giao tiếp với mô hình ngôn ngữ lớn (LLM) đóng vai trò quyết định đến chất lượng đầu ra. Prompt Engineering (Kỹ thuật thiết kế câu lệnh) là nghệ thuật và khoa học về việc tạo ra các câu lệnh (prompt) hiệu quả để hướng dẫn AI thực hiện các tác vụ mong muốn với độ chính xác và sáng tạo cao nhất.

Một prompt đơn giản như "Viết một bài báo" sẽ dẫn đến kết quả chung chung, thiếu định hướng. Ngược lại, một prompt chi tiết như "Bạn là một chuyên gia blog công nghệ. Hãy viết một bài blog kỹ thuật dài 1500 từ với tiêu đề 'Tại sao lập trình viên Front-end nên học AI'. Yêu cầu: ngôn ngữ dễ hiểu cho lập trình viên front-end, mỗi luận điểm có ví dụ mã cụ thể, mở đầu bằng câu chuyện hấp dẫn và kết thúc bằng lời khuyên học tập cụ thể" sẽ giúp AI tạo ra nội dung chất lượng, có cấu trúc và đúng yêu cầu.

Các Nguyên tắc Thiết kế Prompt

  1. Xác định vai trò (Role Setting)

    Giao cho AI một vai trò cụ thể. Ví dụ: thay vì "Viết mã giúp tôi", hãy dùng "Bạn là một lập trình viên TypeScript dày dạn kinh nghiệm, tuân thủ nghiêm ngặt nguyên tắc Clean Code. Hãy viết cho tôi một module xác thực người dùng". Điều này giúp AI định hình phong cách và kiến thức chuyên môn khi trả lời.

    Trong dự án thực tế:

    • Tạo bài viết: "Bạn là một chuyên gia viết lách giàu kinh nghiệm, giỏi sáng tác nhiều thể loại..."
    • Tạo thơ cổ: "Bạn là một nhà thơ tinh thông văn học cổ điển, am hiểu luật thơ Đường, Tống và ý cảnh..."
  2. Cụ thể và Rõ ràng (Specificity)

    Tránh các yêu cầu mơ hồ. Cung cấp thông tin chi tiết về chủ đề, độ dài, phong cách, đối tượng độc giả và định dạng mong muốn.

    Ví dụ:

    • Chủ đề: Viết gì?
    • Độ dài: Bao nhiêu từ?
    • Phong cách: Viết như thế nào?
    • Đối tượng: Viết cho ai?
    • Định dạng: Xuất ra theo cấu trúc nào?
  3. Cung cấp Ví dụ (Few-shot Learning)

    Đưa ra một vài ví dụ minh họa để AI học theo định dạng và yêu cầu. Điều này đặc biệt hữu ích khi bạn cần AI tuân thủ một cấu trúc đầu ra nhất định.

    Ví dụ định dạng mô tả sản phẩm:

    Ví dụ 1:
    Sản phẩm: Tai nghe Bluetooth không dây
    Mô tả: Nhẹ như lông hồng, âm thanh như tiếng trời. Thời lượng pin 40 giờ siêu dài, đồng hành cùng bạn mỗi sáng đi làm.
    Điểm nổi bật: Chống ồn chủ động | Bluetooth 5.3 | Chống nước IPX5
    
    Ví dụ 2:
    Sản phẩm: Đèn bàn thông minh
    Mô tả: Một chiếc đèn thấu hiểu bạn. Tự động điều chỉnh độ sáng và nhiệt độ màu, từ đọc sách ban mai đến làm việc khuya, bảo vệ mắt bạn.
    Điểm nổi bật: Tự động điều chỉnh độ sáng | Chế độ bảo vệ mắt | Điều khiển bằng giọng nói
    
    Giờ hãy viết cho:
    Sản phẩm: {Tên sản phẩm người dùng nhập}
                
  4. Chuỗi Tư duy (Chain-of-Thought - CoT)

    Khuyến khích AI suy nghĩ từng bước trước khi đưa ra câu trả lời, đặc biệt hữu ích cho các bài toán phức tạp hoặc yêu cầu lập luận logic. Điều này giúp tăng đáng kể độ chính xác.

    Ví dụ tính toán:

    Thay vì: "123 * 456 bằng bao nhiêu?" (AI có thể đoán mò)
    Hãy dùng: "Hãy tính toán từng bước phép tính 123 * 456:
    1. Viết phép tính theo cột dọc.
    2. Tính toán từng hàng.
    3. Tổng hợp kết quả cuối cùng."
                

    Áp dụng cho việc tạo bài viết:

    Hãy thực hiện các bước sau để tạo bài viết:
    1. Lập dàn ý chi tiết (3-5 luận điểm chính).
    2. Triển khai mỗi luận điểm với 100-200 từ.
    3. Viết phần mở đầu hấp dẫn.
    4. Viết phần kết luận mạnh mẽ.
    5. Tổng hợp thành bài viết hoàn chỉnh.
                
  5. Ràng buộc (Constraints)

    Nêu rõ những điều AI nên làm và không nên làm. Điều này giúp kiểm soát nội dung và phong cách đầu ra chặt chẽ hơn.

    Ví dụ yêu cầu:

    • Bắt buộc: Bài viết phải có ít nhất 3 ví dụ thực tế, mỗi đoạn không quá 200 từ, sử dụng tiêu đề phụ.
    • Cấm: Không dùng các từ nối sáo rỗng như "đầu tiên, tiếp theo, cuối cùng", không bịa số liệu, không mở đầu bằng câu "Trong thời đại ngày nay...".
  6. Định dạng Đầu ra (Output Format)

    Chỉ định rõ ràng định dạng đầu ra (ví dụ: Markdown, JSON) để dễ dàng cho việc xử lý và hiển thị dữ liệu bởi ứng dụng.

    Ví dụ yêu cầu Markdown:

    Vui lòng xuất bài viết bằng định dạng Markdown, bao gồm:
    # Tiêu đề chính
    > Đoạn giới thiệu (tóm tắt ngắn gọn chủ đề)
    ## Luận điểm 1
    Nội dung chi tiết...
    ## Luận điểm 2
    Nội dung chi tiết...
    ## Tóm tắt
    Tổng kết toàn bộ bài viết...
                

Thiết kế Prompt cho Ứng dụng Cụ thể

Prompt tạo bài viết

Kết hợp các nguyên tắc trên để tạo một System Prompt cho chức năng tạo bài viết:


// src/lib/prompts/article.ts

export function getArticleSystemPrompt(options: {
  style?: string;
  wordCount?: number;
  detailLevel?: string;
}) {
  const { style = "Chuyên nghiệp", wordCount = 1500, detailLevel = "Trung bình" } = options;

  return `Bạn là một chuyên gia viết lách dày dạn kinh nghiệm, giỏi sáng tác nhiều thể loại.

## Yêu cầu viết bài
- Số lượng từ: Khoảng ${wordCount} từ
- Phong cách viết: ${style}
- Mức độ chi tiết: ${detailLevel}
- Sử dụng định dạng Markdown để xuất bản
- Bắt buộc phải có tiêu đề và cấu trúc đoạn văn rõ ràng

## Cấu trúc bài viết
1. Tiêu đề chính (# Tiêu đề)
2. Mở đầu (Tóm tắt ngắn gọn chủ đề bài viết, thu hút sự chú ý của độc giả)
3. Nội dung chính (Chia thành 3-5 luận điểm, mỗi luận điểm có tiêu đề phụ ##)
4. Kết luận (Tổng hợp các điểm chính, đưa ra suy ngẫm hoặc đề xuất)

## Ràng buộc khi viết
- Không sử dụng các từ nối cũ kỹ như "đầu tiên, thứ hai, cuối cùng"
- Không mở đầu bằng những câu sáo rỗng như "Trong thời đại phát triển nhanh chóng này"
- Mỗi luận điểm phải có ví dụ cụ thể hoặc số liệu minh chứng
- Ngôn ngữ phải tự nhiên, trôi chảy, giống như người thật viết, tránh "mùi AI"
- Sử dụng các biện pháp tu từ (ẩn dụ, so sánh, liệt kê...) một cách hợp lý để tăng tính văn học

## Hướng dẫn về phong cách
${getStyleGuide(style)}`;
}

function getStyleGuide(style: string): string {
  const guides: Record = {
    Chuyên nghiệp: "Sử dụng từ ngữ chính xác, chặt chẽ, logic rõ ràng, trích dẫn nguồn uy tín. Phù hợp cho tài liệu kỹ thuật, phân tích ngành.",
    Thoải mái: "Diễn đạt gần gũi, có chút hài hước, như bạn bè trò chuyện. Phù hợp cho bài viết về đời sống, giải trí.",
    Văn chương: "Ngôn ngữ trau chuốt, giàu hình ảnh, sử dụng nhiều biện pháp tu từ. Phù hợp cho tản văn, tùy bút, cảm nhận văn học.",
    Tin tức: "Khách quan, trung lập, cấu trúc kim tự tháp ngược (thông tin quan trọng đặt lên đầu). Phù hợp cho bản tin, phân tích sự kiện.",
    Truyện kể: "Tập trung vào kể chuyện, có nhân vật, tình tiết, xung đột. Phù hợp cho tiểu sử nhân vật, phân tích tình huống.",
  };
  return guides[style] || guides["Chuyên nghiệp"];
}

            

Prompt tạo thơ cổ

Tương tự, thiết kế prompt cho chức năng tạo thơ cổ:


// src/lib/prompts/poem.ts

export function getPoemSystemPrompt(options: {
  type?: string;
  dynasty?: string;
}) {
  const { type = "Thất ngôn tuyệt cú", dynasty = "Đường" } = options;

  return `Bạn là một nhà thơ tinh thông văn học cổ điển, am hiểu sâu sắc luật thơ và ý cảnh của thơ ca ${dynasty} đại.

## Yêu cầu sáng tác
- Thể loại thơ: ${type}
- Phong cách tham khảo: Phong cách thi ca ${dynasty} đại
- Sáng tác dựa trên các danh từ hoặc chủ đề người dùng cung cấp

## Yêu cầu về luật lệ
${getTypeRules(type)}

## Nguyên tắc sáng tác
1. Ưu tiên ý cảnh: Bài thơ cần có hình ảnh, giúp người đọc "thấy" được khung cảnh trong thơ.
2. Sử dụng điển cố tự nhiên: Có thể dùng điển cố nhưng phải tự nhiên, không gượng ép.
3. Hòa quyện tình và cảnh: Cảnh vật chứa đựng tình cảm, tình cảm gửi gắm vào cảnh vật.
4. Ngôn ngữ súc tích: Mỗi chữ đều có dụng ý, không thừa thãi.

## Định dạng đầu ra
Vui lòng xuất theo định dạng sau:

### Tên bài thơ

(Nội dung bài thơ)

---
**Chú thích**
- Từ 1: Giải thích
- Từ 2: Giải thích

**Phân tích**
(Phân tích về ý cảnh, thủ pháp, tình cảm của bài thơ, khoảng 100 từ)

## Ràng buộc
- Không viết thơ bạch thoại hiện đại
- Không thêm chú thích trong phần nội dung bài thơ
- Không sử dụng các từ ngữ quá xa lạ, khó hiểu
`;
}

function getTypeRules(type: string): string {
  const rules: Record = {
    Ngũ ngôn tuyệt cú: `Ngũ ngôn tuyệt cú, 4 câu, mỗi câu 5 chữ.
Tham khảo cấu trúc bằng trắc:
Trắc trắc bằng bằng trắc, bằng bằng trắc trắc bằng.
Bằng bằng bằng trắc trắc, trắc trắc trắc bằng bằng.`,

    Thất ngôn tuyệt cú: `Thất ngôn tuyệt cú, 4 câu, mỗi câu 7 chữ.
Tham khảo cấu trúc bằng trắc:
Bằng bằng trắc trắc bằng bằng trắc, trắc trắc bằng bằng trắc trắc bằng.
Trắc trắc bằng bằng bằng trắc trắc, bằng bằng trắc trắc trắc bằng bằng.`,

    Ngũ ngôn luật: `Ngũ ngôn luật, 8 câu, mỗi câu 5 chữ. Hai câu đối ở giữa yêu cầu đối xứng.
Câu đầu → Câu bổ đầu (đối xứng) → Câu cổ (đối xứng) → Câu cuối`,

    Thất ngôn luật: `Thất ngôn luật, 8 câu, mỗi câu 7 chữ. Hai câu đối ở giữa yêu cầu đối xứng.
Câu đầu → Câu bổ đầu (đối xứng) → Câu cổ (đối xứng) → Câu cuối`,

    Tống Từ: `Tống Từ, viết theo điệu từ.
Cấu trúc các điệu từ phổ biến:
- Hoàn Khê Sa: 2 khổ, mỗi khổ 3 câu
- Điệp Luyến Hoa: 2 khổ
- Thủy Điều Ca Đầu: 2 khổ
Vui lòng ghi rõ tên điệu từ sử dụng.`,
  };
  return rules[type] || rules["Thất ngôn tuyệt cú"];
}

            

Kiểm soát Đầu ra Cấu trúc

Trong một số trường hợp, bạn cần AI trả về dữ liệu có cấu trúc như JSON thay vì văn bản thuần túy. Điều này rất quan trọng cho việc tích hợp và xử lý dữ liệu.

Ví dụ phân tích phong cách bài viết và xuất ra JSON:


export const styleAnalysisPrompt = `Phân tích phong cách viết của bài viết sau và xuất kết quả dưới dạng JSON:

{
  "tone": "Chính thức | Thoải mái | Văn chương | Hài hước | Nghiêm túc",
  "vocabulary": "Đơn giản | Trung bình | Phức tạp | Học thuật",
  "sentenceLength": "Chủ yếu câu ngắn | Kết hợp dài ngắn | Chủ yếu câu dài",
  "features": ["Đặc điểm 1", "Đặc điểm 2", "Đặc điểm 3"],
  "summary": "Tóm tắt đặc điểm phong cách trong một câu"
}

Chỉ xuất ra JSON, không kèm theo nội dung nào khác.`;

    

Khi gọi API, bạn có thể sử dụng tham số `response_format` để ép buộc đầu ra là JSON:


const response = await llm.chat.completions.create({
  model: "deepseek-chat",
  messages: [
    { role: "system", content: styleAnalysisPrompt },
    { role: "user", content: `Nội dung bài viết:\n${articleContent}` },
  ],
  response_format: { type: "json_object" }, // Ép buộc xuất ra JSON
});

    

Kiểm thử và Tinh chỉnh Prompt

Sau khi thiết kế prompt, việc kiểm thử là bắt buộc để đảm bảo chất lượng đầu ra.


// Kiểm tra chất lượng đầu ra với các đầu vào khác nhau
const testCases = [
  { input: "Mùa xuân", expected: "Bài thơ có hình ảnh mùa xuân" },
  { input: "Cô đơn", expected: "Bài thơ có chiều sâu cảm xúc" },
  { input: "Lập trình", expected: "Thơ cổ về chủ đề hiện đại" },
];

for (const test of testCases) {
  const result = await callLLM(test.input); // Hàm gọi LLM tùy chỉnh
  console.log(`Đầu vào: ${test.input}`);
  console.log(`Đầu ra: ${result}`);
  console.log("---");
}

    

Nguyên tắc tinh chỉnh:

  1. Bắt đầu với một phiên bản prompt cơ bản.
  2. Kiểm thử với nhiều loại đầu vào khác nhau.
  3. Quan sát những điểm chưa hài lòng trong kết quả đầu ra.
  4. Thêm các ràng buộc hoặc ví dụ vào prompt để khắc phục.
  5. Lặp lại bước 2-4 cho đến khi đạt yêu cầu.

Mẫu hóa Prompt (Templating)

Biến prompt thành các hàm có thể tái sử dụng bằng cách sử dụng tham số. Điều này giúp điều chỉnh hành vi của prompt linh hoạt hơn.


// Thiết kế tốt: Tham số hóa prompt
function getPrompt(options: { style: string; wordCount: number }) {
  return `Bạn là một tác giả theo phong cách ${options.style}, hãy viết ${options.wordCount} từ...`;
}

// Sử dụng
getPrompt({ style: "Văn chương", wordCount: 2000 });

// Thiết kế chưa tốt: Mã hóa cứng prompt
const prompt = "Bạn là một tác giả theo phong cách văn chương, hãy viết 2000 từ...";
// Phải sửa mã nguồn mỗi khi có thay đổi yêu cầu

    

Tóm tắt

Nguyên tắc Mô tả Ứng dụng thực tế
Xác định vai trò Cho AI biết nó là ai Chuyên gia viết lách / Nhà thơ cổ điển
Cụ thể và Rõ ràng Xác định rõ chủ đề, độ dài, phong cách Cấu hình bằng tham số
Cung cấp Ví dụ Đưa ví dụ để AI học theo Ví dụ về luật thơ
Chuỗi Tư duy Yêu cầu AI suy nghĩ từng bước Lập dàn ý trước khi viết bài
Ràng buộc Giới hạn những gì AI không được làm Cấm sáo rỗng, cấm thơ hiện đại
Định dạng Đầu ra Chỉ định cấu trúc đầu ra Markdown / JSON

Thực hành

  1. Sử dụng các System Prompt khác nhau để gọi AI và so sánh chất lượng đầu ra.
  2. Thử nghiệm với Few-shot (cung cấp ví dụ) và Zero-shot (không cung cấp ví dụ) để thấy sự khác biệt.
  3. Tập sử dụng đầu ra có cấu trúc (JSON) và kiểm tra xem định dạng có chính xác không.
  4. Viết một vài trường hợp kiểm thử cho prompt của ứng dụng, đảm bảo đầu vào khác nhau vẫn tạo ra kết quả hợp lý.

Chương tiếp theo

Với những prompt hiệu quả, chúng ta sẽ bắt đầu triển khai chức năng cốt lõi đầu tiên của ứng dụng: trình tạo bài viết. Bạn sẽ xây dựng một biểu mẫu hoàn chỉnh, nơi người dùng nhập tiêu đề, chọn tham số và AI sẽ tạo ra bài viết Markdown có định dạng theo thời gian thực.

Thẻ: prompt engineering AI LLM chatbot language models

Đăng vào ngày 13 tháng 10 lúc 11:17