
智東西(公眾號:zhidxcom)
編輯?| ?GTIC
智東西4月14日報(bao)道,在剛剛落幕的GTIC 2023中國AIGC創新峰會上(shang),aiXcoder(硅心科技(ji))CTO郝逸洋(yang)帶來了主(zhu)題為《大型語(yu)言模(mo)型(LLM)時(shi)代(dai)下的代(dai)碼(ma)生成》的主(zhu)題演(yan)講。
他(ta)談道,GPT-4帶來(lai)了代(dai)碼生成(cheng)的(de)新(xin)變革,支(zhi)持更(geng)長序列、更(geng)多(duo)指令號微調、多(duo)模態(圖片輸(shu)入)等操作,展(zhan)現出(chu)更(geng)適(shi)于(yu)泛用的(de)效果,同時(shi)也(ye)面臨不(bu)少(shao)問(wen)題,包括(kuo)缺乏(fa)相關文件(jian)、依賴庫及需(xu)求文檔,以(yi)及速度較慢、信息安全威脅等。
實際(ji)上(shang),程序生成模型(xing)(xing)與語言模型(xing)(xing)有較大區(qu)別,比如(ru)在交互方(fang)式方(fang)面(mian),普(pu)通的對話語言模型(xing)(xing)以問答(da)、續寫(xie)為主,程序生成模型(xing)(xing)則(ze)需要(yao)填空、補全、備份。
郝(hao)逸洋稱,未來,aiXcoder將促進模型從(cong)百億級(ji)擴展到千億級(ji),加入大量(liang)自然語言處理(li)+代碼的(de)混合數(shu)據,針(zhen)對編程中的(de)各類場景專門(men)構(gou)造指令數(shu)據集,從(cong)而得到綜合性能更好的(de)代碼編輯工具。
據悉,aiXcoder(硅心科技)是一家AI虛擬編(bian)程(cheng)(cheng)機(ji)(ji)器(qi)人(ren)研發商(shang),旗下有“aiXcoder智能編(bian)程(cheng)(cheng)機(ji)(ji)器(qi)人(ren)”,基(ji)于深度(du)學習模型,并針對不同的專業領(ling)域和編(bian)程(cheng)(cheng)語(yu)言,能夠自動預測(ce)程(cheng)(cheng)序員的編(bian)程(cheng)(cheng)意圖,向用(yong)戶(hu)推(tui)薦即(ji)將書寫(xie)的下一段(duan)代碼,進而(er)提升(sheng)代碼的編(bian)寫(xie)效率。
以下為郝逸洋的演講實錄:
各位下午好!
之(zhi)前的(de)(de)一些(xie)(xie)環節(jie)其實都是(shi)(shi)在講一些(xie)(xie)比較大的(de)(de)、涉及(ji)到整(zheng)個(ge)AI領(ling)域上(shang)的(de)(de)一些(xie)(xie)事(shi)情,接下來我(wo)講的(de)(de)內容可(ke)能會比較聚(ju)焦一些(xie)(xie),重點聚(ju)焦在代(dai)碼這個(ge)小領(ling)域上(shang)。但說小也并不小,整(zheng)個(ge)開(kai)發的(de)(de)程序員群體其實是(shi)(shi)非(fei)常龐大的(de)(de),它(ta)能產生的(de)(de)市場價(jia)值也是(shi)(shi)非(fei)常大的(de)(de),這就(jiu)是(shi)(shi)我(wo)們(men)正在做的(de)(de)事(shi)情。
一、LLM時代的代碼生成,GPT-4利弊并存
在(zai)ChatGPT出來(lai)之(zhi)(zhi)前,世界上就已(yi)經有很(hen)(hen)多(duo)的(de)(de)代碼(ma)(ma)生(sheng)成(cheng)模型。那什么叫(jiao)做代碼(ma)(ma)生(sheng)成(cheng)?用(yong)AI的(de)(de)方(fang)式(shi)來(lai)生(sheng)產代碼(ma)(ma),幫程序員完成(cheng)一部分的(de)(de)寫代碼(ma)(ma)工作(zuo),未來(lai)甚至還(huan)有可能(neng)代替(ti)程序員,這就是代碼(ma)(ma)生(sheng)成(cheng)。在(zai)ChatGPT或(huo)者說是GPT-4出來(lai)之(zhi)(zhi)前,我們用(yong)的(de)(de)辦(ban)法很(hen)(hen)簡單(dan),就是把代碼(ma)(ma)換到大(da)型的(de)(de)自然語言(yan)模型當中(zhong),讓它來(lai)續寫代碼(ma)(ma)。
到GPT-4時,已經比之前的(de)(de)(de)ChatGPT版本好多(duo)了(le)。GPT-4有(you)1750億的(de)(de)(de)數據(ju),在(zai)(zai)GPT-3的(de)(de)(de)基(ji)礎之上(shang)對ChatGPT進(jin)行(xing)微調,讓它學會了(le)對話的(de)(de)(de)能力,又在(zai)(zai)它的(de)(de)(de)基(ji)礎上(shang)進(jin)一步(bu)訓練。雖(sui)然OpenAI沒有(you)公布出相關的(de)(de)(de)細節,但從結果來看,GPT-4有(you)了(le)更(geng)長序列的(de)(de)(de)理(li)解(jie)能力,以(yi)及更(geng)多(duo)的(de)(de)(de)指令微調,還包括對圖片的(de)(de)(de)理(li)解(jie)能力,這就是(shi)我(wo)們現在(zai)(zai)得到的(de)(de)(de)GPT-4。
前幾天在嘗試用GPT-4做代碼生成(cheng)以及其他相關(guan)任務的試驗時(shi),我們給(gei)(gei)出了(le)(le)一(yi)段自然(ran)語言描(miao)述的需求,又給(gei)(gei)了(le)(le)它(ta)一(yi)個沒有完成(cheng)的代碼片段,讓ChatGPT去完成(cheng)這段代碼,它(ta)完成(cheng)的結果(guo)(guo)非(fei)常好。除了(le)(le)最(zui)后的結果(guo)(guo)之外(wai),它(ta)還給(gei)(gei)出了(le)(le)一(yi)段解釋。
我(wo)們又嘗試了(le)(le)一些別的功能,比(bi)如代(dai)(dai)碼的錯誤檢測和修復,我(wo)給了(le)(le)它(ta)一段有問題的代(dai)(dai)碼,我(wo)問它(ta),這段代(dai)(dai)碼的錯誤是(shi)什(shen)么?它(ta)回答了(le)(le)我(wo),告訴我(wo)這段代(dai)(dai)碼實(shi)際的問題是(shi)什(shen)么,還告訴我(wo)這段代(dai)(dai)碼應該改成(cheng)什(shen)么樣,最后還解釋(shi)了(le)(le)修改之后的版(ban)本為什(shen)么可以正常運(yun)作,這就是(shi)用(yong)戶(hu)真正想要得到(dao)(dao)的結果,它(ta)確實(shi)可以做到(dao)(dao)。
GPT-4還(huan)能完(wan)成代碼優化(hua),我給了它(ta)一(yi)小段有(you)(you)缺陷(xian)的(de)(de)代碼,代碼中循環一(yi)百(bai)萬次(ci)(ci)往(wang)一(yi)個(ge)relist里(li)面放東西,我希望它(ta)能發(fa)現這一(yi)百(bai)萬次(ci)(ci)其實有(you)(you)點(dian)大了,應該要先申請一(yi)批內存,而不是不斷地去增加循環次(ci)(ci)數(shu)。但出乎(hu)意料的(de)(de)是,GPT-4并沒(mei)有(you)(you)發(fa)現這個(ge)問(wen)題,反而發(fa)現了兩個(ge)別的(de)(de)問(wen)題。GPT-4把所有(you)(you)的(de)(de)東西都放到一(yi)個(ge)文(wen)件夾里(li),最(zui)后(hou)(hou)一(yi)口氣來(lai)打印所有(you)(you)的(de)(de)日(ri)志(zhi),并給出解釋以及最(zui)后(hou)(hou)的(de)(de)描述(shu),GPT-4具備(bei)一(yi)個(ge)完(wan)整的(de)(de)能力。
GPT-4對片(pian)段也有理解能力,我給了它(ta)(ta)一個很(hen)長的(de)代碼,問它(ta)(ta)是什么意(yi)思(si),它(ta)(ta)就能告訴我是什么意(yi)思(si),對于用(yong)戶而言這是一種很(hen)強的(de)能力。GPT-4是很(hen)泛用(yong)的(de)代碼功能,它(ta)(ta)是在(zai)GPT-3的(de)能力之(zhi)上(shang)訓(xun)練出(chu)來(lai)的(de),為GPT-3加入(ru)了一些RHF讓它(ta)(ta)有更好的(de)對話(hua)能力,又(you)在(zai)這個基礎上(shang)訓(xun)練出(chu)了GPT-4。
我想GPT-4的(de)能力從(cong)GPT-3而來,我做(zuo)了(le)一(yi)(yi)個(ge)(ge)實驗(yan),給(gei)了(le)它(ta)(ta)同樣(yang)的(de)一(yi)(yi)段代碼,問(wen)(wen)(wen)它(ta)(ta)這(zhe)段代碼的(de)問(wen)(wen)(wen)題是(shi)什么(me),它(ta)(ta)的(de)答案(an)前(qian)半部分描述了(le)我在做(zuo)一(yi)(yi)件什么(me)樣(yang)的(de)事情,后面卻越(yue)說越(yue)不對勁(jing),它(ta)(ta)說我收到了(le)以(yi)下錯誤,實際(ji)上我沒有(you)收到任何錯誤。為什么(me)GPT-3會有(you)這(zhe)樣(yang)的(de)行為?GPT-3的(de)訓練模(mo)式就是(shi)語(yu)言模(mo)型(xing),這(zhe)個(ge)(ge)模(mo)型(xing)主要(yao)就是(shi)往后續寫(xie)(xie)。我給(gei)它(ta)(ta)一(yi)(yi)個(ge)(ge)問(wen)(wen)(wen)題,它(ta)(ta)就續寫(xie)(xie)這(zhe)個(ge)(ge)問(wen)(wen)(wen)題,雖然它(ta)(ta)把這(zhe)個(ge)(ge)問(wen)(wen)(wen)題更加詳細地描述了(le)一(yi)(yi)遍,但并不是(shi)我所希望的(de)東西。
這種情況有一個很(hen)好的(de)(de)辦法可以(yi)避免掉,當我(wo)給它(ta)(ta)一個引(yin)子,給它(ta)(ta)冒號告(gao)訴它(ta)(ta)接(jie)下來要寫(xie)的(de)(de)答(da)案,讓它(ta)(ta)續寫(xie),針對我(wo)們的(de)(de)需(xu)求構造(zao)出一個提(ti)(ti)示(shi),讓模型可以(yi)根據我(wo)們的(de)(de)提(ti)(ti)示(shi)往后(hou)生成內容。這是在ChatGPT之前我(wo)們使用大(da)語言模型的(de)(de)主要方式,它(ta)(ta)也(ye)能答(da)出這個結果,跟GPT-4給的(de)(de)答(da)案是一致(zhi)的(de)(de)。如果我(wo)接(jie)下來告(gao)訴它(ta)(ta),接(jie)下來需(xu)要修(xiu)復(fu)的(de)(de)問(wen)題是什么(me)(me),需(xu)要修(xiu)復(fu)的(de)(de)代碼是什么(me)(me),它(ta)(ta)應該也(ye)可以(yi)以(yi)同樣的(de)(de)方式給出來。
GPT-4的(de)強(qiang)處就(jiu)體現在這(zhe)(zhe)里,是很(hen)泛用(yong)(yong)的(de)能力,可以解決開(kai)發中遇到的(de)各種問(wen)題(ti)。我總(zong)結(jie)了一(yi)下,在用(yong)(yong)GPT-4輔助代碼開(kai)發的(de)過程中,你只用(yong)(yong)把你的(de)問(wen)題(ti)描述一(yi)下,丟給GPT-4,就(jiu)能用(yong)(yong)它的(de)結(jie)果。Github前(qian)兩天發布了CopilotX,本(ben)質上就(jiu)是在做這(zhe)(zhe)件事情(qing),除了剛(gang)才demo中的(de)四(si)個場景,另外還有兩個場景,一(yi)個是文檔(dang)搜索,另一(yi)個是Prompt Quest描繪的(de)生成,和(he)自(zi)然語言相關,主要的(de)功能和(he)我剛(gang)才測(ce)試(shi)的(de)場景差不多。
二、GPT-4弱勢初顯:依賴數據、速度慢、信息安全隱患
我們(men)用GPT-4或者是CopilotX去做這(zhe)(zhe)個輔助代碼開(kai)發時(shi),我們(men)興沖沖地去嘗試,但是往往會遇到(dao)很多實際的問題(ti),比如如果我們(men)要做一個可以在網頁上運行的貪吃蛇程序,要把這(zhe)(zhe)個問題(ti)描述清(qing)楚可能有點難(nan)度(du),一般(ban)的程序員還(huan)得先(xian)想想或是上網查點資料才(cai)能寫(xie)出來,但這(zhe)(zhe)個問題(ti)對于GPT-4來說沒有難(nan)度(du)。
真正有難度的(de)(de)是,當我(wo)在寫一(yi)個(ge)有業務邏輯的(de)(de)代碼的(de)(de)時候,我(wo)需要(yao)把用戶(hu)購(gou)物車里的(de)(de)商品循環(huan)一(yi)遍,還要(yao)把每個(ge)商品的(de)(de)價格取出來(lai)求一(yi)個(ge)和(he),獲得總價來(lai)反推(tui)回(hui)去(qu)。
這個(ge)邏輯讓一(yi)般的程(cheng)序員理(li)(li)解起來(lai)沒(mei)有(you)問題,但是讓GPT-4來(lai)做這件事(shi)(shi)就很困難。GPT-4和我們所理(li)(li)解的購物車(che)(che)不(bu)(bu)一(yi)樣,它(ta)不(bu)(bu)知道購物車(che)(che)是什(shen)么,我們需要把這個(ge)結(jie)構告訴它(ta)。總價要怎么獲(huo)取它(ta)也不(bu)(bu)知道,種(zhong)(zhong)種(zhong)(zhong)因素放在一(yi)起導致很難跟(gen)GPT-4描述清楚這件事(shi)(shi)情,因此它(ta)生成(cheng)的代碼很難用。
第二個問題是它(ta)太慢了。我們把這(zhe)個問題拋給GPT-4,補完這(zhe)段代(dai)碼(ma)的(de)(de)時候(hou),代(dai)碼(ma)需要(yao)一分鐘來生成,生成完之后還得修改(gai)它(ta),需要(yao)把它(ta)里面(mian)購(gou)物(wu)(wu)車(che)的(de)(de)部(bu)分改(gai)為你(ni)那(nei)一部(bu)分的(de)(de)購(gou)物(wu)(wu)車(che),需要(yao)把它(ta)獲取的(de)(de)商(shang)品(pin)(pin)價(jia)格改(gai)為你(ni)的(de)(de)商(shang)品(pin)(pin)價(jia)格。一分鐘的(de)(de)時間你(ni)可(ke)能早就已經(jing)寫(xie)好這(zhe)個代(dai)碼(ma)了。
最后就是信(xin)息安(an)全(quan)問(wen)題。GPT-4畢竟部署(shu)在美國(guo)(guo)(guo),不受中國(guo)(guo)(guo)政府(fu)監管(guan)。如果(guo)(guo)一個(ge)公(gong)司(si)的很(hen)關鍵的信(xin)息、資產(chan)、代碼等,通過互聯網傳輸到了(le)美國(guo)(guo)(guo)的服務(wu)器上來獲得(de)結果(guo)(guo)。那(nei)(nei)這個(ge)事情(qing)對于(yu)企業來說是否可以接(jie)受?哪怕OpenAI在國(guo)(guo)(guo)內開了(le)分公(gong)司(si),把(ba)模型(xing)部署(shu)在國(guo)(guo)(guo)內,那(nei)(nei)么它是否信(xin)任國(guo)(guo)(guo)內的部署(shu)商也(ye)是個(ge)問(wen)題,中國(guo)(guo)(guo)一層(ceng)層(ceng)的網絡鏈(lian)接(jie)等都(dou)是問(wen)題。
另外,當你(ni)在手誤(wu)(wu)敲(qiao)分(fen)號鍵(jian)(jian)時(shi)不小心敲(qiao)到了L鍵(jian)(jian)上(shang)時(shi),這(zhe)是Java開發上(shang)很常見的問題(ti),GPT-4能在用戶反應(ying)過來(lai)之前把這(zhe)個(ge)錯(cuo)(cuo)誤(wu)(wu)改好嗎(ma)?從(cong)能力上(shang)說它是可以做到這(zhe)一點的,但是實際效果(guo)很差,一是速度太(tai)慢,二(er)是很少見到拼(pin)寫(xie)錯(cuo)(cuo)誤(wu)(wu)以及(ji)被拼(pin)寫(xie)錯(cuo)(cuo)誤(wu)(wu)修(xiu)改過的數(shu)據。
GPT-4有一(yi)定的(de)泛化能(neng)力,由于(yu)訓(xun)練(lian)時它是用網上抓(zhua)取的(de)數據(ju)、文件和頁面來進行訓(xun)練(lian),這(zhe)些內容基本沒有拼寫(xie)(xie)錯(cuo)誤,因此它也很難理解(jie)拼寫(xie)(xie)錯(cuo)誤應該怎樣去(qu)修(xiu)改。這(zhe)個問(wen)題可以(yi)通過人工反饋強化學習的(de)方式來訓(xun)練(lian)它,但(dan)是這(zhe)種訓(xun)練(lian)的(de)效(xiao)果可能(neng)還不如十幾萬參(can)數的(de)模(mo)型來做。這(zhe)一(yi)點GPT-4很難做到。
三、開發綜合性代碼編輯工具,訓練千億級語言模型
當(dang)我(wo)們說到一個(ge)代(dai)碼項(xiang)目里(li)面(mian)的信息非(fei)常大時,我(wo)們往往指的是它的前后(hou)文。項(xiang)目配置和(he)語言模型有一個(ge)天然(ran)的區(qu)別,它們的交(jiao)互方式(shi)很(hen)不一樣(yang)。從aiXcoder產品實際的例子可以看出來,他會對當(dang)前光標所在的位置進行補(bu)全,會對下面(mian)IDE的提示(shi)做出排序,還會往后(hou)做一個(ge)填空的操作。這些都是它和(he)語言模型所不一樣(yang)的地方。
這(zhe)里有一個具體的例子,一個看(kan)上去很簡單的插入任務,已經給出了(le)前后文,需(xu)要(yao)讓它補(bu)充中間的東西。
實(shi)際(ji)上,在設計這(zhe)個(ge)訓(xun)練任務的(de)(de)時候,里面(mian)有很多小細節需要考(kao)慮(lv)。最簡單的(de)(de)一(yi)個(ge)方法(fa),也(ye)是很多預(yu)訓(xun)練模(mo)型的(de)(de)方法(fa),先確定一(yi)個(ge)長(chang)度(du)(du),假設是1024,有了這(zhe)個(ge)長(chang)度(du)(du)之后,在里面(mian)隨機挖出一(yi)個(ge)空(kong),讓模(mo)型來(lai)補全這(zhe)個(ge)空(kong)并生成里面(mian)的(de)(de)內容。無論怎么生成,它都不會超過當(dang)前(qian)的(de)(de)長(chang)度(du)(du),這(zhe)就會導致一(yi)個(ge)問題,當(dang)我們在實(shi)際(ji)代碼(ma)(ma)中(zhong)使用這(zhe)樣一(yi)個(ge)模(mo)型的(de)(de)時候,我們發現無論這(zhe)個(ge)空(kong)有多長(chang),模(mo)型都會努力用最短(duan)的(de)(de)代碼(ma)(ma)把前(qian)后文連(lian)接起來(lai)。
最后,我們(men)設計(ji)了一(yi)套方(fang)案,強制(zhi)保留(liu)前文和下文,并且(qie)不(bu)限制(zhi)這(zhe)個(ge)空的(de)長(chang)度,最后得到(dao)了一(yi)個(ge)模(mo)型(xing)。我們(men)一(yi)開(kai)始期望模(mo)型(xing)輸出能(neng)把不(bu)存在的(de)值(zhi)給定義出來并且(qie)補(bu)充完整,但是它直接把當(dang)前的(de)函數(shu)結束了并且(qie)又(you)新建了一(yi)個(ge)函數(shu)。
遇到(dao)這(zhe)樣(yang)的問題我們只(zhi)能通過改變訓練(lian)(lian)任務來(lai)解決,設計訓練(lian)(lian)任務的時候就要考慮到(dao)這(zhe)些情況。
我舉(ju)這個例(li)子就是(shi)想說,在(zai)訓練GPT-3、GPT-3.5、GPT-4時也要(yao)(yao)考(kao)慮這樣(yang)的(de)問(wen)題。GPT-4目(mu)前(qian)的(de)缺(que)陷,第一(yi)是(shi)在(zai)實時性上(shang),它對(dui)于代碼(ma)糾(jiu)錯缺(que)少實時性,只能在(zai)代碼(ma)全部寫(xie)完(wan)后(hou)整體糾(jiu)錯;第二就是(shi)它的(de)上(shang)下文序(xu)列(lie)有(you)(you)限,看不到項目(mu)里面所有(you)(you)的(de)信(xin)息。最后(hou)一(yi)點也是(shi)它最致命的(de)問(wen)題,整個項目(mu)中的(de)信(xin)息、配置、文件等(deng)和從網頁上(shang)抓取的(de)文件差異很(hen)大,和主動(dong)構(gou)造(zao)的(de)數據相(xiang)比它表(biao)現的(de)還是(shi)要(yao)(yao)差一(yi)些。
aiXcoder是用(yong)ChatGPT類似語言模型的方式(shi)做代(dai)碼生(sheng)成的一套工具,現在已經免費上線使用(yong)了。
我們(men)的(de)下一(yi)(yi)步就是要(yao)汲取ChatGPT在(zai)代(dai)碼上(shang)的(de)能力,首先是把大模(mo)型(xing)參(can)數逐步從百億(yi)(yi)級(ji)(ji)增加到(dao)千億(yi)(yi)級(ji)(ji),還要(yao)加入(ru)更多(duo)的(de)自(zi)然(ran)語言數據來(lai)訓練它(ta),讓它(ta)有理解(jie)自(zi)然(ran)語言的(de)能力,最(zui)后通(tong)過(guo)指令(ling)微調來(lai)針對(dui)更多(duo)場景,構(gou)造一(yi)(yi)個(ge)指令(ling)級(ji)(ji)的(de)數據,解(jie)決在(zai)代(dai)碼中的(de)程序(xu)依賴(lai)問題,最(zui)后能得到(dao)一(yi)(yi)個(ge)最(zui)好的(de)代(dai)碼全(quan)模(mo)型(xing),完(wan)成(cheng)代(dai)碼理解(jie)、代(dai)碼生成(cheng)、代(dai)碼修復的(de)綜(zong)合智能化代(dai)碼開發。
謝謝大家!
以上是郝逸洋演講內容的完整整理。