我的OpenAI Codex Beta测试:出乎意料的结果

发表时间: 2021-09-07 11:11


作者 | Thomas Smith
译者 | 弯月 责编 | 王晓曼
出品 | CSDN(ID:CSDNnews)
Codex 是 OpenAI 推出的新的深度学习驱动平台,可自动编写能够正常工作的软件代码。该系统以大量公开代码作为语料库进行了训练。该系统原本是 GitHub Copilot 上的一个功能,可帮助程序员自动改进或更新软件。

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()。


这个函数能接受一个字符串,并用空格分割,然后用横线连接起来。比如,输入“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 代码:

然后它还生成了一个简单的网站,精确地实现了我要求的功能:
当然, 这个例子非常简单,但 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