prompt engineering 是這個人工智慧時代最好的起點之一。

了解核心概念將幫助您充分利用 ChatGPT、Google Bard 和 Claude 等生成式 AI 模型來執行偵錯、程式碼翻譯和生成測試(包括任何一般任務)等任務。

今天,我們將透過非常詳細的即時工程範例來涵蓋所有核心概念和原則。

讓我們跳進去吧。


順便說一句,我是 Latitude 的一員,我們正在建立一個開源 LLM 開發平台。您可以透過ai.latitude.so加入候補名單。

你將能夠做很多很酷的事情,例如:

⚡ 將提示部署為 API 端點。

⚡ 使用LLMs進行自動評估。

⚡ 協作進行即時工程。

我非常有信心發布後您一定會喜歡它!

https://ai.latitude.so/ 加入候補名單 ⭐

llm平台按緯度


「prompt engineering」這個新術語是什麼?

每當我們嘗試與 ChatGPT 或任何其他對話式 AI 工具進行通訊以獲取回應時,作為輸入給出的文字、問題或資訊的形式稱為提示。

每當我們談論生成式人工智慧時,即時工程是最常見的單字之一。

即時工程基本上是編寫和完善這些輸入以優化從這些語言模型獲得的回應的過程。

✅ 讓我們想像一下咖啡。

咖啡迷因

想像一下在咖啡館點一杯咖啡。如果您只是要一杯“咖啡”,您將獲得一杯標準咖啡。但如果您指定想要一杯帶有焦糖味的單品濃縮咖啡,您將根據您的需求獲得更精緻的咖啡。

這與提示工程中的原理相同,因為詳細的咖啡訂單會帶來更好的咖啡,具體的良好提示可以產生更相關和更精緻的人工智慧回應。由於用例不斷增加,整個領域都出現了,因為每個人都希望使用人工智慧來改善他們的工作流程。

這將有助於模型更好地執行其任務,例如編寫行銷電子郵件、生成程式碼、分析和合成文本,或其他數百個(如果不是數千個)當前應用程式中的任何一個。

他們不是人類,所以他們沒有直覺。和任何機器一樣,它們只是擅長garbage in, garbage out 。一切都取決於我們提供更好的簡報。

人類有更多的感覺

提示工程師不僅負責為 AI 語言模型提供指導和方向,還負責開發、測試和完善已經提交給 AI 模型的特定提示。

及時工程

用 1 句話來說,即時工程可以概括為「如果您正在尋找更好的結果,請嘗試提出更好的問題」 。讀完本文後,我相信您會更了解它的實際含義以及如何更好地提出這些問題。


我們使用哪種類型的LLMs?

在我們繼續之前,重要的是要了解LLMs有兩種主要類型,但最常用的是:

⚡ 指令調整LLMs。

根據說明進行微調並嘗試遵循這些說明。一般來說,每當我們使用任何生成式人工智慧模型時,我們都會使用它們。

具有人類回饋的強化學習是在此情況下使用的常見實例之一。

-→ 範例:

如果我們問: Asking What is the capital of India?

詢問印度的首都是哪裡

根據我們的指示進行具體回复

指令型LLMs被推薦用於大多數任務,它是有幫助的、誠實的(盡其所能)並且無害。

在解釋概念或進一步討論時我將提到這種類型。


  1. 好的提示是非常具體的並且遵循特定的結構。

通常,可以向模型打招呼並提出問題,例如這樣說:很高興見到你,你能告訴我輸入 console.log("Hello World") 後會收到的控制台訊息嗎?

但它通常會給出不好的結果,並且會自行假設事情,這是我們不想要的。

如果您需要非常準確的結果(例如在程式設計任務中),那麼擁有良好的提示結構非常重要。

人工智慧要求人類做出提示

讓我們看看如何清晰地建立任何提示:

Intro :設定您所指的場景。它有助於賦予人工智慧一個獨特的role來思考自己。

-→ 例如,我想讓你擔任面試官。我將成為候選人,而你將...

Context :任何好的參考文獻都取決於工作。

-→ 例如,你會問我前端開發初級職位的面試問題。

Instructions :根據上下文給予適當的說明很重要。

-→ 例如,不要一次寫出所有守恆。我希望你只接受我的存取。問我問題並等待我的答案。不要寫解釋。

Ending :你可以正確地描述要做什麼。

-→ 例如,像面試官一樣,一一問我問題,然後等待我的回答。我的第一句話是「嗨」 。

因此,將上述所有內容放在一起,我們的範例提示將如下所示:

✅我希望你擔任面試官。我將成為候選人,您將向我詢問前端初級開發人員職位的面試問題。我希望你只作為面試官來回答。不要一次寫出所有的守恆。我希望你只接受我的存取。問我問題並等待我的答案。不要寫解釋。像面試官一樣一一問我問題,然後等待我的答案。我的第一句話是Hi

-→ 另一個很好的提示範例可以是:

✅我希望你充當 JavaScript 控制台。我將輸入命令,您將回覆 javascript 控制台應顯示的內容。我希望您只回覆一個唯一程式碼區塊內的終端輸出,而不是其他任何內容。不要寫解釋。除非我指示您這樣做,否則請勿鍵入命令。當我需要用英語告訴你一些事情時,我會將文字放在大括號內{就像這樣}。我的第一個指令是 console.log("Hello World"); 。

這很好用

這很好用

您應該盡量避免任何閒聊並使用嚴格的提示以獲得更好的結果!

現在,建立提示很重要,但您不需要遵循任何特定結構(即使是上面的結構)。您可以根據獲得的初步結果進行測試並進一步改進。有時,少即是多!

請明確點


  1. ✅主動語態❌被動語態。

主動語態是當句子的主詞執行動詞所表達的動作。 (主詞+動詞+受詞)

而被動語態是當動詞作用於句子的主詞時。 (受詞+動詞+主詞)

-→ 範例:

主動語態:廚師做飯了。

被動語態:這頓飯是廚師做的。

如果您想知道為什麼這很重要?主動語音為人工智慧模型帶來了動作感和更清晰的感覺。這將帶來更好的反應。

此外,在提示中使用反問句可以刺激人工智慧模型的“思考過程”,並引導其產生更有意義的輸出。


  1. 給模型時間思考。

如果您打算更好地進行即時工程,這是您需要了解的最關鍵的概念之一。

假設如果要求將21 乘以 34 ,您可能不會立即知道,但隨著時間的推移仍然可以計算出來。除非你是計算機:)

同樣,模型在嘗試立即回答而不是花時間找出答案時會犯更多推理錯誤。在給出答案之前詢問一系列chain of thought可以幫助模型更可靠地推理出正確的答案。

需要時間來解決這個大問題

策略之一可以是指示模型在急於下結論之前找出自己的解決方案。

有時,當我們明確指示模型做同樣的事情時,我們會得到更好的結果。

假設,我們想要一個模型來評估數學問題的解。解決這個問題最明顯的方法是簡單地詢問模型解決方案是否正確。

Problem Statement:

I'm planning to build a solar power installation and need help calculating the financials.
- Land costs $100 per square foot.
- Solar panels cost $250 per square foot.
- The maintenance contract costs a flat $100,000 per year, plus an additional $10 per square foot.
Calculate the total cost for the first year of operation based on the number of square feet.

Student's Solution:

Let x represent the size of the installation in square feet.
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 10x
Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000

SYSTEM:

Evaluate whether the student’s solution is correct.

USER:

Determine if the student’s solution to the problem is accurate.

ASSISTANT:

First, let’s break down the solution:
1. Land Cost: 100x
2. Solar Panel Cost: 250x
3. Maintenance Cost: 100,000 + 10x

Combining these:
- Total cost = Land cost + Solar panel cost + Maintenance cost
- Total cost = 100x + 250x + 100,000 + 10x
- Total cost = 360x + 100,000

The student's solution is indeed correct.

在得出結論之前製定自己的解決方案是最被低估的技術之一,但它非常強大且簡單!

其他策略可以是:

🎯 使用一系列查詢來隱藏模型的推理過程

🎯 詢問模型是否在先前的過程中遺漏了任何內容

你知道嗎,還有一個自動化思考鏈的概念?您應該在提示指南中閱讀相關內容,包括所涉及的階段。


4.避免立即註射。

提示注入是用特殊的使用者輸入覆蓋提示中原始指令的過程。當稍後使用不受信任的輸入作為提示的一部分時,通常會發生這種情況。

及時注射

-→ 我們再舉一個例子:

迅速的

產生的回應是:提示注入是一種使用者操縱語言模型輸入的技術,旨在改變其行為或輸出。這可能會導致意外或惡意回應,凸顯了穩健輸入驗證的重要性。

現在,您可以要求它忽略它並完全執行其他操作。

忽略並做其他事情

原始開發人員指令和使用者輸入指令確實很難區分。但在某些情況下,如果輸入明確,這是可能的,讓我們來看一個案例。

假設給出相同的輸入並明確要求不要讓它在接下來的兩個提示中覆蓋。

給出相同的輸入

正如您從下面的回應快照中看到的那樣,它沒有被覆蓋。

不同的輸出

按照指示,只有在嘗試 2 次後才可以注射。

2次嘗試後有可能

沒有萬無一失的解決方案,但您可以根據提示進行調整。


5.少鏡頭提示。

少鏡頭提示是一種提示工程技術,涉及向人工智慧展示一些所需結果的範例(或鏡頭)。使用提供的範例,模型可以學習特定行為並更好地執行類似任務。

更像是給出完成任務的成功範例,然後要求模型執行任務。

-→ 例如,讓我們來看一個例子。

Your job is to create content for our client, {{client_name}}. Here is some information about the client {{client_description}}.
Here are a few examples of content we've created in the past from briefs:
"""
Example 1:
Brief: {{brief_1}}
Content: {{content_1}}

Example 2:
Brief: {{brief_2}}
Content: {{content_2}}
"""
Here is the latest brief to create content about:
"""
Brief:{{brief_description}}
Content:

透過傳遞先前的簡報和從這些簡報產生的內容,模型將了解我們期望的特定客戶的風格。

我將範例放在分隔符號(三個引號)中以格式化提示,並幫助模型更好地理解提示的哪一部分是範例而不是說明。

或者您可以透過一些範例讓模型了解基本任務,例如:

Few shot prompting example.
The movie was good // positive
The movie was quite bad // negative
I really like the movie, but the ending was lacking // neutral
I LOVED the movie //

模型

該模型將理解並以小寫形式顯示輸出。

雖然LLMs很棒,但在使用零樣本(第 7 點中討論)時,它們仍然無法完成更複雜的任務。在這種情況下,Few-shot 提示可以作為一種技術來實現情境學習並進一步提高。

它有其相當多的局限性,但在大多數情況下都有效。您可以閱讀有關該技術的更多訊息,包括其局限性。


  1. 限制。

基於約束的提示涉及在提示中新增約束或條件,幫助語言模型在產生回應時專注於特定方面或要求。

強烈建議在與 ChatGPT 的大多數交互作用中使用它。明確的約束為產生的回應設定了界限或限制。

您可以透過不同的方式來完成此操作,例如:

⚡ 指定回應的長度不得超過一定的字數或字元限制。

-→ 讓我們來看一個例子。

正如您所看到的,當我們允許它達到 50 個單字時,它只是假設並放棄了 38 個單字的回應。

少於50字

這是 38 個字

讓我們說close to 50 words來給出更好的提示。

回覆非常接近 50 個字,這是一個更好的限制。

47字回复

這是 47 個字

⚡ 指定響應結構。

-→ 我們正在指定一個具有更嚴格約束的結構。

json結構

這是 JSON 回應。澄清這一點很重要,否則模型將單獨假設並給出文字 + JSON 回應。

{
  "summary": [
    "Prompt engineering involves developing prompts to get clear and useful responses from AI tools.",
    "It helps guide large language models to perform tasks based on various inputs.",
    "Generative AI tools like ChatGPT offer solutions for conversations, programming help, and automated tasks."
  ]
}

⚡ 提供明確的指示。

-→ 定義回應的目標受眾,例如針對軟體工程師或針對倡議者。

-→ 指示 ChatGPT 避免某些類型的內容,以確保其安全並符合道德準則。

您可以在 Andrew Maynard 的部落格上透過一些練習閱讀有關基於約束的提示的更多資訊。


7.零射擊提示。

零樣本提示意味著用於與模型互動的提示將不包含範例或演示。零樣本提示直接指示模型執行任務,無需任何額外的範例。

一種奇特的說法是「給予簡單的指令作為提示」。

-→ 讓我們來看一個例子。

在下面的提示中,我們沒有為模型提供任何文本範例及其分類,LLMs已經理解我們所說的「情緒」的含義。

Classify the text into neutral, negative, or positive. 
Text: I think the vacation is okay.
Sentiment:

回覆

回應情緒

強化學習人類回饋也是改進零樣本提示的方法。

當零樣本不起作用時,建議在提示中提供演示或範例,從而導致少樣本提示。

您可以透過 labelbox 閱讀Zero-Shot、Few-Shot 和 Fine-Tuning之間的差異。最後有基準測試結果,這有點令人驚訝。

標籤盒

🎯 一鍵提示。

還有一個一次性提示的概念,涉及提供單一範例或參考輸出片段作為提示的一部分。

這對於產生與您的寫作風格一致的內容或您需要遵循特定參考的情況非常有用。您可以透過線上資源閱讀更多相關資訊。


  1. 思想鏈(CoT)。

思想鏈 (CoT) 提示鼓勵模型將複雜的推理分解為一系列中間步驟,產生結構良好的最終輸出。

您應該知道,您可以透過要求模型執行推理步驟來將一系列思維提示與零樣本提示結合起來,這通常可能會產生更好的輸出。

這是 CoT 提示的最小形式,零樣本 CoT ,實際上是要求模型一步一步思考。這種方法可以為LLMs經常無法正確解決的數學任務帶來令人印象深刻的結果。

嬰兒床提示

關於一次性 CoT 提示 - 圖片來源來自 Wei 等人。 (2022)

-→ 讓我們看一個範例,您可以將其與幾個提示結合起來,以便在回應之前需要推理的更複雜的任務上獲得更好的結果。

The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.
The odd numbers in this group add up to an even number: 17,  10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.
The odd numbers in this group add up to an even number: 16,  11, 14, 4, 8, 13, 24.
A: Adding all the odd numbers (11, 13) gives 24. The answer is True.
The odd numbers in this group add up to an even number: 17,  9, 10, 12, 13, 4, 2.
A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. 
A:

回覆

這是當我們提供推理步驟時完美結果的回應。

由於模型的改進,即使是單一範例也足以獲得相同的結果。


  1. 減少幻覺並使用分隔符號。

🎯減少幻覺。

當任何大型語言模型 (LLM) 產生的反應要么實際上不正確、無意義,要么與輸入提示脫節時,幻覺或「編造」是一種常見的失敗。

這可能是由於:

⚡ 此模型沒有適當的背景和常識來確定這些是不準確的答案。

⚡ 嘗試假設一些事情,並在不確定正確答案的情況下提供額外的幫助。

-→ 一個例子是人工智慧模型,旨在產生文章摘要,並最終產生包含原始文章中未出現的細節的摘要,甚至完全偽造資訊。

-→ 其他範例可能是誤報(可能無法將某物辨識為威脅)或誤報(將某物辨識為威脅,但實際上並非如此)。

有很多技術可以用來防止這些:

⚡ 檢索增強一代(RAG)

⚡ 驗證鏈(CoVe)提示

⚡ 知識鏈(CoK)提示

⚡ 反應提示

⚡ 註釋鏈 (CoN) 提示

⚡ 其他進階提示技巧

我不打算探討這個問題,因為幻覺並不是真正提高即時工程的內部因素。

雖然頻繁地人工審查 LLM 回應和試誤提示工程可以幫助您檢測和解決應用程式中的幻覺,但這種方法非常耗時,並且隨著應用程式的增長而難以擴展。

🎯 使用分隔符。

三引號、XML 標籤、節標題等分隔符號可以幫助辨識要區別對待的某些文字節。

一些分隔符號可以是:

  • 三重引號: """

  • 三重反引號/破折號: ---

  • 尖括號: < >

  • XML 標籤: <tag> </tag>

Summarize the text delimited by triple quotes in 3 bullet points.

"""insert text here"""

範例響應是。

回覆

您可以透過真正的 python 指南閱讀有關分隔符號和實際範例的更多資訊。


  1. 完善你的提示,因為沒有「完美的提示」。

您很少會在第一次嘗試任何提示時就得到好的結果。為了彌合期望響應和當前輸出之間的差距,需要盡可能地完善提示。

一個簡單的方法可以是:

⚡ 試試看。

⚡ 分析結果沒有給出您想要的結果的地方。

⚡ 澄清指示,並給予更多時間思考。

⚡ 用一批範例完善提示。

-→ 讓我們來看一個例子。

將此作為輸入響應。

✅將括號中的文字總結為大約三個要點,並以 JSON 格式提供該摘要。

「提示工程是開發提示的實踐,這些提示可以從人工智慧工具中產生清晰且有用的回應。人工智慧提示可以幫助指導大型語言模型根據不同的輸入執行任務。

目標是教會人工智慧模型為查詢提供最佳輸出。如果您關注最新的科技新聞,您可能已經熟悉生成式 AI 一詞或稱為 ChatGPT 的平台——一種公開可用的 AI 工具,用於對話、提示、編程幫助,甚至自動化解決方案。 ”“”

它假設了一些事情並給出了 JSON 和文本,這是錯誤的,因為我們只需要 JSON 輸出。

json + 文本

我們需要透過指定需要 JSON 而不是文字描述來進一步細化提示。

✅總結由靠近 3 個要點的括號分隔的文本,並以 json 形式給出最終響應,而不是文本描述。

「提示工程是開發提示的實踐,這些提示可以從人工智慧工具中產生清晰且有用的響應。人工智慧提示可以幫助指導大型語言模型根據不同的輸入執行任務。目標是教會人工智慧模型提供最佳輸出如果您關注最新的技術新聞,您可能已經熟悉生成式AI 一詞或稱為ChatGPT 的平台——一種用於對話、提示、編程幫助和開發的公開可用的AI 工具。

這次,我們得到了更好的回應,沒有任何不良結果。

json而不是文字描述

這就是迭代開發的過程,包括錯誤分析!

🎯 有系統地測試變更。

如果您要進一步完善提示,您應該了解這個概念。

如果您可以衡量效能,則提高效能會更容易。在其中一些情況下,對提示的修改將在一些孤立的範例上獲得更好的結果,但可能會導致其他範例集上的整體結果更差。

為了確保變更對效能產生淨正面影響,可能有必要定義一個全面的測試套件,也稱為eval

良好評估的範例可以是:

-→ 代表現實世界的用法(或至少是多樣化的)。

-→ 包含許多測試案例來評估效能變化。

-→ 易於自動化或重複。

例如你給兩個提示來比較他們的結果,哪個比較好。

電腦可以根據客觀標準(例如具有單一正確答案的問題)以及任何模糊標準自動進行評估。

我知道如果您不了解這個概念,很難理解,您可以參考線上資源,或者您可以註冊以下候補名單。

Latitude 正在建立一個開源 LLM 開發平台。您可以透過ai.latitude.so加入候補名單。

您將能夠做很多很酷的事情,例如使用LLMs進行自動評估並在即時工程方面進行協作。

https://ai.latitude.so/ 加入候補名單 ⭐


11.要求模特兒採用角色。

你有沒有聽過這樣一句話:「假裝成功,直到成功」。我知道這是有爭議的,但大量心理學研究的主題表明它可以提高整體效率,儘管它看起來是錯誤的😅

就像心理學概念一樣,指導LLMs承擔特定的角色或角色可以大大提高績效。

這種技術稱為角色扮演,使LLMs能夠產生更準確、上下文相關且與角色一致的回應。

例如,您可以使用這樣的提示:(參考

我希望你充當 Linux 終端機。我將輸入命令,您將回覆終端機應顯示的內容。我希望您只回覆一個唯一程式碼區塊內的終端輸出,而不是其他任何內容。不要寫解釋。除非我指示您這樣做,否則請勿鍵入命令。當我需要用英語告訴你一些事情時,我會將文字放在大括號內{像這樣}。我的第一個命令是 pwd。

正如您所看到的,它根據輸入提示給出了簡單而有力的響應。

角色扮演

角色扮演提示可能涉及分配角色之外的特定要求。例如,兩名記者從事相同的職業,但他們在性格和專業知識等特徵上有差異的可能性更大。

我建議閱讀有關ChatGPT 等大型語言模型中的角色扮演的內容,以便更好地理解它。


結論

唯一的限制(也是一個巨大的限制)是,無論您的即時工程技能有多好,您仍然受到模型本身有多好的限制。模型訓練資料的品質和整體實用性非常關鍵。

另外,它比以往任何時候都更加困難,因為我們可以使用人工智慧工具產生音訊、視訊或許多不同類型的格式,所以現在它真的變得越來越複雜。

我建議閱讀有關 Prompt Engineering 的最佳文章之一來自Google CloudCircleci

Merve Noyan 建立了一個出色的ChatGPT 提示生成器應用程式,允許用戶生成適合其所需角色的提示。

您可以在很棒的 ChatGPT 提示上找到大量經過測試的提示清單。我使用的一些範例來自此存儲庫。


這是一門需要大量嘗試和錯誤的藝術,但這是值得的!

繼續實驗和測試,直到獲得最佳結果。

我希望您喜歡這個,如果您有任何疑問,請告訴我。

祝你有美好的一天!直到下一次。

關注緯度以獲取更多此類內容。


原文出處:https://dev.to/latitude/prompt-engineering-for-developers-11-concepts-and-examples-in0

按讚的人:

共有 0 則留言