GPT-4:我写的代码你敢用吗?研究表明其API误用率超过62%
机器之心报道
编辑:Panda W
因此,越来越多的软件工程师选择查询大型语言模型来解答编程问题,比如使用 API 来生成代码段或检测代码中的 bug。相比于搜索 Stack Overflow 等网络编程论坛,大型语言模型可为编程问题检索到更加合适的定制版答案。 LLM 的速度很快,但这也掩盖了其代码生成中的潜在风险。从软件工程的角度看,即便已经有许多研究成果问世(涉及避免句法错误以及提升对生成代码的语义理解等方面),LLM 的生成代码能力的稳健性和可靠性还没有得到透彻的研究。 不同于网络编程论坛的情况,LLM 生成的代码没有得到社区同行的审查,因此可能出现 API 误用问题,例如在文件读取和变量索引中缺少边界检查、缺少文件 I/O 关闭、交易完成失败等。即使生成的代码样本可以执行或者能正确执行功能,误用也可能导致产品出现严重的潜在风险,比如内存泄漏、程序崩溃、垃圾数据收集失败等。 更糟糕的是,提出这些问题的程序员还是最容易受到攻击的人,因为他们更有可能是 API 新手,无法辨别生成的代码段中的潜在问题。 下图展示了一个软件工程师向 LLM 询问编程问题的示例,可以看到 Llama-2 能给出句法正确、功能正确、语法对齐的代码段,但却存在不够稳健可靠的问题,因为其中没有考虑到文件已存在或文件夹不存在的情况。
方法概览 RobustAPI 是一个用于全面评估 LLM 生成代码的可靠性和稳健性的框架。 下面将描述构建该数据集时的数据收集过程和 prompt 生成过程,然后将给出 RobustAPI 中评估的 API 误用模式并讨论误用的潜在后果,最后还将给出用 RobustAPI 检测 API 误用情况的静态分析,其中使用的方法是抽象语法树。 结果发现,相比于关键词匹配等基于规则的方法,新方法能以更高的准确度评估 LLM 生成代码的 API 误用情况。 数据收集 为了利用软件工程领域的已有研究成果,研究者构建 RobustAPI 时立足的起点是来自 ExampleCheck (Zhang et al. 2018) 的数据集。ExampleCheck 是用于研究网络问答论坛中常见 Java API 误用情况的框架。 研究者从该数据集选取了 23 个常见的 Java API,如下表 1 所示。这 23 个 API 覆盖 5 个领域,包括字符串处理、数据结构、移动端开发、加密和数据库操作。
下面给出一个例子:
具体的实验过程请参阅原论文,这里给出研究者得到的 5 个发现: 发现 1:当前最佳的大型语言模型对真实世界编程问题的答案普遍存在 API 误用问题。
现在,已经有不少软件开发者在开发软件时让大型语言模型当助手了,但最新的一项研究发出了警示:使用 LLM 反馈的代码时一定要慎重!根据这项研究新提出的评估框架 RobustAPI,如果不在 prompt 中提供演示示例,GPT-4 的 Java API 误用率超过 62%;而即使提供一个正确的演示示例,整体 API 误用率也接近 50%。语言建模的新时代已经到来,大型语言模型(LLM)能力非凡,不仅能理解自然语言,甚至能根据用户需求生成定制代码。
因此,越来越多的软件工程师选择查询大型语言模型来解答编程问题,比如使用 API 来生成代码段或检测代码中的 bug。相比于搜索 Stack Overflow 等网络编程论坛,大型语言模型可为编程问题检索到更加合适的定制版答案。 LLM 的速度很快,但这也掩盖了其代码生成中的潜在风险。从软件工程的角度看,即便已经有许多研究成果问世(涉及避免句法错误以及提升对生成代码的语义理解等方面),LLM 的生成代码能力的稳健性和可靠性还没有得到透彻的研究。 不同于网络编程论坛的情况,LLM 生成的代码没有得到社区同行的审查,因此可能出现 API 误用问题,例如在文件读取和变量索引中缺少边界检查、缺少文件 I/O 关闭、交易完成失败等。即使生成的代码样本可以执行或者能正确执行功能,误用也可能导致产品出现严重的潜在风险,比如内存泄漏、程序崩溃、垃圾数据收集失败等。 更糟糕的是,提出这些问题的程序员还是最容易受到攻击的人,因为他们更有可能是 API 新手,无法辨别生成的代码段中的潜在问题。 下图展示了一个软件工程师向 LLM 询问编程问题的示例,可以看到 Llama-2 能给出句法正确、功能正确、语法对齐的代码段,但却存在不够稳健可靠的问题,因为其中没有考虑到文件已存在或文件夹不存在的情况。
- 提出了一种用于评估 LLM 代码生成的可靠性和稳健性的新基准:RobustAPI。
- 提供了一个完善的评估框架,其中包括一个由 Stack Overflow 问题构成的数据集和一个使用 AST 的 API 使用情况检查器。研究者基于此框架分析了常用 LLM 的性能表现,包括 GPT-3.5、GPT-4、Llama-2 和 Vicuna-1.5。
- 全面分析了 LLM 生成代码的表现。他们总结了每种模型常见的 API 误用情况,并指出了可供未来研究改进的方向。
方法概览 RobustAPI 是一个用于全面评估 LLM 生成代码的可靠性和稳健性的框架。 下面将描述构建该数据集时的数据收集过程和 prompt 生成过程,然后将给出 RobustAPI 中评估的 API 误用模式并讨论误用的潜在后果,最后还将给出用 RobustAPI 检测 API 误用情况的静态分析,其中使用的方法是抽象语法树。 结果发现,相比于关键词匹配等基于规则的方法,新方法能以更高的准确度评估 LLM 生成代码的 API 误用情况。 数据收集 为了利用软件工程领域的已有研究成果,研究者构建 RobustAPI 时立足的起点是来自 ExampleCheck (Zhang et al. 2018) 的数据集。ExampleCheck 是用于研究网络问答论坛中常见 Java API 误用情况的框架。 研究者从该数据集选取了 23 个常见的 Java API,如下表 1 所示。这 23 个 API 覆盖 5 个领域,包括字符串处理、数据结构、移动端开发、加密和数据库操作。
下面给出一个例子:
- 问题 1:这些 LLM 在解答真实世界编程问题时的 API 误用率是多少?
- 问题 2:无关的演示样本会对结果产生什么样的影响?
- 问题 3:正确的 API 使用示例能降低 API 误用率吗?
- 问题 4:为什么 LLM 生成的代码无法通过 API 使用检查?
具体的实验过程请参阅原论文,这里给出研究者得到的 5 个发现: 发现 1:当前最佳的大型语言模型对真实世界编程问题的答案普遍存在 API 误用问题。