文章目录

  • 论文摘要
  • 写作动机
  • 做了什么
  • 怎么做的
  • 效果如何
  • 创新点/贡献
  • 潜在应用
  • 局限性
  • 代码仓库


论文摘要

Code generation models based on the pre-training and fine-tuning paradigm have been increasingly attempted by both academia and industry, resulting in well-known industrial models such as Codex, CodeGen, and PanGu-Coder. To evaluate the effectiveness of these models, multiple existing benchmarks (e.g., HumanEval and AiXBench) are proposed, including only cases of generating a standalone function, i.e., a function that may invoke or access only built-in functions and standard libraries. However, non-standalone functions, which typically are not included in the existing benchmarks, constitute more than 70% of the functions in popular opensource projects, and evaluating models’ effectiveness on standalone functions cannot reflect these models’ effectiveness on pragmatic code generation scenarios (i.e., code generation for real settings of open source or proprietary code).
To help bridge the preceding gap, in this paper, we propose a benchmark named CoderEval, consisting of 230 Python and 230 Java code generation tasks carefully curated from popular real-world open-source projects and a self-contained execution platform to automatically assess the functional correctness of generated code. CoderEval supports code generation tasks from six levels of context dependency, where context refers to code elements such as types, APIs, variables, and consts defined outside the function under generation but within the dependent third-party libraries, current class, file, or project. CoderEval can be used to evaluate the effectiveness of models in generating code beyond only standalone functions. By evaluating three state-of-the-art code generation models (CodeGen, PanGu-Coder, and ChatGPT) on CoderEval and HumanEval, we find that the effectiveness of these models in generating standalone functions is substantially higher than that in generating nonstandalone functions. Our analysis highlights the current progress and pinpoints future directions to further improve a model’s effectiveness by leveraging contextual information for pragmatic code generation.

基于预训练和微调范式的代码生成模型在学术界和工业界都有越来越多的尝试,形成了著名的工业模型,如 Codex、CodeGen 和 PanGu-Coder。为了评估这些模型的有效性,提出了多个现有基准(如 HumanEval 和 AiXBench),其中只包括生成独立函数的情况,即只能调用或访问内置函数和标准库的函数。然而,非独立函数通常不包括在现有基准中,它们占流行开源项目函数的 70% 以上,因此评估模型在独立函数上的有效性并不能反映这些模型在实用代码生成场景(即在开源或专有代码的实际设置中生成代码)上的有效性。
为了弥补上述不足,我们在本文中提出了一个名为 CoderEval 的基准,其中包括从流行的实际开源项目中精心挑选的 230 个 Python 和 230 个 Java 代码生成任务,以及一个自足的执行平台,用于自动评估生成代码的功能正确性。CoderEval 支持六级上下文依赖的代码生成任务,其中上下文指的是在生成函数之外但在依赖的第三方库、当前类、文件或项目中定义的类型、API、变量和常量等代码元素。CoderEval 可用于评估模型在生成独立函数之外的代码时的有效性。通过在 CoderEval 和 HumanEval 上对三种最先进的代码生成模型(CodeGen、PanGu-Coder 和 ChatGPT)进行评估,我们发现这些模型在生成独立函数时的有效性大大高于生成非独立函数时的有效性。我们的分析强调了当前的进展,并指出了未来的方向,即通过利用上下文信息来生成实用代码,从而进一步提高模型的有效性。

写作动机

多个现有的基准(例如HumanEval和AiXBench)仅包括生成独立函数的情况,缺少评估模型生成非独立函数(实用代码)的标准。

做了什么

  • 提出了一个名为CoderEval的基准(由230个Python和230个Java代码生成任务组成)以及一个自成一体的执行平台,用于自动评估生成代码的功能正确性,可用于评估模型在生成独立函数以外的代码方面的有效性。
  • CoderEval 是迄今为止唯一支持项目级代码生成并使用 Pass@k 评估指标的基准,它可以验证生成代码的功能正确性。
  • 根据上下文依赖关系,将代码生成任务分为六个可运行级别,即函数可成功运行的范围:self-contained, slib-runnable, plib-runnable, class-runnable, file-runnable, and project-runnable.

怎么做的

  • CoderEval的构建包括三个步骤:数据集收集、数据集探索和评估过程。
  • 数据集收集分为:目标选择和构建测试样例。
  • 目标选择分为四步:
    1)通过抓取 GitHub 上所有项目的标签来选择候选项目,并挑选出 14 个标签中出现频率最高且星级较高的项目。对于每个标签,我们选择星级数最高的前五个项目。
    2)提取所选项目中的所有函数,只保留不属于测试、接口或已废弃函数的函数,这些函数要有函数级的英文注释,并能在验证平台中成功运行,且能通过原始测试用例。
    3)通过人工筛选从候选函数中选出高质量函数,筛选的主要标准是该函数是否经常出现在实际开发场景中。
    4)我们根据每个项目中包含的被选函数的数量来确定项目。这一过程可以帮助我们在编译较少的项目时,选择相同数量的功能。
  • 构建测试样例
    对于行覆盖率或分支覆盖率未达到 100%的测试,第一作者在 CoderEval 中手动编写了额外的测试用例,以实现函数更高的行覆盖率和分支覆盖率。
  • 选择函数的五条规则:
    (1) 包含少于 10 个上下文标记的函数。过多的上下文依赖会使模型难以生成正确的解决方案。对于所有大型语言模型来说都难以生成正确实现的函数不适合用于基准测试。
    (2) 由 13 名开发人员评判的在实际开发场景中经常使用的函数。这一规则背后的理由是,不同的开发人员对常用函数有不同的偏好;因此,CoderEval 中开发人员偏好函数的多样性可以消除潜在的偏差。
    (3) 包含能反映函数实现的文档说明的函数。
    (4) 实现代码超过三行的函数。
    (5) 不属于测试或废弃函数的函数。
  • 测评过程:环境准备+测评
  • 克隆所有 43 个项目的环境,使用venv为每个项目创建一个单独的虚拟环境,使用 pip 安装所有依赖项,并触发项目中的原始测试以验证运行时环境。
  • 在环境准备就绪并给定一个要评估的模型后,编写一个程序将生成的代码自动注入到项目中,通过测试输入正确调用函数,并将实际输出与预期输出进行比较。给定模型生成的 n 个代码片段后,程序会用每个代码片段依次替换原始函数。替换并运行后,输出将被捕获。如果函数返回时没有错误或异常,平台会将实际输出与预期输出进行比较,否则,意外终止将被视为测试失败。测试完所有任务的所有代码片段后,所有任务的结果将用于计算最终的 Pass@k 指标。

效果如何

测评结果分析回答了以下三个问题:

  • 问题 1:CodeGen、PanGu-Coder 和 ChatGPT 在 CoderEval 和 HumanEval 上的表现如何?
    在 CoderEval for Python 和 CoderEval for Java 上,三种模型生成独立函数的效率都大大高于生成非独立函数的效率。不同的模型在生成代码方面有其独特的能力,如何将不同模型的代码生成能力结合起来是一个值得研究的方向。
  • 问题 2:不同模型在正确生成上下文信息方面的表现如何?
    综上所述,大型语言模型生成正确上下文信息的能力(Acc@k)与生成正确代码的能力(Pass@k)高度相关。大语言模型生成不同类型(即 TypeReference、APIInvocation 和 VariableReference)上下文标记的能力因语言而异。
  • 问题 3:提示语如何影响不同模型的有效性?
    选择使用人工标注的文档字符串还是原始文档字符串会影响代码生成的效果。在单一语言的代码生成任务中,当给出语义相同但表达方式不同的自然语言描述时,使用单一语言语料库训练的模型比使用多种语言训练的模型表现更好。

创新点/贡献

  1. 指出了现有基准的局性:HumanEval 等现有基准通常只包括独立函数,而在开源项目中,非独立函数占函数的 70% 以上。提出了一个实用代码生成基准CoderEval,其源自不同领域的开源项目,考虑了非原始类型、第三方库和项目特定的上下文引用。此外,CoderEval 还包括生成中函数的人工标注文档字符串,以补充原始文档字符串。
  2. 在 CoderEval 上评估并比较了三种最先进的代码生成模型(CodeGen、PanGu-Coder 和 ChatGPT)。实验结果表明了三个重要发现:
    (1) 这些模型在非独立函数上的效果不如在独立函数上的效果好;
    (2) 对于所有这些模型来说,即使是 ChatGPT(功能最强大的模型),生成具有上下文依赖性的代码也很重要,但却很有挑战性;
    (3) 选择使用人工标注的文档字符串还是原始文档字符串会影响代码生成的效果。

潜在应用

不同的模型在生成代码方面有其独特的能力,如何将不同模型的代码生成能力结合起来是一个值得研究的方向。

局限性

无法保证收集到所有第三方库,独立函数和非独立函数的统计比例可能会略有偏差。

代码仓库

https://github.com/CodeArtsSnap/CoderEval