作(zuo)為最領先(xian)的大模型,GPT-4 有(you)自我糾(jiu)正(zheng)生成代碼的能力(li),結合人類反饋,自我糾(jiu)正(zheng)能力(li)還(huan)能進一步的提(ti)高。
大(da)型語(yu)言模型(LLM)已被證明能夠從自(zi)然語(yu)言中生成代(dai)碼(ma)片(pian)段,但(dan)在應對復雜(za)的(de)編碼(ma)挑戰,如專(zhuan)業競賽和軟(ruan)件(jian)工(gong)程專(zhuan)業面(mian)試時,仍面(mian)臨(lin)巨大(da)的(de)挑戰。最(zui)近的(de)研(yan)究試圖通過利用自(zi)修復來提高模型編碼(ma)性(xing)能。自(zi)修復是(shi)指讓模型反(fan)思(si)并(bing)糾(jiu)正自(zi)己(ji)代(dai)碼(ma)中的(de)錯(cuo)誤。
下圖(tu) 1 顯示了(le)基于自修復(fu)方法的(de)典型(xing)(xing)工作流程。首先,給定一(yi)(yi)個規(gui)范(fan),從代碼生成模(mo)(mo)型(xing)(xing)中對程序(xu)(xu)(xu)進(jin)行(xing)采(cai)樣(yang);然后(hou)在作為一(yi)(yi)部分規(gui)范(fan)提(ti)(ti)供的(de)一(yi)(yi)套單(dan)元測試上執(zhi)行(xing)程序(xu)(xu)(xu);如(ru)果(guo)程序(xu)(xu)(xu)在任一(yi)(yi)單(dan)元測試中失(shi)敗,則(ze)將錯(cuo)誤消息和錯(cuo)誤程序(xu)(xu)(xu)提(ti)(ti)供給一(yi)(yi)個反(fan)饋生成模(mo)(mo)型(xing)(xing),該模(mo)(mo)型(xing)(xing)輸出代碼失(shi)敗原因(yin)的(de)簡短解釋;最后(hou),反(fan)饋被(bei)傳(chuan)遞給修復(fu)模(mo)(mo)型(xing)(xing),該模(mo)(mo)型(xing)(xing)生成程序(xu)(xu)(xu)的(de)最終固化版本(ben)。
從(cong)表(biao)面上看,這是一個非常有吸引力的(de)想(xiang)法。這種設計能讓系統克服(fu)在(zai)解碼過(guo)程(cheng)中由(you)離群樣本引起(qi)的(de)錯(cuo)(cuo)誤;在(zai)修復(fu)階段,可以輕松地整(zheng)合來自編譯(yi)器(qi)、靜態分析工(gong)(gong)具和執(zhi)行引擎等符號系統的(de)反饋,并模仿人類軟(ruan)件(jian)工(gong)(gong)程(cheng)師編寫代碼的(de)試(shi)錯(cuo)(cuo)方(fang)式。
然而(er),自(zi)(zi)修復需(xu)要更(geng)多(duo)(duo)的模型調用(yong),計(ji)算(suan)成本(ben)較(jiao)高。特別要注意的是,自(zi)(zi)修復能(neng)否奏效,最終歸結為(wei)在同等計(ji)算(suan)性能(neng)預(yu)算(suan)下,是否能(neng)從模型中抽取更(geng)多(duo)(duo)代碼樣本(ben),并(bing)將(jiang)其與作為(wei)一部分任務提供的單(dan)元測試套件進行比較(jiao)。
至關重(zhong)要的是,自修復(fu)的有(you)(you)效(xiao)性不僅(jin)取決于模(mo)型(xing)生(sheng)成代碼的能力(文獻(xian)中對此進(jin)行(xing)了廣泛研究),還(huan)取決于它識別代碼(由(you)模(mo)型(xing)本身生(sheng)成)在任務規范方面是如何出(chu)錯的能力。此前沒有(you)(you)任何工作試圖(tu)詳細(xi)研究這些能力的影響。
本文中,來自 MIT、微軟研(yan)究院(yuan)的(de)(de)研(yan)究者在解決(jue)競賽(sai)級(ji)別的(de)(de)代碼生成任(ren)務時(shi),使用 GPT-3.5 和(he) GPT-4 研(yan)究自修復的(de)(de)有效性。研(yan)究者首(shou)先(xian)提出一種新(xin)的(de)(de)評估策略,稱為 pass@t,其中獲得(de)正確(que)程序的(de)(de)可(ke)能性(相對(dui)于(yu)給定(ding)的(de)(de)單(dan)元測試)相對(dui)于(yu)從(cong)模型(xing)中采樣的(de)(de) token 總(zong)數進行加權。
使用新的評(ping)估(gu)策略代(dai)替傳統(tong)的 pass@k 度量(liang)(根據(ju)試驗次數(shu)(shu)衡量(liang)通過率),研究者能夠準確(que)地將通過自修(xiu)(xiu)復(fu)獲(huo)得(de)的性能與模型在生(sheng)成反饋(kui)和進行修(xiu)(xiu)復(fu)時所(suo)做的任何額外工作進行比較。研究者仔細探(tan)究了在一系列超(chao)參數(shu)(shu)下的動態自修(xiu)(xiu)復(fu)過程(cheng)。
最后,鑒(jian)于研(yan)(yan)究(jiu)的(de)主(zhu)要(yao)目標是深入了(le)解(jie)最先進(jin)的(de)代碼(ma)生成(cheng)模型反(fan)(fan)思和調試自己代碼(ma)的(de)能力,本(ben)文進(jin)行(xing)(xing)了(le)一組實驗(yan),單獨(du)研(yan)(yan)究(jiu)了(le)改(gai)進(jin)反(fan)(fan)饋(kui)階段(duan)的(de)影響。通過分析使(shi)用(yong)比代碼(ma)生成(cheng)模型更強的(de)反(fan)(fan)饋(kui)生成(cheng)模型(使(shi)用(yong) GPT-4 為 GPT-3.5 代碼(ma)模型生成(cheng)反(fan)(fan)饋(kui))的(de)影響,研(yan)(yan)究(jiu)者進(jin)行(xing)(xing)了(le)一項研(yan)(yan)究(jiu):讓人(ren)類(lei)對不正確的(de)程(cheng)序(xu)提供反(fan)(fan)饋(kui),以便(bian)將模型生成(cheng)的(de)自反(fan)(fan)饋(kui)與(yu)人(ren)類(lei)提供的(de)自反(fan)(fan)饋(kui)進(jin)行(xing)(xing)比較。
論文地址(zhi)://arxiv.org/pdf/2306.09896.pdf
從本文的實驗(yan)中,研究者(zhe)有了(le)以下發現:
1. 當考慮進行檢(jian)查和修(xiu)復(fu)(fu)的(de)(de)成(cheng)本時,自(zi)修(xiu)復(fu)(fu)的(de)(de)性能收益只(zhi)能用 GPT-4 來衡量;對于(yu) GPT-3.5,在所有配置下(xia),修(xiu)復(fu)(fu)的(de)(de)通(tong)過(guo)率(lv)低于(yu)或(huo)等于(yu)基線模型 / 無(wu)修(xiu)復(fu)(fu)方法的(de)(de)通(tong)過(guo)率(lv)。
2. 即使對于 GPT-4,性能提升(sheng)也是(shi)適度(du)的(de)(de)(66%→ 71% 的(de)(de)通過率,預算(suan)為 7000 個(ge) token,約 45 個(ge)獨立同分布(i.i.d.)的(de)(de) GPT-4 樣(yang)本),并同時取決(jue)于初(chu)始程序(xu)是(shi)否(fou)具有足(zu)夠的(de)(de)多(duo)樣(yang)性。
3. 用 GPT-4 產生的(de)反饋代(dai)替 GPT-3.5 對錯誤的(de)解釋,可以獲得更(geng)好的(de)自修復(fu)(fu)性能,甚至(zhi)超(chao)過了基線的(de)無修復(fu)(fu) GPT-3.5 方(fang)法(50%→ 7000token 時為(wei) 54%)。
4. 用人類的解釋取代 GPT-4 自己的解釋可以顯著改善修復結果,從而使通過測試的修復程序數量增加 57%。
愛(ai)丁堡(bao)大(da)學博士生符堯表(biao)示:「只(zhi)有 GPT-4 可以自(zi)我改(gai)進(jin)(jin),而較(jiao)弱的模型(xing)(xing)不能,這(zhe)一發(fa)現非常有趣,表(biao)明(大(da)模型(xing)(xing)存(cun)在)一種新型(xing)(xing)的涌現能力(即改(gai)進(jin)(jin)自(zi)然語言(yan)反饋),可能只(zhi)有在模型(xing)(xing)足夠成熟(大(da)而整齊)時才存(cun)在。大(da)模型(xing)(xing)的這(zhe)種能力在論文《Improving Language Model Negotiation with Self-Play and In-Context Learning from AI Feedback》中也(ye)存(cun)在過。
只有足(zu)夠(gou)成熟的模型才(cai)能清楚(listen to)并(bing)改(gai)進自然語言反饋,較弱(ruo)的模型要么無(wu)法理解反饋,要么無(wu)法對其進行改(gai)進。
我傾向于相信(xin)這(zhe)種(zhong)涌現能(neng)力(通過語(yu)言反(fan)饋(kui)進行自(zi)我改進)會對 LLM 研究(jiu)產生非常重(zhong)要的影(ying)響,因(yin)為這(zhe)意味著 AI 可以在(zai)很少的人類監督下不斷自(zi)主改進。」
方法
自修復概述
如上圖 1 所示,自(zi)修復(fu)方(fang)法包括 4 個(ge)階段:代碼(ma)生成、代碼(ma)執(zhi)行、反(fan)饋生成和代碼(ma)修復(fu)。接下來(lai)正式定義這四(si)個(ge)階段。
代碼生成
給(gei)定(ding)一個規范 ψ,程(cheng)序模(mo)型 M_P 首先生成 n_p 個獨立同分布樣本,研究(jiu)者將其表示為
代碼執行
然后在測試臺上執(zhi)行(xing)這(zhe)(zhe) n_p 個(ge)代碼樣本(ben)。研究者假設可以訪問可執(zhi)行(xing)形式的全套(tao)測試,因此如(ru)果任何樣本(ben)通(tong)過了所有測試,系統就會停止,因為這(zhe)(zhe)時已(yi)經找到了一個(ge)令人滿意的程序。否(fou)則,系統將收集(ji)執(zhi)行(xing)環(huan)境(jing)返(fan)回的錯誤消(xiao)(xiao)息(xi)。這(zhe)(zhe)些錯誤消(xiao)(xiao)息(xi)要么包含編譯(yi) / 運行(xing)時錯誤信息(xi),要么包含程序輸(shu)出與預期輸(shu)出不(bu)同的示(shi)例輸(shu)入(ru)。示(shi)例如(ru)圖 1(組件 3)所示(shi)。
反饋生成
由于來自執(zhi)行環境的(de)錯誤消(xiao)息通常(chang)非常(chang)高級,因此它們提供的(de)修復信號很(hen)少。作為(wei)中間(jian)步驟,研(yan)究(jiu)者使用反(fan)饋模型來更(geng)詳(xiang)細地解釋出了什么問(wen)題;示(shi)例(li)如圖(tu) 1(組(zu)件 4)所示(shi)。形式上,在這個階段,他們為(wei)每個錯誤的(de)程序 p_i 生成(cheng) n_f 個反(fan)饋字符串,具體(ti)如下所示(shi):
有(you)了明確的(de)(de)反饋生成步(bu)驟,就可以消融這個組件,獨立(li)地(di)研究(jiu)它的(de)(de)意義。
代碼修復
在(zai)最后一(yi)步中,對于每個(ge)初始程(cheng)序(xu) p_i 和反饋(kui) f_ij,可(ke)以從(cong)采樣 n_r 個(ge)候選修復程(cheng)序(xu):
修復(fu)樹(shu)。研(yan)究者將(jiang)該過(guo)程生成的包含文本和程序(xu)的樹(shu)稱為植根于規范中的 ψ,然(ran)后分支(zhi)到初(chu)始程序(xu) p_i,每個初(chu)始程序(xu)分支(zhi)到反饋 f_ij,然(ran)后對修復(fu)樹(shu) r_ijk 進行修復(fu),如下(xia)圖所示(shi)。
注(zhu)意:聯合采樣反饋和(he)修(xiu)復。上述通用(yong)框(kuang)架不(bu)要(yao)求編程模型(xing)和(he)反饋模型(xing)相同,因此兩個(ge)模型(xing)可以使(shi)用(yong)各自的專有(you)模型(xing)。然(ran)而,當 M_P=M_F 時,研(yan)究者(zhe)在單個(ge) API 調用(yong)中聯合生成(cheng)反饋和(he)修(xiu)復的程序(xu),因為 GPT-3.5 和(he) GPT-4 都有(you)在響應中交織文本(ben)和(he)代碼(ma)的自然(ran)傾向。形式上,研(yan)究者(zhe)將其(qi)表(biao)示為
pass@t:通過(guo)率(lv)與 token 數量的關系
由于自修(xiu)復需要幾個非均勻成(cheng)本(ben)的(de)依賴(lai)模(mo)型調用(yong),因此(ci) pass@k 這種在 k 個獨立同分布樣本(ben)中獲得正(zheng)確程序的(de)可能性指標,不是用(yong)于比較(jiao)和評(ping)估自修(xiu)復的(de)各(ge)種超參數(shu)(shu)選擇的(de)合適度量。相反,研究者將(jiang)通過(guo)率作(zuo)為從模(mo)型中采樣的(de) token 總數(shu)(shu)的(de)函數(shu)(shu),稱之為 pass@t。
形式上,假設(she)一個數(shu)(shu)據集 D=_d 和(he)超參數(shu)(shu)(M_P,M_F,n_p,n_f,n_r)的一組選(xuan)定值。令
表示(shi)上文所述對任務(wu) ψ_d 進行采(cai)樣的修復(fu)樹;令 size(T^i_d)表示(shi)修復(fu)樹中(zhong)的程序(xu)和反饋(kui) token 的總數(shu);并在當且僅(jin)當 T^i_d 至少有(you)一(yi)個葉子節點程序(xu)滿足規范中(zhong)的單元(yuan)測試 ψ_d 時(shi),令 T^i_d |=ψ_d 為(wei)真。然(ran)后(hou) pass@t 這(zhe)種(zhong)超(chao)參數(shu)選(xuan)擇(ze)的度(du)量(liang)被定義為(wei)希望通過這(zhe)種(zhong)超(chao)參數(shu)選(xuan)擇(ze)生成的 token 數(shu)量(liang)時(shi)預期通過率:
實(shi)(shi)驗(yan)繪(hui)制了(le)這兩(liang)個(ge)(ge)(ge)(ge)量的(de) bootstrapped estimates(一(yi)種統(tong)計(ji)(ji)估(gu)計(ji)(ji)方法,通(tong)常用于評估(gu)參數估(gu)計(ji)(ji)的(de)不(bu)(bu)確定性)。為了(le)獲得這些數值,本文首先為每個(ge)(ge)(ge)(ge)任務規范生成一(yi)個(ge)(ge)(ge)(ge)非常大(da)(da)的(de)修(xiu)復樹,其中:有 N_p≥n_p 個(ge)(ge)(ge)(ge)初(chu)始(shi)程序樣(yang)本;每個(ge)(ge)(ge)(ge)錯誤(wu)程序有 N_f≥n_f 個(ge)(ge)(ge)(ge)反饋(kui)字符串;并且每個(ge)(ge)(ge)(ge)反饋(kui)串有 N_r≥n_r 個(ge)(ge)(ge)(ge)修(xiu)復候(hou)選。給(gei)定(n_p,n_f,n_r)的(de)設(she)置,然(ran)后從(cong)這個(ge)(ge)(ge)(ge)凍(dong)結的(de)數據(ju)集(ji)中對 N_t 個(ge)(ge)(ge)(ge)不(bu)(bu)同(tong)的(de)修(xiu)復樹進行子采(cai)樣(yang)(帶替換)。最后,本文計(ji)(ji)算了(le)這 N_t 棵樹上(shang)通(tong)過率和(he)樹大(da)(da)小的(de)樣(yang)本均值和(he)標準差。如此估(gu)計(ji)(ji) pass@t 大(da)(da)大(da)(da)降低了(le)實(shi)(shi)驗(yan)的(de)計(ji)(ji)算成本,因為可(ke)以重(zhong)用相同(tong)的(de)初(chu)始(shi)數據(ju)集(ji)來(lai)計(ji)(ji)算 n_p、n_f 和(he) n_r 的(de)所有不(bu)(bu)同(tong)選擇的(de)估(gu)計(ji)(ji)。
本(ben)文所有實驗(yan)中(zhong),N_p=50,自修(xiu)復(fu)方法中(zhong) n_p≤25,基線(xian)無修(xiu)復(fu)方法中(zhong) n_p≤50。類(lei)似地,對于(yu)反饋,本(ben)文令 N_f=25 和(he) N_f≤10。對于(yu)候選修(xiu)復(fu),由于(yu)本(ben)文在大多數實驗(yan)中(zhong)對反饋和(he)修(xiu)復(fu)進行聯(lian)合采樣,因(yin)此本(ben)文設置(zhi) N_r=n_r=1。最后(hou),本(ben)文對所有設置(zhi)使用 N_t=1000。
實驗
研究者針對以下問題進行了相關實驗:
(a)在(zai)具有挑戰性的編程難題的背景下,對于本文提出的模(mo)型(xing),自修(xiu)復是否(fou)比不修(xiu)復的獨立同分(fen)布采(cai)樣更(geng)好?如果是,在(zai)什么(me)超參數下自修(xiu)復最有效?
(b) 更(geng)強的(de)反饋(kui)模型(xing)會提高模型(xing)的(de)修復性能(neng)嗎?
(c) 即使(shi)是(shi)最強的模型,讓人參(can)與(yu)提供反饋(kui)會帶來更(geng)好的修復(fu)性(xing)能(neng)嗎?
本文使用 APPS 數據集評估了這些關于 Python 編程挑戰的疑惑。
自修復需要強大的模型和多樣化的初始樣本
令 M_P=M_F∈,用(yong)于(yu)代(dai)碼 / 修復(fu)生成和反饋生成的(de)是同一(yi)個(ge)模型(xing)。GPT-3.5 的(de)結果見(jian)圖 3,GPT-4 的(de)結果見(jian)圖 4。
從(cong)圖中(zhong)可以(yi)看出,對于 GPT-3.5 模型,pass@t 在所有(you)(you)的 n_p、n_fr 選值中(zhong),都低于或等于相應基(ji)線(黑(hei)線),這清楚地表明自修復不是 GPT-3.5 的有(you)(you)效策略。另一(yi)方面,對于 GPT-4,有(you)(you)幾個 n_p、n_fr 值,其自修復的通(tong)過(guo)率明顯優于基(ji)線的通(tong)過(guo)率。例如(ru),當(dang)(dang) n_p=10,n_fr=3 時,通(tong)過(guo)率從(cong) 65% 增加到 70%,當(dang)(dang) n_p=25,n_fr=1 時,通(tong)過(guo)率從(cong) 65% 增加至 71%。
GPT-4 的反饋改進了 GPT-3.5 自修復能力
接下來(lai),本(ben)文進行(xing)了(le)一(yi)個(ge)實驗,在(zai)這個(ge)實驗中,研究(jiu)者評(ping)估了(le)使用一(yi)個(ge)單(dan)獨的(de)、更強的(de)模型(xing)來(lai)生成反饋的(de)影響。這是(shi)為了(le)檢驗一(yi)種假設:即模型(xing)無法內省(sheng)和(he)調(diao)試(shi)自己本(ben)身的(de)代(dai)碼,從而阻礙了(le)自修(xiu)復(fu)(尤其是(shi) GPT-3.5)。
該(gai)實(shi)驗的(de)結(jie)果如圖 5 所示(亮藍線)。研究者觀察到(dao),就絕對性能(neng)(neng)而(er)言,M_P=GPT-3.5,M_F=GPT-4 確實(shi)突破(po)了性能(neng)(neng)障(zhang)礙,變得比 GPT-3.5 的(de)獨(du)立同分布采樣效率略高(gao)。這表明反饋階段(duan)至關重要,改(gai)進它可以緩解 GPT-3.5 自修復的(de)瓶頸。
人類反饋顯著提高了 GPT-4 自修復的成功率
在本文(wen)的(de)最后一(yi)個實驗中(zhong),研(yan)(yan)(yan)(yan)究(jiu)者考慮了在使用 GPT-4 等(deng)更強(qiang)的(de)模型(xing)進(jin)行(xing)修(xiu)復(fu)時(shi)使用專業人(ren)(ren)(ren)類程序(xu)員的(de)反饋的(de)效果。這(zhe)項研(yan)(yan)(yan)(yan)究(jiu)的(de)目的(de)不是(shi)直接比較人(ren)(ren)(ren)在循環中(zhong)的(de)方(fang)法(fa)與自(zi)修(xiu)復(fu)方(fang)法(fa),因(yin)為人(ren)(ren)(ren)在循環方(fang)法(fa)會帶(dai)來(lai)更多的(de)認(ren)知負擔,而本文(wen)沒有對此進(jin)行(xing)研(yan)(yan)(yan)(yan)究(jiu)。相反,本文(wen)的(de)目標(biao)是(shi)了解模型(xing)識別代碼中(zhong)錯誤(wu)的(de)能力與人(ren)(ren)(ren)類相比如何,以及(ji)這(zhe)如何影(ying)響自(zi)修(xiu)復(fu)的(de)下游性(xing)能。因(yin)此,該研(yan)(yan)(yan)(yan)究(jiu)對人(ren)(ren)(ren)類反饋對自(zi)修(xiu)復(fu)的(de)影(ying)響進(jin)行(xing)了定性(xing)和(he)定量(liang)分析(xi)。
結果(guo)總(zong)結在表 1 中。我(wo)們(men)(men)首先注意到,當(dang)我(wo)們(men)(men)用人(ren)類參與者的(de)調試取代(dai) GPT-4 自己的(de)調試時(shi),總(zong)體成(cheng)功率提高了 1.57 倍(bei)以上。也(ye)許不足為奇的(de)是,隨(sui)著(zhu)問題(ti)變得越來越困難,相對差異也(ye)會(hui)增(zeng)加,這表明當(dang)任務(和代(dai)碼)變得更加復(fu)雜時(shi),GPT-4 產(chan)生準確(que)和有用反饋(kui)的(de)能力遠遠落后于我(wo)們(men)(men)的(de)人(ren)類參與者。
此外,該研究還定性地(di)分析了人類參與者提(ti)供的反(fan)饋與 GPT-4 提(ti)供的反(fan)饋之間的差異。
只有 2/80 個人貢(gong)獻的反饋(kui)字(zi)符串包括偽代(dai)碼或顯式 Python;也(ye)就是(shi)說,獲得的幾(ji)乎所有人類(lei)反饋(kui)都(dou)是(shi)自然語言,偶爾(er)穿(chuan)插著單(dan)語句數學 / 代(dai)碼表達式。
GPT-4 的(de)反饋更可能明(ming)顯不(bu)準確(32/80 與人類反饋的(de) 7/80)。
GPT-4 更(geng)可能明確地(di)建議(yi)小(xiao)的(de)變(bian)(bian)化(hua)(54/80 對 42/80;28/48 對 38/73,當(dang)看(kan)起來正(zheng)確時(shi)),而我們的(de)人類參與者(zhe)顯示出更(geng)大的(de)趨勢(shi)來建議(yi)高水平的(de)變(bian)(bian)化(hua)(23/80 對 18/80,GPT-4;21/73 對 13/48,當(dang)看(kan)起來正(zheng)確時(shi))。
人類參(can)與者有(you)(you)時會表(biao)達不確(que)定性(7/80);GPT-4 沒有(you)(you)(0/80)。
進一步的(de)(de)分(fen)析表明,表 1 中(zhong)的(de)(de)結果不是(shi)由(you)于人(ren)為因(yin)素(su)造成(cheng)的(de)(de),例如參與者(zhe)(zhe)提供了模型簡單復制的(de)(de)顯式代碼塊。相反,性能的(de)(de)差(cha)異(yi)似(si)乎是(shi)由(you)更準確的(de)(de)反饋(kui)、在需要(yao)時建議對(dui)代碼進行高級(ji)別、大規模更改的(de)(de)更大能力,以及參與者(zhe)(zhe)表達其不確定性的(de)(de)能力(而不是(shi)自信地給出潛在的(de)(de)不準確反饋(kui))共同造成(cheng)的(de)(de)。