在使用生成式 AI 時,你是否經常遇到 AI 回答了沒有問到的問題,或者答案不令人滿意的情況?你是不是總是試了很多遍,都得到了滿意的答案,卻罵了一句“智障”?
事實上,很多時候使用的提示詞不夠準確,無法準確表達意圖。
12 月 15 日,OpenAI 終於在官方文件中發布了乙份名為快速工程,提示工程指南,現在終於有了官方認可的實用的提示工程標準參考。
本指南分享了從 GPT-4 等大型語言模型中獲得更好結果的策略和方法。 這裡描述的方法有時可以結合起來產生更大的效果。
雖然指南指出所提供的示例目前僅適用於 GPT-4,但在實踐中,大多數建議適用於所有大型語言模型。
寫下清晰的說明
提供參考文字
將複雜的任務拆分為更簡單的子任務
給模型時間“思考”。
使用外部工具
系統地測試更改
模型無法讀懂你的想法。 如果輸出太長,請要求簡短回覆。 如果輸出太簡單,請要求專家級寫作。 如果您不喜歡該格式,請展示您希望看到的格式。 模型猜測你想要什麼的次數越少,你就越有可能得到它。
在查詢中包含詳細資訊以獲得更相關的答案:為了獲得高度相關的響應,請確保請求提供任何重要的詳細資訊或上下文。 否則,您將將其留給模型來猜測您的意思。
要求模型承擔角色:系統訊息可用於指定模型在其回覆中承擔的角色。
例如,“當我請求幫助寫東西時,你回覆的文件每個段落至少包含乙個笑話或有趣的評論。 ”
使用分隔符清楚地指示輸入的不同部分:分隔符,如三引號、XML 標籤、章節標題等,可以幫助劃分要區別對待的文字部分。
例如,“總結俳句中用三個引號分隔的文字。 您將獲得兩篇關於同一主題的文章(以<>分隔)。 首先總結每篇文章的論點。 然後指出哪乙個提出了更好的論點並解釋原因。 “或”您將獲得摘要和建議的標題。 標題應該讓讀者清楚地了解這個主題,但它也應該引人注目。 如果標題不符合這些標準,請建議 5 個替代方案。 ”
對於此類簡單任務,使用分隔符可能不會對輸出質量產生影響。 但是,任務越複雜,消除任務細節的歧義就越重要。 不要讓模型試圖確切地理解你想從他們那裡得到什麼,只要告訴它。
指定完成任務所需的步驟:某些任務最好指定為一系列步驟。 顯式寫出這些步驟可以使模型更容易遵循這些步驟。
例如,“使用以下分步說明來響應使用者輸入。
第 1 步 – 使用者將提供三個引號中的文字。 用一句話總結文章,字首為“Summary:”。
第 2 步 – 將第 1 步的摘要翻譯成西班牙語,並新增字首“Translate:”。
舉例說明:提供適用於所有示例的一般描述通常比通過示例演示任務的所有排列更有效,但在某些情況下,提供示例可能更容易。 例如,如果打算讓模型複製響應使用者查詢的特定樣式,則很難顯式描述。 這就是所謂的“幾個例子”。 提示。
例如,“以一致的風格回答我的問題。 例如,我說:教我什麼是忍耐。 你回答:河流沖刷出最深的山谷,從溫柔的泉水中湧出;最偉大的交響樂來自乙個音符;最複雜的掛毯都是從單個執行緒開始的。 ”
指定所需的輸出長度:您可以要求模型為給定的目標長度生成輸出。 可以根據單詞、句子、段落、專案符號等的數量指定目標輸出長度。 但請注意,指示模型生成特定數量的單詞並不能以很高的精度工作。 該模型可以更可靠地生成具有特定數量的段落或專案符號的輸出。
例如,“將用三個引號分隔的文字總結為50個字左右,將其總結為兩段,並總結為三個要點。 ”
語言模型可以自信地建立虛假答案,尤其是在被問及深奧的主題或引文時。 正如筆記可以幫助學生在考試中取得更好的成績一樣,為這些模型提供參考文字可以幫助減少模型幻覺。
指示模型使用參考文字進行回答:如果可以為模型提供與當前查詢相關的可靠資訊,則可以指示模型使用提供的資訊來撰寫其答案。
例如,“使用用三引號引用的提供的文章回答問題。 如果你在文章中找不到答案,請寫“我找不到答案”。 ”
指示模型通過引用參考文本來回答:如果輸入補充了相關知識,您可以直接要求模型通過引用所提供文件中的段落來新增對其答案的引用。
例如,“您將獲得乙個用三引號引用的文件和乙個問題。 您的任務是僅使用提供的文件回答問題,並引用用於回答問題的文件的段落。 如果文件不包含回答問題所需的資訊,只需寫上:“資訊不足”。 如果提供了問題的答案,則必須附有引文注釋。 使用以下格式引用相關段落()。
將複雜的任務拆分為更簡單的子任務
正如在軟體工程中將複雜系統分解為一組模組化元件是很好的做法一樣,提交到語言模型的任務也是如此。 複雜任務往往比簡單任務具有更高的錯誤率。 另外複雜任務通常可以重新定義為簡單任務的工作流,其中早期任務的輸出用於構建後續任務的輸入
使用意向分類來識別與使用者查詢最相關的指令:對於需要大量獨立指令集來處理不同情況的任務,首先對查詢型別進行分類並使用該分類來確定需要哪些指令會很有幫助。 這可以通過定義與處理給定類別中的任務相關的固定類別和硬編碼指令來實現。 該過程還可以遞迴應用,以將任務分解為一系列階段。 這種方法的優點是,每個查詢僅包含執行下一階段任務所需的指令,與使用單個查詢執行整個任務相比,這可以降低錯誤率。 這也可以降低成本,因為較大的提示的執行成本更高。
例如,第乙個聊天機械人只執行以下答案:
當使用者輸入“故障排除”時,他們可以指定另乙個聊天機械人來回答以下問題:
對於需要長時間對話的對話應用,請彙總或篩選以前的對話:由於模型具有固定的上下文長度,因此使用者和助手之間的對話(其中整個對話包含在上下文視窗中)不能無限期地繼續。 您可以總結上一輪的對話,然後繼續下一輪對話。
分段總結長文件,並以遞迴方式構建完整摘要:由於模型具有固定的上下文長度,因此它們不能用於彙總長度超過上下文長度減去單個查詢中生成的摘要長度的文字。 為了總結乙個很長的文件(例如一本書),我們可以使用一系列查詢來首先總結文件的每個章節。 然後連線並彙總章節摘要,生成摘要的摘要。 此過程可以遞迴方式執行,直到對整個文件進行彙總。 如果有必要使用上一節中的資訊來理解後面的幾節,另乙個有用的提示是在書中任何給定的點之前包括文字的連續摘要,同時總結該點的內容。
如果你要求將 17 乘以 28,你可能不會馬上知道結果,但你可以慢慢計算出來。 同樣,當模型試圖立即回答而不是花時間弄清楚時,它們會犯更多的推理錯誤。 尋求“思路鏈”可以幫助模型更可靠地推導出正確答案。
在匆忙得出結論之前,指示模型找出自己的解決方案:我們可以通過提示模型首先生成自己的解決方案來讓模型注意到這一點。
例如,如果我們想要乙個模型來評估學生對數學問題的解決方案,你可以問“從制定你自己的問題解決方案開始”。 然後將您的解決方案與學生的解決方案進行比較,並評估學生的解決方案是否正確。 在您自己完成問題之前,不要確定學生的解決方案是否正確。 ”
使用內心獨白或一系列查詢來隱藏模型的推理過程:前面的策略表明,模型在回答特定問題之前詳細推理問題有時很重要。 對於某些應用程式,模型用於得出最終答案的推理過程不適合與使用者共享。 內心獨白是一種可以用來緩解這種情況的策略。 內心獨白的想法是指示模型將原本對使用者隱藏的部分輸出轉換為結構化格式,以便可以輕鬆解析它們。 然後分析輸出,在將輸出呈現給使用者之前,僅使部分輸出可見。
例如,“請按照以下步驟回答使用者的問題。
第 1 步 – 首先找出您自己的問題解決方案。 不要依賴學生的解決方案,因為它可能不正確。 將此步驟的所有工作括在三個引號 (“.
第 2 步 – 將您的解決方案與學生的解決方案進行比較,並評估學生的解決方案是否正確。 將此步驟的所有工作括在三個引號 (“.
第 3 步 – 如果學生犯了錯誤,請確定您可以在不透露答案的情況下給學生哪些提示。 將此步驟的所有工作括在三個引號 (“.
第 4 步 – 如果學生犯了錯誤,請向學生提供上一步的提示(三引號之外)。 不要寫“Step 4 - Write ”Prompt:“。
詢問模型在上乙個過程中是否遺漏了任何內容:假設我們使用乙個模型來列出與特定問題相關的摘錄。 列出每個摘錄後,模型需要確定是否應開始編寫另乙個摘錄,或者是否應停止。 如果源文件很大,模型通常會過早停止,並且無法列出所有相關的摘錄。 在這種情況下,通常可以通過使用後續查詢提示模型來查詢以前交付中遺漏的任何摘錄,從而獲得更好的效能。
例如,“您將獲得乙個用三引號分隔的文件。 您的任務是選擇與以下問題相關的摘錄:“人工智慧歷史上發生了哪些重大正規化轉變。 ”
確保摘錄包含解釋它們所需的所有相關上下文——換句話說,不要提取缺少重要上下文的小片段。 以 JSON 格式提供輸出。 ”
通過為模型提供其他工具的輸出來彌補模型的弱點。 例如,文字檢索系統(有時稱為 RAG 或檢索增強生成)可以告訴模型有關文件的資訊。 像 OpenAI 的直譯器這樣的執行引擎可以幫助模型進行數學計算並執行。 如果可以使用工具而不是語言模型更可靠或更高效地完成任務,則可以解除安裝它以充分利用兩者。
使用基於嵌入式的搜尋實現高效的知識檢索:如果作為輸入的一部分提供,則模型可以利用外部資訊源。 這可以幫助模型生成更明智和最新的響應。 例如,如果使用者詢問有關特定電影的問題,則將有關電影的高質量資訊(如演員、導演等)新增到模型的輸入中可能很有用。 嵌入可用於高效的知識檢索,允許在執行時將相關資訊動態新增到模型輸入中。
文字嵌入是測量文字字串之間相關性的向量。 相似或相關的字串比不相關的字串更緊密地聯絡在一起。 這一事實和快速向量搜尋演算法的存在意味著嵌入可用於實現高效的知識檢索。 特別是,文字語料庫可以拆分為多個塊,每個塊都可以嵌入和儲存。 然後可以嵌入給定的查詢,並可以執行向量搜尋,以從語料庫中找到與查詢最相關的嵌入文字塊(即嵌入空間中最接近的文字塊)。
使用執行來執行更準確的計算或呼叫外部 API:不能依賴語言模型自行準確地執行算術或長期計算。 如果需要,您可以指示模型編寫和執行**,而不是執行自己的計算。 具體而言,您可以指示模型將 ** 設定為指定格式,例如三重反引號。 生成輸出後,可以提取並執行它。 最後,如有必要,可以將執行引擎(即 Python 直譯器)的輸出用作下乙個查詢的模型輸入。
例如,“你可以通過將 python** 括在三個反引號中來編寫和執行,例如,將它和它一起放在這裡以執行計算。 ”
授予模型對特定特徵的訪問許可權:聊天完成 API 允許在請求中傳遞功能描述列表。 這使模型能夠根據提供的架構生成函式引數。 生成的函式引數由API以JSON格式返回,可用於執行函式呼叫。 然後,您可以在以下請求中將函式呼叫提供的輸出反饋到模型中,以關閉迴圈。 這是使用 OpenAI 模型呼叫外部函式的推薦方法。
如果效能可以衡量,那麼改進它就會更容易。 在某些情況下,對提示的修改將導致某些孤立示例的效能更好,但會導致一組更具代表性的示例的整體效能較差。 因此,為了確保更改對效能產生淨積極影響,可能需要定義乙個全面的測試套件(也稱為“評估”)。
參考標準答案評估模型輸出:假定已知問題的正確答案應參考一組特定的已知事實。 然後,我們可以使用模型查詢來計算答案中包含多少個必需的事實。
例如,“您將獲得由三個引號分隔的文字,這應該是您問題的答案。 檢查答案中是否直接包含以下資訊:
尼爾·阿姆斯特朗是第乙個在月球上行走的人。
尼爾·阿姆斯特朗於 1969 年 7 月 21 日首次登陸月球。
對於以下每個要點,請按照下列步驟操作:
1 - 重申這一點。
2 - 提供最接近此答案的引文。
3 - 考慮乙個不了解主題的閱讀引文的人是否可以直接推斷出要點。 在做出決定之前解釋原因。
4 - 如果 3 的答案是肯定的,則寫“是”,否則寫“否”。
最後,計算有多少個“是”。 答案是肯定的。 將此計數提供為 。 ”
坦率地說,提示的本質是如何清楚地表達需求。
模型越大,你的實習助理越清晰,你給它的說明越清晰、越詳細,它給你的反饋就越有可能是你想要的。 在這一點上,大型模型與人相同。 甚至有相當多的測試說給予模型激勵和承諾,抱怨以贏得模型的同情,並告知模型回答的重要性,都可以提高模型答案的質量,這麼大的模型和人有什麼不同?
當然,大模型也有一些自身的特點,比如反應快、記憶力差、邏輯能力差等。 如何利用好優勢,避免劣勢,是老闆們不得不思考的問題。
如果您認為本文對您有幫助,歡迎點讚、收藏和分享。 同時,請關注我,獲取更多有關人工智慧的最新訊息和見解!