成熟的AI應(yīng)該自己寫代碼,IBM發(fā)布5億行代碼數(shù)據(jù)集,包含55種語言
本文經(jīng)AI新媒體量子位(公眾號ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
在ImageNet頻頻出現(xiàn)在計算機(jī)視覺研究的今天,IBM也為智能編碼(AI for Code)帶來了它的專屬數(shù)據(jù)集——CodeNet。
1400萬個編程項目,5億行代碼,超過55種的不同編碼語言。研究人員希望這一數(shù)據(jù)集能為編碼自動化領(lǐng)域(比如大型項目代碼的調(diào)試、維護(hù)和遷移)帶來便利。
△下載鏈接見文末
獨(dú)一無二的數(shù)據(jù)基礎(chǔ)
CodeNet的數(shù)據(jù)基礎(chǔ)來自兩個OJ(Online Judge)平臺AIZU和AtCoder所提交的實(shí)例。
△大聲告訴我世界上最好的語言是什么?
在這種在線編程平臺上提交的解決方案,除了大規(guī)模的代碼數(shù)據(jù)之外,還有許多高質(zhì)量的元數(shù)據(jù)(Metadata)和注釋。
比如對于OJ平臺的問題,就有如問題描述、內(nèi)存限制、問題難度等信息。
用戶提交的案例也一樣:
而在平臺自動審查機(jī)制下,提交的解決方案的不同狀態(tài)同樣也可以作為重要參考數(shù)據(jù)。
CodeNet能做什么?
基準(zhǔn)測試
當(dāng)在CodeNet-1K(C++ 1000基準(zhǔn))與最大的公開數(shù)據(jù)集之一GCJ-297上訓(xùn)練相同的MISIM模型,并在第三個獨(dú)立的數(shù)據(jù)集POJ-104上測試這兩個訓(xùn)練好的模型時:
△模型在CodeNet-1K上訓(xùn)練時的POJ-104測試分?jǐn)?shù)比在GCJ-297上的高12%
這表明了CodeNet-1K擁有更好的泛化能力。
而分別使用MLP、CNN、C-BERT、GNN在CodeNet的幾個基準(zhǔn)上進(jìn)行了代碼分類、代碼相似性評估和代碼完成等實(shí)驗(yàn)后,大多數(shù)任務(wù)都獲得了90%以上的準(zhǔn)確率。
實(shí)際應(yīng)用
基于不同編程語言間的規(guī)則,將幾段代碼轉(zhuǎn)換成其他語言,對AI來說并非難事。
但如果是上千上萬行,甚至是一個大型項目,其代碼語義就會涉及到上下文,而上下文又可能牽扯到多個代碼庫。在這樣的復(fù)雜語境下的語言翻譯可是個不小的挑戰(zhàn)。
在以前,通常先由機(jī)器完成程序50%~60%的遷移,涉及復(fù)雜規(guī)則的部分再由人力負(fù)責(zé),非常棘手且費(fèi)事費(fèi)力。
可就在不久前,IBM通過基于CodeNet的AI for Code成功將一位大型汽車客戶的持續(xù)代碼遷移過程(多代Java技術(shù)開發(fā)的3500個Java文件,超一百萬行代碼),從一年縮短到了四星期。
因?yàn)樵贑odeNet的數(shù)據(jù)基礎(chǔ)中,90%以上的問題的描述、輸入格式說明、輸出格式說明,以及50%以上的提交代碼的輸入和輸出樣本,就是確定不同語言間的代碼等價與否的關(guān)鍵。
這就極大地推動了代碼翻譯的強(qiáng)化學(xué)習(xí)技術(shù)。
而大量于內(nèi)存限制、執(zhí)行時間、錯誤類型的元數(shù)據(jù),也可以用來標(biāo)記源代碼中的潛在缺陷,并進(jìn)一步訓(xùn)練開發(fā)代碼優(yōu)化系統(tǒng)。
CodeNet數(shù)據(jù)集提供了一套利于理解和使用的技術(shù),在協(xié)助廣大開發(fā)者和研究者開發(fā)算法,推進(jìn)AI編碼的同時,也為企業(yè)開啟IT現(xiàn)代化帶來了持續(xù)不斷的商業(yè)價值。
技術(shù)上如何實(shí)現(xiàn)
在統(tǒng)計數(shù)據(jù)時,研究者們組織所有數(shù)據(jù)成為一個嚴(yán)格的目錄結(jié)構(gòu):最上層是Project CodeNet目錄,下方的子目錄分別為:
*數(shù)據(jù)
細(xì)分為每個問題中源碼、腳本語言。
*元數(shù)據(jù)
存放所有問題的problem_list.csv文件和提交案例的csv文件。
*問題描述
存放問題的HTML文件,包含文本的廣泛描述。
然后使用命令行工具或像ls和grep這樣的應(yīng)用程序來提取,對csv文件可使用csvkit組件(如csvstat)。
對于數(shù)據(jù)集則采用bash腳本進(jìn)行訪問選擇:
△腳本已給出。
最后通過標(biāo)記器產(chǎn)生標(biāo)記流、AST生成解析到抽象語法樹、構(gòu)建數(shù)據(jù)流圖以分析代碼,最終將代碼樣本轉(zhuǎn)換為可被AI算法識別和使用的表現(xiàn)形式:
△處理過程所用到的工具。
編程自動化的未來
IBM的研究者們還在不斷地改進(jìn)和開發(fā)CodeNet,期望它能夠加速AI編程的算法進(jìn)步。
而隨著機(jī)器學(xué)習(xí)領(lǐng)域的不斷發(fā)展,不僅是代碼的“實(shí)現(xiàn)”,連“設(shè)計”也開始向計算機(jī)一側(cè)傾靠(比如GAN通過對抗學(xué)習(xí)尋找最優(yōu)解)。
未來真的可以像DNA的自我編輯那樣,實(shí)現(xiàn)完全的自動編程嗎?
建議先封裝幾個人類程序員,來幫計算機(jī)完成算法第一步的“精確描述問題需求”。