本發(fā)明涉及一種代碼生成方法,具體涉及一種基于知識和數(shù)據(jù)雙輪驅(qū)動的用于自動生成編程語言的方法,屬于自然語言處理。
背景技術(shù):
1、隨著人工智能技術(shù)的發(fā)展和大模型的普及,自然語言處理相關(guān)技術(shù)也得到了革新性的突破。擁有高達(dá)幾億到幾千億參數(shù),在海量數(shù)據(jù)上預(yù)訓(xùn)練的各種大語言模型,在進(jìn)行各類自然語言處理時展現(xiàn)出了前所未有的強(qiáng)大能力。
2、代碼生成(code?generation)是由自然語言文本生成程序代碼片段的過程。代碼生成的發(fā)展可以劃分為三個主要階段:最初是根據(jù)程序員或?qū)<腋鶕?jù)掌握的編程知識,手動編寫代碼生成規(guī)則和模板,實(shí)現(xiàn)一些簡單初級的代碼生成相關(guān)任務(wù);之后是基于機(jī)器學(xué)習(xí)的方法,使用概率與統(tǒng)計(jì)方法實(shí)現(xiàn)代碼生成;最后是通過深度神經(jīng)網(wǎng)絡(luò)模型實(shí)現(xiàn)代碼語言特征的自動提取。在這一發(fā)展過程中,代碼生成的準(zhǔn)確率有了質(zhì)的提升。
3、傳統(tǒng)的基于模板和規(guī)則的方法以及機(jī)器學(xué)習(xí)方法可解釋性好、資源要求低,但是需要領(lǐng)域內(nèi)專家通過手工編寫模板和規(guī)則的方式將知識注入,也就是依賴于“知識”驅(qū)動。此外,這種方法缺乏靈活性和適應(yīng)性,代碼生成的結(jié)果差強(qiáng)人意?;谏疃壬窠?jīng)網(wǎng)絡(luò)模型的方法能夠從大量文本數(shù)據(jù)或代碼數(shù)據(jù)中學(xué)習(xí)相應(yīng)編程語言的特點(diǎn),在主流的編程語言生成上取得了不錯的成績,但需要巨量標(biāo)注數(shù)據(jù)作為數(shù)據(jù)集才能得到較好的訓(xùn)練結(jié)果,也就是依賴于“數(shù)據(jù)”驅(qū)動。對于一些少見的、難以獲得大量標(biāo)注數(shù)據(jù)的編程語言,基線模型難以獲得與其體量匹配的訓(xùn)練數(shù)據(jù)量,也就難以達(dá)到令人滿意的代碼生成能力。
技術(shù)實(shí)現(xiàn)思路
1、針對現(xiàn)有技術(shù)中代碼生成方法存在的不足,即要么過度依賴于知識,要么過度依賴于數(shù)據(jù)的情況,發(fā)明人創(chuàng)造性地提出一種知識和數(shù)據(jù)雙輪驅(qū)動的代碼生成方法,從而更好地完成代碼生成任務(wù)。
2、本發(fā)明的創(chuàng)新點(diǎn)在于:在進(jìn)行代碼生成任務(wù)時,充分利用專家規(guī)則和模板以及訓(xùn)練用標(biāo)注數(shù)據(jù),將知識與數(shù)據(jù)有機(jī)地結(jié)合起來,以較少的數(shù)據(jù)和硬件資源完成代碼生成任務(wù)。
3、一種知識與數(shù)據(jù)雙輪驅(qū)動的代碼生成方法,包括以下步驟:
4、步驟1:構(gòu)建編程語言知識庫模塊。
5、具體地,包括以下子步驟:
6、步驟1.1:學(xué)習(xí)獲取目標(biāo)編程語言相關(guān)知識。
7、通過閱讀該編程語言相關(guān)著作,通過網(wǎng)絡(luò)博客或視頻學(xué)習(xí)該編程語言編寫方法,閱讀相關(guān)工程源代碼等多種方式,學(xué)習(xí)目標(biāo)編程語言相關(guān)知識以及如何編寫該語言。
8、步驟1.2:設(shè)置代碼類別及對應(yīng)知識表示。
9、根據(jù)所學(xué)到的內(nèi)容和對該內(nèi)容的理解,將在該編程語言編寫中出現(xiàn)的各主要數(shù)據(jù)類型或語句形式(如一般高級編程語言中的數(shù)據(jù)結(jié)構(gòu)、類定義、函數(shù)定義、算法實(shí)現(xiàn)或目標(biāo)待生成語言中類似的概念,之后統(tǒng)稱為“類別”)的知識歸納總結(jié),形成該類別人工總結(jié)提煉出的“知識”。具體來說,如果該類別形式較為固定且有統(tǒng)一的代碼模板,則可以將該模板和一些指示大模型按照該模板生成對應(yīng)代碼的提示(prompt)組合,作為該類別的專家設(shè)置的“知識”;如果該類別沒有模板,則可以從該語言官方文檔中摘取一些該類別有用的信息(如類型定義、編寫特點(diǎn)、關(guān)鍵詞要求等),或根據(jù)學(xué)習(xí)的內(nèi)容人為總結(jié)一些幫助代碼模型生成正確代碼的信息(如“注釋”類別可提示注釋符號和使用方法,“標(biāo)識符”類別可提示命名風(fēng)格和上下文語境等等),作為該類別的知識和規(guī)則。這些模板和提示信息還可以類比c/c++、python、java等主流編程語言特點(diǎn)來設(shè)置,這樣可以更好的讓模型調(diào)動預(yù)訓(xùn)練編程語言信息,有利于讓代碼生成模型更好的理解新的編程語言。
10、步驟1.3:形成知識庫模塊。
11、將上述得到的各個代碼類別和對應(yīng)的知識表示以鍵值對(k,v)的形式組織起來,并將這些鍵值對匯總成為一個字典,作為該編程語言的知識庫k,也就是:
12、k={(k1,v1),(k2,v2),…,(kn,vn)}?????????????(1)
13、其中,(ki,vi)表示第i個類別和對應(yīng)的知識。
14、步驟2:設(shè)置分類器模型模塊。
15、對于用戶輸入的生成目標(biāo)編程語言代碼的自然語言指令,需要一個經(jīng)過訓(xùn)練的分類器模型解析出該指令要生成的具體類別,才能確定知識庫中與該類別對應(yīng)的專家知識,之后才能通過拼接等方式將提示、規(guī)則和模板并入到輸入中,進(jìn)而引導(dǎo)代碼生成模型更好地生成對應(yīng)代碼段。
16、步驟2.1:獲取文本分類數(shù)據(jù)集。
17、根據(jù)目標(biāo)編程語言特點(diǎn)和數(shù)據(jù)獲取的難易程度,從網(wǎng)絡(luò)搜索已有數(shù)據(jù)集,或是自行構(gòu)建分類數(shù)據(jù)集。文本分類數(shù)據(jù)集的格式應(yīng)為:
18、dt={(x1,y1),(x2,y2),…,(xn,yn)}??????????????(2)
19、其中,dt表示文本分類數(shù)據(jù)集,xi表示第i個自然語言描述文本,yi表示該自然語言描述文本對應(yīng)的生成代碼的類別。
20、步驟2.2:訓(xùn)練分類器模型。
21、使用編程語言指令文本分類數(shù)據(jù)集訓(xùn)練分類器模型,使后者學(xué)會根據(jù)目標(biāo)編程語言的自然語言代碼生成指令,判斷用戶想要生成的目標(biāo)代碼的所屬類別。該方法對基線模型(baseline?model)沒有要求,用戶可以根據(jù)自己的硬件資源情況和偏好,自行選擇合適的文本分類模型。常用的模型有基于機(jī)器學(xué)習(xí)的支持向量機(jī)(support?vector?machine,svm)、決策樹、基于深度學(xué)習(xí)的循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent?neural?network,rnn)、bert等。
22、步驟3:設(shè)置代碼生成模型模塊。
23、對代碼生成基線模型,在進(jìn)行新編程語言代碼生成任務(wù)前,使其在目標(biāo)編程語言數(shù)據(jù)上進(jìn)行二次預(yù)訓(xùn)練或微調(diào),使模型能夠在預(yù)測前學(xué)習(xí)該語言的特征,進(jìn)一步提升生成代碼的準(zhǔn)確度,尤其是對于那些沒有模板的類別。
24、步驟3.1:獲取代碼生成數(shù)據(jù)集。
25、與文本分類數(shù)據(jù)集的獲取方法相同,根據(jù)目標(biāo)編程語言代碼生成數(shù)據(jù)獲取的難易程度,以直接選取已有數(shù)據(jù)集或自行構(gòu)建數(shù)據(jù)集的方式,得到訓(xùn)練用數(shù)據(jù)集。根據(jù)選擇的代碼生成模型所要求的數(shù)據(jù)集格式的不同,每個樣本的格式也不同;常見的格式可分為只有輸入和輸出的序列到序列任務(wù)數(shù)據(jù)集格式({input,output}),以及額外包含“指令”字段的指令微調(diào)數(shù)據(jù)集格式({input,instruction,output})。將每個樣本表示為sample,訓(xùn)練數(shù)據(jù)集可表示為:
26、dc={sample1,sample2,…,samplen}?????????????(3)
27、其中,dc表示代碼生成數(shù)據(jù)集,samplei表示數(shù)據(jù)集中第i個樣本。
28、步驟3.2:訓(xùn)練/微調(diào)代碼生成模型。
29、使用獲取的目標(biāo)編程語言的代碼生成數(shù)據(jù)集dc,對基線代碼生成模型按硬件資源水平和實(shí)際使用需求進(jìn)行訓(xùn)練或微調(diào)。訓(xùn)練和微調(diào)的區(qū)別在于:訓(xùn)練一般指對模型的全部參數(shù)進(jìn)行更新,對硬件資源和訓(xùn)練數(shù)據(jù)量的要求非常高,但是能讓模型更好地學(xué)習(xí)到目標(biāo)編程語言的編寫特點(diǎn),適合硬件資源豐富、數(shù)據(jù)量充足的情形;而微調(diào)一般指僅對模型的少部分參數(shù)進(jìn)行更新,而將其他參數(shù)凍結(jié),微調(diào)對硬件資源的要求相比訓(xùn)練要顯著降低,且只需要較少的新編程語言的訓(xùn)練樣本就可以實(shí)現(xiàn),還能讓模型保持其原先具有的生成其他編程語言代碼的能力,適合硬件資源和數(shù)據(jù)量有限,且需要增量開發(fā)的情形。
30、步驟4:知識和數(shù)據(jù)雙輪驅(qū)動的代碼生成。
31、步驟4.1:組合各模塊。
32、將準(zhǔn)備好的三個模型模塊,即分類器、知識庫和代碼生成器首尾連接起來,形成一個整體架構(gòu)。具體來說,分類器模型模塊的輸入端與用于輸入自然語言描述文本,分類器模型模塊的輸出端分別與知識庫和生成器的相連接,知識庫的輸出端與代碼生成器的相連接,代碼生成器輸出代碼。
33、子步驟4.2:使用代碼生成模型進(jìn)行代碼生成。
34、輸入想要生成對應(yīng)代碼的自然語言描述文本,記為description,該自然語言描述文本首先經(jīng)過分類器模型進(jìn)行意圖解析,得到想要生成的目標(biāo)代碼類別,記為categoryd,即:
35、categoryd=classifier(description)??????????????(4)
36、classifier()表示通過分類器網(wǎng)絡(luò)進(jìn)行推斷。
37、之后,在編程語言知識庫k中搜索鍵categoryd,若搜到,取出其映射值knowledged,也就是“知識”,與輸入的自然語言描述文本拼接,形成代碼生成模型的輸入,記為inputd;若是沒有搜到,則直接將用戶輸入作為代碼生成模型的輸入inputd,即:
38、
39、最后,將得到的輸入饋送給代碼生成模型進(jìn)行文本到代碼的生成任務(wù),即:
40、outputd=generator(inputd)?????????????????(6)
41、其中,outputd即為最終生成的目標(biāo)編程語言代碼段,generator()表示使用代碼生成模型進(jìn)行推斷。
42、有益效果
43、與現(xiàn)有技術(shù)相比,本發(fā)明方法具有以下優(yōu)點(diǎn):
44、1.本方法充分利用了知識和數(shù)據(jù)兩方面的學(xué)習(xí)內(nèi)容,提出一種將知識和數(shù)據(jù)兩方面信息結(jié)合的代碼生成方法,從而使模型不僅可以從數(shù)據(jù)中學(xué)習(xí)到編碼知識,還可以通過模板、規(guī)則等學(xué)習(xí)目標(biāo)語言特點(diǎn)。
45、2.本方法的所涉及到的模型結(jié)構(gòu)相對獨(dú)立,使用者可以根據(jù)實(shí)際訓(xùn)練資源情況,自由選擇合適尺寸的分類器模型和代碼生成模型完成訓(xùn)練。
46、3.相比于當(dāng)下需要海量數(shù)據(jù)進(jìn)行訓(xùn)練的大模型,本方法在代碼數(shù)據(jù)量較小、代碼生成模型參數(shù)量較小的情形下依然具有不錯的表現(xiàn)。