Bỏ qua tới nội dung
Bài 2/12 · Prompt engineering từ cơ bản đến trung cấp (DAIR.AI)

Cơ bản về prompt

Cách viết prompt đơn giản, vai trò system/user/assistant, định dạng prompt chuẩn, zero-shot và few-shot prompting.

Cơ bản@shine19045 phút đọc

Bài này giới thiệu cách gửi prompt cho LLM, cách cải thiện prompt bằng chỉ dẫn rõ ràng và các định dạng prompt chuẩn như zero-shot và few-shot.

Gửi prompt cho LLM

Bạn có thể làm được nhiều việc với các prompt đơn giản, nhưng chất lượng kết quả phụ thuộc vào lượng thông tin bạn cung cấp và prompt được viết tốt đến đâu. Một prompt có thể chứa thông tin như chỉ dẫn hoặc câu hỏi bạn đưa cho model, và kèm các chi tiết khác như ngữ cảnh, đầu vào hoặc ví dụ. Bạn có thể dùng các thành phần này để chỉ dẫn model hiệu quả hơn, nhằm cải thiện chất lượng kết quả.

Chúng ta hãy bắt đầu với một ví dụ cơ bản về prompt đơn giản:

Prompt

md
The sky is

Đầu ra:

md
blue.

Nếu dùng OpenAI Playground hoặc bất kỳ LLM playground nào khác, bạn có thể gửi prompt cho model như trong ảnh chụp màn hình sau:

Ví dụ prompt "The sky is" trong playground

Đây là video hướng dẫn bắt đầu với OpenAI Playground.

Cần lưu ý là khi dùng các chat model của OpenAI như gpt-3.5-turbo hay gpt-4, bạn có thể cấu trúc prompt bằng ba vai trò khác nhau: system, user và assistant. System message không bắt buộc nhưng giúp đặt hành vi tổng thể của trợ lý. Ví dụ ở trên chỉ có một tin nhắn user, bạn có thể dùng nó để prompt trực tiếp cho model. Để đơn giản, mọi ví dụ (trừ khi nói rõ) sẽ chỉ dùng tin nhắn user để prompt model gpt-3.5-turbo. Tin nhắn assistant trong ví dụ trên tương ứng với câu trả lời của model. Bạn cũng có thể định nghĩa tin nhắn assistant để đưa ví dụ về hành vi mong muốn. Bạn có thể tìm hiểu thêm về cách làm việc với chat model tại đây.

Từ ví dụ prompt trên, bạn có thể thấy model ngôn ngữ phản hồi bằng một chuỗi token hợp lý với ngữ cảnh "The sky is". Đầu ra có thể bất ngờ hoặc khác xa tác vụ bạn muốn hoàn thành. Thực ra, ví dụ cơ bản này cho thấy sự cần thiết của việc cung cấp thêm ngữ cảnh hoặc chỉ dẫn về điều cụ thể bạn muốn đạt được. Đó chính là bản chất của prompt engineering.

Chúng ta hãy thử cải thiện một chút:

Prompt:

code
Complete the sentence: 

The sky is

Đầu ra:

code
blue during the day and dark at night.

Tốt hơn chưa? Với prompt trên, bạn đang chỉ dẫn model hoàn thành câu, nên kết quả trông tốt hơn nhiều vì nó làm đúng điều bạn bảo ("complete the sentence", hoàn thành câu). Cách thiết kế prompt hiệu quả để chỉ dẫn model thực hiện tác vụ mong muốn này chính là thứ được gọi là prompt engineering trong hướng dẫn này.

Ví dụ trên là minh hoạ cơ bản về những gì LLM ngày nay làm được. LLM hiện nay có thể làm đủ loại tác vụ nâng cao, từ tóm tắt văn bản, suy luận toán học đến sinh code.

Định dạng prompt

Bạn đã thử một prompt rất đơn giản ở trên. Một prompt chuẩn có định dạng như sau:

code
<Question>?

hoặc

code
<Instruction>

Bạn có thể định dạng nó theo kiểu hỏi đáp (QA), vốn là chuẩn trong nhiều bộ dữ liệu QA, như sau:

code
Q: <Question>?
A: 

Prompt như trên còn được gọi là zero-shot prompting, tức bạn prompt trực tiếp để model trả lời mà không đưa ví dụ hay minh hoạ nào về tác vụ bạn muốn nó làm. Một số LLM có khả năng làm zero-shot prompting, nhưng điều đó phụ thuộc vào độ phức tạp và kiến thức của tác vụ, cũng như các tác vụ model được huấn luyện để làm tốt.

Một ví dụ prompt cụ thể:

Prompt

code
Q: What is prompt engineering?

Với một số model gần đây, bạn có thể bỏ phần "Q:" vì model hiểu ngầm đây là tác vụ hỏi đáp dựa trên cách chuỗi được sắp xếp. Nói cách khác, prompt có thể rút gọn như sau:

Prompt

code
What is prompt engineering?

Với định dạng chuẩn trên, một kỹ thuật prompt phổ biến và hiệu quả là few-shot prompting, trong đó bạn đưa các ví dụ mẫu (tức minh hoạ). Bạn có thể định dạng few-shot prompt như sau:

code
<Question>?
<Answer>

<Question>?
<Answer>

<Question>?
<Answer>

<Question>?

Phiên bản định dạng QA sẽ trông như sau:

code
Q: <Question>?
A: <Answer>

Q: <Question>?
A: <Answer>

Q: <Question>?
A: <Answer>

Q: <Question>?
A:

Hãy nhớ rằng không bắt buộc dùng định dạng QA. Định dạng prompt phụ thuộc vào tác vụ. Ví dụ, bạn có thể làm một tác vụ phân loại đơn giản và đưa các ví dụ minh hoạ tác vụ như sau:

Prompt:

code
This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive
What a horrible show! //

Đầu ra:

code
Negative

Few-shot prompt cho phép học trong ngữ cảnh (in-context learning), tức khả năng của model ngôn ngữ học một tác vụ khi được đưa vài minh hoạ. Chúng ta sẽ bàn kỹ hơn về zero-shot prompting và few-shot prompting ở các bài sau.

Nguồn