代碼模型自我進(jìn)化超越GPT-4o蒸餾!UIUC伯克利等提出自對齊方法 | NIPS 2024
LLM作為智能的基座,可以衍生出各種能力。
代碼能力就是其中一種:程序補(bǔ)全、注釋、優(yōu)化、修bug、測試等等。
而想要充分發(fā)揮LLM的巨大潛力,指令調(diào)優(yōu)(Instruction Tuning)是至關(guān)重要的一步。

當(dāng)前,高質(zhì)量指令數(shù)據(jù)主要有兩個(gè)來源:人工注釋和蒸餾。
前者很貴,后者則受到限制。于是,人們開始另辟蹊徑。
近日,來自UIUC、伯克利等機(jī)構(gòu)的研究人員提出了SelfCodeAlign。
這篇工作首次證明了,可以通過自對齊(Self-Alignment)來獲得強(qiáng)大的代碼模型,不需要人工注釋或者蒸餾,而且效果更好!

論文地址:https://arxiv.org/pdf/2410.24198
SelfCodeAlign在整個(gè)數(shù)據(jù)生成過程中,使用相同的基礎(chǔ)模型進(jìn)行推理,分為三步:
首先,從高質(zhì)量的種子片段中提取不同的編碼概念,以生成新任務(wù)。
然后,對每個(gè)任務(wù)的多個(gè)響應(yīng)進(jìn)行采樣,將每個(gè)響應(yīng)與測試用例配對,并在沙盒環(huán)境中對其進(jìn)行驗(yàn)證。
最后,選擇驗(yàn)證通過的示例來進(jìn)行指令調(diào)優(yōu)。

SelfCodeAlign是第一個(gè)完全透明的pipeline,使用純自生成的指令數(shù)據(jù)對基礎(chǔ)代碼模型進(jìn)行自對齊。
實(shí)驗(yàn)表明,使用SelfCodeAlign對CodeQwen1.5-7B進(jìn)行指令微調(diào),在HumanEval+上實(shí)現(xiàn)了67.1 pass@1,超過了參數(shù)量大10倍的CodeLlama-70B-Instruct。

在全部的三項(xiàng)基準(zhǔn)測試(代碼生成、數(shù)據(jù)科學(xué)編程、代碼編輯)中,SelfCodeAlign都戰(zhàn)勝了之前最先進(jìn)的指令微調(diào)方法OctoPack。
此外,在HumanEval+上,SelfCodeAlign的性能超越了基于GPT-3.5-Turbo的蒸餾方法(包括 OSS-Instruct(61.6)和Evol-Instruct(59.1)),甚至打敗了GPT-4o的直接輸出蒸餾(65.9)!

這意味著,從模型自己的數(shù)據(jù)分布對齊中學(xué)習(xí),可能勝于使用強(qiáng)大的teacher模型。
SelfCodeAlign適用于各種規(guī)模(從3B到33B)的LLM,比如StarCoder2-Struct就是以此為基礎(chǔ)創(chuàng)建的(base model為StarCoder2-15B)。

自對齊代碼生成
下圖以StarCoder2-15B的指令調(diào)優(yōu)過程為例,展示了SelfCodeAlign的流程:

種子選擇
SelfCodeAlign首先從The Stack V1中收集一組種子代碼片段。
此步驟中,確保種子片段多樣化且高質(zhì)量至關(guān)重要,它們將用作生成說明和響應(yīng)的起點(diǎn)。
為了收集種子片段,研究人員從The Stack V1中提取所有帶有文檔字符串的Python函數(shù),然后應(yīng)用一系列過濾規(guī)則來確保種子片段的質(zhì)量。
通過運(yùn)行Pyright類型檢查器、刪除基準(zhǔn)項(xiàng)、過濾掉文檔質(zhì)量差的函數(shù),以及刪除幾乎重復(fù)的函數(shù),總共從5M個(gè)函數(shù)中過濾出250k個(gè)Python函數(shù)。
概念生成
收集種子函數(shù)后,開始執(zhí)行Self-OSS-Instruct,對OSS-Instruct的自對齊進(jìn)行修改,以生成不同的指令。
具體來說,這里采用上下文學(xué)習(xí)(In-context learning)讓基礎(chǔ)模型從給定的種子代碼片段中自行生成指令。
### System : I - > R
You are an extremely intelligent AI coding assistant . Please provide an accurate and reliable response to each user instruction . After delivering your response , verify its consistency and correctness by writing a series of executable tests .
### System : C - > I
Create a series of independent coding tasks that are original , distinct , diverse , and high - quality , fostering logical thinking . Each task must adhere to specified properties :
- category : the type of task ( e . g . , function implementation , class implementation , or program implementation )
- language : the programming language to be used
- difficulty : the complexity level of the task ( e . g . , easy , medium , or hard )
- concepts : fundamental principles and techniques the task is designed to incorporate , which developers must understand to effectively solve the task
Design the tasks so that the relevant concepts emerge naturally as the most appropriate solutions , without explicitly mentioning that a particular concept should be used .作者使用了21個(gè)精心設(shè)計(jì)的示例來教模型如何工作:

指令生成過程分為以下兩個(gè)步驟:
概念提取:對于每個(gè)種子函數(shù),提示基本模型生成函數(shù)中存在的代碼概念列表。代碼概念是指編程中使用的基本原則和技術(shù),例如模式匹配和數(shù)據(jù)類型轉(zhuǎn)換。
指令生成:提示基本模型根據(jù)已識別的代碼概念和兩個(gè)附加屬性(難度和類別)自生成編碼任務(wù),隨機(jī)抽樣以豐富生成指令的多樣性。
執(zhí)行篩選
根據(jù)Self-OSS-Struct生成的指令,下一步是將每條指令與高質(zhì)量teacher模型(比如GPT-4)相匹配。
不過,很多強(qiáng)大的商業(yè)模型不允許用蒸餾來做這種事,而且,teacher模型也不一定就更加厲害,畢竟老師也會犯錯(cuò)誤,這時(shí)就會起到負(fù)作用。
作者建議,明確指示模型在產(chǎn)生與自然語言交錯(cuò)的響應(yīng)后,生成用于自我驗(yàn)證的測試來自對齊基本模型。
具體來說,對于每個(gè)指令,基本模型對格式的多個(gè)輸出(響應(yīng)、測試)進(jìn)行采樣,然后過濾掉那些在沙箱環(huán)境中測試失敗的響應(yīng)。然后,為每個(gè)指令隨機(jī)選擇一個(gè)驗(yàn)證通過的響應(yīng),應(yīng)用于最終的指令微調(diào)數(shù)據(jù)集。
實(shí)驗(yàn)評估
本文全面評估了SelfCodeAlign在各種編碼任務(wù)中的表現(xiàn),包括:
函數(shù)生成:給定自然語言描述,要求LLM生成一個(gè)自包含函數(shù),并測試函數(shù)的正確性和效率。
類生成:給定一個(gè)包含類級和方法級信息的代碼框架,要求LLM生成類及其方法。
數(shù)據(jù)科學(xué)編程:給定數(shù)據(jù)科學(xué)任務(wù)的描述和部分代碼片段,要求LLM完成代碼片段以通過相應(yīng)的測試。
文件級代碼編輯:提供文件內(nèi)容后,要求模型按照自然語言指令編輯程序。
函數(shù)級代碼生成
公平起見,比較對象為類似規(guī)模的最先進(jìn)的開源模型,基準(zhǔn)測試選擇LiveCodeBench。
LiveCodeBench是無污染評估的基準(zhǔn),包含2023年5月至2024年2月期間的400項(xiàng)最新Python算法挑戰(zhàn)。這些任務(wù)來自Codeforce和LeetCode等網(wǎng)站,每個(gè)網(wǎng)站平均有20多個(gè)測試用例。

上表報(bào)告了在3個(gè)特定開始日期之后創(chuàng)建的問題的測試結(jié)果(pass@1)。SelfCodeAlign-CQ-7B的性能始終優(yōu)于大多數(shù)基線模型。
此外,將開始日期向前移動對SelfCodeAlign-CQ-7B的影響很小,這表明模型不太可能受到污染。
類級代碼生成
這里使用ClassEval評估類級代碼生成的能力,ClassEval是100個(gè)類級Python代碼生成任務(wù)的集合,涵蓋100個(gè)類和410個(gè)方法,平均每個(gè)類33個(gè)測試,每個(gè)方法有8個(gè)測試。
作者將最大上下文大小設(shè)置為2048個(gè)token,測試了三種生成策略中每個(gè)模型的最佳類級pass@1(以及相應(yīng)的方法級pass@1):
1. 整體生成:在給定類框架的情況下生成整個(gè)類;
2. 增量生成:將早期生成的方法放在提示符中來迭代生成類方法;
3. 組合生成:獨(dú)立生成每個(gè)類方法,不查看其他方法。

上表中的類級pass@1需要同時(shí)生成正確的類和方法,而方法級pass@1僅檢查生成的方法是否能通過方法級測試。
上表的結(jié)果顯示,就類級性能而言,SelfCodeAlign-CQ-7B是表現(xiàn)最好的,不論是相比于開源指令微調(diào)模型,還是使用未知或?qū)S兄噶钗⒄{(diào)數(shù)據(jù)的模型。
數(shù)據(jù)科學(xué)
DS-1000包含7個(gè)流行的Python數(shù)據(jù)科學(xué)庫中1000個(gè)現(xiàn)實(shí)數(shù)據(jù)科學(xué)挑戰(zhàn)。在這個(gè)基準(zhǔn)測試中,模型必須完成部分代碼片段才能解決問題。

上表顯示,盡管SelfCodeAlign-CQ-7B只使用了有限的數(shù)據(jù)科學(xué)代碼進(jìn)行訓(xùn)練,但在與一眾模型的比較中仍然表現(xiàn)出色。
代碼編輯
代碼編輯任務(wù)選用CanItEdit作為基準(zhǔn)測試,該基準(zhǔn)測試由三種類型的210個(gè)代碼編輯任務(wù)(每種類型70個(gè)任務(wù))組成:糾正(修復(fù)錯(cuò)誤)、自適應(yīng)(添加新功能)和完善(改進(jìn)現(xiàn)有功能)。
對于每個(gè)任務(wù),模型需要以原始代碼片段和描述所需代碼更改的自然語言指令作為輸入,生成滿足指令的代碼片段。遵循原始基準(zhǔn)測試中的設(shè)置,在0.2的溫度下為每個(gè)任務(wù)進(jìn)行20次測試。

上表報(bào)告了每種類型的pass@1以及所有任務(wù)的平均成績。盡管沒有專門針對代碼編輯進(jìn)行調(diào)優(yōu),但SelfCodeAlign-CQ-7B在CanItEdit上表現(xiàn)出強(qiáng)大的性能,實(shí)現(xiàn)了39.0%的pass@1,優(yōu)于除CodeQwen1.5-Chat以外的所有模型。





































