论文阅读-自动程序修复-Is Your Code Generated by ChatGPT Really Correct?Rigorous Evaluation of Large Language

论文来源icon-default.png?t=N7T8https://arxiv.org/pdf/2305.01210.pdf

概述

 本文关注大型语言模型在代码生成中的应用,旨在评估ChatGPT生成的代码的正确性。

(评估生成式代码的正确性)

本文创新动机

现有研究中对于生成代码的正确性评估不足,本文提出了一种基于符号执行的方法,用于评估生成代码的正确性,并在实验中证明了其有效性。

这篇论文的创新点,为之后的论文提供了一些的启发

1.通过使用ChatGPT作为自动生成引擎,并且灵活应用突变

使用ChatGPT作为自动生成引擎本来存在速度的问题

因为:ChatGPT不适合大量的自动化测试生成,查询如此大的模型的速度和成本不理想。

本文解决了这个问题:从ChatGPT生成的高质量种子输入开始执行类型感知输入突变。

(i)使用ChatGPT的种子输入语料库来初始化种子池并引导生成管道;

(ii)每次从种子池中随机选择一个输入(即种子),将其突变为新的输入(即突变体);

(iii)符合程序合同(§2.3)的新输入被添加到种子池中,从(ii)开始继续生成过程。

2.扩展基准

通过自动化测试方法改进编程基准,包含更多高质量和自动生成的测试输入,将有助于更准确地评估代码生成的性能。

背景

过往相关论文比较

大语言模型的应用专题里面

·Transformer-based language models for software vulnerability detection 将软件源代码转换成自然语言,利用训练好的Transformer语言模型根据上下文理解注释和代码的关系,推断代码是否存在漏洞。(利用LLM检测代码是否有漏洞)

·Automated repair of programs from large language models

研究利用自动化修复技术(TBar 和Recoder)以及Codex-e来修复GPT-3模型的后代Codex产生的代码错误(修复LLM生成式代码的错误)

·Examining zero-shot vulnerability repair with large language 

作者研究了大语言模型在没有专门对安全漏洞修复进行训练的情况下(Zero-Shot),通过构建适当的提示来引导LLMS生成修复漏洞的代码。(利用LLM修复代码漏洞)

·Large language models are zero-shot fuzzers: Fuzzing deep-learning libraries via large language models 
这篇论文介绍了一种名为TitanFuzz的新方法,利用大语言模型生成输入,模糊深度学习库(TensorFlow/Pytorch)    (利用LLM生成模糊测试)

注:本文也用到了”自动化测试输入生成”这一步,可以将两篇文章利用LLM生成测试的方法类比一下

本文  Is Your Code Generated by ChatGPT Really Correct?Rigorous Evaluation of Large Language

提出EvalPlus代码综合评估框架,评估LLM程序合成代码  (评估LLM的生成代码)

过往的问题与技术局限性

主流解决方案:
HUMANEVAL:手工构建的测试用例来评估LLM解决方案存在问题:
        ·测试不足
当前的编程基准只能为每个编码问题平均包含不到10个测试。此外,这些测试相对过于简单,无法充分探索代码的功能或边界情况
        ·不精确的问题描述
代码生成的输入除了包含函数签名外,还包括自然语言描述。现有基准中的这些任务描述通常过于模糊,无法完全阐明预期的程序行为

相关工作

LLM代码生成

由于开放代码库的丰富和提高开发人员效率的需求,LLMs在代码领域得到了广泛应用。包括代码生成/合成、程序修复、代码翻译和代码摘要。知名的LLMs,包括CODEX 、CodeGen 、INCODER 和PolyCoder
存在问题:生成代码是否正确?

LLM的代码基准

HUMANEVAL [11] 是最早和最广泛研究的基于LLM的代码合成的人工编写基准之一,包括164对Python函数签名与文档字符串以及相关的用于正确性检查的测试用例
存在问题:测试数量少,部分测试不正确

自动化测试生成

自动化测试生成是一种广泛使用的方法,通过自动生成的测试来发现软件错误。
黑盒测试:传统的黑盒技术主要可以分为基于生成的和基于变异的两种
白盒测试:分析SUT的源代码来提供更高质量的测试用例。例如,符号执行通过解决符号路径约束来生成针对深层路径的测试,从而突破覆盖率瓶颈。
存在问题:无法为用动态类型语言编写的任意问题生成语义上有意义的输入

本文贡献

研究:

首个研究当前编程基准测试中测试不足问题的团队,我们的研究还开辟了一条新的研究方向,即精确、严谨地评估LLM合成代码。

方法:

构建了EvalPlus——一个评估框架来改进现有的代码基准,以便精确地评估llm生成的代码的功能正确性。

结果:

· EvalPlus扩展了流行的HUMAN EVAL基准,创建HUMAN EVAL +,将测试用例规模提高了80倍。

· 通过减少测试套件,我们还生产了HU - MAN EVAL + - MINI,它将HUMAN EVAL +测试提炼了47倍,同时仍然达到了类似的测试效率水平。

· 对26个流行的llm的广泛评估令人惊讶地发现,新数据集上的pass@k比基本的HUMAN EVAL低19.3-28.9%(对于不同的ks),这表明测试不足可以在很大程度上影响几乎所有基于llm的代码生成的最新工作的结果分析。

· 在原始的HUMAN EVAL上,34B的wizardcode - codellama[38]和Phind-CodeLlama[52]模型都被认为并不比ChatGPT好,而HUMAN EVAL +修正了排名,表明这两个开源模型实际上更好。

· 甚至发现HUMAN EVAL的基本解可能是错误的,这进一步发了对代码合成基准质量的质疑。

方法

  1. 定义代码正确性的度量标准,包括语法正确性、语义正确性和功能正确性。
  2. 提出一种基于测试用例的评估方法,该方法可以在保证代码正确性的前提下,评估生成的代码的质量。

EvalPlus采用了基于LLM和基于突变的方法[57,74,47]来自动生成和多样化额外的测试输入。EvalPlus首先使用ChatGPT[48]生成一组高质量的种子输入,目的是在有效的输入结构内测试困难的角落用例和程序的功能。使用这些高质量的种子输入,EvalPlus然后执行类型感知突变,以有效地生成大量额外的测试输入。然后使用这些新生成的测试输入,通过对真实实现的差异测试[40]来评估llm生成的代码。此外,作为加速评估的一个选项,EvalPlus还通过只包括最有价值的测试用例来构建最小的测试套件,这些测试用例是通过运行贪婪集覆盖算法来选择的,以保持相同的代码覆盖率[24],突变分析[7]以及经验LLM样本杀戮。

EvalPlus模型图:

 第一大部分:自动化测试输入生成(生成大量符合程序输入合同的输入集X)

Step1:

原始数据集(original dataset):(包括ground-truth实现和基本测试输入)作为示范和提示来查询ChatGPT,从而鼓励ChatGPT提出有趣输入的指令.

Step2:

base inputs 和 (Chatgpt首先产生高质量初始种子输入:Seed inputs,然后经过类型感知突变:Type-aware mutation快速生成大量新输入和种子输入)

遵循典型的基于突变的模糊工作流程[74,57]来连续创建输入:

(i)使用ChatGPT的种子输入语料库来初始化种子池并引导生成管道;

(ii)每次从种子池中随机选择一个输入(即种子),将其突变为新的输入(即突变体);

(iii)符合程序合同(§2.3)的新输入被添加到种子池中,我们从(ii)开始继续生成过程。

注:什么是类型感知突变

该突变检查传入有效种子的数据类型,并生成结构上与种子相似的新输入。

第二大部分:减少测试套件

        减少测试套件,必然有一个原始测试套件。原始测试套件(初始测试集合:由一组精心设计的测试用例和问题组成)的产生是由new input和groud truth组成的

        虽然EvalPlus中大量新生成的测试在检测错误代码方面是有效的,但是测试的执行可能是昂贵的。为了更有效地评估llm生成的代码,我们进一步研究了测试套件缩减策略[75,59],其目的是选择原始测试套件的一个子集,同时仍然保持原始测试的有效性(集合覆盖问题)。

注:准确地定义测试需求的三种策略:

代码覆盖率(coverage):代码覆盖率衡量每个测试执行的代码元素数量,例如语句或分支。传统的测试套件缩减可以使用广泛使用的分支覆盖作为测试要求。

突变杀戮(Mutant Killing):突变测试通过应用一组预定义的突变规则(例如,更改“<”和“≤”)来创建许多人工制造的有缺陷程序,每个程序称为突变体,每个突变体包含一个微妙的种子错误。测试套件的有效性可以通过检测和杀死这些突变体来评估。

LLM样本杀伤(LLM sample killing):不同的大型语言模型可能在某些测试用例上表现不佳。因此,除了理论上的测试要求外,还可以通过观察实际的样本杀伤来确定测试要求。这意味着测试用例必须能够检测到不同大型语言模型的错误。

3.在实验中,使用该方法对ChatGPT生成的代码进行评估,并与其他代码生成模型进行比较,验证了该方法的有效性。

评价

数据集可以分为3类

(1)选择题类型的数据集

原理是:将问题输入给大模型,大模型返回的选择题答案与正确答案进行比较,正确答案的占比作为评估数据的指标值。上面的5-shot指:在输入问题给大模型时,给出5个参考样例。

MMLU:mmlu数据集包含来自各个知识领域的多项选择题。该数据集涵盖了人文学科、社会科学、自然科学以及其他一些对某些人学习至关重要的领域。数据集包括57个任务,其中包括初等数学、美国历史、计算机科学、法律等内容。通过这个数据集可以评估大模型在不同领域的推理能力。

CMMLU:CMMLU数据集是一个综合性的中文评估基准,由MBZUAI、上海交通大学、微软亚洲研究院共同推出,在评估语言模型在中文语境下的知识和推理能力方面极具权威性。一句话理解就是中文版本的MMLU。

C-Eval:C-Eval是一个全面的中文基础模型评估套件,它包含了13948个多项选择题,涵盖了52个不同的学科和四个难度级别,一句话理解就是中文版本的mmlu。

(2)代码编写类型的数据集

原理是:每一条数据中都带了单元测试,大模型编写的代码与数据集中单元测试进行组合,如果单元测试通过,则认为编写的代码正确。当然,在计算Pass@k值的时候,并不是简单使用通过单元测试的量/总数据集的百分比来计算的。Pass@k有个详细的计算公式,具体如下所示

HumanEval:HumanEval是一个用于评估代码生成能力的数据集,由OpenAI在2021年推出。 这个数据集包含164个手工编写的编程问题,每个问题都包括一个函数签名、文档字符串(docstring)、函数体以及几个单元测试。 这些问题涵盖了语言理解、推理、算法和简单数学等方面。

MBPP:MBPP(Mostly Basic Programming Problems)是一个数据集,主要包含了974个短小的Python函数问题,由谷歌在2021年推出,这些问题主要是为初级程序员设计的。 数据集还包含了这些程序的文本描述和用于检查功能正确性的测试用例。一句话理解,和HumanEval一样,也是用于评估大模型代码生成能力的数据集。

Multi-HumanEval:包含多种编程语言的数据集,一句话理解就是HumanEval只包含了python的编程问题,multi-humaneval包含的多种编程语言,例如java,go,javascript等等。

HumanEval-X:HumanEval-X 是一个用于评估代码生成模型的多语言能力的基准测试。 它包含了820个高质量的人工制作的数据样本(每个样本都包含测试用例),涵盖了Python、C++、Java、JavaScript和Go这五种编程语言,可用于各种任务,如代码生成和翻译。一句话理解:HumanEval-X数据集和Multi-HumanEval数据集作用相同,只是数据集推出的机构不同而已。

(3)数学题目类型

​​​​​​​

对于数学类运算问题,在输入给大模型的input text中,通常都会添加step by step的提示语信息。这样,大模型会生成一个计算数学问题的推演过程,在进行评估时,需要从response中提取出最终的答案。然后,和数据集中的正确答案进行对比,从而得到大模型在数学方面的能力分数。

GSM-8K:GSM8K是由人类问题作者创建的8.5K高质量语言多样化小学数学单词问题的数据集,通过这套数据集可以评估大模型的数学推理运算能力。众所周知,数学运算是所有大模型能力最弱的部分。GSM8K数据集就是专门用来评估大模型数学运算能力的。

实验

  1. 通过对ChatGPT生成的代码进行严格的评估,发现其在一些关键指标上表现不佳,存在一定的错误率和不一致性。

  2. 在对比实验中,使用了两个数据集:CodeXGLUE和CodeSearchNet。其中,CodeXGLUE包含了多个任务,如代码补全、代码摘要等,而CodeSearchNet则是一个代码搜索数据集。

  3. 本文提出了一些评估指标,如BLEU分数、ROUGE、METEOR等,用于评估生成的代码与参考代码之间的相似度。

  4. 实验结果表明,ChatGPT在CodeXGLUE数据集上的表现相对较好,但在CodeSearchNet数据集上表现较差。

  5. 本文还对ChatGPT生成的代码进行了错误分析,发现其存在一些常见的错误类型,如语法错误、语义错误等。

  6. 最后,本文提出了一些改进方法,如使用更大的模型、引入更多的训练数据等,以提高ChatGPT生成代码的质量和准确性。

​​​​​​​

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值