本周 GitHub 发布的 AI 代码合成器 GitHub Copilot,是科技界备受关注的话题。传统 IDE 通常使用搜索引擎的方法补全代码,而这个代码神器 Copilot,据说提出的绝大多数代码建议都是全新生成的。
Copilot 发布后,许多网友惊呼代码补全效果「令人震惊」,给出极高的评价。但没过几天,一些试用者就发现了新的问题:Copilot 使用的开源代码数据集可能侵权。原本只是猜测,而就在十几个小时前,有网友曝出了 Copilot 复制粘贴代码的实锤,似乎在一张几十秒的动图里把 Copilot 的「原生」形象推翻了。
「我啥也不说了,但 Copilot,这可不太行。」发现 AI 照抄代码的程序员 Armin Ronacher 来自奥地利。
Copilot 原样复制了经典射击游戏《雷神之锤》里的代码,而且还带着吐槽注释,比如「What the f**k」……
AI 生成的代码:
有网友评论道,GitHub 的 Copilot 很快就走上了当年微软 AI 聊天机器人 Tay 的老路(GitHub 在 2018 年被微软收购了)。
看起来事情并没有 GitHub 原先所说的那么简单。
AI 敲代码,一把双刃剑
作为微软、OpenAI、GitHub 三家联合打造的代码生成工具,GitHub Copilot 由 OpenAI 开发的全新 AI 系统 OpenAI Codex 提供支持,并在数十亿行公共代码上经过了训练。它的主要功能包括补全函数代码、根据注释生成代码等,暂仅支持 Python、JavaScript、TypeScript、Ruby 和 Go 语言。
目前 Copilot 发布的还是技术预览版,用户可以在主页注册报名,将有机会访问使用。
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 许可版本中的,也包含在维基百科的词条内容中,因此或许不构成侵权。
这段著名的原始函数也有一段来历:《雷神之锤 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 领域努力实现的方向。但相比于其他自动化任务,代码的自动化在实现难度和版权划分上都更加繁琐复杂。
Copilot 无疑给代码自动生成带来了新的希望,但完全实现自动化编程还有很长的路要走。
参考内容:
https://twitter.com/mitsuhiko/status/1410886329924194309https://news.ycombinator.com/item?id=27710287