最近OpenAI與GitHub聯(lián)合構(gòu)建的AI自動編程工具Copilot正式登場!Copilot基于自然語言處理模型GPT-3搭建而成,可在程序員編寫代碼時提供建議,甚至直接補齊代碼。
目前Copilot預(yù)覽版已經(jīng)正式上線Visual Studio Code平臺。雖然Copilot AI碼自動生成器仍在逐漸完善當(dāng)中,但它的出現(xiàn)卻提供了一個關(guān)于大型自然語言處理模型的發(fā)展思路,也讓我們程序員群體和對于自身未來是否會被AI取代的問題,產(chǎn)生深深的思考。
初識OpenAI的GPT-3
在2019年DOTA2的頂級賽事TI8的正賽完成之后,OpenAI的人工智能戰(zhàn)隊與TI8的冠軍OG舉行了一場表演賽,在英雄陣容限定17個,部分道具和功能禁用的前提下,OpenAI以2:0完勝了OG,尤其值得一提的是第二場比賽僅用時15分鐘OpenAI就把OG斬落馬下,這一系列的精彩表現(xiàn)也讓OpenAI在業(yè)界抱得大名。
后來OpenAI開始轉(zhuǎn)戰(zhàn)自然語言處理領(lǐng)域,他們第一個引發(fā)廣泛關(guān)注的模型是GPT-2。2019年底著名魔幻電視劇集《權(quán)利的游戲》的最后一季上演了史詩級的爛尾,不過網(wǎng)友用GPT-2來重寫劇本而得到的新結(jié)局,卻意外得到了全網(wǎng)的普遍好評,這也讓GPT-2順利出圈。
去年的六月初,OpenAI發(fā)布了全新一代的NLP模型——GPT-3(論文地址:https://arxiv.org/abs/2005.14165),這個模型的效果之好已經(jīng)到了令人嘆為觀止的程度,在筆者的印象中GPT-3一直在GitHub的趨勢榜的榜首位置上,且一直霸榜了兩個月(https://github.com/openai/gpt-3),一時之間各類GPT-3的神奇應(yīng)用層出不窮。GPT-3的出現(xiàn)再次證明了AI領(lǐng)域大力出奇跡的現(xiàn)象,這個模型的數(shù)據(jù)集達到了45TB,參數(shù)個數(shù)1750億,訓(xùn)練成本接近500萬美元。
與之前NLP領(lǐng)域的王者BERT模型不同,GPT-3雖然博采眾長,但從本質(zhì)上講GPT-3還是個自回歸模型,通俗的理解自回歸就是使用自身做回歸變量的過程。比如在見到一個時間序列“我愛北京天安門”,那自回歸模型要完成的任務(wù)就是收到“我愛北京天”這段輸入時,將后面的內(nèi)容補齊。
假設(shè)我們天、安、門三段日志分別對應(yīng)X_1、X_2、X_3,那么如果我們要建?!疤彀查T”這段主義序列時,就要通過貝葉斯公式解出,在在所有語料信息中,“天安門”這個序列出現(xiàn)的聯(lián)合概率分布 P(X_1,X_2,X_3)。由于這些概率分布彼此之間并不獨立的,我們僅統(tǒng)計P(X_1)、P(X_2)、P(X_3)三個概率是不夠的。因為X_1還依賴于其它變量存在條件分布 P(X_2|X_1) 和 P(X_3|X_1)。對于X_2和X_3也是一樣,我們可以將這三個模型組合起來獲得期望聯(lián)合分布 P(X_1,X_2,X_3)=P(X_1)P(X_2|X_1)P(X_3|X_1,X_2)。在自回歸模型中都考慮了順序信息,也就是說他看到“天安”之后極有可能續(xù)寫出后面的“門”來,這樣的條件概率算法是自回歸模型的基礎(chǔ)。也就是說GPT-3,一旦看到“天安”這個輸入之后,就能判斷出后面是“門”字的概率大幅度增加,因此從原理上看GPT-3的確更適合做文本的生成與續(xù)寫工作。
誤打誤撞,Copilot成GPT-3的首個商業(yè)應(yīng)用
在去年GPT-3最火的階段,代碼補全這個應(yīng)用雖然也被業(yè)界關(guān)注,但其熱度根本不夠看,當(dāng)時像對話機器人、自動診斷、自動作詩、自動作曲的應(yīng)用才是比較吸引眼球的,即使是在編程方面,代碼補全的應(yīng)用也沒有到大放異彩的程度,早在去年7月上線的那個能根據(jù)需求直接生成前端代碼的debuid.co,都曾經(jīng)被認(rèn)為是AI編程的未來趨勢。
不過GPT-3的知識儲備雖然豐富,但本質(zhì)上卻還是對以往代碼的模仿,很難有創(chuàng)造性的靈動表現(xiàn),在很多情況下GPT-3無法獨立完成創(chuàng)作。因此與人類程序員配合,由人類程序員完成功能模塊的一部分,再由AI幫助續(xù)寫剩余代碼,似乎成為了一個相當(dāng)合理的選擇,在這樣的背景下Copilot就應(yīng)運而生了。
Copilot使用的Codex深度學(xué)習(xí)模型,就是基于GPT-3的編程任務(wù)微調(diào)版本,它以部分完成的代碼及注釋作為輸入,輸出完整的代碼建議。Copilot的官方網(wǎng)站(https://t.co/eWPueAXTFt?)將其描述為“程序員結(jié)對編程實踐中的AI對手”,筆者看到不少參加初測的網(wǎng)友都提到,很多時候提供函數(shù)簽名,Copilot就可以完成整個函數(shù)的代碼編寫了,有時甚至只需要一個簡單的注釋描述,Copilot就能把整個功能模塊全寫出來。
神經(jīng)網(wǎng)絡(luò)非常擅長從大型訓(xùn)練數(shù)據(jù)集中得到有效的發(fā)現(xiàn)與建議,從這個角度來看,使用GPT-3的微調(diào)版本,幫助程序員在GitHub的源代碼庫尋找解決方案的做法,有著非常大的意義。
前途雖光明,但道路依舊曲折
根據(jù)GitHub官方說法來看,如果Copilot技術(shù)預(yù)覽成功,Copilot的商業(yè)版本也將很快問世。我們知道目前程序員的時薪很高,一般從10美元到150美元之間,只要能節(jié)省幾個小時的編程時間或稍稍提高一些開發(fā)速度,就能產(chǎn)生不低的效益。尤其是對于一些有著豐富經(jīng)驗的程序員來說,Copilot意味著更加容易的跨界,在它的加持下Rust將不會那么勸退,C++也不會再那么令人愛恨交加。而且Copilot需要定期更新和微調(diào),這對于GitHub這樣的開源公司來說還會帶來持續(xù)性的收入,AI編碼未來很可能會成為一個價值數(shù)十億美元的產(chǎn)業(yè),不過光明的前途不意味著Copilot的發(fā)展將一帆風(fēng)順,從目前情況來看,其主要問題有以下幾點:
不分許可證的引用代碼是否涉嫌侵權(quán)?正如前文所說GPT-3能夠成功依靠就是海量的訓(xùn)練集,根據(jù)Copilot的主頁顯示,Codex的訓(xùn)練代碼由公開來源的英語注釋及源代碼而來,這其中包括 了GitHub上公共存儲庫中的源代碼及注釋,而有跡象表明Codex用于訓(xùn)練的代碼,并沒有按照不同的開源許可證進行區(qū)分對待。
我們知道Copilot未來肯定要有商業(yè)版本推出,那么問題就來了,如果Copilot將那些已經(jīng)明確不允許用于商業(yè)用途的代碼,通通拿來進行AI訓(xùn)練的話,這種做法是否涉嫌侵權(quán)?針對這個問題網(wǎng)上已經(jīng)有很多不同的聲音了,筆者認(rèn)為如果AI最終給出的建議代碼與原先訓(xùn)練集中的代碼一模一樣的話,那么這種情況肯定會涉嫌侵權(quán),但建議代碼與原訓(xùn)練代碼的相似度如何判斷才是關(guān)鍵所在,當(dāng)然截止目前這還依舊是個開放性問題,業(yè)界尚未形成共識。
無效建議拖慢開發(fā)效率:根據(jù)GitHub給出的官方說法Copilot試圖理解程序員的意圖,并盡可能生成最好的代碼,但它建議的代碼可能并不總是有效,甚至沒有意義。也有不少程序員親測后反饋說,如果想提高Copilot建議的正確率,你就必須按照其他程序員那樣,使用一個大眾化的代碼風(fēng)格以及變量名、函數(shù)名的命名規(guī)范,如果你的代碼規(guī)范和變量命名都特別有個性,那么你得到的建議很可能會是沒有意義的代碼。
歸根結(jié)底Copilot等模型根本就不理解源代碼的目的和結(jié)構(gòu),更不了解程序運行的目的,他能做的就是高度模仿之前大量存在過的類似代碼,因此他給出的結(jié)果很可能是沒有意義的,如果這些無效建議的比例過高,會使程序員的編程思路混亂,甚至拖慢開發(fā)的節(jié)奏。
引用老舊類庫,增加安全風(fēng)險:筆者注意到GitHub還警告說,Copilot可能會建議舊的或者不推薦使用的類庫和代碼,這可能會導(dǎo)致安全問題。正如前文所言,Copilot本質(zhì)上是對歷史上全部代碼的學(xué)習(xí)與模仿,但是從實操來講,你又很難對如此大量的代碼進行有效標(biāo)注,因此即便Copilot的建議即使有效而且能夠正常運行,也不能代表這些代碼沒有安全漏洞,這樣的特性就使得開發(fā)人員完全審查AI生成的代碼變得非常重要。
可以說AI自動化編碼工具的發(fā)展還遠(yuǎn)遠(yuǎn)沒有達到我們的期望,程序員在使用Copilot時必須時刻小心翼翼,你不能把Copilot這樣的AI自動生成工具當(dāng)成不會出錯的編程機器。如果由于工期緊迫,而完全依賴Copilot提供代碼,不去進行安全審核的話,那么Copilot帶來的風(fēng)險很可能比產(chǎn)生的效益還大。
不過無論如何Copilot前途還是非常光明的,從歷史經(jīng)驗來看,新的編程工具必然帶來新的編程風(fēng)險。我們必須仔細(xì)跟AI自動編程這個新領(lǐng)域的發(fā)展趨勢,才能做到不落后于趨勢,也不引入風(fēng)險。
馬超,CSDN博客專家,阿里云MVP、華為云MVP,華為2020年技術(shù)社區(qū)開發(fā)者之星。