最新的代码生成研究给出了一个有点扎心的结论:人工智能没那么强,它们缺乏人类的批判性思维,更多是鹦鹉学舌。这项研究发表在《IEEE 软件工程学报》今年6月刊上,下面我们来详细看看。

程序员们用了几十年时间编写代码来训练AI模型,现在风水轮流转,AI开始反过来帮程序员写代码了。但问题来了:AI的代码生成器跟人类程序员相比,水平到底怎么样?
《IEEE 软件工程学报》6月刊上发表的这项研究,从功能性、复杂性和安全性三个维度评估了OpenAI的ChatGPT生成的代码。结果有点意思:ChatGPT在生成功能性代码方面表现相当出色,成功率最低0.66%,最高能达到89%——具体取决于任务的难度、编程语言等多种因素。
在某些场景下,AI生成的代码甚至比人类写得还要好,但研究也揭示了AI代码存在一些安全隐患。参与该研究的格拉斯哥大学讲师Yutian Tang指出,基于AI的代码生成确实能提高生产力、自动化软件开发任务,但了解这些模型的优势和局限性同样重要。
为了更深入地探索这些局限性,Tang的团队用GPT-3.5测试了五种编程语言(C、C++、Ja va、Ja vaScript和Python)解决LeetCode平台上728个编码问题的能力。整体来看,ChatGPT的表现相当亮眼,尤其是在处理2021年之前存在的编码问题时。例如,对于简单、中等和困难级别的问题,它生成可执行代码的成功率分别约为89%、71%和40%。
不过,Tang补充道:“当面对2021年之后的算法问题时,ChatGPT生成功能正确代码的能力就明显下降了。它有时候根本理解不了问题的含义,哪怕只是简单级别的问题。”举个例子,ChatGPT为2021年之后的“简单”问题生成功能性代码的成功率,从89%暴跌到52%;而“困难”级别问题的成功率更是从40%掉到了0.66%。
Tang解释说:“一个合理的猜测是,2021年之前的算法问题在训练数据集里出现频率更高。”本质上,编码技术一直在演进,但ChatGPT接触不到新的问题和解决方案——它缺乏人类那种批判性思维能力,只会解决以前遇到过的问题。这就能解释为什么它处理旧问题比新问题强那么多。
有趣的是,针对相同的LeetCode问题,ChatGPT生成的代码在内存开销和运行效率上,至少比50%的人类解决方案更优。研究人员还测试了ChatGPT在收到LeetCode反馈后修复自身错误的能力——他们随机挑选了50个编码场景,都是ChatGPT一开始因为不理解内容或问题而生成错误代码的情况。结果发现,ChatGPT擅长修复编译错误,但往往不擅长纠正自己的语义错误。
Tang解释道:“ChatGPT可能根本不理解算法问题的含义,所以仅仅提供错误反馈是不够的。”此外,研究人员发现ChatGPT生成的代码确实存在不少漏洞,比如缺少空值测试——不过大多数漏洞很容易修复。结果还显示,用C语言生成的代码最复杂,其次是C++和Python,其复杂度与人类编写的代码相当。
基于这些结果,Tang表示,使用ChatGPT的开发者需要提供更多信息,帮助它更好地理解问题或避免漏洞。比如,面对更复杂的编程问题时,开发者可以尽可能多地提供相关知识,并在提示中告诉ChatGPT要注意哪些潜在的漏洞。
