ChatGPT 无法取代人类程序员: IEEE 35 页论文测出困难编码正确率仅为 0.66%

ChatGPT 无法取代人类程序员: IEEE 35 页论文测出困难编码正确率仅为 0.66%
2024年07月08日 16:46 IT之家

【新智元导读】6 月,IEEE 刊登了一篇对 ChatGPT 代码生成任务进行系统评估的论文,数据集就是程序员们最爱的 LeetCode 题库。研究揭示了 LLM 在代码任务中出现的潜在问题和能力局限,让我们能够对模型做出进一步改进,并逐渐了解使用 ChatGPT 写代码的最佳姿势。

有了 ChatGPT,还需要人类程序猿编码吗?

上个月,一项发表在 IEEE TSE 期刊(Transactions on Software Engineering)上的研究评估了 ChatGPT 所生成的代码在功能性、复杂性和安全性方面的表现。

结果显示,ChatGPT 生成可用代码的能力差异很大。

其成功率从 0.66% 到 89% 不等,这主要取决于任务的难度、编程语言等多种因素。

论文地址:https://ieeexplore.ieee.org/ document / 10507163

具体来说,研究人员测试了 GPT-3.5 在 5 种编程语言(C、C++、Java、JavaScript 和 Python)中,解决 LeetCode 测试平台上的 728 个编码问题,以及应对 18 个 CWE(常见缺陷枚举)场景的能力。

虽然在某些情况下,AI 能够生成比人类更优质的代码,但分析也揭示了,一些 AI 生成代码的安全性问题。

论文作者、格拉斯哥大学助理教授 Yutian Tang 指出,「AI 代码生成一定程度上,可以提升开发效率,自动化软件工程。然而,我们必须认识这类模型优势和不足,以便合理应用」。

「通过全面的分析,可以发现 ChatGPT 生成代码过程中,出现的潜在问题和局限性,进而改进生成技术」。

有网友庆幸地发出疑问,所以我还没有被解雇?另一人对此表示,至少不是今天。

还有人指出,这项研究是关于 GPT-3.5 的评估。要是 GPT-4 早就在编码能力上大幅提升,Claude 3.5 更是如此。

确实,现在我们有了更好的模型,对于 GPT-3.5 模型的评估,并没有太大的意义。

0.66%-89%,惊人反差率

总体而言,ChatGPT 在不同编程语言的问题上表现相当不错 —— 特别是在尝试解决 2021 年之前 LeetCode 上的编码问题时。

例如,它能够为简单、中等和困难的问题生成可运行代码,成功率分别约为 89%、71% 和 40%。

然而,当涉及到 2021 年之后的算法问题时,ChatGPT 生成正确运行代码的能力受到影响。即使是简单级别的问题,它有时也无法理解问题的含义。

比如,ChatGPT 在生成「简单」编码问题的可运行代码方面的能力,在 2021 年后从 89% 下降到 52%。

而它在生成「困难」问题的可运行代码方面的能力也在此时间后从 40% 下降到 0.66%。

Tang 对比表示,「一个合理的假设是,ChatGPT 在 2021 年之前的算法问题上表现更好的原因是这些问题在训练数据集中经常出现」。

接下里,具体看看研究者们对 ChatGPT 进行了哪些方面的评估。

实验评估

评估的整体流程如图 2 所示。

首先为给定的 LeetCode 问题或 CWE 场景构造合适的提示并发送给 ChatGPT,让它根据提示和上一轮对话的上下文信息给出响应。

之后,研究人员将模型响应中的代码片段提交给 LeetCode 平台,利用其在线判断功能来检验代码的正确性,CWE 漏洞则使用 CodeQL 进行手动分析。

如果测试结果通过,则生成结束,否则就需要利用 LeetCode 和 CodeQL 的反馈继续建立新的提示、输入给 ChatGPT,再次进行代码生成。

如果 ChatGPT 在对话轮数限制(5 轮)之内始终没有生成出通过测试的代码,则认为生成任务失败。

功能性正确代码生成

ChatGPT 生成的代码在功能上是否正确?

研究动机:

给定提示,ChatGPT 生成相应的文本,这种能力可能会提高开发者的生产力。首先去评估 ChatGPT 在单轮对话中,自动生成功能正确代码的能力。

研究方法:

- 让 ChatGPT 阅读问题描述,在单轮对话中生成相应代码。(最大对话轮数设为 1)

- 使用 LeetCode 平台上的编程问题作为数据集,截止研究时,有 2500 个难度不等的问题。

- 将 LeetCode 所有问题分为 2021 年之前(Bef.problems)和 2021 年之后(Aft.problems)两类,因为 ChatGPT 的训练数据截止于 2021 年。

- 考虑到 2021 年之前的问题可能已存在于 ChatGPT 的训练集中,这可能使代码生成任务退化为简单的数据库查询(即代码复用)。为了进行全面评估,研究中同时考虑了这两类问题。

具体而言,研究人员重点关注 LeetCode 上的算法问题,因为算法问题是该平台上最重要、最多和最多样化的问题。

Bef.problemsAft.problems 的总数分别为 1624 个和 354 个。此外,两者的难度分布为难、中、易,比例为 1:2:1。

在所有 Bef.problems 中,作者随机抽取了 374 个问题,其数量与 Aft.problems 相似,难度分布也与 Aft.problems 相同。

同样,在 354 个 Aft.problemsBef.problems 中,难、中、易问题的数量比例也是 1:2:1,与 LeetCode 平台上所有问题的难度分布一致。

此外,研究人员还检查了 Bef.problemsAft.problems 之间是否存在显著差异。

如果 Aft.problems 只是 Bef.problems 的重构,那么 ChatGPT 很可能可以轻松解决这些问题,这可能会影响实验结果在区分时间段方面的可靠性。

论文中,作者总共找到了 142 对问题。然后,再让 2 名研究生独立检查这些问题对。

通过仔细核对和讨论,结果发现这些相似的问题要么情景相似,但求解目标完全不同;要么情景和条件不同,但可以使用类似的算法(如动态编程)求解。

经过仔细的人工分析,作者没有发现在任何情况下,Bef.problems 可以很容易地重新表述为 Aft.problems

因此,作者认为 Aft.problemsBef.problems 之外,对于每个问题,都要求 ChatGPT 用 5 种不同的语言生成代码:C、C++、Java、Python3 和 JavaScript。

此外,他们还使用相同的提示模板为每个 <问题、语言> 对创建了相应的提示。

Bef.problemsAft.problems 分别共有 1,870 和 1,770 个提示。由于 ChatGPT 的查询速度有限,研究者将每条提示输入一次,要求生成代码。

然后,研究者将解析后的解决方案,提交给 LeetCode 进行功能正确性判断,并得到提交状态,包括接受、回答错误、编译错误、超过时间限制和运行错误。

它们分别对应于 A.、W.A.、C.E.、T.L.E.和 R.E.。一个问题对应一个唯一的对话,以避免从其他问题触发 ChatGPT 的推理。

实验中,作者以状态率(SR)来评估 ChatGPT 的代码生成能力。其中 Nc 和 Ni 分别是根据状态生成的代码片段数和输入的提示数。

提示:

所设计的提示模板由 4 个部分组成:它们分别是

程序员编程语言
新浪科技公众号
新浪科技公众号

“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)

创事记

科学探索

科学大家

苹果汇

众测

专题

官方微博

新浪科技 新浪数码 新浪手机 科学探索 苹果汇 新浪众测

公众号

新浪科技

新浪科技为你带来最新鲜的科技资讯

苹果汇

苹果汇为你带来最新鲜的苹果产品新闻

新浪众测

新酷产品第一时间免费试玩

新浪探索

提供最新的科学家新闻,精彩的震撼图片