本發(fā)明屬于自然語(yǔ)言處理,具體是指一種基于殘差學(xué)習(xí)的個(gè)性化代碼生成系統(tǒng)及方法。
背景技術(shù):
1、隨著軟件開(kāi)發(fā)的復(fù)雜性增加,自動(dòng)代碼生成技術(shù)成為提高開(kāi)發(fā)效率和代碼質(zhì)量的關(guān)鍵手段之一。傳統(tǒng)的代碼生成方法,如基于規(guī)則的方法和簡(jiǎn)單的機(jī)器學(xué)習(xí)模型,往往難以捕捉編碼的細(xì)微差別和個(gè)性化需求。
2、近年來(lái),深度學(xué)習(xí)技術(shù),尤其是大型預(yù)訓(xùn)練語(yǔ)言模型(如gpt-3、codex等),在代碼生成領(lǐng)域顯示出了巨大的潛力。這些模型能夠基于海量的代碼庫(kù)學(xué)習(xí)編程語(yǔ)言的語(yǔ)法和結(jié)構(gòu),實(shí)現(xiàn)自動(dòng)代碼補(bǔ)全、bug修復(fù)、代碼重構(gòu)等功能。然而,盡管這些模型在理解代碼和生成代碼方面表現(xiàn)出色,但它們通常缺乏對(duì)開(kāi)發(fā)者個(gè)性化編碼風(fēng)格和偏好的理解和適應(yīng)能力。未經(jīng)過(guò)個(gè)性化的代碼常常需要開(kāi)發(fā)者進(jìn)行審查和修改,并且十分容易遺漏,大大增加了代碼開(kāi)發(fā)和維護(hù)的成本。
3、雖然大語(yǔ)言模型在代碼生成領(lǐng)域具有強(qiáng)大的語(yǔ)言理解和生成能力,但如何生成個(gè)性化的代碼仍然是一個(gè)挑戰(zhàn)。傳統(tǒng)的個(gè)性化方法無(wú)法充分理解開(kāi)發(fā)者的代碼風(fēng)格習(xí)慣和滿(mǎn)足個(gè)性化生成的需求,因此需要能夠捕捉開(kāi)發(fā)者代碼語(yǔ)法風(fēng)格的學(xué)習(xí)方法,以滿(mǎn)足不同開(kāi)發(fā)者的代碼個(gè)性化需求。
4、鑒于深度預(yù)訓(xùn)練模型優(yōu)異的代碼生成效果與性能,我們將其引入到個(gè)性化生成任務(wù)中。為了能夠更好地實(shí)現(xiàn)個(gè)性化的代碼生成,我們需要找到一種契合大語(yǔ)言模型特點(diǎn)的個(gè)性化輸入和輸出方式,有效地捕捉和模仿開(kāi)發(fā)者的代碼風(fēng)格和偏好,并有效地建立起對(duì)于不同開(kāi)發(fā)者的細(xì)粒度的代碼風(fēng)格特征。
技術(shù)實(shí)現(xiàn)思路
1、為了解決背景技術(shù)中的問(wèn)題,本發(fā)明提出了一種新穎的殘差學(xué)習(xí)框架,基于此,提供了一種基于殘差學(xué)習(xí)的個(gè)性化代碼生成方法。本發(fā)明的目的在于設(shè)計(jì)了一種表示開(kāi)發(fā)者代碼風(fēng)格的方法,將用戶(hù)的代碼風(fēng)格分解為不同的代碼特征,通過(guò)殘差學(xué)習(xí)學(xué)習(xí)到的代碼特征進(jìn)行組合形成開(kāi)發(fā)者的代碼風(fēng)格,并通過(guò)代碼風(fēng)格特征指導(dǎo)大語(yǔ)言模型生成對(duì)應(yīng)的個(gè)性化代碼。
2、本發(fā)明采用的技術(shù)方案如下,具體包括以下步驟:
3、一、一種基于殘差學(xué)習(xí)的個(gè)性化代碼生成系統(tǒng),包括:
4、前處理模塊,對(duì)用戶(hù)的歷史代碼進(jìn)行風(fēng)格檢測(cè),得到對(duì)應(yīng)代碼片段的風(fēng)格序列;
5、信息提取模塊,基于用戶(hù)的歷史代碼和風(fēng)格序列構(gòu)建基于大語(yǔ)言模型llm的殘差學(xué)習(xí)框架,通過(guò)殘差學(xué)習(xí)框架提取用戶(hù)的風(fēng)格信息;所述風(fēng)格信息為訓(xùn)練學(xué)習(xí)的每個(gè)代碼風(fēng)格規(guī)范的向量表示;
6、代碼生成模塊,將輸入的自然語(yǔ)言和風(fēng)格信息進(jìn)行融合,借助大語(yǔ)言模型llm完成代碼生成任務(wù)。
7、二、一種基于殘差學(xué)習(xí)的個(gè)性化代碼生成方法
8、應(yīng)用于上述個(gè)性化代碼生成系統(tǒng),所述個(gè)性化代碼生成方法具體包括如下步驟:
9、1)從命名、格式、結(jié)構(gòu)三個(gè)角度定義若干個(gè)代碼風(fēng)格規(guī)范,獲取編程語(yǔ)言的代碼片段數(shù)據(jù)集,使用代碼檢測(cè)工具收集代表對(duì)應(yīng)代碼片段的風(fēng)格序列;
10、2)基于步驟1)的代碼與其對(duì)應(yīng)的風(fēng)格序列設(shè)置殘差項(xiàng),生成可用于殘差學(xué)習(xí)的訓(xùn)練數(shù)據(jù);
11、3)對(duì)每個(gè)代碼風(fēng)格規(guī)范設(shè)置一個(gè)可學(xué)習(xí)的向量表示;
12、4)基于步驟3)的可學(xué)習(xí)的向量表示,通過(guò)大語(yǔ)言模型llm構(gòu)建殘差學(xué)習(xí)框架;
13、5)基于步驟2)的訓(xùn)練數(shù)據(jù),通過(guò)步驟4)的殘差學(xué)習(xí)框架進(jìn)行殘差學(xué)習(xí),訓(xùn)練學(xué)習(xí)得到每個(gè)代碼風(fēng)格規(guī)范的向量表示;
14、6)對(duì)于一個(gè)開(kāi)發(fā)者的歷史代碼,通過(guò)代碼檢測(cè)工具得到其風(fēng)格序列,使用步驟5)訓(xùn)練好的代碼風(fēng)格規(guī)范的向量表示,生成與開(kāi)發(fā)者歷史代碼風(fēng)格一致的個(gè)性化代碼。
15、所述步驟1)具體為:
16、將收集到的編程語(yǔ)言的代碼片段數(shù)據(jù)集中的每個(gè)代碼片段c,通過(guò)代碼檢測(cè)工具從命名、格式、結(jié)構(gòu)三個(gè)角度收集得到對(duì)應(yīng)代碼片段的風(fēng)格序列s={s1,s2,…,sn};
17、其中,風(fēng)格序列為由代碼風(fēng)格規(guī)范作為序列元素構(gòu)成的序列;n為收集的代碼風(fēng)格規(guī)范的個(gè)數(shù),風(fēng)格序列中的元素sn取值為0或1,代表是否遵循當(dāng)前位置的代碼風(fēng)格規(guī)范,1代表遵循,0代表不遵循。
18、代碼風(fēng)格規(guī)范包括:命名規(guī)范如變量命名采用駝峰命名;格式規(guī)范如限制行長(zhǎng)度不超過(guò)50個(gè)字符,運(yùn)算符兩側(cè)使用空格等;結(jié)構(gòu)規(guī)范如類(lèi)中方法的順序遵循先公共方法后私有方法等。
19、所述步驟2)具體為:
20、遍歷步驟1)的代碼片段與其對(duì)應(yīng)的風(fēng)格序列,構(gòu)造滿(mǎn)足如下條件的殘差學(xué)習(xí)數(shù)據(jù)集d:
21、殘差學(xué)習(xí)數(shù)據(jù)集d中每條殘差學(xué)習(xí)數(shù)據(jù)d={ca,sa,cb,sb,r,t,t};
22、其中,sa,sb為代碼片段ca與代碼片段cb對(duì)應(yīng)的兩個(gè)序列;提取sb中值為1的元素,并組成序列sb′;提取sa中值為1的元素,并組成序列sa′;代碼片段ca與代碼片段cb需滿(mǎn)足對(duì)應(yīng)的兩個(gè)序列sa′,sb′中不相同的元素個(gè)數(shù)為1;
23、其中,r代表兩個(gè)序列sa′,sb′中不相同的元素的代碼風(fēng)格規(guī)范名;t為r的代碼風(fēng)格規(guī)范的文本詳細(xì)解釋。
24、對(duì)于每條殘差學(xué)習(xí)數(shù)據(jù)d,訓(xùn)練文本t表示為:“已知兩段代碼以及它們對(duì)應(yīng)的風(fēng)格序列;請(qǐng)識(shí)別并解釋在第二段代碼中出現(xiàn),但未在第一段代碼中出現(xiàn)的代碼風(fēng)格規(guī)范名;第一段代碼:ca,第一段代碼的風(fēng)格序列:sa;第二段代碼:cb,第二段代碼的風(fēng)格序列:sb;答:r在第二段代碼中存在,而在第一段代碼中不存在;其文本解釋為t。”
25、所述步驟3)具體包括以下步驟:
26、基于設(shè)定的n個(gè)代碼風(fēng)格規(guī)范,為每個(gè)代碼風(fēng)格規(guī)范設(shè)置一個(gè)可學(xué)習(xí)向量表示,最終得到一組可學(xué)習(xí)向量表示a={a1,a2,…,an}。
27、所述步驟4)中構(gòu)建殘差學(xué)習(xí)框架模型具體包括以下步驟:
28、4.1)對(duì)于每條殘差學(xué)習(xí)數(shù)據(jù)對(duì)應(yīng)的訓(xùn)練文本t:在風(fēng)格序列值為1的位置插入對(duì)應(yīng)的可學(xué)習(xí)向量表示,將值為0的位置從文本中刪除,將r替換為對(duì)應(yīng)的可學(xué)習(xí)向量表示(找到r在風(fēng)格序列中對(duì)應(yīng)的元素位置,根據(jù)元素位置將r替換為對(duì)應(yīng)的可學(xué)習(xí)向量表示),其余位置通過(guò)llm的tokenizer轉(zhuǎn)變?yōu)槲谋厩度?,最終得到訓(xùn)練嵌入q;
29、4.2)將llm的參數(shù)權(quán)重全部?jī)鼋Y(jié),將訓(xùn)練嵌入q輸入llm,保留對(duì)可學(xué)習(xí)向量表示的權(quán)重學(xué)習(xí)。
30、所述步驟5)具體包括以下步驟:
31、通過(guò)步驟4)的殘差學(xué)習(xí)框架對(duì)步驟2)的訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,訓(xùn)練學(xué)習(xí)每個(gè)代碼風(fēng)格規(guī)范的向量表示;選取負(fù)log-likehood函數(shù)作為最終損失函數(shù):
32、
33、采用誤差反向傳播對(duì)可學(xué)習(xí)向量表示的參數(shù)進(jìn)行調(diào)整;根據(jù)訓(xùn)練過(guò)程中模型的損失函數(shù)選取可學(xué)習(xí)向量表示的參數(shù),將損失函數(shù)最小時(shí)對(duì)應(yīng)的一組參數(shù)作為可學(xué)習(xí)向量表示的參數(shù)。
34、所述步驟6)具體包括以下步驟:
35、6.1)對(duì)于一個(gè)開(kāi)發(fā)者的歷史代碼,使用代碼檢測(cè)工具從命名、格式、結(jié)構(gòu)三個(gè)角度收集得到代表對(duì)應(yīng)代碼片段的風(fēng)格序列s={s1,s2,…,sn};
36、6.2)將風(fēng)格序列中值為1的風(fēng)格規(guī)范對(duì)應(yīng)的向量表示,組成代表開(kāi)發(fā)者代碼風(fēng)格特征的向量組a={a1,a2,…,am};其中m為風(fēng)格序列中值為1的元素個(gè)數(shù);
37、6.3)問(wèn)題文本通過(guò)llm的tokenizer后得到嵌入序列e={e1,e2,…,en},其中n為token化的向量表示個(gè)數(shù);所述問(wèn)題文本為由自然語(yǔ)言描述的用戶(hù)編程問(wèn)題或需求;
38、將風(fēng)格特征的向量組a與嵌入序列e進(jìn)行連接,得到用戶(hù)的輸入嵌入q:
39、q={a1,a2,…,am,e1,e2,…,en};
40、6.4)將嵌入q輸入llm通過(guò)自回歸解碼得到與開(kāi)發(fā)者歷史風(fēng)格一致的個(gè)性化代碼。
41、三、一種終端
42、所述終端包括存儲(chǔ)器、處理器及存儲(chǔ)在所述存儲(chǔ)器中并可在所述處理器上運(yùn)行的個(gè)性化代碼生成程序,所述處理器執(zhí)行個(gè)性化代碼生成程序時(shí),實(shí)現(xiàn)上述的基于殘差學(xué)習(xí)的個(gè)性化代碼生成方法。
43、四、一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)
44、所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上存儲(chǔ)有個(gè)性化代碼生成程序,所述個(gè)性化代碼生成程序被處理器執(zhí)行時(shí),實(shí)現(xiàn)上述的基于殘差學(xué)習(xí)的個(gè)性化代碼生成方法。
45、本發(fā)明的有益效果:
46、本發(fā)明提供了一種基于殘差學(xué)習(xí)的個(gè)性化代碼生成系統(tǒng)及方法,通過(guò)從數(shù)據(jù)中提取風(fēng)格規(guī)范,并設(shè)計(jì)殘差學(xué)習(xí)來(lái)訓(xùn)練不同的風(fēng)格規(guī)范表示。借助風(fēng)格規(guī)范表示可以配置靈活且多樣的代碼風(fēng)格,幫助開(kāi)發(fā)者生成與風(fēng)格需求一致的個(gè)性化代碼,提升了代碼自動(dòng)化生成的定制化程度,提高了開(kāi)發(fā)的效率,減少了代碼維護(hù)的成本。