熊猫Jay:万字解读ChatGPT提示词最佳实践

介绍

大家好,我是熊貓Jay,許多小夥伴向我反饋,雖然知道很多提示詞模版,但關於提示詞的基本最佳實踐仍然不夠清晰。令人驚訝的是,即使有一些小夥伴 使用GPT近半年,在與我交流後,我發現他們實際上並沒有深入研究這些最佳實踐,導致他們在提出問題和優化提示詞的時候還是摸不著頭腦。

這篇文章是寫給對於提示詞最佳實踐瞭解一般的新手小夥伴們,大佬們可以忽略啦。

文章也被多位大佬們所鼓勵和推薦,非常感謝他們:

其次,我會針對 不同的策略實際測試一些案例,幫助大家更快地理解這些最佳實踐。大家不用擔心自己無法理解官方的術語,或者長篇大論的內容,針對比較 難以理解的最佳實踐,我會進行 解讀和案例的說明。並且,我在每個最佳實踐下,我都備注了 適用人群,大家可以看看自己是否適合,這樣有助於節省大家的閱讀時間。

那話不多說,我們開始吧。

角色

在每項最佳實踐的案例中,會涉及到不同的三種角色 USER、ASSISTANT、SYSTEM,這邊我先統一介紹下。我們來問下ChatGPT:

SYSTEM 這個角色在ChatGPT官方頁面的對話中,基本上是不會出現的,因為ChatGPT主要是為了與用戶進行直接的交互。但是如果我們 利用ChatGPT的API開發 來自己的應用,那麼 SYSTEM 角色是可以在一些場景中發揮作用的。

如下是一個在 音樂小助手 應用程序的對話場景,我們可以看到,SYSTEM 角色充當了後台角色的作用:

 SYSTEM: 提示:您可以問我任何與音樂相關的問題。
 USER: 什麼是貝多芬的第五交響樂?
 ASSISTANT: 貝多芬的第五交響樂是......(詳細描述)。

此外,如果有小夥伴不瞭解編程方式,但是想要在ChatGPT上嘗試SYSTEM角色,則可以直接使用即可。

這裡”當我請求幫助寫東西時,你將在每個段落中至少加入一個笑話或俏皮話。” 在案例中就是 SYSTEM 角色,我們在聊天窗口用 USER 的角色直接發送即可。

當我們對角色具備清晰的瞭解後,看下面官方提供的案例就不會迷惑啦。

最佳實踐1 – 編寫清晰的指令

GPT 無法讀取您的思想。如果它們的輸出過長,請要求簡潔回復。如果它們的輸出過於簡單,請要求專業水平的寫作。如果您不喜歡某種格式,請展示您想要看到的格式。GPT 越少猜測您想要的內容,您獲得的可能性就越大。

策略:

  • 在查詢中包含詳細信息,以獲得更相關的答案。
  • 要求模型扮演某个角色。
  • 使用分隔符清晰地表示輸入的不同部分。
  • 指定完成任務所需的步驟。
  • 提供示例。
  • 指定輸出的期望長度。
  • 提供參考文本。

策略1:在查詢中包含細節以獲得更相關的回答

適用人群:新手

難度:🌟

為了獲得高度相關的回復,請確保請求提供任何重要的細節或上下文。否則,這會讓模型進行猜測您的意思,結果也會不盡人意。

解读

這個策略的價值在於,通過提供更多的詳細信息,用戶可以獲得更準確、更具體的答案。這樣可以減少模型的猜測和誤解,從而提高交互的效率和滿意度。GPT模型就像是您的男朋友,但它有時候是真的猜不出來呀(手動 狗頭)。

策略2:要求模型扮演角色

適用人群:新手

難度:🌟

系統消息可以用於指定模型在回復中扮演的角色。

 USER
 寫一封感謝信給我的軟件供應商,感謝他們準時並在短時間內交貨。這使我們能夠交付一份重要的訂單。
 
 SYSTEM
 當我請求幫助寫東西時,你將在每個段落中至少加入一個笑話或俏皮話。

解讀

當我們指定一個角色,這樣,模型的回答將會根據所採納的角色特性來進行,使得回答更具特色和針對性。那麼輸出的質量也會隨之提升。

策略3:使用分隔符清晰標示輸入的不同部分

適用人群:新手

難度:🌟

像三重引號、XML標記、節標題等分隔符可以幫助標示需要以不同方式處理的文本部分。

 USER
 使用三重引號中的文本撰寫一首詩。
 
 """在這裡插入文本"""
 SYSTEM
 你將獲得一對關於同一主題的文章(用XML標記分隔)。首先總結每篇文章的論點。然後指出哪篇文章提出了更好的論點,並解釋為什麼。
 
 USER
 <article>在這裡插入第一篇文章</article>
 
 <article>在這裡插入第二篇文章</article>
 SYSTEM
 你將獲得一份論文摘要和一個建議的標題。論文標題應該給讀者一個很好的論文主題概念,同時也要引人注目。如果標題不符合這些標準,請提出5個備選方案。
 
 USER
 摘要:在這裡插入摘要
 
 標題:在這裡插入標題

對於像這樣的簡單任務,使用分隔符可能不會對輸出質量產生影響。然而,任務越複雜,將任務細節澄清變得越重要。不要讓 GPTs 努力理解您究竟在要求什麼。

解讀

想象一下,您正在組裝一款複雜的玩具,但所有的零件都混在一起,沒有任何標籤或說明。這會讓組裝過程變得非常困難,對吧?

同樣,當模型處理一個複雜的輸入時,如果沒有清晰的分隔符來區分不同的部分,模型可能會混淆或誤解某些內容。使用分隔符就像給玩具零件加上標籤和說明,使組裝過程變得更加流暢和準確。

策略4:指定完成任務所需的步驟

適用人群:新手

難度:🌟

某些任務最好指定為一系列步驟。明確寫出這些步驟可以讓模型更容易跟隨。

 SYSTEM
 使用以下逐步說明來回應用戶輸入。
 
 步驟1 - 用戶將用三重引號提供給您文本。用前綴"Summary: "對這段文本進行一句總結。
 
 步驟2 - 將步驟1中的總結翻譯成西班牙語,並使用前綴"Translation: "。

解讀

當我們提供固定的步驟,要求模型提供輸出,這樣模型可以參考步驟更好地輸出內容。如下為測試案例:

策略5:提供示例

適用人群:新手

难度:🌟

通常情況下,提供適用於所有示例的一般說明比通過示例演示任務的所有變體更高效,但在某些情況下,提供示例可能更容易。例如,如果您打算讓模型複製一種難以明確描述的用戶查詢響應風格。這被稱為 “few-shot” 提示。

 SYSTEM
 用一致的風格回答。
 
 USER
 教我什麼是耐心。
 
 ASSISTANT
 刻出最深峽谷的河流起源於一處平凡的泉眼;最壯麗的交響樂源於一顆單獨的音符;最複雜的掛毯始於一根孤立的線縷。
 
 USER
 教我關於海洋。

策略6:指定所需的輸出長度

適用人群:新手

難度:🌟

您可以要求模型生成指定長度的輸出。目標輸出長度可以根據詞數、句子數、段落數、項目符號數等來指定。但請注意,指示模型生成特定數量的單詞並不具有高精確度。模型更可靠地生成具有特定段落或項目符號數量的輸出。

 USER
 用大約50個詞總結由三重引號分隔的文本。
 
 """在這裡插入文本"""
 
 USER
 用2個段落總結由三重引號分隔的文本。
 
 """在這裡插入文本"""
 
 USER
 用3個項目符號總結由三重引號分隔的文本。
 
 """在這裡插入文本"""

解讀

這裡就不過多解讀了,相信大家都能理解不同時間內(字段長度相當於一個人說話的時間),一個人思考的時間和回答的內容長度也是不一樣。ㄈ

額外需要注意的是,有些小夥伴反饋,明明指定了讓GPT輸出70字,但是很多時候並不是70個字。我們來看下模型的回復。

這裡的思路和提問方式,源自小七姐的在線答疑,在此感謝小七姐。

我反復提問了多次後,發現始終GPT不能給出正確的字數。最終請它分析後,理解了原因是什麼。

那解決方案就是,我們可以指定相對寬泛一些的字數範圍,如 70~90字。

最佳实践2 – 提供参考文本

GPT 可以自信地编造假答案,特别是当被询问奇特的话题、引用和网址时。就像一张笔记可以帮助学生在考试中取得更好的成绩一样,为 GPT 提供参考文本可以帮助它以较少的虚构进行回答。

策略:

  • 指示模型使用參考文本進行回答。
  • 指示模型使用參考文本中的引用進行回答。

策略1:指示模型使用參考文本回答問題

適用人群:新手

難度:🌟

如果我們能夠為模型提供與當前查詢相關的可信信息,那麼我們可以指示模型使用提供的信息來組成其答案。

 SYSTEM
 使用由三重引號分隔的所提供的文章來回答問題。如果答案在文章中找不到,寫下"I could not find an answer."
 
 USER
 <插入文章,每篇文章由三重引號分隔>
 
 問題:<插入問題>

鑒於GPT有限的上下文窗口,為了應用此策略,我們需要某種方式動態查找與被提問的問題相關的信息。可以使用提供指定內容來實現高效的知識檢索。

解讀

我覺得最大的好處是 減少錯誤:因為模型可能會 幻想 從而發明答案,尤其是當被問及一些偏門的話題或需要引用和URL時。通過提供參考文本,我們可以減少模型發明答案的可能性。

如下為測試數據:

策略2:指示模型使用參考文本的引文進行回答

適用人群:新手

難度:🌟

如果輸入已經被相關知識補充,直接要求模型通過引用所提供文檔的段落來添加引文到其回答中就很簡單了。請注意,可以通過在所提供的文檔中進行字符串匹配來編程驗證輸出中的引文。

 SYSTEM
 你將得到一個由三重引號分隔的文檔和一個問題。你的任務是只使用提供的文檔來回答問題,並引用用來回答問題的文檔段落。如果文檔不包含回答此問題所需的信息,那麼只需寫下:「信息不足」。如果提供了問題的答案,必須用引文進行注釋。使用以下格式引用相關段落 ({"citation": …})。
 
 USER
 """<插入文檔>"""
 
 問題:<插入問題>

測試數據:

最佳實踐3 – 將複雜任務分解為簡單子任務

就像在軟件工程中將複雜系統分解為一組模塊化組件一樣,提交給 GPT 的任務也是如此。相比較而言,複雜任務的錯誤率往往較高。此外,複雜任務通常可以重新定義為一系列較簡單任務的工作流程,其中早期任務的輸出用於構建後續任務的輸入。

策略:

  • 使用意圖分類來識別用戶查詢的最相關指令。
  • 對於需要非常長對話的對話應用程序,總結或過濾以前的對話。
  • 逐段概括長文檔並遞歸構建完整概要。

策略1:使用意圖分類來識別用戶查詢最相關的指令

適用人群:新手、熟練者

難度:🌟🌟

當處理不同情況的任務時,可以先將任務按類型分類,然後為每種類型設計特定的步驟,就像做菜一樣有食譜。複雜任務可以分解成小階段,每個階段也有自己的指令,這樣整個處理過程更有組織和效率。

這種方法的優點是每個查詢只包含執行任務的下一階段所需的那些指令,這可能導致比使用單個查詢執行整個任務時的錯誤率更低。這也可能導致成本更低,因為更大的提示運行成本更高。

這裡的成本針對使用API的小夥伴們。

假設, 例如對於客戶服務應用,查詢可能被有用地分類如下:

 SYSTEM
 你將得到客戶服務查詢。將每個查詢分類為主要類別和次要類別。以json格式提供你的輸出,包含主要和次要兩個關鍵字。
 
 主要類別:計費,技術支持,賬戶管理,或一般咨詢。
 
 計費次要類別:
 - 退訂或升級
 - 添加付款方式
 - 收費解釋
 - 爭議收費
 
 技術支持次要類別:
 - 故障排除
 - 設備兼容性
 - 軟件更新
 
 賬戶管理次要類別:
 - 密碼重置
 - 更新個人信息
 - 關閉賬戶
 - 賬戶安全
 
 一般咨詢次要類別:
 - 產品信息
 - 價格
 - 反饋
 - 要求與人對話
 
 USER
 我需要讓我的互聯網再次工作。
 

基於客戶查詢的分類,可以向GPT模型提供一組更具體的指令來處理下一步。例如,假設客戶需要幫助”故障排除”。

 SYSTEM
 你將得到需要在技術支持環境中進行故障排除的客戶服務查詢。通過以下方式幫助用戶:
 
 - 讓他們檢查到/從路由器的所有電纜是否已連接。注意,電纜隨著時間的推移會常常鬆動。
 - 如果所有電纜都已連接並且問題仍然存在,詢問他們正在使用哪種路由器模型
 - 現在你將建議他們如何重新啓動他們的設備:
 -- 如果型號是MTD-327J,建議他們按下紅色按鈕並保持5秒鐘,然後等待5分鐘後再測試連接。
 -- 如果型號是MTD-327S,建議他們拔掉並重新插入,然後等待5分鐘後再測試連接。
 - 如果客戶在重啓設備並等待5分鐘後的問題仍然存在,通過輸出{"IT support requested"}將他們連接到IT支持。
 - 如果用戶開始提問與此主題無關的問題,那麼請確認他們是否希望結束當前關於故障排除的聊天,並根據以下方案對他們的請求進行分類:
 
 <插入上述主/次分類方案>
 
 USER
 我需要讓我的互聯網再次工作。
 

請注意,已經指示模型在會話狀態改變時發出特殊的字符串。這使我們能夠將我們的系統轉變為狀態機,其中狀態決定哪些指令被注入。通過跟蹤狀態,什麼指令在那個狀態下是相關的,以及從那個狀態允許什麼狀態轉換,我們可以在用戶體驗周圍設置保護,這在一種不太結構化的方法中很難實現。

解讀

簡單來說,就是先理解用戶的真實需求,然後根據這個需求提供最合適的答案或操作。這種方法特別適用於那些需要多種獨立指令來處理不同情況的任務。通過首先分類查詢的類型,並使用該分類來確定所需的指令,可以更有效地為用戶提供他們真正需要的信息或服務。

如下為測試過程的對話:

由於這次案例的內容較多,我分享在shareGPT上了,需要測試的小夥伴,可以通過鏈接來查看或者開啓繼續對話。

鏈接為:https://shareg.pt/Y6j83cX

策略2:對於需要很長對話的對話應用程序,總結或過濾以前的對話

適用人群:熟練者、程序開發人員

難度:🌟🌟

就好像我們在一個需要很長對話的聊天程序中進行對話,比如和一個虛擬助手聊天,由於GPT具有固定的上下文長度,用戶和助手之間的對話不能無限地進行。

另一種方法是根據當前查詢選擇和當前問題最相關的前面對話部分。這就好比你在找書的目錄一樣,你會去尋找和你問題相關的章節。這裡提到的”使用基於嵌入的搜索來實現高效的知識檢索”,是一種方法,可以讓模型更有效地找到和當前問題相關的信息。

解讀

我通過翻譯和語言通俗化後,上面的介紹已經大致可以理解。那我這邊繼續列舉一個案例來體現這個策略的意義:

想象一個案例: 在線醫療咨詢應用,用戶可能會描述他們的症狀、過去的醫療歷史、藥物使用等。隨著對話的進行,這些信息可能會 變得非常多。但是,當用戶 提到一個新的症狀或問題時,模型需要記住之前的所有相關信息來提供準確的建議。在這種情況下,對之前的對話進行 總結或篩選,只保留 與當前問題最相關的信息,可以幫助模型更好地理解和回應用戶的需求。

如下為案例模擬對話數據:

 用戶:我最近總是感到頭痛。
 ChatGPT:您的頭痛是突然發生的還是已經有一段時間了?您還有其他的症狀嗎?
 
 用戶:已經有兩個星期了,而且我還伴隨著惡心。
 ChatGPT:您最近有沒有服用任何藥物或者有其他的醫療歷史?
 
 用戶:我有高血壓,正在吃降壓藥。
 ChatGPT:瞭解了。您的頭痛和惡心可能與您的高血壓或降壓藥有關。建議您咨詢醫生並檢查一下。
 
 ...[對話繼續]
 
 當對話達到一定長度後:
 
 用戶:我還想知道頭痛的其他可能原因。
 ChatGPT(在內部對之前的對話進行總結):您之前提到有高血壓並正在服用降壓藥,伴隨頭痛和惡心。除了高血壓和藥物反應,頭痛的其他可能原因包括:應激、缺乏睡眠、飲食不當等。

這樣,即使在長對話中,ChatGPT也能夠準確地回應用戶的問題,同時考慮到之前的對話內容。

策略3:分段匯總長文檔並遞歸構造完整匯總

適用人群:熟練者

難度:🌟🌟

簡單來說,就是GPT這樣的模型在處理文本時有個限制,就是它們只能看到一定長度的文字,超過這個長度就看不到了。如果要總結一個超長的文檔,比如一本書,就需要分段進行。每個段落可以作為一個查詢來總結,然後這些段落的總結再連接在一起,形成整體的總結。這個過程可以重復進行,直到整本書都被總結完。

如果後面的內容需要前面的內容作為背景才能理解,那麼在總結後面部分的時候,可以在查詢中包含之前已經總結過的內容,這樣可以幫助模型更好地理解整個文檔。OpenAI之前也研究過使用GPT-3的變種來進行這種匯總長文檔的方法,效果還不錯。

解讀

通過通俗化的翻譯,已經將該策略解釋的相對比較清晰,所以這裡不再過多贅述。我們來看下一個案例,就可以理解它的應用場景:

假設你有一本關於人工智能歷史的300頁書,你想要一個簡短的摘要。由於這本書的長度遠遠超過了 模型的上下文的token 限制,你可以首先將書分為章節,並為每一章生成一個摘要。接下來,你可以將這些章節摘要連接起來,並再次為它們生成一個摘要,得到整本書的總摘要。如果某些章節之間有 關聯或依賴關係,你可以在總結後續章節時包括前面章節的摘要,以確保摘要的準確性和連貫性。 

token是什麼,是一個字的意思嗎?有些小夥伴開始可能還不明白,由於篇幅限制,我簡單解釋下:

Token是文本數據的基本單元,可能代表一個字、詞、標點或句子,不同模型中token代表的內容會有細微區別。

如Claude-2-100k模型上限為100,000個Token。

ChatGPT-16 k 模型的上下文上限是 16k Tokens,也就是 16000 個token。

ChatGPT-4-32 k 模型的上下文上限是 32k Tokens,也就是 32000 個to ken。

達到上限後,模型會「遺忘」早期的對話內容。

在模型如Transformer中,文本首先被切分為Tokens,然後被轉化為向量,供神經網絡處理。說人話就是,我們輸入的文字會被轉化成一個一個token,大模型在詞語接龍般處理後,輸出的也是一個一個token。

這裡關於GPT-3的token統計網站,大家可以試下:https://platform.openai.com/tokenizer

如果我們希望詳細地瞭解token的含義,大家可以看看這邊文章的章節 語言模型中的 token 來系統地瞭解token的原理: https://zhuanlan.zhihu.com/p/620426699

最佳實踐4 – 給予 GPT 足夠的時間進行「思考」

如果被要求計算 17 乘以 28,您可能無法立即知道答案,但可以通過時間來計算出來。同樣,GPT 在試圖立即回答問題時會出現更多的推理錯誤,而不是花時間思考答案。在得出答案之前,要求進行一連串的推理過程可以幫助 GPT 更可靠地推理出正確答案。

策略:

  • 指示模型在得出結論之前自行解決問題。
  • 使用內心獨白或一系列查詢來隱藏模型的推理過程。
  • 詢問模型是否在之前的處理中漏掉了任何內容。

策略1:在匆忙得出結論前,指導模型自行找出解決方案

適用人群:熟練者、程序開發人員

難度:🌟🌟

有時候,我們明確地指導模型在得出結論之前先進行從頭至尾的推理,會得到更好的結果。比如,假設我們希望模型評估一個學生解決數學問題的方法。最直觀的做法就是直接詢問模型學生的解決方案是否正確。

 SYSTEM
 判斷學生的解答是否正確。
 
 USER
 問題描述:我正在建造一個太陽能發電裝置,我需要幫助計算財務狀況。
 - 土地費用為每平方英尺100美元
 - 我可以以每平方英尺250美元的價格購買太陽能板
 - 我已經商定了一個每年固定費用為10萬美元的維護合同,以及每平方英尺額外的10美元
 第一年運營的總成本是多少,作為面積(平方英尺)的函數來表示。
 
 學生的解答:設x為裝置的面積(平方英尺)。
 1. 土地費用:100x
 2. 太陽能板費用:250x
 3. 維護費用:100,000 + 100x
 總成本:100x + 250x + 100,000 + 100x = 450x + 100,000
 
 ASSISTANT
 學生的解答是正確的。
 

測試數據如下:

但實際上,學生的解答並不正確!我們可以通過提示模型首先 生成自己的解答,從而讓模型成功地注意到這一點。

 SYSTEM
 首先自己解決這個問題,然後將你的解答與學生的解答進行比較,評估學生的解答是否正確。在你自己解決這個問題之前,不要判斷學生的解答是否正確。
 
 USER
 問題描述:我正在建造一個太陽能發電裝置,我需要幫助計算財務狀況。
 - 土地費用為每平方英尺100美元
 - 我可以以每平方英尺250美元的價格購買太陽能板
 - 我已經商定了一個每年固定費用為10萬美元的維護合同,以及每平方英尺額外的10美元
 第一年運營的總成本是多少,作為面積(平方英尺)的函數來表示。
 
 學生的解答:設x為裝置的面積(平方英尺)。
 1. 土地費用:100x
 2. 太陽能板費用:250x
 3. 維護費用:100,000 + 100x
 總成本:100x
 
  + 250x + 100,000 + 100x = 450x + 100,000
 
 ASSISTANT
 設x為裝置的面積(平方英尺)。
 1. 土地費用:100x
 2. 太陽能板費用:250x
 3. 維護費用:100,000 + 10x
 總成本:100x + 250x + 100,000 + 10x = 360x + 100,000
 
 學生的解答是不正確的。他們在計算維護費用時犯了錯誤,使用了100x而不是10x。第一年運營的正確總成本應為360x + 100,000。
 

測試數據如下:

解读

從測試數據中可以看出,學生先提供答案後,模型自己生成答案並進行對比得到最終的結論,這樣的準確性也更高。

因此,我們向模型提出一些 複雜的計算問題 時,可以讓模型先進行深入的思考和推理得出它的答案,再對比我們準備的的答案,這是一種提高此類場景正確性的小技巧。

策略2:使用內心獨白或一系列查詢來隱藏模型的推理過程 

適用人群:熟練者、開發人員

難度:🌟🌟🌟

前一個策略表明,模型有時需要在回答特定問題之前詳細地推理一個問題。對於某些應用程序,模型用來得出最終答案的推理過程是 不適合與用戶分享的。

例如,在輔導應用程序中,我們可能 希望鼓勵學生自己找出答案,但是模型對學生解答的推理過程可能會向學生透露答案。

內心獨白是一種可以用來解決這個問題的策略。內心獨白的想法是,指導模型將那些應該對用戶隱藏的輸出部分放入一種結構化的格式中,使其易於解析。然後,在向用戶呈現輸出之前,解析輸出並只使部分輸出可見。

 SYSTEM
 按照以下步驟回答用戶的查詢,以詢問用戶提供問題開始。
 
 步驟 1 - 首先自己解決問題。不要依賴學生的解答,因為它可能是錯誤的。將此步驟的所有工作都包含在三引號(""")中。
 
 步驟 2 - 將你的解答與學生的解答進行比較,並評估學生的解答是否正確。將此步驟的所有工作都包含在三引號(""")中。
 
 步驟 3 - 如果學生犯了錯誤,確定你可以給學生什麼提示,而不透露答案。將此步驟的所有工作都包含在三引號(""")中。
 
 步驟 4 - 如果學生犯了錯誤,將上一步的提示提供給學生(在三引號之外)。寫"提示:",而不是"步驟4 - ...」。
 
 USER
 問題描述: <插入問題描述>
 
 學生的解答: <插入學生的解答>

這裡為了更加精准的得到結果,我使用了GPT-4模型,因為GPT-3計算複雜數據題時不夠穩定。

利用內心獨白的方式,這樣避免提前暴露答案,而是讓學生先提供答案後,模型自己生成答案並進行對比得到最終的結論。

測試數據: 

或者,這也可以通過一系列查詢實現,其中所有查詢的輸出(除了最後一個)都對最終用戶隱藏。

首先,我們可以讓模型自己解決問題。由於這個初始查詢不需要學生的解答,所以可以省略它。這提供了額外的優勢,即模型的解答不可能被學生嘗試的解答所偏倚。

 USER
 <插入問題描述>

測試數據:

接下來,我們可以讓模型使用所有可用的信息來評估學生解答的正確性。

 SYSTEM
 將你的解答與學生的解答進行比較,然後評估學生的解答是否正確。
 
 USER
 問題描述:"""<插入問題描述>"""
 
 你的解答:"""<插入模型生成的解答>"""
 
 學生的解答:"""<插入學生的解答>"""

按照這種方式,模型可以更加清晰的對比,並告訴學生的答案是錯誤的。

測試數據:

最後,我們可以讓模型使用自己的分析,構造一個有幫助的導師的回復。

 SYSTEM
 你是一位數學導師。如果學生犯了錯誤,以不透露答案的方式給學生提供一個提示。如果學生沒有犯錯誤,簡單地對他們提供鼓勵性的評論。
 
 USER
 問題描述:"""<插入問題描述>"""
 
 你的解答:"""<插入模型生成的解答>"""
 
 學生的解答:"""<插入學生的解答>"""
 
 分析:"""<插入模型在前一步生成的分析>"""

這種方式,模型給出一些思路,用來鼓勵學生繼續解決該問題。如下為測試數據:

解讀

經過測試,我覺得通過展示模型的思考過程,用戶可以更好地理解模型是如何得出其答案的。其次,當用戶看到模型是如何逐步推理出答案的,他們可能會更加信任模型的輸出。

另外,對於教育或培訓應用,展示推理過程可以幫助學習者理解問題的解決方法,這也是一個在教育和培訓領域適用該策略的最佳案例。

策略3:詢問模型是否在前幾輪查詢中遺漏了任何內容

適用人群:熟練者、開發人員

難度:🌟🌟🌟

假設我們正在使用模型列出與特定問題相關的源文本的摘錄。在列出每一篇摘錄之後,模型需要確定是否應開始編寫另一篇,或者是否應該停止。如果源文檔很大,模型通常會過早地停止,無法列出所有相關的摘錄。在這種情況下,通過提示模型用後續查詢找出它在前幾輪中遺漏的摘錄,通常可以獲得更好的性能。

 SYSTEM
 你將獲得一個用三引號分隔的文檔。你的任務是選擇與以下問題相關的摘錄:"人工智能歷史上發生過哪些重大的經典轉變事件。"
 
 確保摘錄包含所有相關的上下文,以便解釋它們 - 換句話說,不要提取缺少重要上下文的小片段。以如下的JSON格式提供輸出:
 
 [{"摘錄": "..."},
 ...
 {"摘錄": "..."}]
 
 USER
 """<插入文檔>"""
 
 ASSISTANT
 [{"摘錄": "模型在這裡寫下一段摘錄"},
 ...
 {"摘錄": "模型在這裡寫下另一段摘錄"}]
 
 USER
 還有其他相關的摘錄嗎?請注意不要重復摘錄。並確保新的摘錄確實與問題有關,而且在舊的摘錄中還沒有涵蓋。
 
 ASSISTANT
 [{"摘錄": "模型在這裡寫下一段摘錄"},
 ...
 {"摘錄": "模型在這裡寫下另一段摘錄"}]

注意,如果文檔特別長,這個策略可能需要多次應用。

由於測試的文章內容較大,我將聊天記錄上傳在shareGPT上了,有需要的小夥伴可以訪問鏈接查看或者繼續對話。

地址:https://shareg.pt/F3KN3NC

部分测试数据:

解讀

通過上述的測試數據,我們可以發現,的確模型存在這種遺忘的現象,那是因為我們輸入的內容超過了一定的token,導致模型存在了一些遺忘(在介紹token時,我有簡單說明),這裡請模型再次檢查,讓模型幫我們重新整理了數據。

因此,請AI 再次 自我檢查 的提示詞習慣, 最好是在輸入大量文本後,或者在大量對話後,讓模型進行自己檢查,可以幫助我們收穫更加準確的答案哦。

最佳實踐5 – 使用外部工具

通過向 GPT 提供其他工具的輸出來彌補 GPT 的不足之處。例如,文本檢索系統可以向 GPT 提供相關文檔信息。代碼執行引擎可以幫助 GPT 進行數學計算和代碼運行。如果通過工具而不是 GPT 可以更可靠或更高效地完成任務,則將其卸載以獲得最佳結果。

策略:

  • 使用基於嵌入的搜索來實現高效的知識檢索。
  • 使用代碼執行來執行更準確的計算或調用外部 API。

策略1:利用基於嵌入的搜索實現高效的知識檢索

適用人群:程序開發人員

難度:🌟🌟🌟🌟

當談論模型利用外部信息源時,就像是給它提供更多的信息來幫助它做出更準確、有根據的回答。你可以想象你在跟一個很聰明的朋友聊天,有時候你會告訴他一些背景信息,這樣他就能更好地回答你的問題。

這種外部信息可以通過一種叫做「文本嵌入」的方式被加入到模型中。文本嵌入就像是把文本轉換成特殊的向量,這個向量可以 展示不同文本之間的關係。如果兩段文本很相似或者相關,它們對應的向量就會比較接近。有些聰明的計算方法可以快速地找出相似向量,這就使得我們可以有效地找到相關的信息。

想象一下,我們有很多關於電影的文本,每個文本都可以被轉換成一個向量並存儲起來。當用戶問一個關於電影的問題時,我們可以把這個問題也轉換成一個向量,然後在向量空間中搜索最接近這個向量的文本向量,找到最相關的文本塊,然後從中獲取信息來回答用戶的問題。

簡單來說,就是模型可以借助外部信息來更好地回答問題,而文本嵌入是一種幫助我們在海量文本中迅速找到相關信息的聰明方法。這樣一來,我們就能讓模型變得更聰明,能夠根據背景信息做出更準確的回應了。

解讀

這裡更加適合 程序開發人員 來實踐該案例,這邊我們來舉個例子來理解:

假設,我們有一個關於電影的大型文本數據庫,其中包含了各種電影的詳細信息,如演員、導演、劇情等。現在,用戶想知道關於某部特定電影的信息。通過將用戶的查詢嵌入到一個向量中,並與數據庫中的電影信息進行向量搜索,我們可以迅速找到與用戶查詢最相關的電影信息。例如,如果用戶詢問「由萊昂納多·迪卡普里奧主演的電影」,系統可以迅速檢索到與這個查詢最相關的電影信息,如《泰坦尼克號》、《盜夢空間》等。

要實現這個案例,需要結合幾個關鍵技術和步驟:

  1. 文本嵌入工具:首先,您需要一個能夠將文本轉化為向量的工具,例如Word2Vec、BERT、FastText等。這些工具可以將文本轉化為高維空間中的向量。
  2. 構建電影數據庫:您需要一個包含各種電影詳細信息的數據庫。這個數據庫可以是一個簡單的文本文件,每行包含一個電影的信息,或者是一個更複雜的數據庫系統。
  3. 預處理和嵌入:將數據庫中的每部電影的信息進行文本嵌入,得到每部電影的向量表示,並存儲這些向量。
  4. 查詢處理:當用戶提出查詢時,例如「由萊昂納多·迪卡普里奧主演的電影」,您需要將這個查詢進行文本嵌入,得到一個查詢向量。
  5. 向量搜索:使用某種快速的向量搜索算法(例如余弦相似度、KNN搜索等)在電影數據庫中找到與查詢向量最接近的電影向量。
  6. 返回結果:根據找到的最接近的電影向量,從數據庫中檢索相關的電影信息,並返回給用戶。
  7. 集成到ChatGPT:您可以將上述步驟封裝成一個API或函數,並在ChatGPT的對話邏輯中調用它,以便當用戶提出相關查詢時,ChatGPT可以調用這個API或函數並返回相關的電影信息。

這只是一個高級的概述,實際實現可能會涉及更多的細節和技術挑戰。但基本的思路是將文本嵌入技術與向量搜索結合起來,以實現高效的知識檢索。

策略2:使用代碼執行進行更精確的計算或調用外部API

適用人群:熟練者、程序開發人員

難度:🌟🌟🌟

備注:雖然這裡的策略出現了 代碼 的字眼,但是不僅僅只有 程序開發人員 才可以用,熟練者 即使不瞭解編程,我相信在掌握之前提及的知識後,也可以相對容易地使用該策略的。

我們不能依賴GPT自己精確地進行算術或長時間的計算。在需要的情況下,可以指導模型編寫和運行代碼,而不是自己進行計算。特別是,可以指導模型將要運行的代碼放入特定格式,如三重反引號。在產生輸出後,可以提取並運行代碼。最後,如果必要,可以將代碼執行引擎(如Python解釋器)的輸出作為模型下一次查詢的輸入。

 SYSTEM
 你可以通過將代碼包含在三重反引號中來編寫和執行Python代碼,例如 ``代碼在此``。使用這種方式來進行計算。
 
 USER
 找出以下多項式的所有實數根:3*x5 - 5*x4 - 3*x**3 - 7*x - 10。

代碼執行的另一個好用途是調用外部API。如果模型在API的正確使用上得到了指導,它就可以編寫使用這個API的代碼。可以通過向模型提供文檔和/或代碼示例來指導模型如何使用API。

 SYSTEM
 你可以通過將代碼包含在三重反引號中來編寫和執行Python代碼。另外注意,你可以使用以下模塊幫助用戶向朋友發送消息:
 
 ``python
 import message
 message.write(to="John", message="Hey, want to meetup after work?")
 ``

警告:執行由模型產生的代碼本質上並不安全,任何希望執行此操作的應用都應該採取預防措施。特別地,需要一個沙箱化的代碼執行環境來限制不受信任的代碼可能導致的危害。

解讀

這個策略描述了在需要進行複雜計算時,如何正確地使用GPT模型。

GPT模型有以下幾個特點:

  • GPT模型本身不能被完全依賴來準確地執行算術或長時間的計算。
  • 在需要這樣的計算時,可以指導模型編寫並運行代碼,而不是讓模型自己進行計算。
  • 特別地,可以指導模型將要運行的代碼放入一個指定的格式中,例如使用三個反引號(backticks)。
  • 代碼產生的輸出可以被提取並運行。
  • 如果需要,代碼執行引擎(例如Python解釋器)的輸出可以作為輸入提供給模型,以供下一個查詢使用。

我們再結合一個案例來理解:

假設你想知道1000以內的所有質數。直接詢問GPT可能不會得到完整或準確的答案(當遇到不穩定的計算情況,都可以使用該策略)。但你可以這樣做:

1、請GPT編寫一段代碼。

編寫代碼時,使用GPT-3.5 / GPT-4 都可以,GPT-4寫複雜代碼的能力更強。

2、開啓新的對話,把代碼作為輸入給到模型。

在執行代碼時,建議使用 GPT-4 的 代碼解釋器 來提問。

3、輸入指定數字,讓模型充當代碼執行器來運行代碼。並得出了完整且正確的答案。

大家看見沒,即使我們不懂編程知識,但是我們可以利用該策略生成一段代碼, 並且結合GPT-4提供的 代碼解釋器 來執行代碼,就可以拿到更加準確的答案。畢竟規規矩矩的代碼是比 偶爾犯傻 的GPT模型,在計算負責邏輯的場景時更加靠譜呀。

那對於 程序開發人員 的輔助作用就更大了。我相信優秀的程序員可以玩出花來!

效果一般,好吧,我承認我還不夠優秀,哈哈。

最佳實踐6 – 系統地測試變更

適用人群: 熟練者、程序開發人員

難度: 🌟🌟🌟🌟

如果您利用完整的用例場景來測試,這樣模型就會更加健壯,也更能滿足用戶的需求。需要注意的是,有時改動一點點內容可能在某些單獨的測試用例里表現得很好,但如果使用更多的例子來看,可能整體效果並不好。所以,為了確保改動真的有幫助,您可能需要一個 完整的測試案例 來評估。

策略:

  • 使用參考標準答案評估模型輸出。

評估程序對優化系統設計很有幫助。良好的評估具有以下特性:

  • 貼近用戶的使用場景(至少多樣化)
  • 包含大量測試用例,以覆蓋更大的統計範圍(見下表作為指南)
  • 易於自動化

輸出的評估可以由計算機、人或兩者配合來完成的。計算機可以使用固定標準(例如,具有單一正確答案的問題)以及某些主觀或模糊的標準自動化評估方式,其中模型的輸出結果會由另外一個測試程序進行評估結果的正確性。如,OpenAI Evals 是一個開源軟件框架,是一個提供創建自動化評估的工具。

當存在一系列答案都被認為是同等高質量的輸出(例如,對於具有長答案的問題)時,基於模型的評估可能有用。哪些可以用基於模型來評估、哪些需要人來評估的邊界是模糊的,隨著模型變得越來越強大,這個邊界正在不斷地移動。官方鼓勵進行多次實驗,以確定基於模型的評估對您的測試用例有多大的效果。

策略1:參照標準答案評估模型輸出

適用人群: 熟練者、程序開發人員

難度: 🌟🌟🌟🌟

假設一個問題的正確回答是一組固定的答案。然後,我們可以使用模型來評估到底有多少模型輸出的答案是滿足了這個問題的預設結果。

例如,使用以下的系統消息:

 SYSTEM
 您將獲得由三個引號界定的文本,這應該是問題的答案。檢查以下的信息是否直接包含在答案中:
 
 - 尼爾·阿姆斯特朗是第一個登上月球的人。
 - 尼爾·阿姆斯特朗第一次走上月球的日期是1969年7月21日。
 
 對於這些點,請執行以下步驟:
 
 1 - 重述這一點。
 2 - 提供一個來自答案的引用,這個引用最接近這一點。
 3 - 考慮一個不瞭解這個主題的人讀了引用是否可以直接推斷出這一點。在做決定之前,解釋為什麼或為什麼不。
 4 - 如果3的答案是肯定的,寫「是」,否則寫「否」。
 
 最後,提供一個「是」的答案的數量。將這個數量作為{"count": <在這裡插入數量>}提供。
 
 請讓用戶提供文本的提問開始!

測試數據:

下面是一個例子,其中兩個要點都得到了滿足:

 SYSTEM
 <插入上述的系統信息>
 
 USER
 """尼爾·阿姆斯特朗因為是第一個踏上月球的人而聞名。這個歷史性的事件發生在1969年7月21日,是阿波羅11號任務的一部分。"""

測試數據:

這是一個只滿足一個要點的輸入示例:

 SYSTEM
 <insert system message above>
 
 USER
 """尼爾·阿姆斯特朗在他從月球模塊走下來時創造了歷史,成為第一個在月球上行走的人。"""

測試數據:

這是一個沒有滿足任何要點的輸入示例:

SYSTEM
 <insert system message above>
 
 USER
 """在69年的夏天,一個宏大的旅程,阿波羅11號,像傳說的手一樣大膽。阿姆斯特朗邁出了一步,他說的'一個小步',是為了一個新的世界。"""
 

下面是更深入的官方演示案例:

這種基於模型的評估方法有很多不同的變化。想象一下,我們在評估一個問題的候選答案時,會考慮很多不同的情況。比如,我們會看 候選答案與 專家標準答案 有多大程度的相似,還會考慮候選答案是否與 專家標準答案的任何部分相矛盾。這些都是評估方法的不同方面。

 SYSTEM
 按照以下步驟進行。
 
 步驟1:逐步推理提交的答案與專家答案比較,是:不相交、子集、超集,還是有相等的信息集。
 
 步驟2:逐步推理提交的答案是否與專家答案的任何部分矛盾。
 
 步驟3:輸出一個JSON對象,結構如下:{"交匯類型": "不相交"或"子集"或"超集"或"相等", "矛盾": 真 或 假}
 
 請讓用戶提供文本的提問開始!

測試數據如下:

這是一個輸入例子,其中的答案質量較差:

 SYSTEM
 <insert system message above>
 
 USER
 問題: """尼爾·阿姆斯特朗最著名的事件是什麼,它發生在什麼時候?假設UTC時間。"""
 
 提交的答案: """他在月球上走了一圈嗎?"""
 
 專家答案: """尼爾·阿姆斯特朗最為人所知的是他是第一個踏上月球的人。這一歷史性的事件發生在1969年7月21日,是NASA的阿波羅11號任務的一部分。阿姆斯特朗踏上月球表面時說的名言:"那是人類的一小步,卻是人類的一大步",至今仍被廣泛引用。
 """

這是一個有好答案的輸入示例:

 SYSTEM
 <insert system message above>
 
 USER
 問題: """尼爾·阿姆斯特朗最著名的事件是什麼,它發生在什麼時候?假設UTC時間。"""
 
 提交的答案: """在1969年7月21日的大約02:56 UTC時間,尼爾·阿姆斯特朗成為第一個踏上月球表面的人,標誌著人類歷史上的一項偉大成就。大約20分鐘後,奧爾德林也加入到他的行列。"""
 
 專家答案: """尼爾·阿姆斯特朗最為人所知的是他是第一個踏上月球的人。這一歷史性的事件發生在1969年7月21日,是阿波羅11號任務的一部分。"""

解讀

官方提供了兩種不同的場景,一種是與標題答案進行對比,另外一種則是考慮兩者之間的重疊和矛盾,更加全面的評估模型的表現。

我個人認為,這兩種方式可以幫助 程序開發人員 從以下幾點中獲益:

  1. 深入的評估:不僅僅是簡單地比較模型輸出與專家標準答案,還要考慮兩者之間的重疊和矛盾,從而更全面地評估模型的表現。
  2. 發現細微差異:通過跟蹤重疊和矛盾,可以更容易地發現模型輸出中的細微差異和潛在問題。
  3. 提高模型的準確性和可靠性:確保模型的輸出不僅與專家標準答案相符,而且不與其矛盾,從而提高模型的準確性和可靠性。

通過這種評估方法,開發者可以更加深入地瞭解模型的表現,確保其輸出既準確又可靠。進而可以考慮是否進行優化。這一種非常好的測試手段。

總結

在當下,掌握提示詞的技巧,利用提示詞幫助我們如何與機器互動,讓AI給我們提供真正的業務價值,是每一個人都需要思考的問題。

接下來的課程里,我會介紹更加複雜的結構化提示詞,用於解決複雜的業務場景,那如果我們瞭解提示詞最佳實踐的相關知識,將幫助我們更好地理解 結構化提示詞 的價值。

歡迎大家與我溝通和討論,相信AI學習之路我們可以成為朋友,如果這篇文章有幫助,幫忙點個贊,謝謝各位啦。

Scroll to Top