Giới thiệu về prompt engineering

Giới thiệu
Prompt Engineering là một lĩnh vực khá mới, nhằm phát triển và tối ưu hóa các prompt để áp dụng và xây dựng hiệu quả với cả mô hình ngôn ngữ lớn (LLM) cho nhiều ững dụng và trường hợp sử dụng khác nhau.
Prompt Engineering giúp hiểu rõ hơn về khả năng và giới hạn của các mô hình ngôn ngữ lớn (LLMs). Các nhà nghiên cứu sử dụng prompt engineering để cải thiện độ an toàn và khả năng của LLMs trong nhiều tác vụ phổ biển và phức tạp, chẳng hạn như trả lời câu hỏi và suy luận toán học. Các nhà phát triển sử dụng kỷ thuật prompt engineering để thiết kế các phương pháp prompting mạnh mẽ và hiệu quả, kết nối với LLMs và các công cụ khác.
Hướng dẫn toàn diện này bao gồm cả lý thuyết và các khía cạnh thực tiễn của kỹ thuật prompt engineering, cũng như cách tận dụng những kỹ thuật prompting tốt nhất để tương tác và xây dựng với các LLMs.
Note: Mọi ví dụ đều được thực hiện với gpt-3.5-turbo sử dụng OpenAI’s Playground trừ khi có mô hình khác. Model sử dụng cấu hình mặc định, tức là temperature = 1 và top_p = 1. Các prompt cũng sẽ hoạt động với các model khác có khả năng tương tự như gpt-3.5-turbo, nhưng phản hồi của mô hình có thể sẽ khác.
LLM Settings
Khi thiết kế và kiểm tra các prompt, bạn thường tương tác với LLM thông qua một API. Bạn có thể cấu hình một số tham số để có được kết quả khác nhau cho các prompt của mình. Điều chỉnh các setting này là quan trọng để cải thiện độ tin cậy và sự mong muốn của các phản hồi, và việc này cần một chút thử nghiệm để tìm ra các settings phù hợp cho các trường hợp sử dụng của bạn. Dưới đây là các settings phổ biến mà bạn sẽ gặp phải khi sử dụng các nhà cung cấp LLM khác nhau:
Temperature - Nói ngắn gọn, temperature càng thấp, kết quả càng mang tính xác định, nghĩa là token tiếp theo có xác suất cao nhất sẽ luôn được chọn. Việc tăng temperature có thể dẫn đến sự ngẫu nhiên hơn, khuyến khích các phản hồi đa dạng hoặc sáng tạo hơn. Bạn thực tế đang tăng weights của các token khác có thể có. Về mặt ứng dụng, bạn có thể muốn sử dụng giá trị temperature thấp hơn cho các tác vụ như trả lời câu hỏi dựa trên sự kiện (fact-based QA) để khuyến khích các phản hồi chính xác và ngắn gọn hơn. Đối với các tác vụ sáng tạo khác, việc tăng giá trị temperature có thế sẽ có lợi.
Top P - Là một kỹ thuật lấy mẫu kết hợp với temperature, gọi là nucleus sampling, cho phép bạn kiểm soát mức độ xác định của mô hình. Nếu bạn đang tìm kiếm các câu trả lời chính xác và có căn cứ, hãy giữ giá trị này thấp. Nếu bạn muốn có các phản hồi đa dạng hơn, hãy tăng giá trị này lên. Khi sử dụng Top P, có nghĩa là chỉ những token tạo thành khối xác suất top_p mới được xem xét để phản hồi, vì vậy giá trị top_p thấp sẽ chọn các phản hồi có độ tự tin cao nhất. Điều này có nghĩa là một giá trị top_p cao sẽ cho phép mô hình xem xét nhiều từ ngữ khả thi hơn, bao gồm cả những từ ít khả năng xuất hiện, dẫn đến các kết quả đa dạng hơn.
Chúng ta chỉ nên thay đổi temperature hoặc Top P chứ không nên thay đổi cả hai một lúc.
Max Length - Bạn có thể quản lý số lượng token mà mô hình tạo ra bằng cách điều chỉnh max length. Việc chỉ định một giá trị max length giúp bạn ngăn chặn các phản hồi dài hoặc không liên quan để kiểm soát chi phí.
Stop Sequences - Stop sequence là một string giúp mô hình ngừng tạo ra thêm tokens. Việc chỉ định stop sequences là một cách khác để kiểm soát độ dài và cấu trúc của phản hồi từ mô hình. Ví dụ, bạn có thể yêu cầu mô hình tạo ra các danh sách không quá 10 mục bằng các thêm “11” vào stop sequence, điều này sẽ dừng mô hình khi nó tạo ra mục thứ 11.
Frequency Penalty - Frequency penalty áp dụng một hình phạt cho token tiếp theo tỉ lệ với số lần token đó đã xuất hiện trong phản hồi và prompt. Giá trị frequency penalty càng cao thì càng ít khả năng một từ xuất hiện lại. Setting này giúp giảm sự lặp lại các từ trong phản hồi của mô hình bằng cách áp dụng hình phạt cao hơn cho các token xuất hiện nhiều lần.
Presence Penalty - Presence penalty cũng áp dụng hình phạt cho các token lặp lại, nhưng khác với frequency penalty, hình phạt này là giống nhau với tất cả các token lặp lại. Một token xuất hiện 2 lần và một token xuất hiện 10 lần đều bị phạt như nhau. Setting này giúp ngăn chặn mô hình lặp lại các cụm từ quá nhiều trong phản hồi. Nếu bạn muốn mô hình tạo ra văn bản đa dạng hoặc sáng tạo, bạn có thể muốn sử dụng presence penalty cao hơn. Hoặc nếu bạn cần mô hình tập trung hơn, thì hãy thử sử dụng presence penalty thấp hơn.
Giống như temperature và top_p, chúng ta chỉ nên thay đổi frequency penalty hoặc presence penalty.
Cơ bản về Prompting
Prompt 1 LLM
Bạn có thể đạt được rất nhiều điều với các prompt đơn giản, nhưng chất lượng của kết quả phụ thuộc vào lượng thông tin bạn cung cấp và độ tinh xảo của prompt. Một prompt có thể chứa các thông tin như chỉ dẫn hoặc câu hỏi bạn đưa ra cho mô hình, và có thể bao gồm các chi tiết khác như ngữ cảnh, inputs hoặc ví dụ. Bạn có thể sử dụng những yếu tố này để hướng dẫn cho mô hình hiệu quả hơn, từ đó nâng cao chất lượng kết quả.
Đây là một ví dụ:
Prompt:
The sky is
Output:
blue.
Một điều cần lưu ý là khi sử dụng các chat models như gpt-3.5-turbo hoặc gpt-4, bạn có thể cấu trúc prompt của mình sử dụng ba vai trò khác nhau: system, user, và assistant. Tin nhắn hệ thống không phải là yêu cầu nhưng giúp thiết lập hành vi tổng thể của trợ lý. Ví dụ trên chỉ bao gồm một tin nhắn của user, bạn có thể sử dụng trực tiếp để prompt cho model. Để đơn giản, tất cả các ví dụ, trừ khi có đề cập rõ ràng, sẽ chỉ sử dụng user để prompt gpt-3.5-turbo. Tin nhắn của assistant trong ví dụ trên tương ứng với phản hồi của mô hình. Bạn cũng có thể định nghĩa một tin nhắn của assistant để đưa ra vi
Bạn có thể nhận thấy từ ví dụ prompt trên rằng model phản hồi bằng một chuỗi token có ý nghĩa dựa trên ngữ cảnh “The sky is”. Tuy nhiên, kết quả có thể không như mong đợi hoặc xa với task mà bạn mong muốn. Thực tế, ví dụ cơ bản này nhấn mạng sự cần thiết phải cung cấp thêm ngữ cảnh hoặc chỉ dẫn cụ thể về những gì bạn muốn đạt được với hệ thống. Đây chính là bản chất của prompt engineering.
Thử cải thiện bằng một ví dụ khác:
Prompt:
Complete the sentence:
The sky is
Output:
blue during the day and dark at night.
Vậy điều đó có tốt hơn không? Với prompt trên, bạn đang yêu cầu model hoàn thành câu, vì vậy kết quả trông hợp lý hơn rất nhiều vì model làm đúng những gì bạn yêu cầu (“hoàn thành câu”). Cách tiếp cận này thiết kế các prompt hiệu quả để hướng dẫn mô hình thực hiện một nhiệm vụ mong muốn, chính là những gì được gọi là prompt engineering trong hướng dẫn này.
Ví dụ trên là một minh họa cơ bản về những gì có thể làm được với các model LLMs ngày nay. Các LLMs hiện nay có khả năng thực hiện mọi loại nhiệm vụ nâng cao, từ tóm tắt văn bản, suy luận toán học, đến tạo code.
Prompt Formatting
Bạn đã thử một prompt rất đơn giản ở trên. Một prompt chuẩn có định dạng như sau:
<Question>?
hoặc
<Instruction>
Bạn có thể format điều này theo dạng hỏi đáp (QA), vốn là định dạng chuẩn trong nhiều bộ dữ liệu QA, như sau:
Q: <Question>?
A:
Khi prompting như ví dụ trên, điều này cũng được gọi là zero-shot-prompting, tức là bạn đang yêu cầu mô hình phản hồi trực tiếp mà không có bất kỳ ví dụ hay minh họa nào về nhiệm vụ bạn muốn model thực hiện. Một số model LLM có khả năng thực hiện zero-shot prompting, nhưng điều này phụ thuộc vào độ phức tạp và kiến thức của nhiệm vụ cụ thể, cũng như các nhiệm vụ mà model đã train để thực hiện tốt.
Một ví dụ cụ thể về prompt như sau:
Prompt:
Q: What is prompt engineering?
Dựa trên định dặng chuẩn ở trên, một kỹ thuận phổ biến và hiệu quả trong việc prompting được gọi là few-shot prompting, trong đó bạn cung cấp các ví dụ minh họa (exemplars), tức là các ví dụ về nhiệm vụ bạn muốn model thực hiện. Bạn có thể format few-shot prompt như sau:
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
QA format sẽ nhìn như thế này:
Q: <Question>?
A: <Answer>
Q: <Question>?
A: <Answer>
Q: <Question>?
A: <Answer>
Q: <Question>?
A:
Lưu ý rằng không nhất thiết phải sử dụng QA format. Prompt format phụ thuộc vào nhiệm vụ cụ thể. Ví dụ, bạn có thể thực hiện một nhiệm vụ phân loại đơn giản và cung cấp các ví dụ minh họa cho nhiệm vụ đó như sau:
Prompt:
This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive
What a horrible show! //
Output:
Negative
Few-shot prompting cho phép học trong ngữ cảnh, tức là khả năng của model LLM để học các nhiệm vụ chỉ với một vài ví dụ minh họa. Điều này giúp model hiểu được nhiệm vụ mà không cần train lại.
Elements của Prompt
Khi chúng ta đã đi qua nhiều ví dụ và ứng dụng về prompt engineering, bạn sẽ nhận thấy rằng một prompt thường bao gồm các element sau:
Instruction - Một nhiệm vụ hoặc chỉ dẫn cụ thể mà bạn muốn model thực hiện. Ví dụ: “Tóm tắt đoạn văn dưới đây” hoặc “Trả lời câu hỏi sau.”
Context - Thông tin bên ngoài hoặc ngữ cảnh bổ sung có thể giúp model đưa ra phản hồi chính xác hơn. Ví dụ: Cung cấp thông tin nền về một chủ đề cụ thể hoặc giới thiệu về user, để model có thể điều chỉnh câu trả lời sao cho phù hợp.
Input Data - Dữ liệu đầu vào hoặc câu hỏi mà bạn muốn model tìm ra câu trả lời. Đây là phần bạn yêu cầu model xử lý, chẳng hạn như một đoạn văn, câu hỏi hoặc yêu cầu cụ thể.
Output Indicator - Chỉ dẫn về kiểu hoặc format của kết quả. Ví dụ: “Trả lời bằng một câu ngắn gọn”, “Cung cấp danh sách các mục”, hoặc “Trả lời theo format bảng”.
Khi các yếu tố này được kết hợp đúng cách, chúng giúp model cung cấp các phản hồi chính xác và theo yêu cầu của user.
Để minh họa các yếu tố của prompt một các rõ ràng hơn, đây là một prompt đơn giản nhằm thực hiện một nhiệm vụ phân loại văn bản:
Prompt:
Classify the text into neutral, negative, or positive
Text: I think the food was okay.
Sentiment:
Trong ví dụ prompt trên, instruction tương ứng với nhiệm vụ phân loại, ví dụ: “Phân loại văn bản thành neutral, negative hoặc positive”. Input data tương ứng với phần “I think the food wá okay” và output indicator là “Sentiment:”. Lưu ý rằng ví dụ cơ bản này không sử dụng context, nhưng context cũng có thể được cung cấp như một phần của prompt.
Ví dụ, context cho nhiệm vụ phân loại văn bản này có thể là các ví dụ bổ sung được cung cấp trong prompt để giúp model hiểu rõ hơn về nhiệm vụ và điều hướng các kết quả mà bạn mong đợi. Dưới đây là cách bạn có thể cải tiến prompt bằng cách thêm ngữ cảnh:
Bạn không cần tất cả bốn yếu tố trong một prompt, và định dạng của prompt phụ thuộc vào nhiệm vụ cụ thể. Mỗi nhiệm vụ có thể yêu cầu các yếu tố khác nhau, và đôi khi chỉ cần một hoặc hai yếu tố là đủ để đạt được kết quả mong muốn. Trong các hướng dẫn sắp tới, chúng ta sẽ đi vào các ví dụ cụ thể hơn để thấy rõ cách áp dụng những kỹ thuật này vào các tình huống thực tế.
Một số mẹo để design prompt
Dưới đây là một số mẹo chung để thiết kế prompt hiệu quả:
Khi bắt đầu thiết kế prompt, bạn cần nhớ rằng đây thực sự là một quá trình lặp đi lặp lại, yêu cầu thử nghiệm nhiều để đạt được kết quả tối ưu. Việc sử dụng một công cụ đơn giản như OpenAI Playground hoặc Cohere là một điểm khởi đầu tốt.
Bạn có thể bắt đầu với những prompt đơn giản và từ từ thêm vào các yếu tố và ngữ cảnh khi bạn muốn có kết quả tốt hơn. Quá trình thử nghiệm và điều chỉnh prompt là rất quan trọng để đạt được hiệu quả tốt nhất. Khi đọc hướng dẫn này, bạn sẽ thấy rằng sự cụ thể, đơn giản và súc tích thường mang lại kết quả tốt hơn.
Khi bạn có một nhiệm vụ lớn liên quan đến nhiều subtasks khác nhau, bạn có thể thử chia nhỏ nhiệm vụ thành các subtasks đơn giản hơn và từ từ xây dựng lên khi kết quả tốt hơn. Điều này giúp tránh việc thêm quá nhiều sự phức tạp vào quá trình thiết kế prompt ngay từ đầu.
Instruction
Bạn có thể thiết kế các prompt hiệu quả cho các nhiệm vụ đơn giản bằng cách sử dụng các lệnh để hướng dẫn mô hình về những gì bạn muốn đạt được, chẳng hạn như "Viết", "Phân loại", "Tóm tắt", "Dịch", "Sắp xếp", v.v.
Hãy nhớ rằng bạn cũng cần phải thử nghiệm rất nhiều để xem cái gì hoạt động tốt nhất. Hãy thử các hướng dẫn khác nhau với các từ khóa, ngữ cảnh và dữ liệu khác nhau và xem cái nào mang lại kết quả tốt nhất cho trường hợp sử dụng và nhiệm vụ cụ thể của bạn. Thông thường, ngữ cảnh càng cụ thể và liên quan đến nhiệm vụ bạn đang thực hiện, kết quả càng tốt.
Chúng ta sẽ tiếp tục thảo luận về tầm quan trọng của việc lấy mẫu và thêm ngữ cảnh trong các hướng dẫn tiếp theo. Việc thử nghiệm và điều chỉnh liên tục sẽ giúp bạn tối ưu hóa các prompt và nâng cao hiệu quả của model.
Một số người khuyên bạn nên đặt các hướng dẫn ở phần đầu của prompt. Một lời khuyên khác là sử dụng một dấu phân cách rõ ràng như "###" để tách biệt hướng dẫn và ngữ cảnh.
Ví dụ về cách sử dụng hướng dẫn và ngữ cảnh với dấu phân cách:
Prompt:
###Instruction ###
Translate the text below to Spanish:
Text: "hello!"
Output:
iHola!
Specificity
Hãy rất cụ thể về hướng dẫn và nhiệm vụ bạn muốn model thực hiện. Càng mô tả chi tiết và rõ ràng trong prompt, kết quả sẽ càng tốt. Điều này đặc biệt quan trọng khi bạn có một kết quả mong muốn hoặc một phong cách tạo ra cụ thể mà bạn đang tìm kiếm. Không có các từ khóa hoặc token cụ thể nào có thể dẫn đến kết quả tốt hơn. Điều quan trọng hơn là có một định dạng tốt và một prompt mô tả rõ ràng.
Khi thiết kế prompt, bạn cũng nên lưu ý đến độ dài của prompt vì có những giới hạn về độ dài mà prompt có thể đạt được. Cần cân nhắc xem bạn nên cụ thể và chi tiết đến mức độ nào. Việc thêm quá nhiều chi tiết không cần thiết chưa hẳn là cách làm tốt. Những chi tiết đó nên liên quan và đóng góp vào nhiệm vụ bạn muốn thực hiện.
Điều này yêu cầu bạn phải thử nghiệm rất nhiều để tìm ra độ chi tiết phù hợp. Việc thử nghiệm và lặp lại nhiều lần sẽ giúp bạn tối ưu hóa các prompt cho các ứng dụng của mình. Càng tối giản, súc tích và đúng trọng tâm, prompt càng dễ dàng giúp mô hình thực hiện đúng yêu cầu.
Vì vậy, hãy thử nghiệm với các phiên bản khác nhau của prompt, kiểm tra kết quả, và từ đó điều chỉnh sao cho chi tiết vừa đủ để đạt được kết quả tốt nhất mà không quá phức tạp.
Ví dụ:
Prompt:
Extract the name of places in the following text.
Desired format: Place: <comma_separated_list_of_places>
Input: "Although these developments are encouraging to researchers, much is still a mystery. “We often have a black box between the brain and the effect we see in the periphery,” says Henrique Veiga-Fernandes, a neuroimmunologist at the Champalimaud Centre for the Unknown in Lisbon. “If we want to use it in the therapeutic context, we actually need to understand the mechanism.“"
Output:
Place: Champalimaud Centre for the Unknown, Lisbon
Tránh sự mơ hồ
Dựa trên các mẹo trên về việc chi tiết và cải thiện format, bạn dễ dàng rơi vào cái bẫy muốn làm prompt quá phức tạp hoặc cố gắng quá thông minh, điều này có thể dẫn đến mô tả không chính xác hoặc mơ hồ. Thực tế, thường thì tốt hơn nếu bạn cụ thể và trực tiếp hơn.
Phân tích này tương tự như giao tiếp hiệu quả trong cuộc sống hàng ngày — càng trực tiếp và rõ ràng, thông điệp càng dễ được truyền đạt và hiểu đúng. Khi thiết kế prompt, bạn không cần phải tạo ra các mô tả phức tạp hoặc ẩn dụ quá mức, vì điều này có thể khiến model gặp khó khăn trong việc hiểu nhiệm vụ và cho ra những kết quả không mong muốn.
Ví dụ:
Explain the concept prompt engineering. Keep the explanation short, only a few sentences, and don't be too descriptive.
Không rõ ràng từ prompt trên là cần bao nhiêu câu và phong cách nào. Bạn vẫn có thể nhận được những phản hồi tốt với những prompt trên, nhưng prompt tốt hơn sẽ là một prompt rất cụ thể, súc tích và đi thẳng vào vấn đề. Một ví dụ có thể là:
Use 2-3 sentences to explain the concept of prompt engineering to a high school student.
Nên và không nên làm
Một mẹo phổ biến khác khi thiết kế prompt là tránh nói những điều không nên làm, mà thay vào đó, hãy nói rõ những điều cần làm. Điều này khuyến khích sự cụ thể hơn và tập trung vào các chi tiết dẫn đến những phản hồi tốt từ mô hình.
Dưới đây là một ví dụ về một chatbot gợi ý phim thất bại trong việc thực hiện chính xác những gì bạn không muốn nó làm, do cách bạn viết hướng dẫn — tập trung vào những gì không nên làm.
Prompt:
The following is an agent that recommends movies to a customer. DO NOT ASK FOR INTERESTS. DO NOT ASK FOR PERSONAL INFORMATION.
Customer: Please recommend a movie based on my interests.
Agent:
Output:
Sure, I can recommend a movie based on your interests. What kind of movie would you like to watch? Do you prefer action, comedy, romance, or something else?
Đây là prompt tốt hơn:
Prompt:
The following is an agent that recommends movies to a customer. The agent is responsible to recommend a movie from the top global trending movies. It should refrain from asking users for their preferences and avoid asking for personal information. If the agent doesn't have a movie to recommend, it should respond "Sorry, couldn't find a movie to recommend today.".
Customer: Please recommend a movie based on my interests.
Agent:
Output:
Sorry, I don't have any information about your interests. However, here's a list of the top global trending movies right now: [list of movies]. I hope you find something you like!





![[ZVE-2025-3566] Stored XSS to RCE in Manage Engine OpManager](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1753930975579%2Fb835c2ae-2b5b-425e-9210-09bb506d46c1.png&w=3840&q=75)