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