1. 介紹
Prompt Engineering 是一種人工智能(AI)技術,它通過設計和改進 AI 的 prompt 來提高 AI 的表現。Prompt Engineering 的目標是創建高度有效和可控的 AI 系統,使其能夠準確、可靠地執行特定任務。
如果你從來沒有使用過Prompt Enginerring,可以看Google的這個prompt教程:
https://learningprompt.wiki/zh-Hans/docs/chatGPT/tutorial-basics/brief-introduction
prompt Engineering的介紹和使用網上已經有很多帖子介紹,這里并不重復說明。本博客主要總結OpenAI官網推薦的Prompt的提示策略和技巧。
2. 提示技巧
2.1 清晰的指令要求
我們輸入給大模型的prompt,最好是清晰的,不帶歧義的。具體有以下幾種方式可以構建清晰的prompt。
-
在查詢中包含詳細信息以獲得更相關的答案:例如在prompt中提供所有重要的細節或者背景信息。
-
指定角色:例如,在prompt模板里,指定大模型的角色,可以是老師、學生、專家等等,讓大模型以特性的角色來回答問題。
你是一個小學老師,麻煩將下面文本改寫成小學生弄聽得懂的話。需要改寫的文本:xxxxxxxxx
-
使用特定的分隔符來區分不同的輸入部分:例如用三重引號、XML標簽等分隔符來劃分需要不同處理的文本。
你是一個小學老師,麻煩將下面文本<text>改寫成小學生弄聽得懂的話。""" <xxxxxxxxx> """
-
提供例子:這個很好理解,類似few-shot,在模型正式回答問題前,附帶一些樣例,期望大模型能從樣例中獲得一些啟發。
你是一個小學老師,麻煩將下面文本<text>改寫成小學生弄聽得懂的話。""" <文本1> """# output <答案1>""" <xxxxxxxxx> """# output
-
指定所需要的輸出長度:可以要求模型輸出指定長度的單詞、段落等。
請為我介紹國內最值得去爬的10座山,并說明原因。
提供充足的參考文本
-
指導模型使用參考文本回答:在prompt里,如果可以提供與當前查詢相關的信息,那么就可以要求模型根據參考文本來回答問題。
輸出景區A的攻略。# 參考文本 """ xxxxxxxxxxx(某一天A景區的天氣和售票情況) """# 輸出格式 <當前天氣>: <票價>: <行程攻略>:
-
指示大模型用制定參考文本中的引用來回答
2.2 將復雜的任務分解為簡單的子任務
- 使用意圖分類來識別與用戶查詢相關的指令:如果某一任務存在大量的獨立的指令集,這種情況下可以先對查詢進行分類,最后根據分類結果來確定要執行哪些指令。通過定義固定類別和硬編碼與處理給定類別中的任務相關的指令來實現。此過程可以遞歸應用,將任務分解為一系列階段。該方法的優勢是每次查詢僅包含執行任務下一階段所需指令,與使用單個查詢執行這個任務相比,錯誤率更低。還可以降低成本,因為更大的提示運行成本更高。
- 對于需要長時間的對話應用,總結或過濾之前的對話:由于模型具有固定上下文長度,因此用戶和助手之間的對話(其中整個對話包含在上下文窗口中)不能無限期地繼續下去。一旦輸入的大小達到預定的閾值長度,會觸發一個總結部分對話的查詢,并且前一次對話的摘要可以作為系統消息的一部分。或者,可以在整個對話過程中在后臺異步總結前一次對話。
- 分段總結長文檔并遞歸構建完整摘要:由于模型具有固定上下文長度,因此它們不能用于在單個查詢中匯總長度超過上下文長度減去生成的摘要的長度的文本。要總結非常長的文檔(例如一本書),我們可以使用一系列查詢來總結文檔的每個部分。可以將各部分摘要連接起來并進行總結,從而生成摘要的摘要。此過程可以遞歸進行,直到總結整個文檔。如果需要使用有關前面部分的信息來理解后面的部分,那么另一個有用的技巧是在總結該部分內容的同時,在書中任何給定點之前包含文本的連續摘要。
2.3 給模型思考的時間
- 在匆忙得出結論之前,指導模型自己找到解決方案:當明確指示模型在得出結論之前從第一原則進行推理時,我們回得到更好的結果。例如,假設我們想要一個模型來評估學生對數學問題的解決方案。最明顯的方法是直接詢問模型學生的解決方案是否正確。
- 使用內心獨白或一系列查詢來隱藏模型的推理過程:內心獨白的理念是指示模型將輸出中本應對用戶隱藏的部分放入結構化格式中,以便于解析它們。然后將輸出呈現給用戶之前,對輸出進行解析,并只顯示部分輸出。
- 詢問模型在之前的傳遞中是否遺漏來什么:假設使用模型列出于特定問題相關來源的摘錄。列出每一個摘錄后,模型需要確定是否應該開始編寫另一個摘錄或是否應該停止。如果源文檔很大,模型通常會過早停止并無法列出所有相關摘錄。在這種情況下,通常可以通過使用后續查詢提示模型來查找之前傳遞時遺漏的任任何摘錄來獲得更好的性能。
2.4 使用外部工具
- 使用基于嵌入的搜索實現高效的知識檢索(RAG應用):如果外部信息作為輸入的一部分,模型可以利用這些信息源。這可以幫助模型生成更明智和最新的響應。例如,如果用戶詢問有關特定電影的問題,將有關該電影的高質量信息(例如演員、導演等)添加到模型的輸入中可能會很有用。嵌入可用于實現高效的知識檢索,以便可以在運行時將信息動態添加到模型輸入中。
- 使用代碼執行進行更精確的計算或調用外部API:語言模型不能依靠自身準確地執行算術或長時間計算。在需要的情況下,可以指示模型編寫和運行代碼,而不是自己進行計算。具體來說,可以指示模型將要運行的代碼放入指定的格式(例如三重反引號),生成輸出后,可以提取并運行代碼。最后,如果需要,可以將代碼執行引擎(如python解釋器)的輸出作為模型的輸入。
- 讓模型訪問特定的功能:Chat Completions API允許在請求中傳遞函數描述列表。這使模型能夠根據提供的模式生成函數參數。生成的函數參數由API以JSON格式返回,可用于執行函數調用。函數調用提供的輸出隨后可以在以下請求中反饋到模型中以關閉循環。這使使用OpenAI模型調用外部函數的推薦方式。