智東西(公眾號:zhidxcom)
編輯?| ?GTIC
智東西4月14日報道,在剛剛落幕的GTIC 2023中國AIGC創新峰會上,aiXcoder(硅心科技)CTO郝逸洋帶來了主題為《大型語言模型(LLM)時代下的代碼生成》的主題演講。
他談道,GPT-4帶來了代碼生成的新變革,支持更長序列、更多指令號微調、多模態(圖片輸入)等操作,展現出更適于泛用的效果,同時也面臨不少問題,包括缺乏相關文件、依賴庫及需求文檔,以及速度較慢、信息安全威脅等。
實際上,程序生成模型與語言模型有較大區別,比如在交互方式方面,普通的對話語言模型以問答、續寫為主,程序生成模型則需要填空、補全、備份。
郝逸洋稱,未來,aiXcoder將促進模型從百億級擴展到千億級,加入大量自然語言處理+代碼的混合數據,針對編程中的各類場景專門構造指令數據集,從而得到綜合性能更好的代碼編輯工具。
據悉,aiXcoder(硅心科技)是一家AI虛擬編程機器人研發商,旗下有“aiXcoder智能編程機器人”,基于深度學習模型,并針對不同的專業領域和編程語言,能夠自動預測程序員的編程意圖,向用戶推薦即將書寫的下一段代碼,進而提升代碼的編寫效率。
以下為郝逸洋的演講實錄:
各位下午好!
之前的一些環節其實都是在講一些比較大的、涉及到整個AI領域上的一些事情,接下來我講的內容可能會比較聚焦一些,重點聚焦在代碼這個小領域上。但說小也并不小,整個開發的程序員群體其實是非常龐大的,它能產生的市場價值也是非常大的,這就是我們正在做的事情。
一、LLM時代的代碼生成,GPT-4利弊并存
在ChatGPT出來之前,世界上就已經有很多的代碼生成模型。那什么叫做代碼生成?用AI的方式來生產代碼,幫程序員完成一部分的寫代碼工作,未來甚至還有可能代替程序員,這就是代碼生成。在ChatGPT或者說是GPT-4出來之前,我們用的辦法很簡單,就是把代碼換到大型的自然語言模型當中,讓它來續寫代碼。
到GPT-4時,已經比之前的ChatGPT版本好多了。GPT-4有1750億的數據,在GPT-3的基礎之上對ChatGPT進行微調,讓它學會了對話的能力,又在它的基礎上進一步訓練。雖然OpenAI沒有公布出相關的細節,但從結果來看,GPT-4有了更長序列的理解能力,以及更多的指令微調,還包括對圖片的理解能力,這就是我們現在得到的GPT-4。

前幾天在嘗試用GPT-4做代碼生成以及其他相關任務的試驗時,我們給出了一段自然語言描述的需求,又給了它一個沒有完成的代碼片段,讓ChatGPT去完成這段代碼,它完成的結果非常好。除了最后的結果之外,它還給出了一段解釋。
我們又嘗試了一些別的功能,比如代碼的錯誤檢測和修復,我給了它一段有問題的代碼,我問它,這段代碼的錯誤是什么?它回答了我,告訴我這段代碼實際的問題是什么,還告訴我這段代碼應該改成什么樣,最后還解釋了修改之后的版本為什么可以正常運作,這就是用戶真正想要得到的結果,它確實可以做到。

GPT-4還能完成代碼優化,我給了它一小段有缺陷的代碼,代碼中循環一百萬次往一個relist里面放東西,我希望它能發現這一百萬次其實有點大了,應該要先申請一批內存,而不是不斷地去增加循環次數。但出乎意料的是,GPT-4并沒有發現這個問題,反而發現了兩個別的問題。GPT-4把所有的東西都放到一個文件夾里,最后一口氣來打印所有的日志,并給出解釋以及最后的描述,GPT-4具備一個完整的能力。
GPT-4對片段也有理解能力,我給了它一個很長的代碼,問它是什么意思,它就能告訴我是什么意思,對于用戶而言這是一種很強的能力。GPT-4是很泛用的代碼功能,它是在GPT-3的能力之上訓練出來的,為GPT-3加入了一些RHF讓它有更好的對話能力,又在這個基礎上訓練出了GPT-4。
我想GPT-4的能力從GPT-3而來,我做了一個實驗,給了它同樣的一段代碼,問它這段代碼的問題是什么,它的答案前半部分描述了我在做一件什么樣的事情,后面卻越說越不對勁,它說我收到了以下錯誤,實際上我沒有收到任何錯誤。為什么GPT-3會有這樣的行為?GPT-3的訓練模式就是語言模型,這個模型主要就是往后續寫。我給它一個問題,它就續寫這個問題,雖然它把這個問題更加詳細地描述了一遍,但并不是我所希望的東西。
這種情況有一個很好的辦法可以避免掉,當我給它一個引子,給它冒號告訴它接下來要寫的答案,讓它續寫,針對我們的需求構造出一個提示,讓模型可以根據我們的提示往后生成內容。這是在ChatGPT之前我們使用大語言模型的主要方式,它也能答出這個結果,跟GPT-4給的答案是一致的。如果我接下來告訴它,接下來需要修復的問題是什么,需要修復的代碼是什么,它應該也可以以同樣的方式給出來。

GPT-4的強處就體現在這里,是很泛用的能力,可以解決開發中遇到的各種問題。我總結了一下,在用GPT-4輔助代碼開發的過程中,你只用把你的問題描述一下,丟給GPT-4,就能用它的結果。Github前兩天發布了CopilotX,本質上就是在做這件事情,除了剛才demo中的四個場景,另外還有兩個場景,一個是文檔搜索,另一個是Prompt Quest描繪的生成,和自然語言相關,主要的功能和我剛才測試的場景差不多。
二、GPT-4弱勢初顯:依賴數據、速度慢、信息安全隱患
我們用GPT-4或者是CopilotX去做這個輔助代碼開發時,我們興沖沖地去嘗試,但是往往會遇到很多實際的問題,比如如果我們要做一個可以在網頁上運行的貪吃蛇程序,要把這個問題描述清楚可能有點難度,一般的程序員還得先想想或是上網查點資料才能寫出來,但這個問題對于GPT-4來說沒有難度。
真正有難度的是,當我在寫一個有業務邏輯的代碼的時候,我需要把用戶購物車里的商品循環一遍,還要把每個商品的價格取出來求一個和,獲得總價來反推回去。
這個邏輯讓一般的程序員理解起來沒有問題,但是讓GPT-4來做這件事就很困難。GPT-4和我們所理解的購物車不一樣,它不知道購物車是什么,我們需要把這個結構告訴它。總價要怎么獲取它也不知道,種種因素放在一起導致很難跟GPT-4描述清楚這件事情,因此它生成的代碼很難用。

第二個問題是它太慢了。我們把這個問題拋給GPT-4,補完這段代碼的時候,代碼需要一分鐘來生成,生成完之后還得修改它,需要把它里面購物車的部分改為你那一部分的購物車,需要把它獲取的商品價格改為你的商品價格。一分鐘的時間你可能早就已經寫好這個代碼了。
最后就是信息安全問題。GPT-4畢竟部署在美國,不受中國政府監管。如果一個公司的很關鍵的信息、資產、代碼等,通過互聯網傳輸到了美國的服務器上來獲得結果。那這個事情對于企業來說是否可以接受?哪怕OpenAI在國內開了分公司,把模型部署在國內,那么它是否信任國內的部署商也是個問題,中國一層層的網絡鏈接等都是問題。
另外,當你在手誤敲分號鍵時不小心敲到了L鍵上時,這是Java開發上很常見的問題,GPT-4能在用戶反應過來之前把這個錯誤改好嗎?從能力上說它是可以做到這一點的,但是實際效果很差,一是速度太慢,二是很少見到拼寫錯誤以及被拼寫錯誤修改過的數據。
GPT-4有一定的泛化能力,由于訓練時它是用網上抓取的數據、文件和頁面來進行訓練,這些內容基本沒有拼寫錯誤,因此它也很難理解拼寫錯誤應該怎樣去修改。這個問題可以通過人工反饋強化學習的方式來訓練它,但是這種訓練的效果可能還不如十幾萬參數的模型來做。這一點GPT-4很難做到。
三、開發綜合性代碼編輯工具,訓練千億級語言模型
當我們說到一個代碼項目里面的信息非常大時,我們往往指的是它的前后文。項目配置和語言模型有一個天然的區別,它們的交互方式很不一樣。從aiXcoder產品實際的例子可以看出來,他會對當前光標所在的位置進行補全,會對下面IDE的提示做出排序,還會往后做一個填空的操作。這些都是它和語言模型所不一樣的地方。
這里有一個具體的例子,一個看上去很簡單的插入任務,已經給出了前后文,需要讓它補充中間的東西。

實際上,在設計這個訓練任務的時候,里面有很多小細節需要考慮。最簡單的一個方法,也是很多預訓練模型的方法,先確定一個長度,假設是1024,有了這個長度之后,在里面隨機挖出一個空,讓模型來補全這個空并生成里面的內容。無論怎么生成,它都不會超過當前的長度,這就會導致一個問題,當我們在實際代碼中使用這樣一個模型的時候,我們發現無論這個空有多長,模型都會努力用最短的代碼把前后文連接起來。
最后,我們設計了一套方案,強制保留前文和下文,并且不限制這個空的長度,最后得到了一個模型。我們一開始期望模型輸出能把不存在的值給定義出來并且補充完整,但是它直接把當前的函數結束了并且又新建了一個函數。
遇到這樣的問題我們只能通過改變訓練任務來解決,設計訓練任務的時候就要考慮到這些情況。
我舉這個例子就是想說,在訓練GPT-3、GPT-3.5、GPT-4時也要考慮這樣的問題。GPT-4目前的缺陷,第一是在實時性上,它對于代碼糾錯缺少實時性,只能在代碼全部寫完后整體糾錯;第二就是它的上下文序列有限,看不到項目里面所有的信息。最后一點也是它最致命的問題,整個項目中的信息、配置、文件等和從網頁上抓取的文件差異很大,和主動構造的數據相比它表現的還是要差一些。
aiXcoder是用ChatGPT類似語言模型的方式做代碼生成的一套工具,現在已經免費上線使用了。

我們的下一步就是要汲取ChatGPT在代碼上的能力,首先是把大模型參數逐步從百億級增加到千億級,還要加入更多的自然語言數據來訓練它,讓它有理解自然語言的能力,最后通過指令微調來針對更多場景,構造一個指令級的數據,解決在代碼中的程序依賴問題,最后能得到一個最好的代碼全模型,完成代碼理解、代碼生成、代碼修復的綜合智能化代碼開發。
謝謝大家!
以上是郝逸洋演講內容的完整整理。