GitHub Copilot抄襲實錘!GitHub:我們的AI沒有「背誦」代碼

新智元報道
新智元報道
來源:GitHub
編輯:好困
【新智元導讀】微軟、OpenAI、GitHub聯(lián)合出品的自動代碼生成AI——Copilot,似乎在第二天就跌落了神壇。盡管深陷「復(fù)制-粘貼門」,GitHub發(fā)表了一篇調(diào)查稱:我們的AI并不「背誦」別人的代碼。
GitHub Copilot憑借著自動生成代碼這個強有力的噱頭,推出之后就成為了討論的焦點。
Copilot建立在OpenAI全新的Codex算法之上,其中Codex接受了從GitHub中提取的TB級公開代碼以及英語語言示例的訓練。
因此,GitHub聲稱Copilot可以做到分析文檔中的字符串、注釋、函數(shù)名稱以及代碼本身,從而生成新的匹配代碼,包括之前調(diào)用的特定函數(shù)。
同時,Copilot支持多種編程語言:Python、JavaScript、TypeScript、Ruby和Go。
發(fā)布之后就有人把Copilot拉去刷Leetcode的題庫,并對這位「AI程序員」的表現(xiàn)十分滿意。

經(jīng)過數(shù)個題目的驗證,Copilot每次都能通過Leetcode的測試。鑒于幾乎是實時的生成速度,博主表示,AI可能比我們更會編寫代碼。
不過網(wǎng)友懷疑Copilot已經(jīng)在LeetCode數(shù)據(jù)庫上進行過了訓練,因為生成的注釋和Leetcode給的模板幾乎一模一樣。
針對這點,GitHub表示,雖然可能有0.1%的直接引用,但是Copilot生成的代碼大部分都會是原創(chuàng)的。
「復(fù)制-粘貼」成實錘
「復(fù)制-粘貼」成實錘
在發(fā)布的第二天,就有網(wǎng)友質(zhì)疑GitHub Copilot是把免費開源的代碼清洗之后,搖身一變成了賺錢的工具。
而這些代碼本應(yīng)該受到GPL(通用公共許可證)的保護,從而防止它們被用在商業(yè)項目中。

不出所料,這個懷疑沒過兩天就變成了實錘,有網(wǎng)友發(fā)現(xiàn),Copilot直接「復(fù)制-粘貼」了最有名的「平方根倒數(shù)速算法」。

Copilot「生成」的這段代碼不僅用到了至今都沒有人能理解的magic number:0x5f3759df,同時還包含了對這段代碼的吐槽:what the f***?。

源代碼
這么看來,Copilot做的只是把訓練集中別人寫好的代碼重新組裝了一下而已。
我們的AI不「背誦」代碼
我們的AI不「背誦」代碼
不過GitHub方面似乎早就已經(jīng)做了應(yīng)對的準備,一位名叫Albert Ziegler的團隊成員表示,截止2021年5月7日,他把Copilot對于Python的453780條建議都進行了收集,其中這些數(shù)據(jù)來自于300名員工在日常工作中的使用。
Albert針對這個數(shù)據(jù)集進行了分析整理,并寫了一篇看似十分完備的博客進行討論。
在文章的一開始,Albert便讓GitHub Copilot背誦了一篇眾所周知的文章,顯然,Copilot已經(jīng)牢牢記住了文章的內(nèi)容。
不過Albert認為,記住訓練集的內(nèi)容不是什么問題,畢竟他自己也背誦過詩歌,而這并不會使他在日常的交流中被這些背誦的內(nèi)容帶跑偏。

案例分類
類別1:Copilot有時會在某個被采納的建議之后,由于程序員新編寫的注釋,又提出了一個非常相似的建議。
Albert認為第二次只不過是重復(fù)了之前「成功」的案例,因此把它們從問題分析中刪除了出去。
類別2:Copilot可能會提出長的、重復(fù)的序列。比如下面這個例子,其中重復(fù)的'<p>'最后在訓練集中被發(fā)現(xiàn)了。

類別3:Copilot給出比如自然數(shù)、素數(shù)、希臘字母表這種類似于標準清單的建議。有些建議可能是有幫助的,也可能是沒有幫助的。
不過Albert表示,這些并不符合他對「背誦」代碼的假設(shè)。

類別4:在做一些自由度很低的任務(wù)時,Copilot會給出的一些常見、或者普遍的解決方案。
例如,下面的中間部分可以算做是使用BeautifulSoup包來解析維基百科列表的標準方法。
Albert表示,在訓練數(shù)據(jù)中發(fā)現(xiàn)的最佳匹配片段就是使用這樣的代碼來解析不同文章的。同樣,這不符合他對「背誦」代碼的定義。

類別5:最后這些案例符合Albert對「背誦代碼」的設(shè)想,其中,這些代碼或注釋中至少有一些具體的重疊。
測試結(jié)果

對于GitHub Copilot的大部分建議,Albert表示并沒有發(fā)現(xiàn)與訓練用的代碼有任何明顯的重疊。在去掉第一個類別后,可以得到了185條建議。
在這些案例中,有144個被分到了第2-4個類別中。這就在最后一個類別5里留下了41個案例,作者表示,這就是他心目中的代碼 「背誦」。
GitHub Copilot在缺乏具體語境時的引語
在人工標注時挑出的41個主要案例中,沒有一個出現(xiàn)在少于10個不同的文件中。大多數(shù)(35個案例)出現(xiàn)超過一百次。
有一次,GitHub Copilot建議從一個空文件開始,它在訓練期間甚至看到了超過700,000次的東西--那就是GNU通用公共許可證。
下面的圖表顯示了第5個類別的結(jié)果(每個結(jié)果底部有一個紅色標記)與第2-4個類別中的匹配文件數(shù)量。

推斷出的分布圖顯示為一條紅線;它在100和1000個匹配之間達到峰值。
GitHub Copilot主要在一般情況下引證
隨著時間的推移,每個文件都變得獨一無二。但GitHub Copilot會將在你的文件非常通用時提供解決方案。
而此時,在沒有任何具體內(nèi)容的情況下,它更有可能從其他地方引用。

當然,軟件開發(fā)者大部分時間都在復(fù)雜的代碼中間,那里的上下文足夠獨特,GitHub Copilot會提供獨特的建議。
相比之下,一開始的建議就比較中規(guī)中矩,因為GitHub Copilot無法知道程序會是什么。
不過,在獨立的腳本中,適度的上下文就足以讓人合理地猜測出用戶想要做什么。
而有時,上下文仍然過于普遍,以至于Copilot認為它熟知的某個解決方案看起來很有希望。

上面這個例子就是直接取自被上傳的機器人課的課件。
結(jié)論
Albert認為,雖然GitHub Copilot可以逐字逐句地引用一組代碼,但它很少這樣做,而且當它這樣做時,多數(shù)也都是所有人都會引用的代碼,而且大部分是在文件的開頭。
Albert表示,理想狀態(tài)下,當一個建議包含從訓練集復(fù)制的片段時,用戶界面應(yīng)該簡單地告訴你它是從哪里引用的。然后,你可以包括適當?shù)氖鹈驔Q定不使用該代碼。而他的團隊也將努力去做到這一點。
網(wǎng)友評論
網(wǎng)友評論
雖然網(wǎng)友在看到GitHub團隊有在關(guān)心「復(fù)制粘貼」的問題之后表示了欣慰,然而,這篇「調(diào)查」顯然很難讓人信服。
「這會導致每一個愛好者都面臨風險,同時,把『這東西可能會生成GPL的代碼?』這種擔憂推到任何一個在企業(yè)中工作的人的面前。」
「你不能僅僅依據(jù) 『嗯,它們略有不同』,從而推斷出『所以它們不是真正的相同的東西』, 如果它實質(zhì)上是相似的,就需要被引用。」

對于Copilot來說,可能還有很長一段路要走。
參考資料:
https://docs.github.com/en/github/copilot/research-recitation#github-copilot-parrot-or-crow

