代碼生成綜述

代碼生成大模型屬於LLM模型的一個子類,理論來講也是屬於語言模型的一種特例。代碼本身其實也是一種特殊的語言表示,所以代碼模型的實現應該是具備通用自然語言和代碼兩部分的能力。實際的代碼模型也是有兩條路徑來實現,讓訓練好的NLP LLM模型經過code的訓練,或者讓code LLM模型經過NLP語料的訓練來實現代碼生成模型。其實應該還有一條路徑,就是把code也當成是nlp語料,不區分code和nlp直接來訓練。

對於訓練的語料其實和NLP的LLM模型是一樣的至少包括三種:pretrain語料、instruct監督訓練語料、RLHF的比較訓練語料。實際上用的比較多的是前面兩種:pretrain語料和instruct語料。

對於模型馴練來說比較重要的就三樣東西和一條鏈路。所謂三樣東西無非:模型、數據、任務設計,一條鏈路就是經過多少輪的數據訓練,數據訓練的配比和加入順序。下面我們會圍繞三樣東西來展開介紹,為什麼不講解一條鏈路並非有什麼秘密。問題在於這個東西很難穩定成一套理論,有點類似傳統文化裡的“火候”、“易觀”這種東西跟實際情況結合很緊密,很難去講什麼時候該如何,就算能講出來往往也是當時決定完後馬後炮的總結,在下一次不一定就完全可用。所以沒有更好辦法隻有你自己多練,自己多感悟自然用多瞭就知道那麼一回事瞭,往往可能就是一個直覺的決定可能就有效,但是前提是你得碰到問題夠多想的夠多。

模型

基礎模型

模型 size 架構 pass@1
codeT5+ T5
code-davinci-2 GPT 59.86%
codegeex2 6B GLM
starcode 15.5B decode only
codegen16b 16B decode only 29.28%
InCoder-6.7B 6.7B Fairseq 15.6%
Palm- coder 540B 36%
Bloom

指令模型

模型 size 指令集 pass@1
OctoCoder 16B CommitPack、CommitPackFT 35.5%
OctoGeeX 6B CommitPack、CommitPackFT 30.9%
WizardCoder 16B Evol-Instruct 57%
InstructCodeT5+ 16B 22.3%
PanGu-Coder2 15B RRTF框架抽數據 61%
Instruct-Codegen-16B 16B code alpaca 250k 37.1%

數據

預訓練數據

The Stack(6TB)

下載鏈接:https://huggingface.co/datasets/bigcode/the-stack

The Stack數據集,這是一個具有3.1TB的合法開源代碼語料,擁有30種編程語言(註:最新版The Stack v1.1已經拓展到瞭308種語言,6TB數據);

CodeParrot github-code(500GB)

下載鏈接:https://huggingface.co/datasets/codeparrot/github-code

PolyCoder(249GB)

下載鏈接:https://github.com/VHellendoorn/Code-LMs

用的是GitHub上的公開代碼,主要選取的是各種編程語言中比較受歡迎的庫,每個庫至少有50 Stars,采用瞭多種編程語言代碼集來訓練,一共有12種

Google BigQuery(2B文件)

下載鏈接:https://cloud.google.com/blog/topics/public-datasets/github-on-bigquery-analyze-all-the-open-source-code

Google BigQuery提供瞭GitHub上許可存儲庫的快照,可以通過SQL查詢進行過濾。AlphaCode,BLOOM,InCoder、CodeGen)都在他們的預訓練數據集中包括瞭這部分數據。

CodeSearchNet(20GB)

下載鏈接:https://github.com/github/CodeSearchNet

其中包含瞭約600萬種函數,取自Go,Java,JavaScript,PHP,Python和Ruby這六種編程語言的開源代碼。

ProjectCodeNet(5億行)

下載鏈接:https://github.com/IBM/Project_CodeNet

該數據集包含 1400 萬個代碼樣本,共有用 55 種編程語言編寫的 5 億行代碼,其中 C++ 是樣本中使用最多的語言,Python 位居第二。

CodeXGLUE

下載鏈接:GitHub – microsoft/CodeXGLUE: CodeXGLUE

microsoft 開源的,包含10個任務及14個數據集

The Pile

下載鏈接:https://pile.eleuther.ai/

The Pile數據集也包含來自StackOverflow的問題、答案和評論組成這些問題和答案,但不包含註釋。定性地說,作者發現註釋。

指令數據

代碼生成:

https://huggingface.co/datasets/TnT/Multi_CodeNet4Repair

代碼填空:

https://huggingface.co/datasets/code_x_glue_cc_cloze_testing_all

代碼問答:

https://huggingface.co/datasets/Dahoas/code-review-instruct-critique-revision-python

代碼判斷:

https://huggingface.co/datasets/reshinthadith/pairwise-code-review-instruct-critique-revision-python

代碼閱讀理解:

https://huggingface.co/datasets/Nan-Do/instructional_code-search-net-python/viewer/Nan-Do–instructional_code-search-net-python/train?row=1

代碼測試:

https://huggingface.co/datasets/codeparrot/apps/viewer/all/train?row=0

https://huggingface.co/datasets/deepmind/code_contests

代碼填空:

https://huggingface.co/datasets/code_x_glue_cc_cloze_testing_all/viewer/go/train?row=0

綜合性instruct:

https://huggingface.co/datasets/nickrosh/Evol-Instruct-Code-80k-v1

https://huggingface.co/datasets/HuggingFaceH4/CodeAlpaca_20K

https://huggingface.co/datasets/iamtarun/python_code_instructions_18k_alpaca

任務設計

預訓練任務

前向生成

所謂前向生成,在訓練形式上其實應該是最簡單。就是讓模型源碼閱讀,難點在於選出讓他讀什麼,什麼時候讀,讀幾遍。

1.帶註釋源碼閱讀

2.帶項目需求源碼閱讀

3.語言規則+代碼例子

mask填補

這部分就是如何對源碼mask掉一部分,可能是一個詞或者幾個詞,也可能是一行或者幾行。然後讓代碼來做填空。這個可以隨機mask,也可以對代碼匯總關鍵詞mask或者是變量名mask,或者可以做一些語義理解隨機mask。

1. strategyDecisionDrm.__________ 是什麼?

2. getDefaultStrategyMap() 方法的返回值是什麼類型?

3. 如何從一個 List<String> 中隨機選擇指定數量的字符串?

4. 請為以下變量添加類型聲明:row, strategyCode, recommendCount

5. 使用 Java 8 中的什麼方法可以將一個 List<String> 中的元素限制在指定數量?

段生成

這個和上面的mask填補任務很像,可以把整段代碼mask或則核心實現mask,或者定義部分mask,更或者可以把代碼註釋mask,或者功能描述mask,讓模型來填補。

判斷

這部分可以在代碼修復、代碼復雜度選擇中設計任務,比如可以判斷哪個實現是對的,哪個實現會更快,哪個變量名是對的,哪個執行速度會更快,哪個測試結果是對的。

關鍵詞抽取

這部分可以設計抽取指定語意對應的參數,識別關鍵詞、識別摘要和代碼的關系。

選擇

多個變量選擇一個合適的填入代碼,代碼多段實現選擇填入

摘要

對代碼結構框架抽起,對代碼運行流程抽取,對代碼核心實現抽取,抽取代碼的實現邏輯。

指令任務

單問題點

生成:

NL–>Code 給文本生成代碼

NL–>NL+code 給文本生成代碼和描述

NL+code –>NL 生成代碼的邏輯、流程,描述;生成代碼功能描述

註釋:

Code–>NL給代碼生成註釋

Code–>NL+code 給代碼生成代碼功能實現思路,代碼續寫

Code+NL–>code 代碼填空,代碼改寫

問答:

Code+NL–> NL+code 給定代碼,根據問題回答問題

改寫:

Code+NL–> code 代碼改寫

Code+NL–> code 代碼糾錯

Code+NL–> code 代碼翻譯

Code+NL–> code 代碼增加功能

多輪對話/CoT

NL–>NL+code 根據需求生成代碼框架

NL–>code 根據需求描述生成帶多個功能模塊的類

NL+code–>NL+code 跟據功能描述和代碼框架,補全細節

NL+code–>NL+code 根據輸入輸出描述,生成可執行小項目工程

{
"代碼生成能力prompt": [
"1.根據以下需求生成一段代碼:需要一個函數,該函數接受策略代碼和推薦數量作為參數,然後從默認的策略地圖中獲取對應的股票,如果沒有找到相應的策略代碼,則返回預設的股票代碼,並按照請求的推薦數量進行限制。"
],
"代碼補全能力prompt": [
"1.我有一段未完成的代碼,需要你幫助完成,代碼如下:def useDefaultSymbolPool = { row, strategyCode, recommendCount -> 此處需要你的補全"
],
"代碼續寫能力prompt": [
"1.給定下面這段代碼,能否進行邏輯續寫:def ASSET_ID = 'finscprod.chooseStockCard'"
],
"代碼糾錯能力prompt": [
"1.這段代碼中存在一個錯誤,能否幫助找出並修正:def useDefaultSymbolPool = { row, strategyCode, recommendCount -> def strategyDecisionDrm = row.get('strategyDecisionDrm') as StrategyDecisionStorm"
],
"代碼註釋能力prompt": [
"1.請為以下代碼添加註釋:def useDefaultSymbolPool = { row, strategyCode, recommendCount -> def strategyDecisionDrm = row.get('strategyDecisionDrm') as StrategyDecisionDrm"
],
"代碼理解能力prompt": [
"1.請解釋這段代碼的功能:def useDefaultSymbolPool = { row, strategyCode, recommendCount -> def strategyDecisionDrm = row.get('strategyDecisionDrm') as StrategyDecisionDrm"
],
"代碼問答能力prompt": [
"1.在本段代碼中,getOrDefault方法是如何工作的?"
],
"註釋生成代碼prompt": [
"1.根據以下註釋生成相應的代碼:'使用默認的股票池,根據給定的策略代碼和推薦數量從策略決策DRM獲取股票代碼,如果沒有找到則返回預設的股票代碼,並限制返回的數量'"
],
"功能描述生成代碼prompt": [
"1.根據以下功能描述生成代碼:'創建一個函數,該函數接受三個輸入參數,即row,策略代碼和推薦數量,從“strategyDecisionDrm”獲取默認策略圖,如果策略代碼不存在,則返回默認的股票代碼,並且返回的數量不超過推薦數量。'"
],
"摘要生成代碼prompt": [
"1.從以下摘要生成代碼:'這是一個使用默認股票池的函數,其基於輸入的策略代碼和推薦數量從策略決策DRM中提取股票代碼,如果沒有找到匹配的策略代碼,將返回預定義的股票列表,並根據推薦數量進行限制。'"
],
"代碼功能描述prompt": [
"1.為下面這段代碼提供一個功能描述:def useDefaultSymbolPool = { row, strategyCode, recommendCount -> def strategyDecisionDrm = row.get('strategyDecisionDrm') as StrategyDecisionDrm"
],
"代碼註釋生成prompt": [
"1.請根據給定的功能描述生成相應的代碼註釋:'這個功能會從默認的策略決策DRM地圖中獲取股票代碼,如果無法根據給定的策略代碼找到,就會返回一個預設的股票代碼數組,並且返回的數量不超過給定的推薦值。'"
],
"功能描述到代碼COT prompt": [
"1.請根據以下的功能描述轉化為具體的代碼操作任務(COT):'我們需要一個函數來從默認的策略地圖中獲取策略代碼,如果沒有找到相應的策略代碼,則返回預設的股票代碼,並按照請求的推薦數量進行限制。'"
]
}

赞(0)