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