源代碼is all you need!7B代碼小模型同尺寸無敵,性能媲美ChatGPT和谷歌Gemini
Hugging Face 技術(shù)負(fù)責(zé)人 Philipp Schmid 表示:“代碼自動補(bǔ)全工具,如 GitHub Copilot,已被超過一百萬開發(fā)者使用,幫助他們的編碼速度提高了 55%??吹较?Magicoder 和 OSS-INSTRUCT 這樣的開源創(chuàng)新超越了 OpenAI 的 GPT-3.5 和 Google DeepMind 的 Gemini Ultra,真是令人振奮。這些進(jìn)步不僅展示了人工智能技術(shù)的快速發(fā)展,也突顯了開源社區(qū)在推動這一領(lǐng)域創(chuàng)新中的重要角色?!?/span>
代碼生成(也稱為程序合成)一直是計算機(jī)科學(xué)領(lǐng)域的挑戰(zhàn)性課題。在過去幾十年,大量的研究致力于符號方法的研究。最近,基于代碼訓(xùn)練的大型語言模型(LLM)在生成準(zhǔn)確滿足用戶意圖的代碼方面取得了顯著突破,并已被廣泛應(yīng)用于幫助現(xiàn)實(shí)世界的軟件開發(fā)。
最初,閉源模型如 GPT-3.5 Turbo (即 ChatGPT) 和 GPT4 在各種代碼生成基準(zhǔn)和排行榜中占據(jù)主導(dǎo)地位。為了進(jìn)一步推動開源 LLM 在代碼生成領(lǐng)域的發(fā)展,SELF-INSTRUCT 被提出來引導(dǎo) LLM 的指令遵循能力。在代碼領(lǐng)域,從業(yè)者通常使用更強(qiáng)大的教師模型(如 ChatGPT 和 GPT-4)設(shè)計合成編碼指令,然后用生成的數(shù)據(jù)微調(diào)更弱的學(xué)生模型(如 CODELLAMA)以從教師那里提煉知識。
我們以 Code Alpaca 為例,它包含了通過在 ChatGPT 上應(yīng)用 SELF-INSTRUCT 生成的 20,000 個代碼指令,使用了 21 個種子任務(wù)。為了進(jìn)一步增強(qiáng) LLM 的編碼能力,Luo et al. 2023b 提出了 Code Evol-Instruct,該方法采用各種啟發(fā)式方法來增加種子代碼指令 (如 Code Alpaca) 的復(fù)雜性,在開源模型中取得了 SOTA 結(jié)果。
雖然這些數(shù)據(jù)生成方法能有效提高 LLM 的指令遵循能力,但它們在內(nèi)部依賴于一系列狹義的預(yù)定義任務(wù)或啟發(fā)式方法。比如采用 SELF-INSTRUCT 的 Code Alpaca 僅依賴于 21 個種子任務(wù),使用相同的提示模板生成新的代碼指令。而 Code Evol-Instruct 以 Code Alpaca 為種子,僅依賴于 5 個啟發(fā)式方法來演化數(shù)據(jù)集。如 Yu et al.,2023 和 Wang et al., 2023a 論文中所提到的,這樣的方法可能會明顯繼承 LLM 中固有的系統(tǒng)偏見以及預(yù)定義任務(wù)。
在本文中,來自伊利諾伊大學(xué)香檳分校(UIUC)的張令明老師團(tuán)隊(duì)提出了 OSS-INSTRUCT,用以減少 LLM 的固有偏見并釋放它們通過直接從開源學(xué)習(xí)創(chuàng)造高質(zhì)量和創(chuàng)造性代碼指令的潛力。
- 論文地址:https://arxiv.org/pdf/2312.02120.pdf
- 項(xiàng)目地址:https://github.com/ise-uiuc/magicoder
- 試玩鏈接:https://huggingface.co/spaces/ise-uiuc/Magicoder-S-DS-6.7B (貪吃蛇 / 奧賽羅 /…)
如下圖 1 所示,OSS-INSTRUCT 利用強(qiáng)大的 LLM,通過從開源環(huán)境收集的任意隨機(jī)代碼片段中汲取靈感,自動生成新的編碼問題。在這個例子中,LLM 受到來自不同函數(shù)的兩個不完整代碼片段的啟發(fā),成功地將它們關(guān)聯(lián)起來并創(chuàng)造出了逼真的機(jī)器學(xué)習(xí)問題。
由于現(xiàn)實(shí)世界近乎無限的開源代碼,OSS-INSTRUCT 可以通過提供不同的種子代碼片段直接產(chǎn)生多樣化、逼真且可控的代碼指令。研究者最終生成了 75,000 條合成數(shù)據(jù)來微調(diào) CODELLAMA-PYTHON-7B,得到 Magicoder-CL。OSS-INSTRUCT 雖然簡單但有效,與現(xiàn)有的數(shù)據(jù)生成方法正交,并可以結(jié)合使用以進(jìn)一步拓展模型編碼能力的邊界。因此,他們持續(xù)在一個包含 110,000 個條目的開源 Evol-Instruct 上微調(diào) Magicoder-CL,產(chǎn)生了 MagicoderS-CL。
研究者在廣泛的編程任務(wù)中對 Magicoder 和 MagicoderS 進(jìn)行評估,包括 Python 文本到代碼生成的 HumanEval 和 MBPP、多語言代碼生成的 MultiPL-E,以及解決數(shù)據(jù)科學(xué)問題的 DS-1000。他們進(jìn)一步采用了 EvalPlus,包括增強(qiáng)的 HumanEval+ 和 MBPP + 數(shù)據(jù)集,用于更嚴(yán)格的模型評估。據(jù)實(shí)驗(yàn)證實(shí),在 EvalPlus 增強(qiáng)的測試下,ChatGPT 和 GPT-4 等代碼大模型的實(shí)際準(zhǔn)確率比在之前在 HumanEval 和 MBPP 等廣泛使用數(shù)據(jù)集上的評估平均下降將近 15%。有趣的是,EvalPlus 同樣也是張令明老師團(tuán)隊(duì)的近期工作,短短半年的時間已經(jīng)被業(yè)界廣泛采納、并已經(jīng)在 GitHub 上擁有 500 Star。更多模型在 EvalPlus 上的評估可以參考 EvalPlus 排行榜:https://evalplus.github.io/。
結(jié)果顯示,Magicoder-CL 和 MagicoderS-CL 都顯著提升基礎(chǔ)的 CODELLAMA-PYTHON-7B。此外,Magicoder-CL 在所有測試基準(zhǔn)上都超過了 WizardCoder-CL-7B、WizardCoder-SC-15B 和所有研究過的參數(shù)小于或等于 16B 的 SOTA LLM。增強(qiáng)后的 MagicoderS-CL 在 HumanEval 上的 pass@1 結(jié)果與 ChatGPT 持平(70.7 vs. 72.6),并在更嚴(yán)格的 HumanEval + 上超過了它(66.5 vs. 65.9),表明 MagicoderS-CL 能夠生成更穩(wěn)健的代碼。MagicoderS-CL 還在相同規(guī)模的所有代碼模型中取得了 SOTA 結(jié)果。
DeepSeek-Coder 系列模型在最近表現(xiàn)出卓越的編碼性能。由于目前披露的技術(shù)細(xì)節(jié)有限,研究者在第 4.4 節(jié)中簡要討論它們。盡管如此,他們在 DeepSeek-Coder-Base 6.7B 上應(yīng)用了 OSS-INSTRUCT,創(chuàng)建了 Magicoder-DS 和 MagicoderS-DS。
除了與之前以 CODELLAMA-PYTHON-7B 為基礎(chǔ)模型的結(jié)果保持一致外,Magicoder-DS 和 MagicoderS-DS 還受益于更強(qiáng)大的 DeepSeek-Coder-Base-6.7B。這一優(yōu)勢由 MagicoderS-DS 展示,其在 HumanEval 上取得了顯著的 76.8 pass@1。MagicoderS-DS 在 HumanEval、HumanEval+、MBPP 和 MBPP+ 上的表現(xiàn)同樣優(yōu)于 DeepSeek-Coder-Instruct 6.7B,盡管微調(diào) token 減少為 1/8。
OSS-INSTRUCT: 基于開源進(jìn)行指令調(diào)優(yōu)
從高層次來看,如上圖 1 所示,OSS-INSTRUCT 的工作方式是通過為一個 LLM(比如 ChatGPT)輸入提示,從而根據(jù)從開源環(huán)境中收集到的一些種子代碼片段(例如來自 GitHub)生成編碼問題及其解決方案。種子片段提供了生成的可控性,并鼓勵 LLM 創(chuàng)建能夠反映真實(shí)編程場景的多樣化編碼問題。
生成代碼問題
OSS-INSTRUCT 利用可以輕松從開源環(huán)境獲取的種子代碼片段。本文研究者直接采用 StarCoderData 作為種子語料庫,這是用于 StarCoder 訓(xùn)練的 The Stack 數(shù)據(jù)集的過濾版本,包含以各種編程語言編寫的許可證允許的源代碼文檔。選擇 StarCoderData 的原因在于它被廣泛采用,包含了大量高質(zhì)量的代碼片段,甚至經(jīng)過了數(shù)據(jù)凈化的后處理。
對于語料庫中的每個代碼文檔,研究者隨機(jī)提取 1–15 個連續(xù)行作為模型獲得靈感并生成編碼問題的種子片段。最終共從 80,000 個代碼文檔中收集 80,000 個初始種子片段,其中 40,000 個來自 Python,還有 40,000 個分別平均來自 C++、Java、TypeScript、Shell、C#、Rust、PHP 和 Swift。然后,每個收集到的種子代碼片段都應(yīng)用于下圖 2 所示的提示模板,該模板由教師模型作為輸入,并輸出編碼問題及其解決方案。
數(shù)據(jù)清理和凈化
研究者在數(shù)據(jù)清理時,排除了共享相同種子代碼片段的樣本。雖然在生成的數(shù)據(jù)中存在其他類型的噪聲(比如解決方案不完整),但受到了 Honovich et al. [2023] 的啟發(fā),這些噪聲并未被移除,它們被認(rèn)為仍然包含 LLM 可以學(xué)習(xí)的有價值信息。
最后,研究者采用與 StarCoder Li et al.,2023 相同的邏輯,通過刪除包含 HumanEval 和 MBPP 中的文檔字符串或解決方案、APPS 中的文檔字符串、DS-1000 中的提示或 GSM8K 中問題的編碼問題,對訓(xùn)練數(shù)據(jù)進(jìn)行凈化處理。事實(shí)上,凈化過程僅過濾掉了額外的 9 個樣本。由于種子語料庫 StarCoderData 已經(jīng)經(jīng)過嚴(yán)格的數(shù)據(jù)凈化,這一觀察結(jié)果表明 OSS-INSTRUCT 不太可能引入除種子之外的額外數(shù)據(jù)泄漏。最終的 OSS-INSTRUCT 數(shù)據(jù)集包含約 75,000 個條目。
OSS-INSTRUCT 的定性示例
下圖 3 的一些定性示例展示了:OSS-INSTRUCT 如何幫助 LLM 從種子代碼片段獲取靈感以創(chuàng)建新的編碼問題和解決方案。例如,Shell 腳本示例顯示了 LLM 如何利用一行 Shell 腳本創(chuàng)作一個 Python 編碼問題。庫導(dǎo)入示例演示了 LLM 如何使用幾個導(dǎo)入語句創(chuàng)建一個現(xiàn)實(shí)的機(jī)器學(xué)習(xí)問題。
與此同時,類簽名示例說明了 LLM 從具有 SpringBootApplication 等注釋和 bank 等關(guān)鍵詞的不完整類定義中獲取靈感的能力?;诖?,LLM 生成了一個要求基于 Spring Boot 實(shí)現(xiàn)完整銀行系統(tǒng)的問題。
總體而言,OSS-INSTRUCT 可以激發(fā) LLM 以不同的代碼結(jié)構(gòu)和語義來創(chuàng)建各種編碼任務(wù),包括算法挑戰(zhàn)、現(xiàn)實(shí)問題、單函數(shù)代碼生成、基于庫的程序補(bǔ)全、整個程序開發(fā),甚至整個應(yīng)用程序構(gòu)建。
為了研究 OSS-INSTRUCT 生成的數(shù)據(jù)的類別,研究者使用了 INSTRUCTOR,這是 SOTA embedding 模型之一,可以根據(jù)任務(wù)指令生成不同的文本 embedding。受到了 OctoPack 和 GitHub 上主題標(biāo)簽的啟發(fā),研究者手動設(shè)計了 10 個與編碼相關(guān)的特定類別。如下圖 4 所示,他們計算了 OSS-INSTRUCT 中每個樣本的 embedding 與這 10 個類別的 embedding 之間的余弦相似度,以獲取類別分布??傮w而言,OSS-INSTRUCT 在同類別之間表現(xiàn)出多樣性和平衡。
下圖 5 中展示了生成的問題和解決方案的長度分布。橫軸表示每個問題 / 解決方案中的 token 數(shù)量,縱軸表示相應(yīng)的樣本數(shù)量。
為了研究數(shù)據(jù)生成過程是否產(chǎn)生更多的類 HumanEval 問題或解決方案,研究者將 75,000 個數(shù)據(jù)集中的每個樣本與 164 個 HumanEval 樣本中的每個樣本配對,并使用 TF-IDF embedding 計算它們的余弦相似度,然后將每個 OSS-INSTRUCT 樣本與具有最高相似度分?jǐn)?shù)的 HumanEval 樣本關(guān)聯(lián)。
研究者還分別將數(shù)據(jù)集與 Code Alpaca 和 evol-codealpaca-v1 進(jìn)行比較 ,前者是一個在代碼任務(wù)上應(yīng)用 SELF-INSTRUCT 的 20K 數(shù)據(jù)集,后者是 Evol-Instruct 的一個包含 110K 編碼指令的開源實(shí)現(xiàn)。由于官方的 Code Evol-Instruct 數(shù)據(jù)集尚未發(fā)布,研究者使用開源實(shí)現(xiàn)。他們還使用了與第 2.2 節(jié)中討論的相同方式對所有數(shù)據(jù)集進(jìn)行凈化。
下圖 6 結(jié)果顯示,OSS-INSTRUCT 在所有研究的數(shù)據(jù)生成技術(shù)中表現(xiàn)出最低的平均相似性,而 SELF-INSTRUCT 顯示出最高的平均相似性。這一發(fā)現(xiàn)表明,OSS-INSTRUCT 的改進(jìn)并不僅僅是由于包含了來自相同分布的數(shù)據(jù)。
評估
Python 文本到代碼生成
下表 1 展示了不同基準(zhǔn)測試上,不同 LLM 在 pass@1 上的結(jié)果。從結(jié)果中首先可以觀察到,Magicoder-CL 相較基礎(chǔ) CODELLAMA-PYTHON7B 有明顯的改進(jìn),并且除了 CODELLAMA-PYTHON-34B 和 WizardCoder-CL-34B,在 HumanEval 和 HumanEval + 上優(yōu)于所有其他研究過的開源模型。
值得注意的是,Magicoder-CL 超過了 WizardCoder-SC-15B,并且在 HumanEval 和 HumanEval+ 上相對于 CODELLAMA-PYTHON-34B 有了明顯的提升。通過使用正交的 Evol-Instruct 方法進(jìn)行訓(xùn)練,MagicoderS-CL 進(jìn)一步實(shí)現(xiàn)改進(jìn)。MagicoderS-CL 在 HumanEval + 上優(yōu)于 ChatGPT 和所有其他開源模型。
此外,雖然在 HumanEval 上分?jǐn)?shù)略低于 WizardCoder-CL-34B 和 ChatGPT,但在更嚴(yán)格的 HumanEval + 數(shù)據(jù)集上超過了它們,表明 MagicoderS-CL 可能生成更為穩(wěn)健的代碼。
多語言代碼生成
除了 Python 外,研究者在下表 2 中對 Java、JavaScript、C++、PHP、Swift 和 Rust 等 6 種廣泛使用的編程語言進(jìn)行了全面評估,使用的基準(zhǔn)測試是 MultiPL-E。
結(jié)果表明,在所有研究的編程語言中,Magicoder-CL 相對于基礎(chǔ)的 CODELLAMA-PYTHON-7B 有著明顯的改進(jìn)。此外,Magicoder-CL 在半數(shù)以上的編程語言上也取得了比 SOTA 15B WizardCoder-SC 更好的結(jié)果。此外,MagicoderS-CL 在所有編程語言上進(jìn)一步提高了性能,在只有 7B 參數(shù)的情況下實(shí)現(xiàn)了媲美 WizardCoder-CL-34B 的性能。
值得注意的是,Magicoder-CL 僅使用了非常有限的多語言數(shù)據(jù),但仍然優(yōu)于其他具有相似或更大規(guī)模的 LLM。此外,盡管評估框架以補(bǔ)全格式評估模型,但 Magicoders 仍然表現(xiàn)出明顯的改進(jìn),盡管它們只進(jìn)行了指令微調(diào)。這表明 LLM 可以從其格式之外的數(shù)據(jù)中學(xué)習(xí)知識。
用于數(shù)據(jù)科學(xué)的代碼生成
DS-1000 數(shù)據(jù)集包含來自 Python 中 7 個流行數(shù)據(jù)科學(xué)庫的 1,000 個不同的數(shù)據(jù)科學(xué)編碼問題,并為驗(yàn)證每個問題提供單元測試。DS-1000 具有補(bǔ)全和插入兩種模式,但在這里僅評估補(bǔ)全,因?yàn)榛A(chǔ) CODELLAMA-PYTHON 不支持插入。
下表 3 顯示了評估結(jié)果,其中包括了最近的 INCODER、CodeGen、Code-Cushman-001、StarCoder、CODELLAMA-PYTHON 和 WizardCoder。
結(jié)果表明,Magicoder-CL-7B 優(yōu)于評估的所有基線,包括最先進(jìn)的 WizardCoder-CL-7B 和 WizardCoder-SC-15B。MagicoderS-CL-7B 通過在 WizardCoder-SC-15B 的基礎(chǔ)上引入 8.3 個百分點(diǎn)的絕對改進(jìn),進(jìn)一步突破了極限。
與 DeepSeek-Coder 的比較
DeepSeek-Coder 是最近發(fā)布的一系列模型,展示了卓越的編碼性能。由于在撰寫時其技術(shù)細(xì)節(jié)和指令數(shù)據(jù)尚未公開,因此這里簡要討論它。研究者在 DeepSeek-Coder-Base-6.7B 上采用了與在 CODELLAMA-PYTHON-7B 上執(zhí)行的相同微調(diào)策略,得到了 Magicoder-DS 和 MagicoderS-DS。
下表 4 顯示了與表 1 相似的趨勢,即在應(yīng)用 OSS-INSTRUCT 后,基礎(chǔ)模型可以顯著改進(jìn)。值得注意的是,MagicoderS-DS 變體在所有基準(zhǔn)上均超過 DeepSeek-Coder-Instruct-6.7B,而且訓(xùn)練 token 數(shù)量減少至 1/8,它還在這些數(shù)據(jù)集上與 DeepSeek-Coder-Instruct-33B 表現(xiàn)相當(dāng)。
更多技術(shù)細(xì)節(jié)和實(shí)驗(yàn)結(jié)果請參閱原論文。
團(tuán)隊(duì)介紹
這篇論文的作者均來自伊利諾伊大學(xué)香檳分校(UIUC)張令明老師團(tuán)隊(duì),包括:魏宇翔,二年級博士生,研究方向是基于 AI 大模型的代碼生成;王者,科研實(shí)習(xí)生,目前為清華大學(xué)大四學(xué)生,研究方向是機(jī)器學(xué)習(xí)和自然語言處理;劉佳偉,三年級博士生,研究方向是編程系統(tǒng)和機(jī)器學(xué)習(xí);丁一峰,二年級博士生,研究方向是基于 AI 大模型的自動軟件調(diào)試。張令明老師現(xiàn)任 UIUC 計算機(jī)系副教授,主要從事軟件工程、機(jī)器學(xué)習(xí)、代碼大模型的相關(guān)研究,更多詳細(xì)信息請見張老師的個人主頁:https://lingming.cs.illinois.edu/。