Multi-Stage Language Model Programs:提升語言模型程序的新策略 原創(chuàng)
在自然語言處理(NLP)領(lǐng)域,語言模型程序(Language Model Programs)正逐漸成為推動任務(wù)進展的關(guān)鍵力量。這些由多個模塊化語言模型(LM)調(diào)用組成的復(fù)雜管道,為解決復(fù)雜的NLP任務(wù)提供了新的思路和方法。然而,構(gòu)建這些管道并非易事,其中一個關(guān)鍵挑戰(zhàn)就是如何優(yōu)化提示(prompts),使得所有模塊都能高效協(xié)同工作。今天我們就來介紹一篇來自DSPy一作、斯坦福大學(xué)博士生、并且即將成為MIT助理教授的Omar Khattab領(lǐng)導(dǎo)的一項有意思的工作!
一、研究背景
(一)語言模型程序的發(fā)展與挑戰(zhàn)
隨著技術(shù)的發(fā)展,語言模型在解決復(fù)雜任務(wù)時,常常需要運用復(fù)雜的提示技術(shù),并將其組合成多階段的管道。例如在問答系統(tǒng)、文本生成、信息檢索等任務(wù)中,通過將多個語言模型按特定順序和方式組合,可以實現(xiàn)更強大的功能。但是,目前構(gòu)建這些管道大多依賴于手動的“提示工程”(prompt engineering),即通過反復(fù)試驗來設(shè)計提示,以促使特定的語言模型在特定的管道步驟中運行。這種方法不僅耗時費力,而且難以保證效果的最優(yōu)性。
(二)現(xiàn)有提示優(yōu)化方法的局限性
近年來,雖然出現(xiàn)了一些提示優(yōu)化器(prompt optimizers),如APE、OPRO和EvoPrompt等,但它們大多針對單個語言模型的提示優(yōu)化,無法直接應(yīng)用于多階段的語言模型程序。在多階段程序中,由于缺乏對單個語言模型調(diào)用的黃金標簽或評估指標,使得提示優(yōu)化變得更加困難。
圖1:優(yōu)化問題的一個示例,以一個多跳檢索語言模型程序展示。給定一些問答對和一個度量標準,優(yōu)化器為每個階段提出新的指令并引導(dǎo)新的演示(未圖示)。
二、問題定義與挑戰(zhàn)分析
(一)問題正式化
考慮一個由m個模塊組成的語言模型程序Φ,每個模塊使用一個語言模型,并由一個包含一組變量(開放插槽)v的提示模板pi定義。我們的目標是找到一個變量到字符串的總分配,使得程序在給定的訓(xùn)練集D上,根據(jù)評估指標μ達到最優(yōu)性能。這個問題面臨著諸多挑戰(zhàn),例如每個字符串可以取任意值,評估指標只能在整個任務(wù)層面提供監(jiān)督,無法獲取語言模型的梯度或嵌入,以及通常只有小數(shù)據(jù)集和有限的語言模型調(diào)用預(yù)算等。
(二)主要挑戰(zhàn)
- 提案挑戰(zhàn)(Proposal Challenge) 可能的提示空間非常大,而且隨著模塊數(shù)量的增加,這個問題更加嚴重。因此,提出一些高質(zhì)量的指令就變得至關(guān)重要。
- 信用分配挑戰(zhàn)(Credit Assignment Challenge) 需要聯(lián)合優(yōu)化許多不同的變量,這些變量用于參數(shù)化所有模塊的提示。為了合理分配搜索努力,我們必須有效地推斷每個變量配置的影響。
三、解決策略
(一)應(yīng)對提案挑戰(zhàn)的策略
- 引導(dǎo)演示(Bootstrapping Demonstrations)一種簡單而有效的策略是通過從訓(xùn)練集中采樣輸入,運行程序Φ生成輸入/輸出軌跡,將成功的軌跡作為潛在的標記演示(即有效輸入/輸出示例)。然后,從這些潛在演示中選擇組合作為有效的少樣本示例用于提示。
- 基礎(chǔ)設(shè)定(Grounding)為了引導(dǎo)提案語言模型為給定模塊生成高效的指令,我們?yōu)槠涮峁┫嚓P(guān)的上下文信息,如數(shù)據(jù)的屬性、程序的控制流以及成功任務(wù)完成的示例等。通過構(gòu)建一個零樣本語言模型程序來描述原始數(shù)據(jù)集的模式、總結(jié)程序的控制流、引導(dǎo)程序演示以及收集每個階段的提示及其評估分數(shù),并將這些信息作為上下文提供給提案語言模型。
- 學(xué)習提案(Learning To Propose)每個提案策略都有一些超參數(shù),如指令生成的溫度以及是否使用數(shù)據(jù)摘要、程序控制流等來設(shè)定提案語言模型的基礎(chǔ)。由于這些超參數(shù)的最優(yōu)配置可能因任務(wù)、程序和提案語言模型而異,我們通過參數(shù)化提案超參數(shù),并在多次試驗中學(xué)習一個貝葉斯模型,以找到適合給定任務(wù)、程序和語言模型設(shè)置的提案策略。
圖2:引導(dǎo)隨機搜索。在第1步中,通過將訓(xùn)練輸入在程序Φ中運行,并保留根據(jù)度量標準μ判斷能產(chǎn)生足夠高得分輸出的軌跡,來引導(dǎo)演示。在第2步中,使用隨機搜索對這些引導(dǎo)出的演示集進行搜索,并返回性能最佳的集合。
(二)應(yīng)對信用分配挑戰(zhàn)的策略
- 貪婪策略(Greedy)分別對語言模型程序的單階段變化進行提案和評估。雖然這種方法可以避免將錯誤錯誤地歸因到不正確的階段,但它效率低下,因為每次只能應(yīng)用一個變化,而且某些階段的變化可能要在其他階段先改進后才能對程序級性能產(chǎn)生影響。
- 替代策略(Surrogate)利用貝葉斯學(xué)習構(gòu)建一個替代模型,通過學(xué)習從先前評估中預(yù)測不同參數(shù)組合的質(zhì)量,使我們能夠聚焦于搜索空間中有希望的區(qū)域。這種基于替代的優(yōu)化方法可以有效地優(yōu)化離散的現(xiàn)有參數(shù)提案集,但它的缺點是只能對固定的提案集進行優(yōu)化,無法利用過去的評估結(jié)果來改進提案本身。
- 基于歷史的策略(History - Based)假設(shè)給定過去評估的歷史,一個足夠強大的語言模型可以進行信用分配。通過將評估過的指令及其分數(shù)包含在上下文中,讓提案語言模型學(xué)習分配信用并輸出新的指令。
四、算法實例與實驗
(一)算法實例
- 引導(dǎo)隨機搜索(Bootstrap Random Search)首先通過引導(dǎo)演示過程為每個模塊引導(dǎo)出一定數(shù)量的少樣本示例,然后使用隨機搜索在這些引導(dǎo)出的演示集上進行搜索,返回性能最佳的集合。
- 模塊級OPRO(Module - Level OPRO)將模塊級指令和程序分數(shù)對的歷史作為輸入提供給提案語言模型,為每個模塊生成新的指令,然后在程序中評估這些指令,并將結(jié)果分數(shù)與每個模塊的指令一起添加回模塊的歷史中,重復(fù)這個過程直到達到最大迭代次數(shù),最后返回得分最高的程序參數(shù)化。
- MIPRO(Multiprompt Instruction PRoposal Optimizer)首先通過引導(dǎo)演示和基礎(chǔ)設(shè)定策略為每個模塊引導(dǎo)出少樣本示例和指令,并初始化潛在的分類變量。然后使用樹結(jié)構(gòu)的Parzen估計器的采樣規(guī)則選擇用于參數(shù)化Φ的指令和少樣本示例。接著在隨機選擇的小批量樣本上對參數(shù)化的Φ進行評分,并使用這些分數(shù)更新估計器對參數(shù)質(zhì)量的先驗。最后,每隔一定步驟,在整個訓(xùn)練集上評估具有最高平均分數(shù)的候選參數(shù)化,返回最優(yōu)的分配。
圖3:模塊級OPRO優(yōu)化器。模塊級指令和程序分數(shù)對的歷史作為輸入提供給提案語言模型,以便為每個模塊生成一條新指令。然后在程序中對這些指令進行評估,并將所得分數(shù)與每個模塊的指令一起添加回模塊的歷史記錄中。這個過程重復(fù)I次。
圖4:MIPRO優(yōu)化器。在第1步中,使用與引導(dǎo)隨機搜索第1步相同的過程引導(dǎo)演示。在第2步中,使用3.1節(jié)中描述的基礎(chǔ)設(shè)定策略提出指令。在第3步中,使用貝葉斯優(yōu)化來找到指令和演示候選的最佳性能組合。
(二)實驗設(shè)置
- 基準測試(Benchmark)開發(fā)了七個任務(wù)來評估語言模型程序優(yōu)化器,包括四個多階段程序和兩個單階段程序,涵蓋了問答、分類、自然語言推理等多種任務(wù)類型。使用500個示例進行訓(xùn)練,500個用于開發(fā),2000個(或更小的完整測試集)用于測試。
- 方法與模型(Methods & Models)對指令僅優(yōu)化、少樣本優(yōu)化以及指令和少樣本聯(lián)合優(yōu)化三種情況進行了評估。在不同的優(yōu)化場景下,比較了多種優(yōu)化器的性能,如Module - Level OPRO、0 - Shot MIPRO、0 - Shot MIPRO++、Bootstrap Random Search、Bayesian Bootstrap等,并使用未優(yōu)化的語言模型程序作為基線。同時,為了評估基礎(chǔ)設(shè)定的效用,還比較了帶有和不帶有基礎(chǔ)設(shè)定的Module - Level OPRO。在實驗中,使用GPT - 3.5作為提案語言模型,Llama3 - 8B作為任務(wù)模型,并根據(jù)任務(wù)的不同,在引導(dǎo)少樣本演示時可能會切換使用的模型。
表1:DSPy優(yōu)化器基準測試和相關(guān)程序。我們在七個不同的程序上對我們的優(yōu)化器進行基準測試。
(三)實驗結(jié)果與討論
- 引導(dǎo)演示的重要性對于大多數(shù)任務(wù),優(yōu)化引導(dǎo)的演示作為少樣本示例對于實現(xiàn)最佳性能至關(guān)重要。通過實驗證明,即使是簡單的引導(dǎo)隨機搜索,在除了一個任務(wù)之外的所有任務(wù)中,都比最佳的僅指令優(yōu)化器表現(xiàn)更好。
- MIPRO的優(yōu)勢使用MIPRO聯(lián)合優(yōu)化指令和少樣本示例通常能獲得最佳的整體性能。但也存在一些例外情況,對于某些任務(wù),如HotPotQA和Heart Disease等,可能由于任務(wù)本身的特點,指令優(yōu)化的價值相對較小。
- 指令優(yōu)化的適用場景對于具有條件規(guī)則且這些規(guī)則對語言模型不明顯且無法通過有限的少樣本示例表達的任務(wù),指令優(yōu)化最為重要。例如在HotPotQA Conditional任務(wù)中,即使是0 - shot指令優(yōu)化也優(yōu)于僅演示優(yōu)化。
- 基礎(chǔ)設(shè)定的效果基礎(chǔ)設(shè)定對于指令提案總體上是有幫助的,但最佳的提案策略因任務(wù)而異。在某些任務(wù)中,如HotPotQA和HoVer,基礎(chǔ)設(shè)定對性能提升至關(guān)重要,而在ScoNe任務(wù)中,似乎會損害性能。這也促使了像MIPRO++這樣能夠針對給定任務(wù)學(xué)習自定義提案策略的方法的出現(xiàn)。
- 進一步探索的空間通過比較不同優(yōu)化器的性能,發(fā)現(xiàn)結(jié)果是復(fù)雜的。不同的優(yōu)化器在不同的任務(wù)和場景下各有優(yōu)劣,未來還需要進一步研究在不同優(yōu)化預(yù)算下這些優(yōu)化器的性能差異,以及探索如何讓優(yōu)化器在不依賴手寫輸入的情況下學(xué)習任務(wù)動態(tài)等問題。
表2:5次運行的平均結(jié)果,分為僅優(yōu)化指令(即“0 - shot”提示)、僅優(yōu)化演示以及兩者同時優(yōu)化。每列中性能最佳的值用粗體突出顯示。這些粗體值表示與第二高值相比的最高平均分數(shù),相應(yīng)運行平均值之間的威爾科克森符號秩檢驗(p <.05)支持其顯著性。如果顯著性未得到確認,則多個結(jié)果用粗體表示它們具有可比的性能。
五、研究貢獻與局限
(一)貢獻
- 對語言模型程序的提示優(yōu)化問題進行了形式化定義,并提出了一個算法設(shè)計空間,包括三種應(yīng)對提示提案挑戰(zhàn)的策略和三種解決信用分配問題的策略。
- 發(fā)布了一個涵蓋七個任務(wù)的語言模型程序優(yōu)化器基準測試套件,為評估不同優(yōu)化器的性能提供了統(tǒng)一的標準。
- 構(gòu)建并評估了一組可能的提示優(yōu)化算法,其中MIPRO優(yōu)化器在七個任務(wù)中的五個任務(wù)上優(yōu)于基線優(yōu)化器,為實際應(yīng)用提供了有效的優(yōu)化方法。
- 為從業(yè)者提供了五條關(guān)于優(yōu)化語言模型程序的關(guān)鍵經(jīng)驗教訓(xùn),有助于指導(dǎo)實踐操作。
(二)局限
- 研究是在固定預(yù)算下進行的,沒有探討在極低或極高預(yù)算場景下優(yōu)化動態(tài)的差異。
- 在實驗中使用了固定的提案語言模型和任務(wù)語言模型,未來需要評估在使用不同模型時方法的一致性表現(xiàn)。
- 優(yōu)化器在推斷復(fù)雜任務(wù)的規(guī)則方面能力有限,尤其是在沒有手寫種子提示的情況下。
- 雖然建立了一個涵蓋多種任務(wù)和程序的基準,但對于日益復(fù)雜的任務(wù)和程序,優(yōu)化器方法的性能還有待進一步研究和完善。
總的來說,這項研究在語言模型程序提示優(yōu)化方面取得了重要進展,為未來的研究和實踐提供了有價值的參考和方向。盡管存在一些局限,但也為進一步的探索和改進提供了空間。
本文轉(zhuǎn)載自公眾號AIGC最前線 作者:不是小馬哥啊
