編輯的話
親愛的讀者朋友們,
今天,我們的【ChatGPT 跨界應用週報】迎來了第十期,這也意味著一個階段的結束,同時開啟了我們反思與尋找新方向的起點。
最近我讀到一本書,裡面提到一句話深深觸動了我:“小心不要陷入偽讀書的陷阱”。這讓我反思到2023 年參加 IT 邦幫忙的鐵人賽時,是如何一步步深入學習,實際操作,並將所學整理成文章分享給大家的過程。那種實實在在的成就感,與我最近嘗試的分享方式——我暫時稱之為「電子報2.0」——形成了鮮明的對比。
分享無論以哪種形態進行,都需要投入大量的時間和心血。我一直在思考,如何平衡學習、實做與分享所需要的時間比例,使之更有深度、更有效率。
隨著時間的推移,我越來越感覺到需要進一步思考和規劃我們的「電子報3.0」。這種感覺在這期尤其強烈。
所以,在整理並且完善【OpenAI 官方提示工程指南 - 註釋】的同時,我深思熟慮後決定,是時候為【ChatGPT 跨界應用週報】畫上一個段落,尋找一種更紮實、能夠與時俱進的分享方式。
接下來的方向,我想要回到「小專案基礎」上來,思考如何可以更有效地分享 - 也許是透過影片或分享會等形式?
我真心希望能聽到你們的想法,如果你有任何建議,請務必告訴我。待我整理好思緒和方向後,我們再次相聚。
感謝你一路的陪伴,讓我們期待下一次的重逢。
本期內容
OpenAI 官方提示工程指南 - 註釋
利用外部工具
提示技巧 5-1:利用基於嵌入的檢索實現高效的知識檢索
提示技巧 5-2:透過程式碼執行來進行更精準的計算或呼叫外部 AP
提示技巧 5-3:賦予模型訪問特定功能的能力
策略:有系統地測試變更
提示技巧 6-1:參考金標準答案來評估模型輸出
OpenAI 官方提示工程指南 - 註釋
(此段落為 OpenAI 官方提示工程指南的註釋,原文請參考: Prompt engineering - OpenAI API)
策略: 利用外部工具
通過將其他工具的輸出餵給模型,來彌補模型的不足。例如,使用文本檢索系統(有時被稱為RAG或檢索增強生成)可以向模型提供相關文檔的信息。其次像 OpenAI 的程式碼執行引擎(Code Interpreter)這樣的工具可以幫助模型進行數學計算和運行代碼。如果有任何一項任務可以通過工具比通過語言模型更可靠或高效地完成,那麼就把它外包出去,以獲得二者的最佳結合。
提示技巧 5-1:利用基於嵌入的檢索實現高效的知識檢索
模型可以利用外部資訊源作為其輸入部分訊息。這可以幫助模型生成更有資訊量和更新的回應。例如,如果用戶問一個關於特定電影的問題,將有關該電影的高質量資訊(例如,演員、導演等)添加到模型的輸入中可能會很有用。文本嵌入可以用來實現高效的知識檢索,以便在運行時動態地將相關資訊添加到模型輸入中。
文本嵌入是一種向量,可以衡量文本之間的相關性。相似或相關的文本會比無關的文本更靠近。這一事實,連同快速向量搜索算法的存在,意味著嵌入可以用來實現高效的知識檢索。特別是,一個文本語料庫可以被分割成區塊,每個區塊都可以被嵌入並存儲。然後可以嵌入給定的查詢並執行向量搜索,以找到語料庫中與查詢最相關(即在嵌入空間中最接近)的嵌入文本區塊。
在 OpenAI Cookbook 中可以找到實做範例。參見“指示模型使用參考文本來回答”,來進一步瞭解如何使用知識檢索來最小化模型捏造不正確事實可能性的提示範例。
以上所提提示範例,請見週報第三期「提示技巧 2-1:指示模型使用參考文本來回答」段落。
提示技巧 5-2:透過程式碼執行來進行更精準的計算或呼叫外部 API
語言模型無法自行準確地完成算術或複雜計算。在需要這類操作時,我們可以引導模型撰寫並執行程式碼,而不是依賴模型本身來進行計算。具體來說,我們可以指示模型將要執行的程式碼以特定格式呈現,例如使用三個反引號。一旦產生了輸出,就可以提取並運行這段代碼。最後,如果需要,可以將代碼執行結果(比如 Python 解釋器的輸出)作為模型下一次查詢的輸入。
提示範例:
System 您可以通過將程式碼包含在三個反引號中來編寫和執行 Python 代碼,例如 ``` 這裡寫程式碼 ```。使用這種方式進行計算。 User 找出以下多項式的所有實數根:3x**5 - 5x4 - 3*x3 - 7*x - 10。
例如,您可以透過將程式碼包裹在三個反引號中來撰寫並執行Python代碼,從而完成計算。此外,呼叫外部 API 也是程式碼執行的一個很好的應用場景。如果模型被正確指導使用 API,它可以撰寫利用該 API 的程式碼。透過提供 API 的文件和/或程式碼範例,可以指導模型如何使用API。
提示範例:
System 您可以通過將程式碼包括在三個反引號中來編寫和執行Python代碼。另請注意,您可以使用以下模塊來幫助使用者向朋友發送消息: ```python import message message.write(to="John", message="Hey, want to meetup after work?")```
需要注意的是,由模型生成的代碼執行並非保證安全,任何試圖這麼做的應用都應該采取預防措施。特別是,需要一個沙盒環境來限制不信任代碼可能引起的損害。
提示技巧 5-3:賦予模型訪問特定功能的能力
Chat Completions API 允許在請求中包含一系列功能描述,從而使模型能夠根據提供的架構生成功能參數。API返回的生成參數以 JSON 格式出現,可以用於執行功能調用。然後,可以將功能調用的輸出反饋給模型,用於下一輪請求,從而實現閉環操作。這是推薦使用 OpenAI 模型調用外部功能的方法。欲了解更多,請參閱我們的入門文本生成指南中的 Function Calling 部分以及OpenAI Cookbook 中的 Function Calling 範例。
策略:有系統地測試變更
有時候,要判斷一項變更——例如,一個新指令或一個新設計——是讓系統變得更好還是更糟,可能會有點困難。觀察幾個例子可能會提示哪個更好,但是如果樣本大小很小,就難以區分真正的改善還是隨機幸運。可能某個變更對某些輸入有幫助,但對其他輸入則損害性能。評估程序(或稱為"evals")對於優化系統設計很有用。好的評估程序應該:
反映真實世界的使用情況(或至少是多樣化的)
包含許多測試案例以提供更大的統計力量(見下表指導原則)
易於自動化或重複
| 需要檢測的差異 | 為了95%的信心水平所需的樣本大小 |
| 30% | ~10 |
| 10% | ~100 |
| 3% | ~1,000 |
| 1% | ~10,000 |輸出的評估可以由電腦、人類或混合進行。電腦可以利用客觀標準(例如,具有單一正確答案的問題)以及一些主觀或模糊標準來自動化evals,這些標準中模型輸出由其他模型查詢評估。OpenAI Evals 是一個開源軟體框架,提供創建自動化evals的工具。
基於模型的evals在存在一系列可能同樣高質量的可能輸出時很有用(例如,對於有長答案的問題)。用基於模型的eval評估與需要人類評估的邊界是模糊的,並隨著模型變得更有能力不斷變化。我們鼓勵實驗,以弄清楚基於模型的 evals 對您的使用案例能有多好的效果。
提示技巧 6-1:參考金標準答案來評估模型輸出
假設一個問題的正確答案,我們應該參考一組特定的已知事實。那麼我們可以使用模型查詢來計算答案中包含了多少個必需的事實。
例如,使用以下系統訊息:System 您將獲得由三重引號分隔的文本,該文本應該是對某個問題的答案。檢查答案中是否直接包含以下資訊: - 尼爾·阿姆斯特朗是第一個踏上月球的人。 - 尼爾·阿姆斯特朗首次踏上月球的日期是1969年7月21日。 對於每一條信息,請執行以下步驟: 1 - 重述該訊息。 2 - 提供答案中與該訊息最接近的引文。 3 - 考慮不知道這個主題的人在閱讀引文時能否直接推斷出該訊息。解釋為什麼或為什麼不能,然後做出判斷。 4 - 如果第3步的答案是"是",則寫上"是",否則寫上"否"。 最後,提供有多少個"是"答案的計數,格式如下:{"count": <在此插入計數>}。
下面這個提示是兩點資訊都符合的提示範例:
System <插入上述系統訊息> User """尼爾·阿姆斯特朗因為是第一個踏上月球的人而聞名。這一歷史性事件發生在1969年7月21日的阿波羅11號任務期間。"""
在 OpenAI Playground 中開啟
這是一個只滿足一個條件的輸入示例:System <插入上述系統訊息> User """當尼爾·阿姆斯特朗走出月球着陸艙時,成為第一個踏上月球的人,開創了歷史。"""
在 OpenAI Playground 中開啟
這是一個都不滿足的輸入示例:System <插入上述系統訊息> User """在69年的夏天,一次宏偉的航行,勇敢的傳奇之手阿波羅11號。阿姆斯特朗邁出了一步,史詩向前推進,'一小步,'他說,迎接嶄新世界。"""
在 OpenAI Playground 中開啟
在這類基於模型的評估中,有許多可能的變體。考慮以下變體,它追踪候選答案與標準答案之間的重疊類型,並且還檢查候選答案是否與標準答案的任何部分矛盾。System 按照以下步驟回應用戶輸入。在進行前,完整重述每一步。即是說,「步驟1:原因...」。 步驟1:逐步推理提交答案與專家答案相比的訊息是否為:不相交、相等、子集、超集,或重疊(即有某些交集但不是子集/超集)。 步驟2:逐步推理提交答案是否與專家答案的任何方面矛盾。 步驟3:輸出一個結構如下的JSON物件:{"type_of_overlap": "disjoint" 或 "equal" 或 "subset" 或 "superset" 或 "overlapping", "contradiction": true 或 false}
這裡有一個帶有次標準答案的範例輸入,儘管如此,它並未與專家答案相矛盾:System <插入上述系統訊息> User 問題:「尼爾·阿姆斯壯最著名的事件是什麼,以及它發生在何時?假設使用 UTC 時間。」 提交答案:「他不是在月球上走了走什麼的嗎?」 專家答案:「尼爾·阿姆斯壯最著名的是成為第一個踏上月球的人。這一歷史性事件發生於1969年7月21日。」
在 OpenAI Playground 中開啟
這裡有一個範例輸入,其答案直接與專家答案相矛盾:System <插入上述系統訊息> User 問題:「尼爾·阿姆斯壯最著名的事件是什麼,以及它發生在何時?假設使用 UTC 時間。」 提交答案:「1969年7月21日,尼爾·阿姆斯壯成為繼巴茲·奧爾德林之後,第二個踏上月球的人。」 專家答案:「尼爾·阿姆斯壯最著名的是成為第一個踏上月球的人。這一歷史性事件發生於1969年7月21日。」
在 OpenAI Playground 中開啟
這裡有一個範例輸入,其答案正確且提供了一些不必要的細節:System <插入上述系統訊息> User 問題:「尼爾·阿姆斯壯最著名的事件是什麼,以及它發生在何時?假設使用 UTC 時間。」 提交答案:「在1969年7月21日大約02:56協調世界時,尼爾·阿姆斯壯成為第一個踏上月球表面的人類,標誌著人類歷史上的一個偉大成就。」 專家答案:「尼爾·阿姆斯壯最著名的是成為第一個踏上月球的人。這一歷史性事件發生於1969年7月21日。」
在 OpenAI Playground 中開啟