我對 OpenAI 的 Codex 進行了Beta 測試,結果出乎意料
CSDN · 程式 ·

我對 OpenAI 的 Codex 進行了Beta 測試,結果出乎意料

作者 | Thomas Smith

譯者 | 彎月 責編 | 王曉曼

出品 | CSDN(ID:CSDNnews)

Codex 是 OpenAI 推出的新的深度學習驅動平台,可自動編寫能夠正常工作的軟體代碼。該系統以大量公開代碼作為語料庫進行了訓練。該系統原本是 GitHub Copilot 上的一個功能,可幫助程式設計師自動改進或更新軟體。

PT-3。去年我測試了GPT-3,感覺自己見證了一場技術革命。該系統可

Codex的基礎是大獲成功的 GPT-3。去年我測試了 GPT-3,感覺自己見證了一場技術革命。該系統可以生成所有內容,從完整的博客文章到歌曲、食譜,甚至是船夫號子。許多 GPT-3 測試人員也指出,該系統能夠使用 Python 和 JavaScript 等語言編寫代碼。

OpenAI開發了新版的 GPT-3,該版本經過了專門的代碼訓練,而且優化了代碼的生成。這個新版的 GPT-3 就是 Codex。該系統推出大約一周後,我應邀進行了 Beta 測試。顯然 Codex 是進化版的 GPT-3,結果非常出人意料。在本文中,我將分享 Codex 測試過程中的想法和發現。

首先,我利用 Hacker Rank 上的 Python 編程考題來測試 Codex。這些考題的目標是幫助程式設計師準備工作面試。其中有一些是很簡單的編程題目,很多Python 入門級課程中都有這樣的題目,而且在申請某些公司的程式設計師職位時,可能也會遇到這樣的考題。

在遇到簡單的問題時,Codex 能夠給出非常簡潔的答案,比如拆分和連接字符串等。我輸入的問題如下:

#Python 2.7#You are given a string. Split the string on a 」 」 (space)delimiter and join using a — hyphen. 

然後,它輸出了一個 Python 函數,我將這個函數複製到了 Aptana Python IDE。我只對Codex的輸出做了一處修改,將 input 修改成了 raw_input。

動改進或更新軟體。Codex的基礎是大獲成功的G

這個函數能接受一個字符串,並用空格分割,然後用橫線連接起來。比如,輸入「This is a test,」,能給出輸出「This-is-a-test.」。Codex 自動生成的代碼通過了 HackerRank 的測試。

上面僅僅是一個非常基礎的例子。但 Codex 也能夠成功地解決 HackerRank 上更複雜的問題,比如編寫兩個正則表達式來驗證郵政編碼的問題,這個問題被 HackerRank 歸類為「高級問題」(對於人類程式設計師來說)。對於該問題,我只是把 HackerRank 上的問題描述直接輸入到了 Codex,讓它自己解決。只用了幾秒鐘,就輸出了兩個正則表達式。(面向非程式設計師的說明:正則表達式是一種模式匹配工具,只有編程大牛才能寫好)。

我將這兩個正則表達式粘貼到了 HackerRank,然後該網站確認結果非常正確。這個答案我自己都需要一個多小時才能寫出來,而 Codex 只花了兩秒鐘,這就非常可怕了。

[影片:https://youtu.be/grmaclSVdMM]

我的 YouTube 頻道上的一位粉絲問到,針對這些簡單問題,Codex 是自己編寫的答案,還是從訓練數據中找到的已有答案?平心而論,這的確可能是 Codex 解決簡單問題時的策略:程式設計師也經常從開原始碼中拷貝整個函數,所以當問題足夠簡單時,從已有的公開代碼中找到解決方案是可能的。Codex 也可能做了同樣的處理。

不管 Codex 採用了何種方法,它的確能夠解決描述清晰的編程問題。對於入門級別的編程職位面試,或者是計算機基礎課程的考試,它很可能可以輕鬆地通過。考慮到它得到的只有純文本的輸入,所以這個結果就很了不起。

但是我想知道 Codex 在真實世界中的表現如何。如果不是訓練數據中出現過的問題,而是我臨時杜撰的問題,它能否很好地解決?真實業務環境中的許多編程任務都需要訪問並處理數據,而不僅是簡單的數值驗證或字符串變換等。

根據 OpenAPI 的說法,Codex 能訪問許多API,並進行許多數據變換。我決定通過解決實際問題來測試一下這一點。這個問題在加州非常接地氣:根據郵編獲取空氣品質指數(Air Quality Index),判斷是否存在山火。

我給 Codex 提供了以下描述:

#Python 2.7#Use the airnow API to to find and print the current AQI for zip code 94549

它返回的代碼如下:

import urllib2import jsonapi_key = "E722A2CA-9D39–4CDD-943B-8BAD9A298E0B"url ="http://www.airnowapi.org/aq/observation/zipCode/current/?format=application/json&zipCode=94549&distance=25&API_KEY="+ api_keyrequest = urllib2.Request(url)response = urllib2.urlopen(request)data = json.load(response)print data[0]['AQI']

非常優秀。它根據我的文本描述中提到的 Airnow API,找出了 API 的 URL,並提供了必要的參數,以獲得輸出。它還正確地判斷出了 AQI 的含義,並編寫了一個 URL 字符串,接受郵編 94595 作為輸入,查找該郵編的當前情況,並返回 AQI。

為了讓輸出的代碼能在 Python 中運行,Codex 將其包裹在了一些基本的 Python 操作中,進行 URL 訪問、格式化 Airnow API 返回的 JSON 響應等。只有一個問題:Codex 生成的用於登錄 API 的APIkey 完全是杜撰的。

我在 GPT-3 中也遇到了這個問題。系統會捏造事實和引用,或者引用完全不存在的科技文獻。在GPT-3中,這些有關事實的問題很難發現,因為它們看起來都相當真實,並且非常自然地混在了系統的輸出中。至少在代碼中,我們可以很容易地判斷輸出是否正確:它是否能編譯並運行?在我的例子中,我運行了代碼,得到了 Airnow API 返回的認證錯誤。為了修復這個問題,我輸入了真正的認證令牌。再次運行,Codex 的代碼就能完美地執行,並輸出了郵編對應的 AQI。

Codex 不僅能編寫伺服器端代碼,還能編寫基於 Web 語言的代碼,如 JavaScript,甚至還能做基本的 Web 設計。為了測試這個功能,我啟動了一個 OpenAI 為 beta 測試者提供的特殊的 JavaScript 練習網站。然後我提供了一些描述,指示 Codex 獲取當前的比特幣價格,然後格式化輸出。

Get the current price of Bitcoin using Coindesk’sAPI and display it as giant red letters in the middle of a webpage

Codex生成了如下 JavaScript 代碼:

統原本是GitHubCopilot上的一個功能,可幫助程式設計師自

然後它還生成了一個簡單的網站,精確地實現了我要求的功能:

寫能夠正常工作的軟體代碼。該系統以大量公開代碼作為語料庫進行了訓練。該系

當然, 這個例子非常簡單,但 OpenAI 的一個影片(https://www.youtube.com/watch?v=Zm9B-DvwOgw&t=248s)演示了 Codex 的 Web 開發可以解決更為複雜的問題。在該影片中,OpenAI 使用 Codex 創建了一個完全能夠正常工作的以宇宙飛船和天體為主題的 JavaScript 遊戲,而輸入僅僅是有關每個遊戲功能的描述,Codex 負責編寫代碼。

除了編寫新代碼之外,Codex 還能描述已有的代碼。為了測試該功能,我給它提供了一段我們公司的 Python代碼,這段代碼的功能是從指定的 URL 下載文件。我要求Codex 解釋這段代碼的功能,它表示,「這段代碼從指定的URL 下載文件,並保存到指定的路徑中。」這是完全正確的描述。

用自然語言解釋的能力可能來自 Codex 的母平台 GPT-3。不難想像,這種能力對於程式設計師來說非常重要。設想你需要更新一個舊的開原始碼,而該開原始碼沒有任何文檔。只需要將每個函數粘貼到 Codex 中,系統就能找出代碼的作用,並用自然語言描述給你。

《連線》的文章(https://www.wired.com/story/plaintext-open-ai-codex/)指出,這個功能對於學習編程的人也非常有用。他們可以將不明白的函數粘貼到 Codex 中,然後快速得到其工作原理。甚至可以想像,Codex 可以自動為公司或開源項目的已有代碼編寫文檔。許多程式設計師討厭寫文檔,因此世界上絕大部分代碼都沒有文檔。因此代碼很難更新和維護,新手更難以加入項目並理解代碼的工作原理。Codex 可以自動地填補這些文檔的空白。

在我的測試中,Codex 能很好地完成其他枯燥但重要的編碼工作。我給 Codex 提供了一段 Python 代碼,要求它翻譯成 JavaScript。它完成得很好,生成的 JavaScript 沒有出現問題。維護舊代碼的代價可能非常高。各個公司可以使用Codex,將用某種舊語言編寫的代碼自動更新為現代語言,從而節省巨額的維護成本。

更新舊代碼也能給社會帶來巨大的好處。在疫情開始時,美國加州就業發展部在發放失業救濟金時遇到了很大困難,因為他們使用的還是上世紀八十年代的舊系統。自動更新舊代碼可以讓政府的運作更順暢,從而為納稅人省錢,還能讓關鍵系統更安全。開源項目也可以使用 Codex 進行增量更新,例如將代碼從 Python 2.7 移植到 Python 3。

既然 Codex 如此出色,程式設計師們是否應該擔心自己的飯碗不保?大可不必。儘管 Codex 非常強大,但並不完美。根據 OpenAI 的說法,當前版本的 Codex 第一次就能編寫完美代碼的可能性只有 37%。要讓該系統真正起作用,依然需要人類程式設計師去審查代碼,評測其輸出是否正常工作,並進行 Codex 做不到的微調和更新。

我的第一個例子就展示了這一點。input 在我的 IDE 中無法正常工作,所以 Codex 的字符串轉換代碼無法正常工作。根據我所學的 Python 知識,我在看到錯誤消息時能立即想到,raw_input 會更好。這個修改非常簡單,但非常重要。但是,非程式設計師可能永遠不會想到這個修改。Codex 的輸出非常優秀,但一旦犯了小錯誤,就需要有經驗的人類找出問題所在。

即使不考慮修復小錯誤的情況,Codex 也無法完全取代人類程式設計師。編寫代碼只是編程工作中的一小部分,程式設計師最重要的工作是理解問題,並將其轉換成計算機能理解的格式。就像 OpenAI 自己說的那樣:「一旦程式設計師知道如何構建,那麼編寫代碼的問題就可以看做 (1) 將問題分解成更簡單的問題,(2) 將簡單問題映射成已知的代碼上。」

Codex可以完成後者,但前者依然是人類占據主導地位。定義問題、歸約到最基本的組成部分,再將這些組成部分翻譯成指令,這些工作占據了經驗豐富的程式設計師的大部分時間。照搬網上的菜譜並不能讓你成為米其林大廚,編寫漂亮的 Python 代碼也不能讓你成為程式設計師。除非 Codex 能與客戶坐在一起,理解需求,並找出技術解決方案,分解成小塊,然後給每一塊找出清晰的計劃,否則就不可能取代人類程式設計師。

但是 Codex 能做到的一點是,讓程式設計師的工作更輕鬆。要求一個有經驗的程式設計師花費幾個星期甚至幾個月的時間將公司的代碼從一種語言翻譯成另一種語言,不僅是在浪費他們的才華,也是在浪費公司的金錢。將這些令人發瘋的重擔從程式設計師的肩上移到 Codex 身上,就能將他們解放出來,讓他們專注於價值更高的工作,比如為業務問題找出技術解決方案。Codex 還可以為開源社區做貢獻,可以讓一個人花一個周末就能重構整個代碼,或者只需要幾個小時就能將新點子變成可以正常工作的代碼庫。

目前來看,Codex 依然不完美,依然需要人類的指導,其輸出結果經常無法使用。但是,隨著時間一天天過去,Codex 接受更多的訓練,情況就會發生變化。由於編程需要的遠不止寫代碼,我認為Codex 永遠不會取代人類程式設計師。但是很快,它就能極大地增強程式設計師的工作能力,讓程式設計師變得更有效率、更有能力、更強大。

參考連結:

https://betterprogramming.pub/i-beta-tested-openais-codex-and-the-results-are-spooky-good-e282a1874c79

Codex是OpenAI推出的新的深度學習驅動平台,可自動編
編|王曉曼出品|CSDN(ID:CSDNnews)
作者|ThomasSmith譯者|彎月責
聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯
繼續其他精彩內容吧!
more