最新的代码生成研究表明,人工智能没那么强,它们缺乏人类的批判性思维,更多是鹦鹉学舌,文章来自编译。
程序员们用了几十年时间给人工智能模型编写代码,而现在,人工智能正被用来编写代码。但人工智能的代码生成器跟人类程序员的水平相比如何呢?
《IEEE 软件工程学报》今年 6 月刊就发表了一项研究,从功能性、复杂性与安全性等方面评估了 OpenAI 的 ChatGPT 所生成的代码。结果表明,ChatGPT 在生成功能性代码方面取得了极大的成功,成功率最低为 0.66% ,最高可达 89% ,具体要取决于任务的难度、编程语言等许多其他因素。
虽然在某些情况下,人工智能生成器生成的代码比人类写的还要好,但分析也揭示了人工智能生成的代码存在一些安全问题。
参与这项研究的格拉斯哥大学讲师 Yutian Tang 指出,基于人工智能的代码生成在提高生产力和自动化软件开发任务方面可以带来一些优势,但了解这些模型的优势和局限性也很重要。
为了更详细地探索这些局限性,他的团队测试了 GPT-3.5 用五种编程语言(C、C++、Java、JavaScript 和 Python)解决 LeetCode 测试平台上的 728 个编码问题的能力。
总体而言,ChatGPT 在解决不同编码语言的问题方面表现相当出色,在解决 2021 年之前 LeetCode 上存在的编码问题尤为出色。比方说,它能够针对简单、中等及困难级别的问题生成可执行代码,成功率分别约为 89%、71% 以及 40%。
Tang指出:“不过,在解决 2021 年以后的算法问题时,ChatGPT 生成功能正确的代码的能力会受到影响。它有时候会没法理解问题的含义,哪怕是简单级别的问题”。
比方说,ChatGPT 给2021 年之后的“简单”编码问题生成功能性代码的能力就从 89% 下降到 52%。而其为“困难”级别问题生成功能性代码的能力也从 40% 下降到 0.66%。
Tang说:“ChatGPT 能更好地解决2021 年之前的算法问题,其中一个合理假设是,这些问题在训练数据集里经常出现。”
从本质上来说,编码会不断发展演变,而ChatGPT 还接触不到新的问题与解决方案。它缺乏人类的那种批判性思维能力,只能解决以前遇到的问题。这可以解释为什么它在解决旧的编码问题方面比解决新的编码问题要好得多。
有趣的是,针对相同的LeetCode 问题,ChatGPT 生成的代码至少比 50% 的人类解决方案更高效,内存开销更小。
研究人员还探索了 ChatGPT 在收到 LeetCode 反馈后修复自身编码错误的能力。他们随机挑选了 50 个编码场景,都是ChatGPT 一开始要么因为不理解内容或手头的问题而生成了错误代码的情况。
虽然 ChatGPT 擅长修复编译错误,但往往不擅长纠正自身的错误。
Tang解释道:“ChatGPT 可能会生成错误代码,因为它不理解算法问题的含义,因此光是提供错误反馈信息是不够的”。
研究人员还发现,ChatGPT 生成的代码确实存在相当多的漏洞,比方说缺少空值测试,但其中的很多漏洞都很容易修复。他们的结果还显示,用 C 语言生成的代码最复杂,其次是 C++ 和 Python,其复杂度与人类编写的代码相似。
Tangs 表示,基于这些结果,用 ChatGPT 的开发者提供更多信息来帮助 ChatGPT 更好地了解问题或避免漏洞非常重要。
Tang说:“比方说,在遇到更复杂的编程问题时,开发者可以尽可能多地提供相关知识,并在提示中告诉 ChatGPT 要注意哪些潜在的漏洞”。