萬字長文總結提示詞技巧!新加坡首屆GPT-4提示工程大賽冠軍最新分享

新智元報道

編輯:Henry 喬楊

【新智元導讀】提示工程已經成爲了熱門話題,無論是CO-STAR框架構建提示詞,使用分隔符將提示詞分段,使用LLM護欄創建系統提示,還是僅使用LLM(無需插件或代碼)分析數據集,用戶都將擁有全新的使用體驗。

新加坡(GovTech)舉辦了首屆GPT-4提示工程競賽,Sheila Teo很幸運地取得了勝利。

提示工程是一門融合了藝術和科學的學科——它既是對技術的理解,也包含創造力和戰略思維。

這次她和我們分享了她在學習過程中學到的提示工程策略,這些策略可以讓任何LLM都可以完全滿足用戶的需求,甚至做得更多!

其中1,2指的是適合初學者的提示技術,而3,4指的是高級策略:

1. 使用CO-STAR框架構建提示詞

2. 使用分隔符將提示詞分段

3. 使用LLM護欄創建系統提示符

4. 僅使用LLM(無需插件或代碼)分析數據集

1. 使用CO-STAR框架構建提示信息

有效的提示結構對於從LLM那裡獲取最佳回覆至關重要。CO-STAR框架是新加坡政府科技部數據科學與人工智能團隊的心血結晶,是構建提示的便捷模板。

它考慮到了LLM回答的有效性和相關性的所有關鍵方面,從而使回答更加優化。

具體操作如下:

(C)上下文:提供任務的上下文信息

這有助於LLM瞭解正在討論的具體情景,確保其答覆具有相關性。

(O)目標:確定你希望LLM執行的任務是什麼

明確你的目標有助於LLM把回答的重點放在實現這一具體目標上。

(S)風格:指明你希望LLM使用的寫作風格

這可以是某個名人的寫作風格,也可以是某個行業的某個專家,如商業分析專家或首席執行官。這將引導LLM以符合你需求的方式和用詞做出回覆。

(T)語氣:確定回覆的態度

這可確保LLM的回覆與所需的情感或情緒背景產生共鳴。例如,正式的、幽默的、善解人意的等。

(A)受衆:確定回覆的對象

根據受衆(如某一領域的專家、初學者、兒童等)量身定製LLM的回覆,確保其在所需的語境中是恰當的、可以理解的。

(R)回覆:提供回覆格式

這可確保LLM按照下游任務所需的準確格式輸出。例如,列表、JSON、專業報告等。大多數LLM應用程序都會以編程方式LLM回覆進行下游操作,對於這些應用程序來說,JSON輸出格式是最理想的。

CO-STAR的實際應用

下面是一個真實的例子,說明CO-STAR框架爲什麼有用。

假設你是一名社交媒體經理,你需要幫助起草一篇Facebook帖子來宣傳公司的新產品。

沒有CO-STAR的提示工程是這樣的:

在Facebook上寫一篇文章,爲我公司的新產品做廣告。我的公司名爲Alpha,產品名爲Beta,是一種新型超快速吹風機。

下面是GPT-4的輸出結果:

這種輸出方式雖然夠用,但卻非常普通,缺乏必要的細微差別和有針對性的吸引力,無法引起公司受衆的共鳴。

下面是一個使用CO-STAR模板的示例,它提醒你將任務的其他方面融入你的提示中,特別是之前的快速提示中缺少的「風格」、「語氣」和「受衆」方面:

通過應用CO-STAR,GPT-4的回覆變得更有針對性、更有效:

CO-STAR框架指導你有條不紊地向LLM提供有關任務的所有關鍵信息,確保根據你的需求提供量身定製的優化回覆。

2. 使用分隔符將提示詞分段

分隔符是一種特殊的標記,可幫助LLM區分提示詞的哪些部分應被視爲一個意義單元。這一點很重要,因爲你的整個提示信息是作爲一長串標記符到達LLM的。

分隔符通過對提示詞的特定部分進行區別對待,爲這一語素序列塑造了結構。

值得注意的是,對於簡單的任務,分隔符可能不會影響LLM的回覆質量。

但是,任務越複雜,使用分隔符進行分段對LLM回答的影響就越大。

將分隔符用作特殊字符

分隔符可以是任何通常不會同時出現的特殊字符序列,例如:

所選特殊字符的數量和類型並不重要,只要它們足夠獨特,能讓LLM將其理解爲內容分隔符而非普通標點符號即可。

下面舉例說明如何在提示符中使用此類分隔符:

以上示例使用分隔符####進行分節,分節標題EXAMPLE CONVERSATIONS(示例對話)和EXAMPLE OUTPUTS(示例輸出)用大寫字母區分。

序言指出,要分類的對話被分在<< >>內,這些對話隨後在提示的底部提供給LLM,但沒有任何解釋性文字,但由於分隔符<<< and>>>的存在,LLM明白這些是它應該分類的對話。

下面是GPT-4的輸出結果,其中給出了情感分類,但沒有像我們要求的那樣輸出任何其他前言文本:

將分隔符用作XML標籤

使用分隔符的另一種方法是將其作爲XML標籤。XML標籤是用角括號括起來的帶有開頭和結尾的標籤。 和 就是一個例子。

這種方法很有效,因爲LLM已經接受過大量XML網頁內容的訓練,並學會了理解其格式。

下面是同樣的提示,但結構上使用XML標籤作爲分隔符:

在XML標籤中,使用與你在說明中用來描述它們的詞相同的名詞,是有好處的。

我們在上述提示中給出的指令是:

其中我們使用了名詞「對話」、「分類」和「示例」。因此,我們用作分隔符的XML標籤是 <對話> 、 <類> 、 <示例-對話> 和 <示例-類> ,確保LLM理解你的指令與用作分隔符的XML標籤之間的關係。

同樣,通過使用分隔符,以清晰、有條理的方式對指令進行分段,可確保GPT-4按你希望的方式作出回覆:

3. 使用LLM護欄創建系統提示

在進入正題之前,需要注意的是本節只適用於具有系統提示功能的LLM,而不像本文其他章節那樣適用於任何LLM。

最著名的LLM當然是ChatGPT,因此我們將使用ChatGPT作爲本節的示例。

圍繞系統提示的術語

首先,讓我們來理清術語:關於ChatGPT,有大量資源幾乎可以互換使用這三個術語:「系統提示」、「系統消息」和 「自定義指令」。

這讓很多人感到困惑,以至於OpenAI發佈了一篇文章來解釋這些術語。以下是其摘要:

「系統提示」和 「系統消息」是通過聊天完成API以編程方式與ChatGPT進行交互時使用的術語。

另一方面,「自定義指令」是通過ChatGPT用戶界面與ChatGPT交互時使用的術語。

不過總的來說,這三個術語指的是同一件事,所以不要被術語混淆了!今後,本節將使用「系統提示」一詞。現在讓我們深入瞭解一下!

什麼是系統提示?

系統提示是一種附加提示,你可以在其中提供有關LLM行爲方式的指令。它被認爲是附加的,因爲它不屬於你對LLM的「正常」提示(即用戶提示)。

在聊天中,每次你提供新提示時,系統提示都會像過濾器一樣,讓LLM在回覆你的新提示前自動應用。這意味着LLM在聊天中的每次回覆都會考慮到到系統提示。

何時使用系統提示?

你首先想到的問題可能是:既然我也可以在與LLM進一步對話之前,在新聊天的第一次提示中說明,爲什麼還要在系統提示中說明呢?

答案是,因爲LLM的對話內存是有限的。在後一種情況下,隨着對話的繼續,LLM很可能會「忘記」你在聊天中提供的第一條提示,從而遺忘這些提示。

另一方面,如果在系統提示自帶指令,那麼這些系統提示就會與聊天中的每個新提示一起被自動考慮。

這可以確保LLM在聊天過程中繼續接收這些提示,無論聊天時間多長。

總之:在整個聊天過程中使用系統提示,可提供你希望LLM在回覆時記住的提示。

系統提示應包括哪些內容?

系統提示中的說明通常包括以下幾類:

任務定義,這樣LLM就能在整個聊天過程中始終記住要做什麼。

輸出格式,以便LLM始終記住應該如何回覆。

安全護欄,這樣LLM就能始終記住它應該如何「不」回覆。安全護欄是LLM管理中的新興領域,指的是LLM允許在其中運行的配置範圍。

例如,系統提示可能如下所示:

其中每個部分涉及的類別如下:

但是,「正常」的聊天提示又是什麼呢?

現在你可能會想:聽起來系統提示中已經提供了很多信息。那我應該在聊天的 「正常」提示(即用戶提示)中放點什麼呢?

系統提示概述了當前的任務。在上面的系統提示示例中,任務被定義爲只使用一段特定文本來回答問題,並且LLM被指示以{「問題」:「答案」}格式。

在這種情況下,聊天的每個用戶提示都是你希望使用文本回答的問題。例如,用戶提示可能是「文本是關於什麼的」而LLM會回答{文本是關於什麼的?文本是關於......}。

但是,讓我們進一步概括這個任務示例。在這種情況下,我們可以將上述系統提示的第一行編輯爲:

現在,聊天的每個用戶提示,都會包括要回答問題的文本和要回答的問題,例如:[插入文本]:

在這裡,我們還使用XML標籤作爲分隔符,以便有條理地向LLM提供所需的2條信息。

XML標籤「文本」和「問題」中使用的名詞,與系統提示中使用的名詞相對應,這樣LLM就能理解標籤與系統提示指令之間的關係。

總之,系統提示應給出總體任務指令,而每個用戶提示應提供你需要任務執行的具體細節。在本例中,這些具體內容就是文本和問題。

此外:使LLM護欄動態化

以上是通過系統提示中的幾句話添加的護欄。這些護欄是一成不變的,在整個聊天過程中不會改變。

如果你希望在聊天的不同階段設置不同的護欄,該怎麼辦?

不幸的是,對於ChatGPT用戶界面的用戶來說,現在還不能直接做到這一點。

不過,如果你正在以編程方式與ChatGPT進行交互,那你就走運了!

隨着人們對構建有效的LLM護欄的關注度越來越高,一些開源軟件包也應運而生,它們可以讓你以編程方式設置更詳細、更動態的護欄。

其中值得注意的是英偉達團隊開發的NeMo護欄,它允許你配置用戶與LLM之間的預期對話流,從而在聊天的不同點設置不同的護欄,使動態護欄隨着聊天的進行而發展。非常推薦你去看一看!

4. 僅使用LLM(無需插件或代碼)分析數據集

你可能聽說過OpenAI在ChatGPT的GPT-4中推出的高級數據分析插件,高級(付費)賬戶可以使用該插件。

它允許用戶將數據集上傳到ChatGPT,並直接在數據集上運行代碼,從而進行精確的數據分析。

但你知道嗎,使用LLM分析數據集並不一定需要這樣的插件?讓我們先來了解一下單純使用LLMs分析數據集的優勢和侷限性。

LLM「不擅長」的數據集分析類型

你可能已經知道,LLM進行精確數學計算的能力有限,因此它們不適合從事需要對數據集進行精確定量分析的工作,例如:

描述性統計:通過平均值或方差等指標對數字列進行定量總結。

相關性分析:獲取列之間的精確相關係數。

統計分析:如假設檢驗,以確定各組數據點之間是否存在統計意義上的顯著差異。

機器學習:在數據集上執行預測建模,如使用線性迴歸、梯度提升樹或神經網絡。

在數據集上執行此類定量任務,是OpenAI高級數據分析插件存在的原因,這樣編程語言就可以在數據集上運行代碼來執行此類任務。

那麼,爲什麼有人要只使用LLM而不使用此類插件來分析數據集呢?

LLM擅長的數據集分析類型

LLM擅長識別模式和趨勢。這種能力源於它們在多樣化和海量數據方面接受的廣泛培訓,使他們能夠辨別可能無法立即察覺的複雜模式。

這使它們非常適合執行基於數據集模式識別的任務,例如:

異常檢測:根據一個或多個列值,識別偏離常規的異常數據點。

聚類:將各列中具有相似特徵的數據點進行分組。

跨列關係:識別跨列的綜合趨勢。

文本分析(針對基於文本的列):根據主題或情感進行分類。

趨勢分析(針對有時間方面的數據集):識別跨時間列內的模式、季節性變化或趨勢。

對於這類基於模式的任務,僅使用LLM可能比使用代碼在更短的時間內獲得更好的結果!讓我們用一個例子來充分說明這一點。

僅使用LLM分析Kaggle數據集

我們將使用一個流行的Kaggle數據集,該數據集是爲客戶個性分析而策劃的,其中一家公司試圖對其客戶聚類進行細分,以便更好地瞭解客戶。

爲便於稍後驗證LLM的分析結果,我們將把該數據集子集爲50行,並只保留最相關的列。

之後,用於分析的數據集將如下所示,其中每一行代表一位客戶,每一列描述客戶信息:

假設你在公司的營銷團隊工作。你的任務是利用這個客戶信息數據集來指導營銷工作。

這是一項分兩步走的任務:首先,利用數據集生成有意義的客戶細分。

其次,就如何對每個細分市場進行最佳營銷提出想法。現在,這是一個實際的商業問題,LLM的模式發現(第一步)能力在這個問題上確實可以大顯身手。

讓我們使用4種提示工程技術,爲這項任務設計如下提示:

1. 將複雜的任務分解成簡單的步驟

2. 參考每個步驟的中間輸出

3. 編寫LLM回答的格式

4. 將指令與數據集分開

下面是GPT-4的回覆,我們繼續將數據集以CSV字符串的形式傳遞給它。

隨後,GPT-4按照我們要求的標記符報告格式回覆了分析結果:

驗證LLM的分析結果

爲簡潔起見,我們選取兩個由LLM生成的客戶聚類進行驗證,例如年輕的家庭成員和挑剔的發燒友。

年輕的家庭

由LLM綜合得出的特徵:1980年以後出生、已婚或同居、中低收入、有子女、經常小額消費。

按LLM聚類爲該組的行:3、4、7、10、16、20

深入研究數據集,這些行的完整數據是:

這與LLM確定的配置文件完全一致。它甚至能夠在我們沒有事先進行預處理的情況下,對帶有空值的行進行聚類!

挑剔的發燒友

由LLM合成的特徵:年齡跨度大、婚姻狀況不限、收入高、子女狀況各異、購物花費高。

通過LLM聚類到該組的行:2、5、18、29、34、36

深入研究數據集,這些行的完整數據是:

這也非常符合LLM所確定的特徵!

這個例子展示了LLM在發現模式、解釋多維數據集並將其提煉爲有意義的見解方面的能力,同時確保其分析深深植根於數據集的事實真相。

如果我們使用ChatGPT的高級數據分析插件呢?

爲了完整起見,我用同樣的提示嘗試了同樣的任務,但要求ChatGPT使用代碼來執行分析,這就激活了它的高級數據分析插件。

我的想法是讓該插件使用K-Means等聚類算法直接在數據集上運行代碼,以獲得每個客戶聚類,然後再綜合每個聚類的概況,從而提供營銷策略。

然而,儘管數據集只有50行,但多次嘗試後都出現了以下錯誤信息,並且沒有任何輸出:

現在使用高級數據分析插件,在數據集上執行較簡單的任務(如計算描述性統計或創建圖表)似乎很容易實現,但需要計算算法的較高級任務有時可能會由於計算限制或其他原因導致錯誤或無輸出。

那麼,何時使用LLM分析數據集?

答案是取決於分析的類型。

對於需要精確數學計算或複雜、基於規則的處理的任務,傳統的編程方法仍然更勝一籌。

對於基於模式識別的任務,使用傳統的編程和算法方法可能具有挑戰性或更耗時。然而,LLM擅長此類任務,甚至可以提供額外的輸出,如支持其分析的附件和markdown格式的完整分析報告。

最終,是否使用LLM取決於當前任務的性質,要在LLM在模式識別方面的優勢與傳統編程技術提供的精確性和特定性之間取得平衡。

現在回到提示工程!

在本節結束之前,讓我們回過頭來看看用於生成本數據集分析的提示,並對所使用的關鍵提示工程技術進行分析:

LLM擅長完成簡單的任務,但對於複雜的任務就不那麼擅長了。因此,對於像這樣的複雜任務,重要的是要把任務分解成簡單的步驟說明,讓LLM遵循。這樣做的目的是,向LLM提供你自己執行任務時會採取的步驟。

在本例中,步驟如下:

不要 簡單地把總體任務交給LLM,而是 讓 它「把客戶分成幾組, 然後就如何向每組客戶進行營銷提出想法」。

有了循序漸進的指導,LLM就更有可能取得正確的結果。

技巧 2:引用每一步的中間產出

在向LLM提供分步流程時,我們會給每個步驟的中間輸出一個大寫的變量名,即 CLUSTERS、CLUSTER_INFORMATION、CLUSTER_NAME、MARKETING_IDEAS和RATIONALE。

使用大寫字母是爲了將這些變量名與給出的指令正文區分開來。以後可以用方括號[VARIABLE_NAME]來引用這些中間輸出。

技巧 3:規範LLM回覆的格式

在這裡,我們要求使用markdown報告格式,以美化LLM的回覆。在這裡,中間輸出中的變量名又派上了用場,可以決定報告的結構。

事實上,你甚至可以隨後要求ChatGPT以可下載文件的形式提供報告,以便你在撰寫最終報告時參考其答覆。

技巧 4:將任務指令與數據集分開

你會注意到,在第一個提示中,我們從未將數據集交給LLM。相反,提示中只給出了數據集分析的任務說明,並將其添加到了底部:

ChatGPT隨後回覆說它能理解,我們在下一個提示中將數據集作爲CSV字符串傳遞給它:

但爲什麼要把指令和數據集分開呢?

這樣做可以幫助LLM保持對每條指令的清晰理解,降低遺漏信息的可能性,尤其是像本任務這樣指令較長的複雜任務。

你可能遇到過這樣的情況,即LLM「不小心遺忘」了你作爲較長提示的一部分給出的某個指令。例如,如果你要求給出100字的回覆,而LLM給你的回覆是一個較長的段落。

通過先接收指令,再接收指令所針對的數據集,LLM可以先消化它應該做的事情,然後再對接下來提供的數據集執行指令。

不過請注意,只有聊天LLM才能實現指令和數據集的分離,因爲聊天LLM會保留會話記憶,而用於補全的LLM不會。

參考資料:

https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41