原文來源:新智元
圖片來源:由無界AI 生成
我們都知道,大模型具有自省能力,可以對寫出的代碼進行自我糾錯。
這種自我修復背後的機制,究竟是怎樣運作的?
對代碼為什麼是錯誤的,模型在多大程度上能提供準確反饋?
近日,MIT和微軟的學者發現,在GPT-4和GPT-3.5之中,只有GPT-4表現出了有效的自修復。並且,GPT-4甚至還能對GPT-3.5生成的程序提供反饋。
論文地址:https://arxiv.org/pdf/2306.09896.pdf
英偉達科學家Jim Fan強烈推薦了這項研究。
在他看來,即使是最專業的人類程序員也無法一次性正確編寫程序。他們需要查看執行結果,推理出問題所在,給出修復措施,反复嘗試。這是一個智能體循環:根據環境反饋迭代改進代碼。
很有可能,OpenAI正在通過僱傭大量軟件工程師來訓練下一代GPT。而他們不需要輸出代碼——Critique is all you need。
– GPT-4能夠進行自我修復的核心原因是其強大的反饋能力。它能夠有效地自我反思代碼的問題所在,其他模型無法與之競爭。
– 反饋模型和代碼生成模型不必相同。事實上,反饋模型是瓶頸。
– 基於GPT-4的反饋,GPT-3.5能夠編寫更好的代碼。
– 基於專業人員的反饋,GPT-4本身能夠編寫更好的代碼。
揭秘用於代碼生成GPT修復
我們都知道,大語言模型在生成代碼方面,表現出了非凡的能力。
然而,在具有挑戰性的編程任務(比如競賽和軟件工程師的面試)中,它們卻完成得併不好。
好在,很多模型會通過一種自修復工作流來「自省」,來自我糾正代碼中的錯誤。
研究者很希望知道,這些模型在多大程度上能提供正確的反饋,並且說明自己生成的代碼為什麼是錯誤的。
如圖顯示的是,基於自我修復方法的經典工作流程。
首先,給定一個規範,從代碼生成模型中採樣一個程序,然後在規範中提供的一組單元測試上執行該程序。
如果程序在任何單元測試中失敗,那麼錯誤的消息和程序會被提供給一個反饋生成模型,該模型再輸出代碼失敗原因的簡短解釋。
最後,反饋被傳遞給一個修復模型,該模型生成程序的一個固定版本。
表面上看,這個工作流似乎非常完美。它讓系統在解碼過程中克服由於不良樣本引起的錯誤,在修復階段容易地合併來自符號系統(編譯器、靜態分析工具和執行引擎等)的反饋。
並且模仿人類軟件工程師編寫代碼的試錯方式。
然而,工作流有一個問題:自修復需要對模型進行更多的調用,從而增加了計算成本。
而且,研究者們發現了一個很有意思的現象:大模型自修復的有效性不僅取決於模型生成代碼的能力,還取決於它對於代碼如何在任務中犯錯的識別能力。
目前還沒有任何工作對此進行詳細調查,因此,作者們研究了GPT-3.5和GPT-4在解決競賽級代碼生成任務時的自修復有效性。
研究人員提出了一個新的評估策略,稱為
,在這個策略中,根據從模型中採樣的token總數來衡量任務的通過率。
因為使用的是pass@t,而不是傳統的pass@k(根據實驗數量衡量通過率),這樣就能與純粹基於採樣的方法進行公平的比較。
從實驗中,研究者發現:
1. GPT-4才能實現自我修復帶來的性能提升;對於GPT-3.5,在所有預算下,修復後的通過率要低於或等於基準的無修復方法。
2. 即使對於GPT-4模型,性能提升也最多只能算是適度的(在預算為7000個token的情況下,通過率從66%提高到71%,約等於45個獨立同分佈的GPT-4樣本的成本),並且取決於初始程序的多樣性足夠豐富。
3. 使用GPT-4生成的反饋替換GPT-3.5對錯誤的解釋,可以獲得更好的自修復性能,甚至超過基準的無修復GPT-3.5方法(在7000個token下,從50%提高到54%)。
4. 使用人類程序員提供的解釋替換GPT-4自己的解釋,可以顯著改善修復效果,修復並通過測試的程序數量增加了57%。
自我修復四階段
自修復方法涉及4個階段:代碼生成、代碼執行、反饋生成和代碼修復。對此,研究人員正式定義了這四個階段。
階段一:代碼生成
給定規範
,一個程序模型
,首先生成
樣本
用一個公式來表示:
階段二:代碼執行
然後在測試平台上執行
代碼示例,並假設可以以可執行形式的訪問完整測試集。
如果任何樣本通過了所有的測試,就會停止,因為此時已經找到了令人滿意的程序。
否則,收集執行環境返回的錯誤信息
。
這些錯誤消息要么包含編譯/運行時錯誤信息,要么包含程序輸出與預期不同的示例輸入。
階段三:反饋生成
在此,研究人員使用反饋模型來生成更詳細的錯誤解釋。
在這個階段,為每個錯誤的程序生成
反饋字符串,
,如下所示:
階段四:代碼修復
在最後一步中,對於每個初始程序
和反饋
,
候選修復程序從
中採樣:
研究人員稱這個過程產生的交錯文本和程序樹修復樹T
——植根於規範
,然後分支到初始程序
,每個程序分支到反饋
,然後修復
。
具體如圖所示:
由於自我修復需要幾個非一致成本的相關模型調用,在這種設置中,
(在
樣本中獲得正確程序的可能性)不是比較和評估自我修復的各種超參數選擇的合適度量。
相反,研究人員將通過率作為從模型中採樣總token數量的函數來衡量,將其稱之為
的度量。
實驗過程
研究人員又進一步針對3個問題進行了測試:
1. 對於更加有挑戰的編程任務中,這些模型的自我修復是否比不進行修復的iid有更好的採樣?
2. 更強的反饋模型會提高模型的修復性能嗎?
3. 如果讓人類參與功能最強模型的自我修復循環,提供人工反饋,是否可以解鎖更好的修復性能?
首先研究團隊引入了一個很有挑戰的編程任務:Automated Programming Progress Standard (APPS)數據中心化的編程任務。
這個數據中心化的任務包括從入門級到大學競賽級的編程任務,可以用來評估人類程序員解決問題和代碼能力。
研究人員選取了300個任務,包括60個入門級別的任務和60個競賽級別的任務。
研究人員選取了GPT-3.5和GPT-4作為模型,使用模板字符串連接和單次提示詞來進行自我修復。
下圖為提示詞的實例之一。
自修復需要強大的模型和多樣化的初始樣本
研究人員讓單個模型分別進行代碼的修復生成和反饋生成。
在右邊的圖中,我們沿軸顯示了具有兩個超參數的熱圖,其中每個單元格中的值表示平均通過率,當給定相同的token預算(即t的相同值pass@t)時,自我修復由基線的平均通過率歸一化。
從圖中可以看到,對於GPT-3.5模型,pass@t在所有設置下都低於或等於相應的基線(黑),清楚地表明自我修復對GPT-3.5並不是一種有效的策略。
而在GPT-4(下圖)中,有幾個值的自修復通過率明顯優於基線。
下圖是
和基線的無修復方法。
GPT-4反饋改進了GPT3.5的修復結果
研究人員又進一步進行了新的實驗,評估使用單獨的、更強的模型來生成反饋的效果,目的是為了測試一個假設:由於模型無法內省和調試自己的代碼,阻礙了自我修復(比如說對於GPT-3.5)。
這個實驗的結果如上圖(亮藍色)所示。
在絕對性能方面,GPT-3.5,GPT-4確實突破了性能障礙,並且比GPT-3.5的iid採樣略微更高效。
這表明文本反饋階段本身是至關重要的,改進它可以緩解GPT-3.5自修復的瓶頸。
人工反饋顯著提高了GPT-4修復的成功率
在最後一項實驗中,想要研究在用更強的模型(GPT-4)進行修復時,加入專家人類程序員的反饋的影響。
研究目的是了解模型識別代碼中錯誤的能力與人類的能力相比如何,以及這如何影響自修復的下游性能。
研究人員研究人員招募了16名參與者,包括15名研究生和1名專業機器學習工程師。
每個參與者都有五種不同的基礎程序,基於他們的Python經驗編寫代碼。
每個程序都取自不同的任務,參與者永遠不會看到屬於同一個任務的兩個不同的程序。
然後,參與者被要求用他們自己的話解釋這個程序做錯了什麼。
實驗結果如下圖所示:
研究人員發現,當我們用人類參與者的調試替換GPT-4自己的調試時,總體成功率提高了1.57×以上。
不出意外的是,隨著問題變得更難,相對差異也會增加,這表明當任務(和代碼)變得更複雜時,GPT-4產生準確和有用反饋的能力遠遠落後於人類參與者。
資訊來源:由0x資訊編譯自8BTC。版權歸作者所有,未經許可,不得轉載