流量工程將代碼生成的準(zhǔn)確率提高一倍:由19%提高至44%
譯文一篇新論文的作者提出了一種“強(qiáng)化”代碼生成的方法。
代碼生成是人工智能中一項(xiàng)越來越重要的能力。它指訓(xùn)練機(jī)器學(xué)習(xí)模型,基于對所需程序功能的自然語言描述自動(dòng)生成計(jì)算機(jī)代碼,并有許多潛在的應(yīng)用,從將軟件規(guī)格轉(zhuǎn)換成實(shí)用代碼、自動(dòng)化后端開發(fā)到協(xié)助人類程序員,不一而足。
然而,與翻譯或總結(jié)等相關(guān)語言任務(wù)相比,生成高質(zhì)量代碼對AI系統(tǒng)依然具有挑戰(zhàn)性。代碼必須精確匹配目標(biāo)編程語言的語法,優(yōu)雅地處理極端情況和意外輸入,并準(zhǔn)確地處理問題描述中指定的許多小細(xì)節(jié)。就連在其他領(lǐng)域無害的小錯(cuò)誤也可能完全破壞程序的功能,導(dǎo)致編譯或運(yùn)行失敗。
最近,CodiumAI的研究人員提出了一種名為AlphaCodium的新方法,可大幅提高GPT-4等大語言模型的代碼生成能力。他們的主要觀點(diǎn)是,僅僅調(diào)整提示的措辭對于復(fù)雜的編碼問題具有固有的局限性。相反,他們設(shè)計(jì)了一個(gè)多階段流程,專注于對照測試用例迭代地生成、運(yùn)行和調(diào)試代碼,從而使模型能夠從經(jīng)驗(yàn)中學(xué)習(xí)。
提示工程的局限性
在自然語言任務(wù)中,提示工程指仔細(xì)調(diào)整提示的措辭和結(jié)構(gòu),以指導(dǎo)模型生成所需的輸出。比如說,在輸入文本之前添加短語“寫簡明的摘要:”可以從模型中得到針對性更強(qiáng)的摘要。
提示工程已被證明在做文本生成引導(dǎo)大語言模型行為方面非常有效。然而針對編碼問題,研究人員發(fā)現(xiàn),就連廣泛的及時(shí)調(diào)整也只能獲得極小的效益。原因發(fā)人深省。生成高質(zhì)量的代碼需要:
- 精確匹配目標(biāo)編程語言的語法
- 優(yōu)雅地處理極端情況和意外輸入
- 解決問題陳述中描述的所有小細(xì)節(jié)和需求
- 為所有的有效輸入確保代碼正確編譯和運(yùn)行
這些結(jié)構(gòu)性需求遠(yuǎn)遠(yuǎn)超出了文本生成的范疇。將它們硬編碼到提示中對于復(fù)雜的問題是行不通的。單單提示本身缺乏模型學(xué)習(xí)這些的編碼技巧和細(xì)微差別所需要的具體反饋。
AlphaCodium迭代流程
為了應(yīng)對這些挑戰(zhàn),研究人員設(shè)計(jì)了一個(gè)針對代碼生成問題結(jié)構(gòu)的迭代流程。關(guān)鍵的創(chuàng)新在于針對測試用例利用所生成代碼的執(zhí)行,以提供直接的學(xué)習(xí)信號。
AlphaCodium的流程有兩個(gè)主要階段:
預(yù)處理
- 模型將問題描述釋義為項(xiàng)目符號,以提取關(guān)鍵細(xì)節(jié)。
- 解釋每個(gè)示例輸入/輸出背后的預(yù)期邏輯。
- 提供兩三個(gè)自然語言解決方案。
- 為代碼覆蓋生成額外的不同測試用例。
代碼迭代
- 模型生成初始代碼解決方案。
- 針對公共測試用例重復(fù)運(yùn)行該代碼,修復(fù)出現(xiàn)的錯(cuò)誤。
- 對模型生成的測試用例執(zhí)行同樣的事情。
- 額外的測試用例被添加到不斷增大的“測試錨”(test anchor)套件中,以防止回歸。
通過增量推理問題、開發(fā)解決方案假設(shè)、擴(kuò)展測試覆蓋,以及反復(fù)生成和調(diào)試代碼,模型通過經(jīng)驗(yàn)來學(xué)習(xí)——這正是高質(zhì)量代碼生成所需的技能。
圖1. 具有結(jié)構(gòu)化輸出的提示示例(生成可能的解決方案階段)
研究人員發(fā)現(xiàn),與端到端模型相比,將流程設(shè)計(jì)為具有清晰接口和目標(biāo)的模塊可以獲得更好的結(jié)果。每個(gè)階段首先專注于更簡單的子任務(wù),以積累知識,并發(fā)掘?yàn)橄掠坞A段提供依據(jù)的洞察力。像測試生成這樣的上游階段不需要完整的解決方案,只需要基本的推理。
實(shí)驗(yàn)結(jié)果
研究人員依據(jù)CodeContests衡量基準(zhǔn)對AlphaCodium進(jìn)行了評估,該衡量基準(zhǔn)包含來自競爭性編程比賽的數(shù)百個(gè)編碼問題。
圖2. 問題描述和反思——一個(gè)典型的CodeContests問題的例子,基于人工智能對問題進(jìn)行自我反思。雖然最初的描述冗長而復(fù)雜,但適當(dāng)?shù)淖晕曳此伎梢允箚栴}更清晰、更連貫,從而改進(jìn)代碼解決方案
針對GPT-4模型,與經(jīng)過大量優(yōu)化的單個(gè)提示相比,AlphaCodium將驗(yàn)證集上的代碼生成準(zhǔn)確率從19%提高到了44%。面對不同的模型大小和測試集,這個(gè)好處依然適用,與單獨(dú)的提示工程相比收效顯著。
AlphaCodium的性能也顯著優(yōu)于之前發(fā)布的方法,比如AlphaCode和CodeChain,同時(shí)使用更少的計(jì)算資源。比如說,它通過避免不必要的蠻力生成,其準(zhǔn)確性可以媲美AlphaCode,而模型查詢少10000倍。
這些結(jié)果證明了圍繞任務(wù)結(jié)構(gòu)整體設(shè)計(jì)AI系統(tǒng)的價(jià)值,而不是將其視為通用文本生成器。通過合并迭代代碼運(yùn)行和調(diào)試,AlphaCodium更好地將訓(xùn)練過程與生成健壯實(shí)用代碼的最終目標(biāo)結(jié)合起來。
更廣泛的影響
雖然針對競爭性編程問題進(jìn)行了演示,但AlphaCodium中使用的概念為AI推進(jìn)代碼生成提供了更廣泛的適用經(jīng)驗(yàn):
- 單單提示工程對于處理復(fù)雜的代碼任務(wù)具有局限性。具體解決問題的經(jīng)驗(yàn)至關(guān)重要。
- 基于測試的開發(fā)規(guī)范可以為模型訓(xùn)練提供依據(jù)。測試提供了明確的適應(yīng)度函數(shù)。
- 迭代代碼調(diào)試將模型改進(jìn)的重點(diǎn)放在實(shí)際發(fā)生的錯(cuò)誤上。
- 測試覆蓋擴(kuò)展突出了提示中不可見的泛化性差距。
- 具有雙重驗(yàn)證的軟決策減少了脆弱性和偏差。
AlphaCodium為基于軟件工程最佳實(shí)踐的代碼生成提供了一種大有前途的新范式。關(guān)于泛化性和計(jì)算開銷仍然存在有待商榷的研究問題。但這里展示的原則(從經(jīng)驗(yàn)中學(xué)習(xí)、測試驅(qū)動(dòng)開發(fā)、模塊化推理和迭代式調(diào)試)似乎為提高AI的編碼能力提供了堅(jiān)實(shí)的基礎(chǔ)。
論文鏈接:https://arxiv.org/pdf/2401.08500.pdf
代碼庫:https://github.com/Codium-ai/AlphaCodium
原文標(biāo)題:"Flow engineering" doubles code generation accuracy (19% vs 44%),作者:Mike Young
鏈接:https://notes.aimodels.fyi/flow-engineering-intensifies-for-code-generation/