當大模型開始規劃合作,一個模型打造軟件開發團隊,代碼生成性能狂升
AI 自動生成代碼是一種使用機器學習技術來生成程序代碼的方法。通過對大量的程序代碼進行訓練,機器學習模型可以學習到程序代碼的語法和結構,從而能夠自動生成符合要求的程序代碼。
這種方式極大的提高了研究者的開發效率,特別是在重復性高、邏輯簡單的任務中。同時,自動生成的代碼還可以減少人為錯誤的發生,提高代碼的可讀性和可維護性。
然而,現有的代碼生成方法或工具在處理簡單需求的場景時表現較好,如行級代碼補全和初級的函數級代碼生成。但在復雜的函數級代碼生成、深入的問題分析和軟件系統設計方面,它們的表現尚有不足。
本文中,來自北京大學李戈教授團隊的最新研究通過融入規劃和合作的方法論,使大型模型在原有基礎上能夠應對更復雜的需求,并進一步提高代碼生成的質量。
總結而言,在論文《Self-planning Code Generation with Large Language Model》中,他們探索了基于規劃的代碼生成方法,提出一種使用大型語言模型(LLM)進行 self-planning 來生成代碼的簡潔方案。在多個代碼生成數據集上,self-planning 代碼生成的性能明顯優于直接生成的方法。
在另一篇論文《Self-collaboration Code Generation via ChatGPT》中,該研究提出了一種名為 self-collaboration 框架,其目的是通過合作和交互方法來增強大模型的問題解決能力。與直接利用大模型代碼生成相比,self-collaboration 代碼生成的相對性能提高了 29.9%-47.1%,達到了最先進的性能,甚至超越了 GPT-4。
接下來我們看看每項研究的具體內容:
論文 1:Self-planning Code Generation with Large Language Model
盡管大型語言模型在代碼生成方面展現了令人矚目的能力,在解決人類提供的復雜意圖(intent)時仍面臨挑戰。人類通常通過規劃來分解復雜問題,并在實施前制定解決方案。因此,作者將規劃引入到代碼生成中,以幫助模型更好地理解復雜意圖并降低問題解決的難度。
論文地址:https://arxiv.org/pdf/2303.06689.pdf
本文提出了一種結合大型語言模型的自我規劃(self-planning)代碼生成方法,它由兩個階段組成,即規劃階段和實施階段。具體而言,在規劃階段,語言模型從 intent 出發,結合上下文學習(Incontext Learning),規劃出解決步驟。然后進入實施階段,模型在解決步驟的指導下逐步地生成代碼。
Self-planning 代碼生成在多個代碼生成數據集上進行了嚴格的評估,結果表明,與直接利用語言模型進行代碼生成的方法相比,Self-planning 具有明顯的優勢,性能提升顯著,凸顯了 self-planning 在代碼生成任務中的重要價值。
下面具體介紹一下 self-planning 代碼生成方法。
Self-planning 代碼生成
在規劃階段,利用 LLM 的能力,通過 Incontext Learning 進行自我規劃。給定一個提示,由
元組串聯而成,,其中
表示人類的 intent,
表示 plan,表示兩者的串聯。plan 是對子問題的調度,它從 intent 中抽象和分解出來,intent 被設定為
。在推理過程中,測試時 intent 將被添加在提示之后,將被送入 LLMs
,后者將試圖為新的 intent 做規劃,從而得到測試時的 plan
。
請注意,這里 是一個相當小的數字,意味著僅通過注釋幾個演示規劃的例子就可以實現自我規劃。
在實施階段,將 plan附加到 intent
上,作為模型
的輸入,得到最終代碼
。
以上兩個階段可以被形式化為下列公式:
通過條件獨立假設進一步簡化
,因此:
下面通過演示示例進一步理解這個過程。
在 planning 階段,人類提供了一個 intent,即 “找到第 n 個斐波那契數,并且它也是素數”。可以看出 LLM 能夠從 intent 中抽象出兩個子問題,即 “生成斐波那契數列” 和 “確定一個數字是否為素數”,并規劃四個步驟來組合解決這些子問題。
然后進入實施階段,作者將 plan 附加到 intent 中,然后喂給 LLM。LLM 在步驟的導航下生成代碼,而且它還能夠將 "判斷是否是素數" 包裝成一個子函數并正確調用它。
如果將這個 intent 直接交給 LLM 生成代碼,LLM 無法理解 intent 是多個問題的組合;它知道要寫一些關于 "素數" 和 "斐波那契" 的內容,但實際上它生成了一些混亂的代碼,即它列舉了前五個正確的樣本,然后計算斐波那契數,完全忽略了檢查是否是素數的要求。
實驗結果
在代碼測試通過率指標下,相比與直接生成,self-planning 達到了 10.9% 到 26.7% 的相對提升。相比之下,CoT 的提升沒有 self-planning 大,這里CoT 的定義是具體的推理步驟,CoT 的抽象程度與被視為人類思維抽象的代碼相當,所以生成一個準確和足夠詳細的 CoT 的難度幾乎與直接生成代碼的難度相當。
最后作者通過提供 ground-truth code 來生成了一些 ground-truth planning,使用 ground-truth planning 來生成代碼的相對提升超過 30%,這個結果大約是 self-planning 的一個上限(實際上是偏小的),但也說明了 planning 的方法是非常有潛力的。
為了驗證 self-planning 方法的有效性,作者進行了定性評價的案例研究。如下圖三個案例證明了 self-planning 和直接代碼生成的性能。
在案例 1 中,LLM 的任務是 "給定一個整數數組 nums,找到 nums 的任何非空子數組的最小和"。LLM 直接生成的代碼只考慮了子數組中的一個子集,而 self-planning 代碼生成則確保沒有一個子集被忽略。
在案例 2 中,LLM 的任務是 “接收一個整數作為輸入并返回這個整數的特殊階乘.”,利用 LLM 直接生成的代碼,只是以遞歸的方式實現了標準階乘,忽略了特殊階乘的定義。相反,self-planning 代碼生成通過使用子函數來實現標準階乘,然后調用這個子函數來構造特殊階乘。
在案例 3 中,LLM 的任務是 “給定三角形三條邊的長度,返回該三角形是否為直角三角形”。self-planning 代碼生成更全面,因為它通過應用勾股定理來計算不同邊的斜邊,而直接生成代碼只考慮單一判斷直角三角形的情況。此外,此方法還測試了了輸入的邊是否形成了一個三角形。
總之,在這些案例中,直接生成代碼方法只解決了用戶 intent 的一個有限方面,這往往會導致生成不正確的代碼。相比之下,self-planning 的代碼生成方法首先將 intent 轉換為 plan,然后系統地解決 plan 的每一個解決步驟,降低了代碼生成的復雜性,往往能夠產生更全面的細致的程序。
結論
本文研究了基于規劃的代碼生成方法,并提出了一種使用大型語言模型(LLM)進行 self-planning 來生成代碼的簡潔方案。在多個代碼生成數據集上,self-planning 代碼生成的性能明顯優于直接生成的方法。總之,規劃是一種非常有潛力的處理復雜性的方法。
論文 2:Self-collaboration Code Generation via ChatGPT
大型語言模型(LLMs)在多項任務上的表現已經非常接近人類的水平,是否能讓大型語言模型像人類一樣組成團隊合作完成更加復雜的任務?第二篇文章介紹了一種 self-collaboration 的技術,通過角色指令讓多個大型語言模型扮演不同的角色組成軟件開發團隊,在無需人類參與的情況下以合作和交互的方式完成代碼生成任務。
論文地址:https://arxiv.org/pdf/2304.07590.pdf
代碼生成被廣泛認為是提高軟件開發自動化和最終質量的關鍵技術。然而,現有的代碼生成方法通常集中在軟件開發過程的單個階段(即編碼階段),而沒有考慮對降低復雜性和確保質量保證至關重要的其他階段。軟件開發中多個階段的組織和實施需要團隊合作。
為此,本文提出了一種使用大型語言模型 (簡稱為:大模型) 進行代碼生成的 self-collaboration 框架。具體來說,大模型通過角色指令扮演不同的角色組成團隊,在無需人參與的情況下以合作和交互的方式處理代碼生成任務。根據 self-collaboration 框架,作者組建了一個由三位 ChatGPT 扮演角色(分析師、程序員和測試員)組成的初等團隊,分別負責軟件開發的分析、編碼和測試階段。實驗結果表明,與直接利用大模型代碼生成相比,self-collaboration 代碼生成的相對性能提高了 29.9%-47.1%,達到了最先進的性能,甚至超越了 GPT-4。
本文所提的方法通過將軟件開發的多個階段與代碼生成結合,旨在提高最終代碼的質量和可維護性。通過利用 ChatGPT 等 LLMs 的潛力,可以為模型間合作和交互提供更強大的支持,從而促進虛擬團隊在處理復雜軟件開發任務方面的成功。這種多階段、模型堆疊的自合作框架為自動代碼生成提供了一種新的、更高效的方法,有助于推動軟件開發領域的創新和進步。此外,這項工作還可以作為未來研究各個領域的自我合作方法以及開發更先進、更專業的虛擬團隊來處理更復雜任務的基礎。
下面具體介紹一下 Self-collaboration 框架以及在該框架基礎上按照軟件開發方法論組建虛擬團隊的實例。
Self-collaboration 框架
給定需求,利用大模型執行 Self-collaboration 以生成輸出 y。該任務定義為
。Self-collaboration 框架由兩部分組成:分工和合作。
在分工部分,作者運用先驗知識將復雜任務分解為一系列階段 并構建一些不同的角色
,這些角色基于大模型和角色指令。每個角色
負責一個或多個階段
。
眾所周知,大模型對上下文非常敏感,因為它們在訓練時,被要求根據前面的文字預測后續文字。因此,一種廣泛使用的方式是通過指令或提示來控制大模型的生成。作者采用特定類型的指令為大模型分配身份和職責,被稱為角色指令。具體來說,作者要求大模型扮演與其職責緊密相關的特定角色并且傳達這個角色應該執行的詳細任務。
使用角色指令的優勢在于它們僅需要在交互開始時被提供一次。在隨后的交互中,傳達的只是意圖,而不是指令和意圖的組合。因此,角色指令提升了后續溝通合作的整體效率和清晰度。
在合作部分,作者關注于促進在 self-collaboration 框架內承擔不同角色的大模型之間的有效交互。每個大模型在其指定角色指令的指導下,通履行其分配的職責為整體任務做出貢獻。隨著階段的進展,大模型與其他大模型交流他們的輸出,交互信息并輸出。
利用角色指令,可以有效控制大模型的輸出格式。結合語言模型的基礎方面,這可以初步建立大模型之間的通信。
合作部分可以形式化為:
其中是階段
的輸出,
表示
前提階段的輸出,
表示
對應的角色。請注意,如果階段
之間的關系不是線性關系,self-collaboration 框架可以并行化。計算
被視為合作,其中角色
與每個前面階段的角色合作生成
。輸出
隨著階段
的進展迭代更新:

其中 是一個更新函數。
完成后,得到最終輸出
。為了促進有效合作,作者建立了一個消息共享池,每個角色從中獲取所需的信息以完成各自的任務
。算法 1 給出了 self-collaboration 框架的完整算法。
實例化
為了實例化 Self-collaboration 框架,作者將軟件開發方法論中的經典瀑布模型引入到 Self-collaboration 代碼生成中。根據瀑布模型,軟件開發是一個多階段過程,其中一系列階段依次進行。作者選擇了三個階段應用于代碼生成,分別是:分析、編碼和測試階段。該過程從一個階段流向下一個階段,如果發現問題,則返回到上一個階段進行修改。為此,作者建立了一個初等的三人團隊來生成代碼,由分析師、程序員和測試人員組成,負責分析、編碼和測試階段,如圖 1(右)所示。具體來說,作者使用 ChatGPT 的角色指令來扮演以下角色:
分析師:分析師的目標是制定高層次的 plan 并專注于指導程序員編寫程序,而不是深入研究實現細節。給定需求,分析師將分解為幾個易于解決的子任務,以方便程序員直接實施,并制定概述實施主要步驟的 plan。
程序員:作為該團隊的核心角色,程序員將在整個開發過程中接收來自分析師的 plan 或來自測試人員的測試報告。因此,作者通過角色說明將兩項主要職責分配給程序員:1. 編寫滿足指定要求的代碼,遵守分析師提供的 plan。2. 修復或細化代碼,考慮到測試人員反饋的測試報告反饋。編碼器角色指令的詳細信息如圖 2 所示。
測試員:測試人員獲取程序員編寫的代碼,隨后記錄包含各個方面的測試報告,例如功能性、可讀性和可維護性。與直接生成測試用例相比,作者認為生成測試報告更符合語言模型的傾向,無論是交流的輸入端還是輸出端。
作者僅在階段編碼時更新輸出
,并且此開發過程在測試人員確認
滿足要求時結束。
實驗結果
作者將 self-collaboration 代碼生成與各種最先進(SOTA)方法進行比較,實驗結果表明,self-collaboration 框架顯著提高了基礎大模型的性能。值得注意的是,即使是一個簡單的三人團隊(包括分析師、程序員和測試員),基于 ChatGPT (GPT-3.5) 的 self-collaboration 代碼生成在四個代碼生成基準測試中也取得了最佳性能,甚至超過了 GPT-4。與 ChatGPT (GPT-3.5) 相比,self-collaboration 框架提供的改進是巨大的,相對增幅從 29.9% 到 34.6% 不等。
值得注意的是,self-collaboration 代碼生成對與擴展測試用例相關的數據集(即 HumanEval-ET 和 MBPP-ET)產生了更顯著的改進。這表明 self-collaboration 可以有效地幫助基礎大模型生成更高質量的代碼。這種增強可能歸因于合作團隊可以考慮更廣泛的邊界條件和解決常見錯誤的能力。考慮到基礎大模型本身的差距,將 self-collaboration 框架應用于更強大的模型,例如 GPT-4,將產生更好的結果。
作者進一步研究了僅使用自然語言描述的代碼生成,這種設置更貼近實際的軟件開發。在此設置下,作者比較了由 self-collaboration 框架實例化的初等團隊中每個 ChatGPT 角色的表現,如表 2 所示。
實驗結果表明,與僅使用程序員角色相比,無論是二位角色還是三位角色組建的團隊,性能都有顯著提高。程序員 - 分析師 - 測試員團隊在 HumanEval 和 HumanEval-ET 基準測試中取得了最好的成績,相對改進分別為 40.8% 和 47.1%。相比之下,編碼器 - 測試員團隊在 MBPP 和 MBPP-ET 基準測試中獲得了最高性能,相對改進分別為 36.7% 和 39.4%。分析師在 MBPP 和 MBPP-ET 基準上的表現不佳可能是由于 MBPP 的要求相對簡單,所以對規劃較少(但是隨著問題的復雜化,規劃是不可或缺的一部分)。此外,MBPP 中各種任務的大量測試用例偏離了人類典型的書寫習慣和推理過程,例如程序返回不常用的數據格式而而沒有任何自然語言提示。因此,作者認為應該定制特定任務的團隊以實現最佳結果。
此外,作者展示了一個 self-collaboration 代碼生成示例,如圖 3 所示。
1. 分析師進行全面分析并制定 plan 以解決整體需求。對于這個需求,分析師首先將其拆分為幾個易于解決的子任務,然后根據子任務給出一些高層次的 plan。
2. 程序員根據給定的要求以及設計的拆分和高層次 plan 實現代碼。顯而易見,已實現代碼中的每個子模塊都與拆分和高層次 plan 幾乎一一對應。
3. 測試員為實現的代碼編寫詳細的測試報告,找出其中的錯誤。在這份測試報告中,測試人員指出所實現的代碼可能會導致從列表中刪除重復元素,從而可能導致某些邊緣測試用例失敗。因此,建議從實現的代碼中刪除行 “lst = list (set (lst))”。
4. 程序員隨后根據測試報告中提供的反饋完善了代碼。在編碼器提供的修改后的代碼中,整合了測試報告中的建議,并同時刪除了 “lst = list (set (lst))” 行。
5. 測試員評估修改后的代碼,確認沒有任何問題,至此代碼生成過程結束。在最后一次交互中,測試員確認修改后的代碼已經通過所有測試,滿足要求。
總之,self-collaboration 框架在代碼生成任務中表現出顯著的性能提升,與單一角色相比,多角色團隊能夠更有效地處理各種問題和挑戰。這種方法為自然語言處理和代碼生成領域提供了新的研究方向,值得進一步探討和優化。未來的工作可能包括對更多角色和更強大模型的探索,以及將 self-collaboration 框架應用于其他自然語言處理任務。
結論
在本文中,作者提出了一種 self-collaboration 框架,其目的是通過合作和交互方法來增強大模型的問題解決能力。具體而言,作者探索了 ChatGPT 在促進基于團隊的代碼生成和合作方面的軟件開發過程中的潛力。為此,作者組建了一個由三個不同的 ChatGPT 角色組成的初等團隊,目的是全面解決代碼生成任務。為了評估 self-collaboration 框架的有效性和泛化性能,作者針對各種代碼生成基準進行了廣泛實驗。實驗結果提供了大量證據支持 self-collaboration 框架的有效性和普適性。作者認為,使模型能夠組建自己的團隊并合作完成復雜任務是實現人工通用智能(AGI)的關鍵一步。