今天小編分享的科學經驗:GPT-4最全攻略來襲!OpenAI官方發布,六個月攢下來的使用經驗都在裏面了,歡迎閲讀。
GPT-4 官方使用指南炸裂登場啦!
你沒聽錯,這次不需要自己做筆記了,OpenAI 親自幫你整理了一份。
據説匯聚了大夥兒 6 個月的使用經驗,你、我、他的提示訣竅都融匯其中。
雖然總結下來只有六大策略,但該有的細節可絕不含糊。
不僅普通 GPT-4 用户可以在這份秘籍中 get 提示技巧,或許應用開發者也可以找到些許靈感。
網友們紛紛評論,給出了自己的 " 讀後感 ":
好有意思啊!總結來説,這些技巧的核心思想主要有兩點。一是我們得寫得更具體一些,給一些細節的提示。其次,對于那些復雜的任務,我們可以把它們拆抽成一些小的提示來完成。
OpenAI 表示,這份攻略目前僅針對 GPT-4。(當然,你也可以在其它 GPT 模型上試試?)
趕緊瞧瞧,這份秘籍裏究竟都有啥好東西。
策略一:寫清楚指令
要知道,模型可不會 " 讀心術 ",所以你得把你的要求明明白白地寫出來。
當模型輸出變得太啰嗦時,你可以要求它回答簡潔明了。相反地,如果輸出太過簡單,你可以毫不客氣地要求它用專業水平來寫。
如果你對 GPT 輸出的格式不滿意,那就先給它展示你期望的格式,并要求它以同樣的方式輸出。
總之,盡量别讓 GPT 模型自己去猜你的意圖,這樣你得到的結果就更可能符合你的預期了。
實用技巧:
1、有細節才能得到更相關的答案
為了使輸出和輸入具有強相關性,一切重要的細節信息,都可以喂給模型。
比如你想讓 GPT-4:總結會議記錄
就可以盡可能在表述中增加細節:
将會議記錄總結成一段文字。然後編寫一個 Markdown 列表,列出與會人員及其主要觀點。最後,如果與會人員有關于下一步行動的建議,請列出來。
2、要求模型扮演特定角色
通過改變系統消息(system message),GPT-4 會更容易扮演特定的角色,比在對話中提出要求的重視程度更高。
如規定它要回復一個檔案,這份檔案中的每個段落都要有好玩的評論:
3、用分隔符清晰标示輸入的不同部分
用 """ 三重引号 """、<XML 标記 >、節标題等分隔符标記出文本的不同部分,可以更便于模型進行不同的處理。在復雜的任務中,這種标記細節就顯得格外重要。标記 >
4、明确指定完成任務所需的步驟
有些任務按步驟進行效果更佳。因此,最好明确指定一系列步驟,這樣模型就能更輕松地遵循這些步驟,并輸出理想結果。比如在系統消息中設定按怎樣的步驟進行回答。
5、提供示例
如果你想讓模型輸出按照一種不是能夠很好描述出來的特定樣式,那你就可以提供示例。如提供示例後,只需要告訴它 " 教我耐心 ",它就會按照示例的風格,将其描述得生動形象。
6、指定所需輸出長度
你還可以要求模型具體生成多少個單詞、句子、段落、項目符号等。但是,在要求模型生成特定數量的單詞 / 字的時候,它有可能不會那麼精準。
策略二:提供參考文本
當涉及到深奧的話題、引用和 URL 等内容時,GPT 模型可能會一本正經地胡説八道。
為 GPT-4 提供可以參考的文本,能夠減少虛構性回答的出現,使回答的内容更加可靠。
實用技巧:
1、讓模型參照參考資料進行回答
如果我們能夠向模型提供一些和問題有關的可信信息,就可以指示它用提供的信息來組織回答。
2、讓模型引用參考資料進行回答
如果在上面的對話輸入中已經補充了相關信息,那麼我們還可以直接要求模型在回答中引用所提供的信息。
這裏要注意的是,可以通過編程,對讓模型對輸出中引用的部分進行驗證注釋。
策略三:拆分復雜任務
相比之下,GPT-4 在應對復雜任務時出錯率更高。
然而,我們可以采取一種巧妙的策略,将這些復雜任務重新拆解成一系列簡單任務的工作流程。
這樣一來,前面任務的輸出就可以被用于構建後續任務的輸入。
就像在軟體工程中将一個復雜系統分解為一組模塊化組件一樣,将任務分解成多個模塊,也可以讓模型的表現更好。
實用技巧:
1、進行意圖分類
對于需要處理不同情況的大量具有獨立性的任務,可以先對這些任務進行分類。
然後,根據分類來确定所需的指令。
比如,對于客户服務應用程式,可以進行查詢分類(計費、技術支持、賬户管理、一般查詢等)。
當用户提出:
我需要讓我的互聯網重新恢復正常。
根據用户查詢的分類,可以鎖定用户的具體訴求了,就可以向 GPT-4 提供一組更具體的指令,來進行下一步操作。
例如,假設用户需要在 " 故障排除 " 方面尋求幫助。
就可以設定下一步的方案:
要求用户檢查路由器的所有電纜是否已連接……
2、對先前對話進行概括或篩選
由于 GPT-4 的對話視窗是有限制的,上下文不能太長,不能在一個對話視窗中無限進行下去。
但也不是沒有解決辦法。
方法之一是對先前的對話進行概括。一旦輸入的文本長度達到預定的阈值,就可以觸發一個查詢,概括對話的一部分,被概括出來的這部分内容可以變成系統消息的一部分。
此外,可以在對話過程中就在後台對前面的對話進行概括。
另一種方法是檢索先前的對話,使用基于嵌入的搜索實現高效的知識檢索。
3、逐段概括長文檔,并遞歸構建完整概述
還是文本過長的問題。
比如你要讓 GPT-4 概括一本書,就可以使用一系列查詢來概括這本書的每個部分。
然後将部分概述連接起來進行總結,匯成一個總的答案。
這個過程可以遞歸進行,直到整本書被概括。
但是有些部分可能要借前面部分的信息才能理解後續部分,這裏有一個技巧:
在概括當前内容時,将文本中當前内容之前的内容概述一起總結進來,進行概括。
簡單來説,用前面部分的 " 摘要 "+ 當前部分,然後進行概括。
OpenAI 之前還使用基于 GPT-3 訓練的模型,對概括書籍的效果進行了研究。
策略四:給 GPT 時間 " 思考 "
如果讓你計算 17 乘 28,你可能不會立刻知道答案,但是可以通過一些時間計算出來。
同樣的道理,當 GPT-4 接收到問題時,它并不會花時間仔細思考,而是試圖立刻給出答案,這樣就可能導致推理出錯。
因此,在讓模型給出答案前,可以先要求它進行一系列的推理過程,幫助它通過推理來得出正确的答案。
實用技巧:
1、讓模型制定解決方案
你可能有時候會發現,當我們明确指示模型在得出結論之前從基本原理出發進行推理時,我們可以獲得更好的結果。
比如説,假設我們希望模型評估學生解答數學問題的方案。
最直接的方法是簡單地詢問模型學生的解答是否正确。
在上圖中,GPT-4 認為學生的方案是正确的。
但實際上學生的方案是錯誤的。
這時候就可以通過提示模型生成自己的解決方案,來讓模型成功注意到這一點。
在生成了自己的解決方案,進行一遍推理過後,模型意識到之前學生的解決方案不正确。
2、隐藏推理過程
上面講到了讓模型進行推理,給出解決方案。
但在某些應用中,模型得出最終答案的推理過程不适合與用户共享。
比如,在作業輔導中,我們還是希望鼓勵學生制定自己的解題方案,然後得出正确答案。但模型對學生解決方案的推理過程可能會向學生揭示答案。
這時候我們就需要模型進行 " 内心獨白 " 策略,讓模型将輸出中要對用户隐藏的部分放入結構化格式中。
然後,在向用户呈現輸出之前,對輸出進行解析,并且僅使部分輸出可見。
就像下面這個示例:
先讓模型制定自己的解決方案(因為學生的有可能是錯的),然後與學生的解決方案進行對比。
如果學生的答案中哪一步出錯了,那就讓模型針對這一步給出一點提示,而不是直接給學生完整的正确的解決方案。
如果學生還是錯了,那就再進行上一步的提示。
還可以使用 " 查詢 " 策略,其中除了最後一步的查詢以外,所有查詢的輸出都對用户隐藏。
首先,我們可以要求模型自行解決問題。由于這個初始查詢不需要學生的解決方案,因此可以省略掉。這也提供了額外的優勢,即模型的解決方案不會受到學生解決方案偏見的影響。
接下來,我們可以讓模型使用所有可用信息來評估學生解決方案的正确性。
最後,我們可以讓模型使用自己的分析來構建導師的角色。
你是一名數學導師。如果學生回答有誤,請以不透露答案的方式向學生進行提示。如果學生答案無誤,只需給他們一個鼓勵性的評論。
3、詢問模型是否遺漏了内容
假設我們正在讓 GPT-4 列出一個與特定問題相關的源檔案摘錄,在列出每個摘錄之後,模型需要确定是繼續寫入下一個摘錄,還是停止。
如果源檔案很大,模型往往會過早地停止,未能列出所有相關的摘錄。
在這種情況下,通常可以讓模型進行後續查詢,找到它在之前的處理中遺漏的摘錄。
換而言之,模型生成的文本有可能很長,一次性生成不完,那麼就可以讓它進行查驗,把遺漏的内容再補上。
策略五:其它工具加持
GPT-4 雖然強大,但并非萬能。
我們可以借助其他工具來補充 GPT-4 的不足之處。
比如,結合文本檢索系統,或者利用代碼執行引擎。
在讓 GPT-4 回答問題時,如果有一些任務可以由其他工具更可靠、更高效地完成,那麼我們可以将這些任務交給它們來完成。這樣既能發揮各自的優勢,又能讓 GPT-4 發揮最佳水平。
實用技巧:
1、使用基于嵌入的搜索實現高效的知識檢索
這一技巧在上文中已經有所提及。
若在模型的輸入中提供額外的外部信息,有助于模型生成更好的回答。
例如,如果用户詢問關于一部特定電影的問題,将關于電影的信息(例如演員、導演等)添加到模型的輸入中可能會很有用。
嵌入可用于實現高效的知識檢索,可以在模型運行時動态地将相關信息添加到模型的輸入中。
文本嵌入是一種可以衡量文本字元串相關性的向量。相似或相關的字元串将比不相關的字元串更緊密地結合在一起。加上快速向量搜索算法的存在,意味着可以使用嵌入來實現高效的知識檢索。
特别的是,文本語料庫可以抽成多個部分,每個部分可以進行嵌入和存儲。然後,給定一個查詢,可以進行向量搜索以找到與查詢最相關的語料庫中的嵌入文本部分。
2、使用代碼執行進行更準确的計算或調用外部 API
不能僅依靠模型自身進行準确地計算。
如果需要,可以指示模型編寫和運行代碼,而不是進行自主計算。
可以指示模型将要運行的代碼放入指定的格式中。在生成輸出後,可以提取和運行代碼。生成輸出後,可以提取并運行代碼。最後,如果需要,代碼執行引擎(即 Python 解釋器)的輸出可以作為下一個輸入。
代碼執行的另一個很好的應用場景是調用外部 API。
如果将 API 的正确使用方式傳達給模型,它可以編寫使用該 API 的代碼。
可以通過向模型演示文檔和 / 或代碼示例來指導模型如何使用 API。
在這裏 OpenAI 提出了特别警告⚠️:
執行模型生成的代碼在本質上來説并不安全,任何試圖執行此操作的應用程式中都應采取預防措施。特别是,需要一個沙盒代碼執行環境來限制不受信任的代碼可能造成的危害。
策略六:系統地測試更改
有時候很難确定一個改變是會讓系統變得更好還是更差。
通過觀察一些例子有可能會看出哪個更好,但是在樣本數量較少的情況下,很難區分是真的得到了改進,還是只是随機運氣。
也許這個 " 改變 " 能夠提升某些輸入的效果,但卻會降低其它輸入的效果。
而評估程式 ( evaluation procedures,or "evals" ) 對于優化系統設計來説非常有用。好的評估有以下幾個特點:
1)代表現實世界的用法(或至少是多種用法)
2)包含許多測試用例,可以獲得更大的統計功效(參見下表)
3)易于自動化或重復
對輸出的評估可以是由計算機進行評估、人工評估,或者兩者結合進行。計算機可以使用客觀标準自動評估,也可以使用一些主觀或模糊的标準,比如説用模型來評估模型。
OpenAI 提供了一個開源軟體框架—— OpenAI Evals,提供了創建自動評估的工具。
當存在一系列質量同樣高的輸出時,基于模型的評估就會很有用。
實用技巧:
1、參考黃金标準答案評估模型輸出
假設已知問題的正确答案應參考一組特定的已知事實。
然後,我們可以詢問模型答案中包含多少必需的事實。
例如,使用下面這個系統消息,
給出必要的既定事實:
尼爾 · 阿姆斯特朗是第一個在月球上行走的人。
尼爾 · 阿姆斯特朗第一次登上月球的日期是 1969 年 7 月 21 日。
如果答案中包含既定給出的事實,模型會回答 " 是 "。反之,模型會回答 " 否 ",最後讓模型統計有多少 " 是 " 的答案:
下面是包含兩點既定事實的示例輸入(既有事件,又有時間):
僅滿足一個既定事實的示例輸入(沒有時間):
而下面這個示例輸入,不包含任何一個既定事實:
這種基于模型的評估方法有許多可能的變化形式,需要跟蹤候選答案與标準答案之間的重疊程度,并追蹤候選答案是否與标準答案的有相矛盾的地方。
比如下面的這個示例輸入,其中包含不合标準的答案,但與專家答案(标準答案)并不矛盾:
下面是這個示例輸入,其答案與專家答案直接矛盾(認為尼爾 · 阿姆斯特朗是第二個在月球上行走的人):
最後一個是帶有正确答案的示例輸入,該輸入還提供了比必要内容更多的詳細信息(時間精确到了 02:56,并指出了這是人類歷史上的一項不朽成就):
傳送門:
https://github.com/openai/evals(OpenAI Evals)
參考鏈接:
[ 1 ] https://platform.openai.com/docs/guides/gpt-best-practices
[ 2 ] https://www.reddit.com/r/OpenAI/comments/141yheo/openai_recently_added_a_gpt_best_practices_guide/