摘要
通過以自然語言指令作為條件輸入,大型語言模型(LLMs)展現出令人印象深刻的通用計算能力。然而,任務表現嚴重依賴于用于引導模型的提示(prompt)質量,而最有效的提示通常是由人類手工設計的。受經典程序合成方法和人類提示工程實踐的啟發,我們提出了自動提示工程師(Automatic Prompt Engineer, APE)方法,用于自動生成和選擇指令。在我們的方法中,將“指令”視作“程序”,通過在由LLM提出的一組指令候選中搜索,優化一個目標評分函數,從而選擇最優指令。為了評估所選指令的質量,我們使用另一個LLM在零樣本設定下執行該指令,并評估其表現。大量實驗證明,我們自動生成的指令在24項Instruction Induction任務中全面超越了先前的LLM基線,并在21項BIG-Bench任務中的17項上實現了優于或可比于人類注釋者的性能。我們進行了大量定性和定量分析來探索APE的性能,展示了APE生成的提示不僅能提升少樣本學習效果(只需將其前綴添加至標準的上下文學習提示中),還能找到更優的零樣本chain-of-thought提示,并能引導模型生成更真實和/或更具信息性的內容。
1 引言
大規模和基于注意力機制的架構相結合,使得語言模型具備了前所未有的通用性(Kaplan et al., 2020;Vaswani et al., 2017)。這些被稱為“大型語言模型”(LLMs)的系統在各類任務中表現出卓越,甚至超越人類的能力,包括零樣本和少樣本設定(Brown et al., 2020;Srivastava et al., 2022)。然而,通用性的提升也引出了一個核心問題:我們如何才能讓LLM做我們希望它做的事?
為了解決這個問題并引導LLMs展現出期望行為,近期研究探索了多種方法,包括微調(Ouyang et al., 2022;Ziegler et al., 2019)、上下文學習(Brown et al., 2020),以及多種提示生成方法(Gao, 2021),其中包括軟提示的可微調方法(Qin & Eisner, 2021;Lester et al., 2021)和自然語言提示工程(Reynolds & McDonell, 2021)。其中,自然語言提示工程特別值得關注,因為它為人類與機器之間提供了一種自然的交互接口,這種方法不僅適用于LLMs,也可能對其他通用模型(例如基于提示的圖像生成器,Rombach et al., 2022;Ramesh et al., 2022)具有重要意義。公眾對提示設計與生成的興趣也日益增長(見附錄A示例)。
這一現象背后的原因在于:即使目標結果是可以通過其他指令實現的,樸素語言提示也往往無法產生期望的輸出。因此,用戶需要嘗試多種提示以激發模型產生目標行為,因為他們對于哪些指令與特定模型兼容知之甚少。我們可以將LLM看作執行由自然語言指令定義程序的黑盒計算機:盡管它們能夠執行大量的自然語言程序,但程序的處理方式可能并不符合人類的直覺,且指令的質量只能通過在下游任務中執行后才能被評估(Sanh et al., 2022;Wei et al., 2021)。
為了減少在創建和驗證有效指令過程中所需的人力成本,我們提出了一種使用大語言模型(LLM)自動生成和篩選指令的新算法。我們將這一問題稱為自然語言程序合成(natural language program synthesis),并提出將其作為一個黑盒優化問題來解決,利用LLM生成并在啟發式可行的候選解空間中進行搜索。在此過程中,我們從三個方面利用了LLM的通用能力。首先,我們將LLM作為推理模型(Ellis 等,2021;Honovich 等,2022),根據少量輸入-輸出示例生成指令候選項。接著,我們通過計算每條指令在目標LLM下的評分來引導搜索過程。最后,我們提出了一種迭代的蒙特卡洛搜索方法,由LLM生成語義相近的指令變體以改進當前最佳候選項。
直觀地說,我們的算法讓LLM根據示例生成一組指令候選項,并評估哪些指令更具潛力。我們將此算法命名為自動提示工程師(Automatic Prompt Engineer,APE)。我們的主要貢獻如下:
- 我們將指令生成建模為自然語言程序合成問題,形式化為一個由LLM引導的黑盒優化問題,并提出了樸素的和迭代的蒙特卡洛搜索方法來近似求解。
- 我們提出的方法 APE 在由模型生成指令的零樣本學習任務中達到了人類水平的表現,在24個Instruction Induction任務中全部通過(24/24),在21個Big-Bench任務中完成了17個(17/21)。
- 我們提供了廣泛的定性和定量分析,探討了APE的多個方面,并展示了APE在提升小樣本學習效果、發現更優的零樣本思維鏈提示(zero-shot chain of thought prompts)以及引導LLM朝向更真實和/或更具信息性的行為方面的應用。
2 相關工作
大型語言模型
通過在模型規模、訓練數據和計算資源方面對基于transformer的語言模型進行擴展,已經被證明可以在各種下游自然語言處理任務中帶來可預測的性能提升(Vaswani et al., 2017;Devlin et al., 2018;Brown et al., 2020)。隨著規模擴展,LLM展現出了許多涌現能力(Wei et al., 2022a),包括小樣本上下文學習、零樣本問題求解、思維鏈推理、指令遵循和指令誘導(Cobbe et al., 2021;Wei et al., 2022b;Kojima et al., 2022;Sanh et al., 2022;Wei et al., 2021;Ouyang et al., 2022;Honovich et al., 2022)。在本文中,我們將LLM視為能夠執行由自然語言指令指定程序的黑盒計算機,并研究如何利用模型生成的指令來控制LLM的行為。
提示工程
提示(prompting)為人類與通用模型如LLM的交互提供了一種自然直觀的接口。由于其靈活性,提示已被廣泛用于各種NLP任務中(Schick & Schütze, 2021;Brown et al., 2020;Sanh et al., 2022)。然而,LLM對提示的理解方式與人類不同,因此需要精心設計提示,無論是手動(Reynolds & McDonell, 2021)還是自動(Gao et al., 2021;Shin et al., 2020)生成。盡管許多成功的提示微調方法使用基于梯度的方式在連續空間中進行優化(Liu et al., 2021;Qin & Eisner, 2021;Lester et al., 2021),但隨著模型規模的增加,這種方法的計算代價變得越來越高,并且API化的模型使用方式往往不再提供梯度訪問權限。
在本文中,我們借鑒了離散提示搜索方法中的組件,如提示生成(Gao et al., 2021;Ben-David et al., 2021)、提示評分(Davison et al., 2019)和提示釋義(Jiang et al., 2020;Yuan et al., 2021),通過直接在自然語言假設空間中搜索來優化指令。與這些依賴于多個專用模型并嚴重依賴人工模板的工作不同,我們展示了整個搜索過程可以由單一LLM完成。
程序合成
程序合成指的是在“程序空間”中自動搜索,找到滿足特定規范的程序(Gulwani et al., 2017)。現代程序合成支持多種形式的規范,包括輸入-輸出示例(Ellis et al., 2021;Wong et al., 2021)和自然語言(Jain et al., 2022)。可搜索的程序空間也在不斷擴大,從早期受限的領域特定語言逐步發展為支持通用編程語言(Austin et al., 2021)。
與需要結構化假設空間和組件庫的傳統方法(Liang et al., 2010;Ellis et al., 2018)不同,我們利用LLM所提供的結構,在自然語言程序空間中進行搜索。使用推理模型是一種常見的加速搜索的方式,通過限制搜索空間為一小部分可行表達來提高效率(Menon et al., 2013;Lee et al., 2018;Devlin et al., 2017;Ellis et al., 2021)。受此啟發,我們將LLM作為近似推理模型,基于少量示例生成程序候選項。與傳統程序合成方法不同,我們的推理模型無需訓練,并且能夠很好地泛化到各種任務。
3 使用LLM進行自然語言程序合成
我們考慮這樣一個任務:由數據集 D train ? = { ( Q , A ) } { \mathcal { D } } _ { \operatorname { t r a i n } } = \{ ( Q , A ) \} Dtrain?={(Q,A)} 指定,該數據集由來自總體 X X X 的輸入/輸出示例組成,同時還包括一個提示式模型 M M M。自然語言程序合成的目標是找到一個指令 ρ \rho ρ,使得當模型 M M M 接收到 ρ \rho ρ 和給定輸入 Q Q Q 的拼接 [ ρ ; Q ] [\rho ; Q] [ρ;Q] 作為提示時,能夠輸出相應的輸出 A A A。更形式化地,我們將這一過程表述為一個優化問題:尋找指令 ρ \rho ρ,以最大化某個對單個樣本打分函數 f ( ρ , Q , A ) f(\rho, Q, A) f(ρ,Q,A) 在所有可能的 ( Q , A ) (Q, A) (Q,A) 上的期望:
ρ ? = arg ? max ? ρ f ( ρ ) = arg ? max ? ρ E ( Q , A ) [ f ( ρ , Q , A ) ] ( 1 ) \rho^{\star} = \underset{\rho}{\arg\operatorname*{max}} \; f(\rho) = \underset{\rho}{\arg\operatorname*{max}} \; \mathbb{E}_{(Q, A)} \left[ f(\rho, Q, A) \right] \quad(1) ρ?=ρargmax?f(ρ)=ρargmax?E(Q,A)?[f(ρ,Q,A)](1)
需要注意的是, Q Q Q 一般也可以是空字符串,此時我們等價地在優化一個能直接生成輸出 A {A} A 的指令 ρ \rho ρ。盡管人類經常嘗試該任務,但我們對某個特定指令與模型 M M M 之間的兼容性知之甚少。因此,我們提出將這一人類難以處理的問題轉化為一個由LLM引導的黑盒優化過程。
我們的算法 APE(Automatic Prompt Engineer)在兩個關鍵組件中使用LLM:候選指令生成(proposal)和 評分(scoring)。如圖和算法中所示,APE 首先生成一組候選提示,然后根據選定的評分函數對這些候選集進行過濾或改進,最終選出得分最高的指令作為最終輸出。我們將在接下來的部分討論候選生成與評分策略的具體實現方案。
3.1 初始提議分布
由于搜索空間幾乎無限大,找到合適的指令極為困難,這也使得自然語言程序合成在歷史上一直被認為是難以實現的任務。NLP領域的最新進展表明,語言模型在生成多樣的自然語言文本方面表現優異。因此,我們考慮利用預訓練的LLM來提出一組良好的候選解集合 U U U,以引導我們的搜索過程。雖然從LLM中隨機采樣不太可能生成理想的 ( Q , A ) (Q, A) (Q,A) 對,但我們可以改為請求LLM基于輸入/輸出示例近似推斷出那些具有較高得分的最可能指令,即從 P ( ρ ∣ D train ; f ( ρ ) 高 ) P(\rho \mid \mathcal{D}_{\text{train}}; f(\rho) \text{ 高}) P(ρ∣Dtrain?;f(ρ)?高) 中進行近似采樣。
正向模式生成(Forward Mode Generation)
我們考慮兩種從 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain?,?f(ρ)?is?high) 中生成高質量候選項的方法。第一種方法是基于“正向”模式的生成,通過將該分布 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain?,?f(ρ)?is?high) 翻譯為自然語言文本。例如,在我們的指令誘導實驗中(第4.1小節),我們遵循 Honovich 等人(2022)的方法,使用圖2(上)中的提示方式來提示LLM。
反向模式生成(Reverse Mode Generation)
盡管“正向”模型對大多數預訓練LLM而言可以直接使用,但將 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain?,?f(ρ)?is?high) 翻譯為自然語言文本在不同任務中仍需要自定義設計。這是因為指令通常出現在段落的開頭,而“正向”模型只能從左到右生成文本,這要求指令必須出現在提示的末尾才能被預測。因此,我們希望采用一種更靈活的方法,使得指令可以出現在文本中的任意位置。
為了解決這一問題,我們提出“反向”模式生成方法,利用具備填空能力的LLM(例如 T5(Raffel et al., 2020)、GLM(Du et al., 2022)以及 InsertGPT(Bavarian et al., 2022))來推斷缺失的指令。我們的“反向”模型通過填空的方式直接從 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain?,?f(ρ)?is?high) 中進行采樣。圖2(中)展示了這種模板的一個示例。
定制提示(Customized Prompts)
需要注意的是,根據所使用的評分函數的不同,可能存在比上述樣例更合適的提示方式。例如,在我們的 TruthfulQA 實驗中,我們從原始數據集中人類設計的指令出發(Lin et al., 2022),并請求“反向”模型生成符合缺失上下文的初始指令樣本(見圖2(下))。
3.2 評分函數
為了將我們的問題建模為黑盒優化問題,我們選擇一個評分函數,用以準確衡量數據集與模型生成數據之間的一致性。在我們的指令誘導實驗中,我們考慮了兩種潛在的評分函數,下面將進行介紹。在 TruthfulQA 實驗中,我們主要采用 Lin 等人(2022)提出的自動化度量指標,這些指標與執行準確率(execution accuracy)類似。在每種情況下,我們使用公式(1)對生成指令的質量進行評估,并在保留的測試數據集 D test \mathcal{D}_{\text{test}} Dtest? 上取期望。
執行準確率(Execution Accuracy)
首先,我們考慮使用 Honovich 等人(2022)提出的執行準確率指標來評估指令 ρ \rho ρ 的質量,記作 f exec f_{\text{exec}} fexec?。在大多數情況下,執行準確率被簡單地定義為 0-1 損失函數: f ( ρ , Q , A ) = 1 [ M ( [ ρ ; Q ] ) = A ] f ( \rho , Q , A ) = \mathbb { 1 } \left[ \mathcal { M } ( [ \rho ; Q ] ) = A \right] f(ρ,Q,A)=1[M([ρ;Q])=A] ,其中, 1 [ ? ] \mathbf{1}[\cdot] 1[?] 是指示函數,若括號內的條件為真則返回 1,否則返回 0。在某些任務中,執行準確率還會考慮不變性(invariants);例如,它可能是一個對順序不敏感的集合匹配損失函數,具體定義詳見 Honovich 等人(2022)附錄 A。
對數概率
我們進一步考慮一種更柔和的概率評分函數,我們假設這種方法在搜索低質量指令候選時,能夠通過提供更細粒度的信號來改善優化效果。具體來說,我們考慮在目標模型 MM 下,給定指令和問題時期望答案的對數概率,即每個樣本上的 log ? P ( A ∣ [ ρ ; Q ] ) \log P(A \mid [\rho; Q]) logP(A∣[ρ;Q])。
溫馨提示:
閱讀全文請訪問"AI深語解構" APE:大語言模型具有人類水平的提示工程能力