天天看點

AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

本周 GitHub 釋出的 AI 代碼合成器 GitHub Copilot,是科技界備受關注的話題。傳統 IDE 通常使用搜尋引擎的方法補全代碼,而這個代碼神器 Copilot,據說提出的絕大多數代碼建議都是全新生成的。

Copilot 釋出後,許多網友驚呼代碼補全效果「令人震驚」,給出極高的評價。但沒過幾天,一些試用者就發現了新的問題:Copilot 使用的開源代碼資料集可能侵權。原本隻是猜測,而就在十幾個小時前,有網友曝出了 Copilot 複制粘貼代碼的實錘,似乎在一張幾十秒的動圖裡把 Copilot 的「原生」形象推翻了。

AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

「我啥也不說了,但 Copilot,這可不太行。」發現 AI 照抄代碼的程式員 Armin Ronacher 來自奧地利。

Copilot 原樣複制了經典射擊遊戲《雷神之錘》裡的代碼,而且還帶着吐槽注釋,比如「What the f**k」……

被複制的代碼:

https://github.com/id-Software/Quake-III-Arena/blob/dbe4ddb10315479fc00086f08e25d968b4b43c49/code/game/q_math.c#L552
AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯
AI 生成的代碼:
AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

有網友評論道,GitHub 的 Copilot 很快就走上了當年微軟 AI 聊天機器人 Tay 的老路(GitHub 在 2018 年被微軟收購了)。

看起來事情并沒有 GitHub 原先所說的那麼簡單。

AI 敲代碼,一把雙刃劍

作為微軟、OpenAI、GitHub 三家聯合打造的代碼生成工具,GitHub Copilot 由 OpenAI 開發的全新 AI 系統 OpenAI Codex 提供支援,并在數十億行公共代碼上經過了訓練。它的主要功能包括補全函數代碼、根據注釋生成代碼等,暫僅支援 Python、JavaScript、TypeScript、Ruby 和 Go 語言。

目前 Copilot 釋出的還是技術預覽版,使用者可以在首頁注冊報名,将有機會通路使用。

AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

GitHub Copilot 注冊位址:

https://github.com/features/copilot/signup

OpenAI Codex 在人們如何使用代碼方面擁有廣泛的知識,并且在代碼生成領域顯著優于 GPT-3,這得益于 Codex 的訓練集中包含提取自 GitHub 的 TB(terabyte)級公開可用代碼以及英語語言示例。

但自釋出以來,關于 Copilot 的代碼訓練集的版權問題就一直存在争議,加之 Copilot 基于的算法模型 Codex 目前公開的資訊不多,一時間「Copilot 是否涉及侵權」成為人們讨論的焦點。

有人開始思考,既然 GitHub 是一家微軟旗下公司,OpenAI 也從微軟那裡拿了 10 億巨額投資。那麼,Copilot 是使用微軟内部源代碼訓練的嗎?或者未來将會如此?它會不會偶爾吐出一些 Windows 核心代碼?

試想,等到 Copilot 添加了對 C++ 的支援,然後有人就會使用其編寫具備 Win32 相容 API 的作業系統,鑒于 GitHub 平台上有大量洩露的 Windows 源代碼,是以 Copilot 肯定在這個過程生成很多代碼。最終,微軟是否會認為使用他們的 AI 生成的代碼侵犯了他們的版權?

減負還是添堵?

類似的擔心廣泛存在,如果 Copilot 生成的代碼是「複制」自其他項目的代碼,那麼使用它的開發者也無法得知自己編寫的代碼段落是否受版權保護。這就像一個定時炸彈。

假如開發者未能及時發現代碼中的問題,最終惹來麻煩,似乎責任也應該由 Copilot 承擔?因為代碼是其衍生品。更糟糕的是,作為使用者,我們即使想要去遵守什麼代碼使用許可,似乎也無從切入。

至于被「複制粘貼」的那段代碼,有人發現這段是最初的 GPL 許可版本中的,也包含在維基百科的詞條内容中,是以或許不構成侵權。

AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

這段著名的原始函數也有一段來曆:《雷神之錘 3》是 20 世紀 90 年代的經典遊戲。該系列不但畫面和内容(在當時)屬于上乘,更難能可貴的是即使你的計算機配置較低,也能流暢地運作。這要歸功于它 3D 引擎的開發者 John Carmack。

這款遊戲 3D 引擎中的數學運算經曆了精心的編寫,在 game/code/q_math.c 中,上述這段代碼的作用是将一個數開平方并取倒,經測試這段代碼比用系統自帶 sqrt 函數求倒 (float)(1.0/sqrt(x)) 快 4 倍。

其中神秘的數字 0x5f3759df 作用很大,但很少有人能夠說清楚它的來由,這類無法了解但卻有效的神奇數字經常被稱為 magic number。從「WTF」的注釋上來看,當初審閱的程式員恐怕也沒有弄明白。

後來還有一篇論文解釋了這個常數:

http://www.matrix67.com/data/InvSqrt.pdf

雖然 Quake 3 的開平方根算法已被遊戲公司公開了,但我們保不齊 AI 還會借鑒哪些代碼。

有人說:「我看不到這個工具的意義,生成有效代碼從來不是人類開發者的瓶頸,沒有一個項目是因為代碼輸入速度不夠快而失敗的。真正的瓶頸在于了解代碼如何工作、如何正确設計、如何根據現有設計進行更改、如何對現有代碼進行故障排除等。這個工具不會讓任何事情變得更容易,而且讓事情變得更難了,因為現在你運作的軟體不是由任何人編寫的,沒有人完全了解它。」

AI自動生成的代碼還自帶原來的「WTF」注釋?程式員:我笑了,抄的太明顯

當然,寫代碼的速度确實不算瓶頸,不過有一個減少重複編寫代碼的工具總歸是好事。但對于企業開發者來說,釋出代碼之前的檢查代碼工作,可能要略微繁重了。

編寫代碼自動化一直是人們期望達成的目标,也是 AI 領域努力實作的方向。但相比于其他自動化任務,代碼的自動化在實作難度和版權劃分上都更加繁瑣複雜。

Copilot 無疑給代碼自動生成帶來了新的希望,但完全實作自動化程式設計還有很長的路要走。

參考内容:

https://twitter.com/mitsuhiko/status/1410886329924194309 https://news.ycombinator.com/item?id=27710287