Prompt進階2:LangGPT(構建高效能Prompt策略和技巧)--最佳實踐指南
0.前言
左圖右圖 prompt 基本是一樣的,差別只在提示工程這個詞是否用中英文表達。我們看到,一詞之差,回答質量天壤之別。為了獲得理想的模型結果,我們需要調整設計提示詞,這也就是所謂的提示工程。
一個廣泛的理解誤區就是將 prompt 簡單理解為自己精心設計的那一小段提示詞,而忽略了prompt 的其他來源 。
我們用輸入法做個類比,第一張圖片中的 “春眠” 是我們的輸入,“不覺曉” 是模型輸出,所以 “春眠” 是 Prompt。到了第二張圖片, “春眠不覺曉” 是模型輸入(“不覺曉”是模型前一輪的輸出),“處處聞啼鳥” 是模型輸出,所以 “春眠不覺曉” 是 Prompt。prompt 的來源可以是我們的預設 prompt,也可以是使用者的輸入,甚至模型自己之前的輸出也是 prompt。所以,要用好大模型能力,我們應意識到:"所有會被模型用於預測輸出結果的內容,都是 Prompt"。
相比一般提示詞,將提示詞這一作文題變為填空題,編寫門檻降低的同時,更加清晰和強大。
1.1 六大提高效能的策略
1.1 策略一:清晰地表達指令
GPT 無法讀取您的思維。如果輸出過長,要求它提供簡短的回覆。如果輸出過於簡單,要求它提供專業級的寫作。如果您不喜歡輸出的格式,請示範您希望看到的格式。GPT 模型需要猜測的東西越少,您得到想要的結果的可能性就越大。
技巧:
- 在查詢中包含更多細節以獲取更相關的回答
- 要求模型採用特定的角色
- 使用分隔符清楚地指示輸入的不同部分
- 指定完成任務所需的步驟
- 提供示例
- 指定期望的輸出長度
1.2 策略二:提供參考文字
GPT 模型可以自信地編造虛假的答案,尤其是在被問到深奧的話題或被要求提供引用和 URL 時。就像考試前準備的筆記本可以幫助學生取得更好的成績一樣,為 GPT 模型提供參考文字也可以減少它編造答案的可能性。
技巧:
- 指示模型使用提供的參考文字進行回答
- 指示模型使用參考文字中的引文進行回答
1.3 策略三:將複雜任務分解為更簡單的子任務
正如在軟體工程中將複雜系統分解為一組模組元件是一個好的實踐一樣,提交給 GPT 模型的任務也應該進行拆分。複雜的任務錯誤率往往比簡單任務高。此外,複雜任務通常可以重新定義為一系列更簡單任務的工作流,其中早期任務的輸出被用於構造後期任務的輸入。
技巧:
- 使用意圖分類識別與使用者查詢最相關的指令
- 對需要非常長對話的對話應用,彙總或過濾之前的對話
- 分段摘要長文件,遞迴構建完整摘要
1.4 策略四:給予 GPT“思考”的時間
如果要求您立刻計算 17 乘以 28,您可能不會立即知道答案,但仍能透過思考得出正確解。類似地,GPT 模型如果被要求立即回答也更容易出現推理錯誤,而逐步思考問題可以更可靠地得出正確答案。
技巧:
- 指示模型在匆忙得出結論之前自己推匯出解決方案
- 使用內心獨白或一系列查詢來隱藏模型的推理過程
- 詢問模型是否在之前的輪次中遺漏了任何資訊
1.5 策略五:使用外部工具
補充 GPT 模型的輸入短板,為其提供其他工具的輸出。例如,文字檢索系統可以告知 GPT 模型相關文件的資訊。如果一項任務可以由工具而不是 GPT 模型更可靠、更高效地完成,則將其外包可以取得兩全其美的效果。
技巧:
- 使用基於嵌入的搜尋實現高效的知識檢索
- 使用程式碼執行進行更準確的計算或呼叫外部 API
- 允許模型訪問特定函式
1.6 策略六:系統地測試更改
有時候很難分辨出某項更改(如新指令或設計)是否提升了系統效能。檢視幾個例子可能會提示哪種方法更好,但樣本量太小時,難以區分真正的改進與隨機幸運。也許某項更改對某些輸入有益,但對其他輸入有害。
評估程式(或“測評”)對最佳化系統設計很有用。好的測評應該具有以下特點:
- 代表真實使用情況(或至少包含多樣性)
- 包含大量測試用例以增強統計功效(參見下表)
- 易於自動化或重複
需檢測的差異 | 需樣本量(95%置信度) |
---|---|
30% | ~10 |
10% | ~100 |
3% | ~1000 |
1% | ~10000 |
模型輸出的評估可以由計算機、人類或兩者的組合來完成。計算機可以用客觀標準(如只有單一正確答案的問題)自動進行測評,也可以用其他模型查詢對一些主觀或模糊標準進行測評。OpenAI Evals是一個開源軟體框架,提供了建立自動化測評的工具。
對於輸出範圍廣泛且同等高質量的問題(如需要長答案的問題),基於模型的測評可發揮作用。模型測評與需要人工評估的問題界限模糊,隨著模型變得越來越強大而不斷擴充套件。我們鼓勵您進行試驗,瞭解基於模型的測評對您的用例能發揮多大作用。
技巧:
- 根據參考標準答案評估模型輸出
2.技巧深入
上述每種策略都可以用具體的技巧來實現。這些技巧旨在提供思路,絕非面面俱到,您應隨意嘗試這裡未涉及的創造性思路。
2.1 策略一:清晰地表達指令
技巧:在查詢中包含更多細節以獲取更相關的回答
為了獲得高度相關的回覆,查詢需要提供任何重要的細節或上下文資訊,否則就要由模型猜測您的意圖。
劣質 | 優質 |
---|---|
Excel 中如何相加數字? | 在 Excel 中如何對一行金額自動相加?我想對整個工作表的行進行求和,總和顯示在右邊一列"總計"中。 |
誰是總統? | 2021年墨西哥總統是誰,選舉頻率是多久一次? |
編寫程式碼計算斐波那契數列。 | 用 TypeScript 編寫一個函式來有效地計算斐波那契數列。對程式碼新增詳細註釋以解釋每個部分的作用及編寫方式。 |
摘要會議記錄。 | 用一段話摘要會議記錄。然後用 markdown 列表羅列發言人及每個人的要點。最後,列出會議記錄中發言者提出的後續步驟或行動事項(若有)。 |
技巧:要求模型採用特定的角色
系統訊息可用於指定模型在回覆時採用的角色。
技巧:使用分隔符清楚地指示輸入的不同部分
三引號、XML標籤、標題等分隔符可以幫助標記需不同對待的文字片段。
對於簡單的任務,使用分隔符可能不會影響輸出質量。然而,任務越複雜,明確任務細節就越重要。不要讓 GPT 模型費勁理解您到底在要求什麼。
技巧:指定完成任務所需的步驟
有些任務最好用一系列步驟來表達。明確寫出步驟可以讓模型更容易遵循。
技巧:提供示例
在所有示例上演示任務的各種變化通常比僅給出說明更高效,但在某些情況下提供示例可能更簡單。例如,如果您希望模型模仿回覆使用者查詢的特定風格,而這種風格難以明確表達。這被稱為 “few-shot” 提示。
技巧:指定期望的輸出長度
您可以要求模型生成特定目標長度的輸出。目標輸出長度可以以單詞數、句子數、段落數、專案符號數等來指定。但是,指示模型生成特定數量的單詞不能高精度實現。模型可以更可靠地生成特定段落數或專案符號數的輸出。
2.2 策略二:提供參考文字
技巧:指示模型使用提供的參考文字進行回答
如果我們能為模型提供與當前查詢相關的可信資訊,那麼我們可以指示模型使用提供的資訊來組成其回答。
鑑於 GPT 模型具有有限的上下文視窗,為了應用此技巧,我們需要某種方法根據問題動態查詢相關資訊並新增到模型輸入中。嵌入可用於實現高效的知識檢索。請參閱技巧“使用基於嵌入的搜尋實現高效知識檢索”以獲取更多詳細資訊。
技巧:指示模型使用參考文字中的引文進行回答
如果輸入補充了相關知識,則可以輕鬆要求模型在答案中新增引文,引用提供文件的相關段落。輸出中的引文然後可以透過與提供文件的字串匹配來程式化驗證。
2.3 策略三:將複雜任務分解為更簡單的子任務
技巧:使用意圖分類識別與使用者查詢最相關的指令
對於需要大量獨立指令集來處理不同情況的任務,首先對查詢進行分類以確定所需指令會很有益。這可以透過定義固定類別並針對每個類別硬編碼相關指令來實現。該過程也可以遞回應用以將任務分解成一系列階段。這種方法的優點是每個查詢只包含執行任務下一階段所需的指令,這可以與使用單個查詢執行整個任務相比降低錯誤率。這也可以降低成本,因為更大的提示需要更高的執行成本(檢視價格資訊)。
例如,對於客戶服務應用,查詢可以劃分為以下類別:
根據客戶查詢的分類,可以為 GPT 模型提供更具體的指令來處理後續步驟。例如,假設客戶需要“故障排除”的幫助。
注意,模型被指示在對話狀態發生變化時輸出特殊字串。這使我們可以將系統轉化為狀態機,其中狀態確定注入哪些指令。透過跟蹤狀態、該狀態下相關的指令,以及從該狀態允許的狀態轉移,我們可以為使用者體驗設定更難以用不太結構化的方法實現的約束。
技巧:對需要非常長對話的對話應用,彙總或過濾之前的對話
由於 GPT 模型具有固定的上下文長度,因此將整個對話包含在上下文視窗內的使用者與助手之間的對話無法無限期地繼續。
這一問題有多種解決方法,一種是在輸入大小達到預定閾值長度時,使用一個查詢來總結對話的一部分,並將之前對話的摘要包含在系統訊息中。或者,可以在整個對話的過程中非同步地在後臺總結之前的對話。
另一種解決方案是動態選擇與當前查詢最相關的之前對話部分。請參閱技巧“使用基於嵌入的搜尋實現高效知識檢索”。
技巧:分段摘要長文件,遞迴構建完整摘要
由於 GPT 模型具有固定的上下文長度,它們無法在單個查詢中概括比上下文長度減去生成摘要長度還要長的文字。
要摘要像書籍這樣的非常長文件,我們可以使用一系列查詢逐部分摘要文件。部分摘要可以連線在一起生成摘要的摘要。該過程可以遞迴進行,直到整個文件被摘要。如果為了理解後面部分需要使用前面部分的資訊,則可以在摘要某點內容時,將該點之前文字的執行摘要也包括在內,這一技巧也很有用。OpenAI 之前的研究已經研究了使用 GPT-3 變體遞迴摘要書籍的效果。
2.4 策略四:給予 GPT“思考”的時間
技巧:指示模型在匆忙得出結論之前自己推匯出解決方案
有時候明確地讓模型先自行推理出答案再回複使用者,可以獲得更好的效果。
例如,我們想讓模型評判一個學生對數學問題的解答。 最直接的方法是簡單地詢問模型該解答是否正確。
但如果我們首先讓模型自己解出題目並生成答案,再讓其比較學生的答案,就更容易發現問題:
SYSTEM: 首先自己解出這道題並生成答案。然後再比較你的答案和學生的答案,判斷學生的答案是否正確。在比較之前,不要依賴學生的答案來決定其是否正確。
USER: <插入題目>
<插入學生答案>
ASSISTANT: <模型先生成自己的答案>
<模型比較兩個答案並作出評價>
技巧:使用內心獨白或一系列查詢來隱藏模型的推理過程
有時候我們不想讓使用者看到模型的全部推理過程,只需要展示最後的回覆。
這時可以使用"內心獨白"把需要隱藏的部分放入特定格式中,在展示給使用者前把這些部分刪除。
或者,可以進行一系列查詢,其中只有最後一個查詢的輸出會展示給使用者。
#隱藏查詢1: 僅提供問題描述,讓模型解出答案
#隱藏查詢2: 提供問題描述、模型解答和學生解答,讓模型判斷學生解答的正確性
#可見查詢: 假設模型是一個有幫助的導師,如果學生錯誤,給出提示;如果正確,給予鼓勵
技巧:在前幾輪後詢問模型是否遺漏了相關資訊
當我們要求模型列舉某文字中的所有相關摘錄時,模型常會過早停止而未羅列全部。
這時可以在前幾輪查詢後,再詢問模型是否還遺漏了相關內容,以獲取更完整的結果。
2.5 策略:使用外部工具
技巧:使用基於嵌入的搜尋實現高效的知識檢索
我們可以在模型的輸入中加入相關的外部資訊,幫助其生成更準確的回覆。
例如,如果使用者詢問一個具體的電影,將該電影的高質量資訊(演員、導演等)也加入輸入中會很有用。
透過使用文字嵌入可以實現高效的知識檢索,從而動態地在執行時將相關資訊加入模型輸入中。
具體實現可以參考 OpenAI Cookbook。
技巧:使用程式碼執行進行更精確的計算或呼叫外部 API
GPT 模型自己進行算術運算或長時間計算時誤差很大。這時可以讓其編寫程式碼進行運算並執行。
程式碼執行也可以用來呼叫外部 API。如果事先教會模型如何使用某 API,它可以編寫呼叫該 API 的程式碼。
需要注意,執行模型生成的程式碼有安全風險,需要採取防護措施。
技巧:系統地測試各種改變
有時候很難判斷某項改變是否提升了系統效能。僅觀察幾個例子來判斷是不可靠的。
適當的評估流程對最佳化系統設計非常有用。好的評估應該具有代表性、包含足夠多的測試用例。
評估可以由計算機、人工或兩者混合來進行。計算機可以自動進行客觀的評估。OpenAI Evals 提供了用於構建自動評估的開源工具。
當存在多種可被認為同等優質的輸出時,使用模型進行評估也可行。我們鼓勵針對不同使用案例進行試驗,衡量模型評估的可行性。
技巧:參照標準答案來評估模型輸出
如果問題的正確答案需要包含某些已知的事實,我們可以用模型查詢來統計答案中包含了多少需要的事實。
例如:
SYSTEM: 檢查提交的答案是否直接包含下列資訊:
- Neil Armstrong 是第一個登月的人
- Neil Armstrong 首次登月的日期是 1969年7月21日
對於每個要點:
1 - 重述要點
2 - 提供與要點最相關的答案摘錄
3 - 分析僅看摘錄的人是否可以推斷出該要點,解釋你的推理過程
4 - 如果答案是肯定的,寫 "yes",否則寫 "no"
最後,統計"yes"的個數,用以下格式提供:
{"count": <yes的個數>}
如果答案滿足所有要點,count 將為要點的總數。如果僅滿足部分要點,count 將小於要點總數。
這樣可以構建不同的模型評估變體來統計答案與標準答案的重合情況,以及是否存在矛盾。
更多優質內容請關注公號:汀丶人工智慧;會提供一些相關的資源和優質文章,免費獲取閱讀。
- 參考連結:
https://github.com/EmbraceAGI/LangGPT/tree/main
https://github.com/EmbraceAGI/LangGPT/blob/main/Docs/GPTBestPractise.md