提示工程(Prompt Engineering)最全綜述:本質、技術、最佳實踐
提示工程(prompt engineering),簡而言之,是構建和優化輸入提示以引導 LLMs 生成準確且富有洞察力的輸出的藝術和科學。在 LLMs 的世界裏,一個精心設計的提示就如同一位經驗豐富的嚮導,能夠引領模型穿越複雜的信息海洋,找到用戶心中的答案。
一、理解提示與提示工程(prompt engineering)
(一)提示的本質
提示是我們輸入給大語言模型以獲取期望響應的信息。它的形式豐富多樣,可以是一個簡單的問題、一段陳述、詳細的指令,甚至可以是文本與圖像等其他模態的組合。例如,在向大語言模型詢問歷史事件時,我們輸入的關於該事件的相關描述或問題就是提示(掌握 Prompt Engineering(提示工程):解鎖大型語言模型的無限潛能)。提示的質量直接影響着模型輸出的準確性和有效性,一個精心設計的提示能夠激發模型挖掘出其訓練數據中的深度知識,從而給出令人滿意的回答。
(二)提示工程的定義
提示工程(prompt engineering)則是一門精心雕琢提示的藝術與科學。它不僅僅是簡單地構造輸入文本,更是涉及到對模型行爲的深入理解,以及對各種影響因素的綜合考量。通過不斷地實驗、優化,提示工程師能夠設計出最適合特定任務和場景的提示,引導大語言模型生成精準、富有洞察力的輸出。這是一個迭代的過程,需要不斷地調整和改進提示,以適應不同的需求和模型特性。
二、控制大語言模型輸出:配置是關鍵
(一)輸出長度
大語言模型的輸出長度是一個重要的配置參數,它決定了模型將生成的最大令牌數量。令牌是模型處理文本的基本單位,可以是單詞、標點符號等。當我們需要更詳細、全面的回答時,可能會希望增加輸出長度,但這需要更多的計算資源。因爲生成更多令牌意味着模型需要進行更復雜的計算,這不僅會導致更高的能源消耗,還可能使響應時間變長,並且增加使用成本。例如,在生成一篇長篇文章時,若設置較長的輸出長度,模型將花費更多時間和資源來構建完整的內容。相反,如果我們只需要一個簡短的答案,如查詢一個事實性信息時,適當限制輸出長度可以提高效率並降低成本。
(二)溫度
溫度參數控制着大語言模型輸出的隨機性。較低的溫度值(如 0.1)會使模型的響應更具可預測性和確定性,它傾向於選擇概率最高的令牌,從而生成較爲保守和常規的回答。這種情況下,模型的輸出更穩定,適合於需要準確、一致性答案的場景,如查詢科學公式或定義等。而較高的溫度(如 0.9)則引入了更多的隨機性,允許模型探索更多樣化的可能性,從而產生更具創造性和獨特性的結果。在創意寫作、頭腦風暴等任務中,較高的溫度能夠激發模型生成新穎的想法和獨特的表達方式。例如,在創作一篇小說時,適當提高溫度可以讓模型生成更富有想象力的情節和生動的描寫。
(三)Top - K 採樣
Top - K 採樣基於模型爲下一個令牌生成的概率分佈進行操作。它限制模型僅從概率最高的 K 個令牌中選擇下一個令牌。例如,當 K = 5 時,模型會在生成每個新令牌時,僅從概率排名前五的候選令牌中隨機選擇。這種方法在一定程度上平衡了確定性和隨機性,既能保證模型考慮到最有可能的選項,又給予了一定的變化空間。在實際應用中,根據任務的需求調整 K 的值可以影響模型輸出的多樣性和準確性。如果 K 值過小,可能會導致輸出過於侷限;而 K 值過大,則可能使模型的選擇過於分散,降低輸出的質量。
(四)Top - P 採樣(核心採樣)
Top - P 採樣採用了不同的策略,它不固定考慮的令牌數量,而是設定一個概率閾值 P。模型從概率分佈中選擇令牌,從最有可能的開始,直到所選令牌的累積概率達到或超過 P。例如,當 P = 0.9 時,如果前三個最有可能的令牌的累積概率爲 0.92,模型就會選擇這三個令牌。這種方法更加靈活,能夠根據概率分佈的實際情況動態確定選擇的範圍。在處理一些複雜或不確定的任務時,Top - P 採樣可以更好地適應模型的預測概率分佈,提供更合適的輸出。它可以避免因固定 K 值而可能導致的不合理選擇,尤其在概率分佈較爲分散的情況下,能夠更準確地捕捉到關鍵信息。
(五)配置示例
在實際應用中,爲了獲得一般連貫且具有創造性的結果,通常可以從溫度爲 0.2、Top - P 爲 0.95、Top - K 爲 30 開始進行嘗試。當然,這些參數並非一成不變,需要根據具體的任務需求和模型表現進行調整。例如,在一個需要高度準確和穩定答案的知識問答應用中,可能會進一步降低溫度,同時適當調整 Top - K 和 Top - P 的值,以確保模型給出最可靠的回答。而在一個創意寫作項目中,則可能提高溫度,放寬 Top - K 和 Top - P 的限制,鼓勵模型發揮更大的創造力。
三、提示技術
(一)零樣本提示
零樣本提示是最基礎的方法,在這種方式下,我們僅提供任務描述和輸入文本,而不給出任何示例。它完全依賴大語言模型自身的知識儲備和從訓練數據中歸納總結的能力。例如,當我們詢問 “太陽系有哪些行星?” 時,模型憑藉其預先學習到的天文知識來回答。然而,零樣本提示的侷限性在於,對於一些複雜或不常見的任務,模型可能無法準確理解我們的意圖,導致輸出不夠理想。
(二)單樣本和少樣本提示
單樣本和少樣本提示通過在提示中提供一個或多個示例來引導模型生成特定結構或模式的輸出。這些示例就像是模型的學習範例,向模型展示了我們期望的答案形式。在代碼生成任務中,提供一段代碼示例以及相應的功能描述,模型就能更好地理解我們的需求並生成符合要求的代碼。在翻譯任務中,給出幾個句子及其翻譯示例,有助於模型在處理新句子時遵循相同的翻譯模式。這種提示技術在許多領域都取得了顯著的效果,因爲它爲模型提供了更明確的指導,降低了理解任務的難度。
Parse a customer's pizza order into valid JSON:
EXAMPLE:
I want a small pizza with cheese, tomato sauce, and pepperoni
JSON Response:
("size": "small", "type": "normal", "ingredients": [l"cheese", "tomaato sauce","peperoni"]]
Now, I would like a large pizza, with the first half cheeseand mozzarella. And the
other tomato sauce, ham and pineapple.
JSON Response:
(三)系統提示
系統提示(系統提示(System Prompt)與 LLM 輸出:揭祕 AI 對話背後的 “隱形指揮棒”)爲語言模型設定了整體的上下文和目的。它明確了模型的 “大方向” 任務,例如是進行語言翻譯、評論分類還是其他特定任務。此外,系統提示還可用於指定返回的結構或格式,如要求以 JSON 格式或大寫形式輸出。通過系統提示,我們可以將模型的行爲引導到特定的任務框架內,使其生成的輸出更符合我們的預期用途。例如,在構建一個電商客服聊天機器人時,系統提示可以告知模型其主要任務是解答客戶關於產品的疑問、處理訂單問題等,並指定輸出格式爲清晰易懂的文本段落,以便更好地與客戶進行交互。
(四)上下文提示
上下文提示爲模型提供與當前對話或任務相關的具體細節和背景信息。這有助於模型更好地理解問題的細微差別,從而生成更貼合情境的回答。在一個持續的對話中,如果我們提到了之前討論過的某個主題或事件,通過上下文提示將相關信息傳遞給模型,它就能基於這些背景知識進行連貫的迴應。例如,在討論一部電影時,我們先提到了導演的風格特點,然後詢問電影中的某個情節設置的意義,模型可以結合之前關於導演風格的信息來給出更深入、準確的解釋。
(五)角色提示
角色提示要求大語言模型扮演特定的角色,從而影響其輸出的語氣和風格。通過賦予模型一個角色,如醫生、律師、詩人等,模型會根據該角色的特點和知識背景生成相應風格的回答。當我們希望得到一首富有詩意的描述時,可以讓模型扮演詩人的角色;而在尋求法律建議時,則讓模型扮演律師。這種提示技術能夠爲輸出增添更多的情感色彩和專業氛圍,使其更符合特定場景的需求。
I want you to act as a travel guide. I will write to you about my location and you will
suggest 3 places to visit near me. In some cases, I will alsogive you the type of places
I will visit.
My suggestion: "I am in Amsterdam and I want to visit only Imuseums.
Travel Suggestions:
(六)回退提示
回退提示鼓勵大語言模型進行更深入的批判性思考。其操作方式是先讓模型考慮一個與手頭特定任務相關的一般性問題,然後將該一般性問題的答案作爲後續特定任務提示的輸入。這種 “回退一步” 的方法有助於激活模型的相關背景知識,從而產生更有見地和準確的回答。例如,在解決一個複雜的數學問題時,我們可以先讓模型思考解決此類問題的一般方法或原理,然後再將這些思路應用到具體的問題解決中。
(七)思維鏈提示 Chain of Thought (CoT)
思維鏈(Chain-of-Thought (CoT):引導大型語言模型解決問題的有效策略)提示通過明確要求模型生成中間推理步驟,顯著增強了其推理能力。這使得推理過程更加透明,不僅提高了答案的準確性,對於涉及邏輯推理和問題解決的複雜任務尤其有效。在解決一道邏輯謎題時,模型可以逐步展示其推理過程,如 “首先,根據條件 A,我們可以得出結論 X;然後,結合條件 B,進一步推斷出結論 Y……”,最終得出答案。這種方式讓用戶能夠清晰地瞭解模型的思考路徑,增加對答案的信任度,同時也有助於模型在複雜任務中更準確地找到解決方案。
When I was 3 years old, my partner was 3 times my age. Nlow, I am 20 years old. How
old is my partner? Let's think step by step.
(八)自一致性提示
自一致性提示利用了多個推理路徑的優勢來提高準確性。具體操作是多次發送相同的思維鏈提示,並設置較高的溫度值,以鼓勵模型產生多樣化的推理。然後,從這些不同的推理結果中選擇出現頻率最高的答案。這種方法類似於 “羣體智慧” 的概念,通過讓模型從多個角度思考問題,減少了單一推理路徑可能導致的錯誤。在處理一些具有模糊性或多種可能解決方案的問題時,自一致性提示能夠提高答案的可靠性。
(九)思維樹提示
思維樹提示進一步拓展了思維鏈提示的概念,允許大語言模型同時探索多個推理路徑,就像一棵樹的分支一樣。與思維鏈提示遵循單一的線性推理鏈不同,思維樹提示能夠更全面地考慮各種可能性,因此在需要探索多種選擇才能得出解決方案的複雜任務中表現出色。例如,在制定一個項目計劃時,模型可以同時考慮不同的任務安排、資源分配方案等多種可能性,並逐步評估和篩選,最終確定最優的計劃。思維樹提示可以通過手動精心設計提示來引導模型進行多路徑探索,也可以藉助 Python 腳本或 LangChain 等庫實現自動化操作,提高效率和靈活性。
(十)ReAct 提示
ReAct 提示是一種流行的技術,它通過使大語言模型能夠與外部工具和 API 交互,極大地增強了其能力。在這個過程中,模型首先分析給定的提示,制定行動計劃,該計劃可能涉及使用外部工具來收集額外信息。然後,模型利用其內部知識和外部獲取的信息進行推理,將問題分解爲更小的步驟,並制定實現目標的策略。接着,模型與適當的外部工具(如搜索引擎、API 或數據庫)進行交互,執行計劃中的行動,如搜索相關信息、檢索特定數據點或進行計算。最後,模型觀察行動的結果,並將新信息納入推理過程,通過反饋循環不斷調整計劃和優化方法,直至找到解決方案。例如,當我們想要了解某個城市的實時天氣情況時,ReAct 提示可以讓模型與天氣預報 API 進行交互,獲取最新的天氣數據並提供給用戶。這種技術突破了傳統文本輸入的限制,使模型能夠處理更復雜、實際的問題。
四、自動提示工程
(一)核心思想
自動提示工程(APE)的核心思想是利用大語言模型自身來生成多種提示候選,然後根據選定的評估指標對這些候選進行評估,最終選擇表現最佳的提示。這一過程是迭代的,可以重複進行以進一步優化提示的效果。通過自動化提示生成和評估的過程,節省了人工設計提示的時間和精力,同時提高了提示的質量和適應性。
(二)實現步驟
-
提示生成:首先向大語言模型提供一個初始提示,並指示其生成具有相同語義但表述不同的多個提示變體。例如,若目標是爲一個旅遊網站訓練一個聊天機器人,初始提示可以要求模型生成遊客詢問特定旅遊景點門票價格的不同表達方式。
-
提示評估:使用合適的評估指標對生成的每個提示候選進行評估。常用的評估指標包括 BLEU(雙語評估輔助工具)和 ROUGE(面向召回的摘要評估輔助工具)等。這些指標從不同角度評估提示的質量,如流暢性、連貫性以及與原始提示的語義相似度等。
-
提示選擇:選擇評估得分最高的提示候選作爲最終用於目標應用的提示。如果需要,還可以對選定的提示進行進一步的微調,並再次評估,以確保其達到最佳效果。
(三)示例
以一個在線書店的聊天機器人爲例,我們提供初始提示:“我們有一個在線書店,爲了訓練聊天機器人,我們需要各種顧客詢問某本暢銷書價格的方式。生成 10 個變體,保持語義相同。” 大語言模型會根據此指令生成一系列不同的提示,如 “某本暢銷書多少錢?”“我想知道某本暢銷書的售價是多少?” 等。然後,使用評估指標對這些提示進行評估,選擇最適合用於訓練聊天機器人的提示,使其能夠更好地理解和處理顧客關於圖書價格的詢問。
五、有效提示工程的最佳實踐
(一)提供示例
只要條件允許,儘量使用單樣本或少量樣本學習來展示期望的輸出結構或模式。示例對於大語言模型來說是非常有效的學習工具,它們能夠直觀地向模型傳達我們的需求,幫助模型更快地理解任務並生成符合要求的回答(與 LLM 溝通的藝術:實現高效交互的 Prompt 技巧)。例如,在訓練一個圖像描述生成模型時,提供一些圖像及其對應的準確描述示例,模型就能更好地學習到如何根據圖像特徵生成合理的描述。
(二)設計簡潔
保持提示簡潔、清晰、易於理解。避免使用複雜的語言和不必要的信息,以免混淆模型。使用明確描述期望動作的動詞,如 “總結”“解釋”“生成” 等。簡潔的提示能夠減少模型理解的難度,提高回答的準確性和效率。例如,當我們想要獲取一篇文章的主旨時,簡單地輸入 “總結這篇文章的主旨” 比使用冗長複雜的表述效果更好。
(三)明確輸出要求
不要給出模糊的指令,要明確說明期望的回答格式、風格、長度和內容。清晰的輸出要求可以使模型更準確地把握我們的期望,生成更符合需求的回答。例如,如果我們需要一個簡短的摘要,明確指定 “生成不超過 100 字的摘要”;如果需要一個正式的商務報告風格的回答,也要在提示中說明。
(四)優先指令而非限制
重點告訴大語言模型要做什麼,而不是不要做什麼。僅在安全、清晰或特定要求的情況下使用限制條件。正面的指令能夠引導模型朝着正確的方向生成回答,而過多的限制可能會限制模型的創造力和靈活性。例如,在要求模型創作一篇文章時,告訴它 “圍繞某個主題創作一篇具有邏輯性和趣味性的文章”,而不是 “不要寫得太枯燥,不要偏離主題”。
(五)控制最大令牌長度
可以在配置中或直接在提示中設置限制,以管理輸出長度和成本。合理控制輸出長度既能滿足我們的需求,又能避免不必要的資源浪費(Prompt 壓縮:提升大型語言模型效率的關鍵技術)。例如,在查詢一個簡單事實時,設置較短的最大令牌長度,確保回答簡潔明瞭;而在生成較長的文本內容時,根據實際需要適當調整長度限制。
(六)使用變量
在提示中引入變量可以提高其可重用性和靈活性。通過改變變量的值,同一提示可以適用於不同的輸入,這對於構建與大語言模型交互的應用程序非常有用。例如,在一個旅遊推薦系統中,提示可以包含 “目的地” 變量,根據用戶輸入的不同目的地生成相應的旅遊建議。
(七)實驗與迭代
提示工程(prompt engineering)的成功關鍵在於不斷實驗。嘗試不同的輸入格式、寫作風格、模型配置,甚至與其他提示工程師合作比較不同的方法,以找到最適合特定任務的方式。由於大語言模型的複雜性和多樣性,沒有一種通用的最佳提示方法,需要通過不斷嘗試和改進來優化提示效果。例如,在優化一個問答系統的提示時,嘗試不同的問題表述方式、增加或減少示例數量、調整模型的溫度參數等,觀察模型回答的準確性和質量變化,逐步找到最佳組合。
(八)適應模型更新
大語言模型在不斷髮展,新的版本可能會帶來架構、訓練數據或能力上的改進。及時瞭解這些更新,並重新審視和優化提示,以充分利用新的特性。例如,當模型更新了對某種語言結構的理解能力時,我們可以調整提示,更好地利用這一改進,提高回答的質量。
(九)探索輸出格式
對於涉及數據提取、組織或分析的任務,考慮請求結構化的輸出格式,如 JSON。結構化輸出便於後續處理,減少了手動格式化的工作量,提高了數據處理的效率。例如,在從一篇新聞文章中提取關鍵信息時,要求模型以 JSON 格式輸出,包含標題、主要內容、涉及人物等信息,方便後續的存儲和分析。
(十)記錄實驗過程
詳細記錄提示嘗試、模型配置、輸出結果和觀察到的現象。這有助於跟蹤進度、發現模式,並隨着時間的推移不斷完善提示策略。通過記錄和分析實驗數據,我們可以總結經驗教訓,避免重複犯錯,同時也能更好地理解模型的行爲和特點,爲進一步優化提示提供依據。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/QDzbfUkvSEalLxm3XX9rtA