Codex程式產生器開箱 編程好幫手但還不實用

非營利人工智慧研究機構OpenAI推出的GPT-3自然語言轉換器在科技界掀起波瀾,由於GPT-3也曾針對電腦程式碼做訓練,因此OpenAI也釋出專為協助程式設計師的特殊引擎版本Codex,本文將測試這樣的程式碼產生功能到底能夠發揮到多少實用性。

非營利人工智慧研究機構OpenAI推出的GPT-3自然語言轉換器在科技界掀起波瀾。

由於GPT-3也曾針對電腦程式碼做訓練,因此OpenAI也釋出專為協助程式設計師的特殊引擎版本Codex,在網管人198期「人工智慧Codex幫寫程式 程式員想用駭客也想用」一文中已經詳細探討Codex的功能對犯罪集團未來的日常生活將有何影響、程式開發人員及一般使用者該提防哪些事情,以及這些功能未來將如何演變。本文是該系列文章的第二篇,將測試這樣的程式碼產生功能到底能夠發揮到多少實用性。

Codex是以第三版的Generative Pre-trained Transformer(GPT-3)為基礎,因此已先經過網際網路上的大量程式碼訓練完成,且涵蓋了幾乎每一種目前可取得的程式設計語言。不過,自然語言和程式設計語言在特性上並不相同。一般來說,自然語言在傳達人類想法時的彈性較大,而程式設計語言則結構較為固定、規則較為嚴謹,且完全視程式語言的解譯器和組譯器而定。

在高階程式設計語言方面,很自然地會認為針對自然語言處理而設計的GPT-3統計模型應該也可以用來產生高階程式設計語言的程式碼。然而,Codex缺乏真正「理解」程式語言的必要元素,例如有關語法的結構或是電腦的架構。 那麼,這樣的程式碼產生功能到底能發揮到多少實用性呢?

模仿遊戲:Codex理解低階程式碼的能力

為了評量Codex對其所產生的程式碼到底有多深的理解,我們測試了它對組合語言的理解能力。刻意挑選與自然語言最不像、但卻最貼近機器的組合語言。先試著提供一段組合語言程式碼範例給Codex(圖1),然後看看它能不能用一般語言來解釋這段程式碼。 當提供一段用x86組合語言撰寫的典型「Hello, World!」程式碼然後要求Codex解釋這段程式碼時,得到了一份詳細的程式碼解說,包括個別暫存器的用途,甚至還包括如何組譯這段程式碼的指示。

圖1  要求Codex解釋用組合語言語言撰寫的「Hello, World!」程式。

不過,Codex看來似乎並非是在真正了解程式碼的運作之後才產生出這些說明,而是從某個討論「Hello, World!」組合語言教學範例中擷取出這些內容。為了驗證這點,稍微修改了一下程式碼,例如將「Hello, World!」這串字拿掉,讓它看起來像是一般的組合語言程式碼(只是不再運作),如圖2所示。

圖2  要求Codex解釋修改過的「Hello, World!」組合語言程式範例。

同樣地,得到的程式碼「說明」還是取自「Hello, World!」程式的組合語言教學範例,即便所提供的程式碼已經不算是真正的「Hello, World!」程式。

Codex在這範例中證明了它不具備理解程式碼的能力,它只是經過了某些複雜的「特徵比對」運算之後產生出最像我們所要的程式碼。Codex並非真的理解程式碼在做什麼,因為它的模型並無任何運算架構方面的資訊。它只是「模仿」得像是具備程式設計的能力,從訓練好的模型中找到最接近使用者要求的內容。

為了再次驗證這點,我們又修改了一下程式碼。這次,把其中一個暫存器的值從1改成100,且不要求Codex解釋程式碼的運作,而是要求它將程式碼翻譯成另一種較不常見的程式設計語言,如圖3所示。

圖3  要求Codex翻譯「Hello, World!」組合語言程式範例。

Codex又再次引用「Hello, World!」的範例,因為在它的經驗中,這是最接近我們要求的程式碼。

雖然Codex對於一些較鮮為人知的程式語言也有相當的涉略,但仍未發展到可以對電腦運算知識有深入理解的程度。

二進位內容元解析

然而,這並不表示Codex完全沒用。Codex很明顯地可以當成一種彈性的特徵比對工具,足以應付所有程式碼相關的工作,這一點可以好好加以善用,即便是較低階的應用。

在以下範例當中,將示範Codex確實有能力解析和辨認二進位格式的程式碼,只要是寫成十六進位數字形式即可,甚至可以判斷某段二進位程式碼是來自哪一個函式庫,如圖4所示。

圖4  Codex解析和辨認以十六進位數字表示的二進位程式碼。

結論是,當討論Codex對於程式碼的理解與撰寫能力時,很重要的一點是抱持正確的期待。雖然一套強大精密的特徵比對系統在撰寫一些通用、重複、浪費時間的標準程式碼時,會是一個不錯的輔助工具,並可提供足夠的彈性來針對個別情況加以調整,但這跟一套靜態程式碼分析器的能力還差得很遠,不過相信這在不久的將來應該還是有機會實現。

資料解析器

Codex所缺乏的,還不光只是底層運算架構的重要知識而已,但這已嚴重限縮它程式產生能力的應用範疇。Codex還缺乏資料結構方面的知識,這使得它很難用來解析或處理某種特定或特殊結構的輸入資料。

在以下範例,將要求Codex產生一個網站爬蟲程式來連上某個網站,並且列出一份有關該網頁的項目清單,然後用電子郵件發送這份清單(圖5)。

圖5  要求Codex撰寫一個針對某個網站的爬蟲程式。

Codex完全依照我們在註解中提供的詳細指示產生了對應的程式碼:它匯入了正確的函式庫、連線至指定的網站,還自己為通知郵件設定了主旨,並且正確地撰寫了連線到某個電子郵件伺服器的程式碼。不過,當深入查看Codex如何從網頁上擷取出正確的資訊時,會發現Codex竟然是在目標網頁上隨意挑一個位置開始尋找資訊。

這不僅是因為它並非真正理解程式碼,而且它也不知道目標網頁的「結構」,但這卻是成功找到所需資訊的必要能力之一。

結語

Codex仍然是一個絕佳的程式設計「支援」與開發人員輔助工具,尤其是針對一些重複性的程式碼,這要歸功於訓練它的龐大資料庫。 不過,本文已經證明,它距離完全理解程式設計語言的運算邏輯並且達到一個實用程度還很遙遠。此外,也證明它比較像是一個非常聰明的「複製∕貼上」工具。但是,這並不意味著能夠自行撰寫原創程式碼的語言轉換器仍是個遙遠的未來。

<本文作者:Trend Micro Research趨勢科技威脅研究中心本文出自趨勢科技資安部落格,是由趨勢科技資安威脅研究員、研發人員及資安專家全年無休協力合作,發掘消費者及商業經營所面臨層出不窮的資安威脅,進行研究分析、分享觀點並提出建議。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!