【网安大模型专题10.19】论文4:大模型+自动生成代码评估:改进自动化测试方法、创建测试输入生成器、探索新的评估数据集扩充方法,提高编程基准的精度

news2024/11/16 12:03:54

Is Your Code Generated by ChatGPT Really Correct?

  • 写在最前面
    • 主要贡献
    • 这篇论文的创新点,为之后的论文提供了一些的启发
      • 未来研究的方向:改进自动化测试方法、创建测试输入生成器、探索新的评估数据集扩充方法,以及提高编程基准的精度。
      • 实验设计可尝试:不同温度设置对模型性能的影响,模型在生成多个样本时的表现
      • 评价方向可增加:归纳分析错误最多的几个方面
    • 课堂讨论
      • 主要思路
      • LLM样本杀伤力策略
        • 2.2测试用例集缩减
  • 研究背景
    • HUMANEVAL数据集错误范例
  • 相关工作
    • LLM代码生成
    • LLM的代码基准
    • 自动化测试生成
  • 本文贡献
  • 方法
    • 模型设计
    • 系统设计
    • 模型评价方向
  • 评价分析
    • HUMANEVAL数据集
    • 生成测试数量
    • 评价分析指标:无偏版本的pass@k
    • 评价方法
    • 评价分析
      • Test-suite Reduction effective 测试
      • 通过率分布
      • HUMANEVAL错误最多的几个方面
  • 总结
  • 展望

写在最前面

本文为邹德清教授的《网络安全专题》课堂笔记系列的文章,本次专题主题为大模型。

李宾逊同学分享 Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation《你由 ChatGPT 生成的代码真的正确吗?严格评估用于代码生成的大型语言模型》

该论文已经被neurips接收
论文:ttps://arxiv.org/pdf/2305.01210.pdf
代码:https://github.com/evalplus/evalplus

主要贡献

动机:🚨 使用“3 个测试用例”在数据集上评估 LLM 生成的代码还不够!🚨

为了解决这个问题,提出了EvalPlus——一个严格的LLM4Code评估框架,它:
✨ 通过添加多达数千个新测试来改进代码基准!(HumanEval的81倍新测试!
✨ 制作一套实用工具来清理,可视化和检查LLM生成的代码和评估结果!
✨ 通过为 14+ 模型开源 LLM 生成的样本来加速 LLM4Code 研究——无需重新运行昂贵的基准测试!

在这里插入图片描述

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

未来研究的方向:改进自动化测试方法、创建测试输入生成器、探索新的评估数据集扩充方法,以及提高编程基准的精度。

  1. 自动测试输入生成器的使用:帮助增强现有的评估数据集,改进和丰富现有的评估方法

  2. 基于LLM和模拟突变的策略:结合不同策略,创建多样性的测试用例。如通过模拟变异创建测试用例

  3. 扩展流行基准测试:将流行的基准测试进行扩展,以包含更多高质量和自动生成的测试输入,有助于提高评估的细致程度,而不仅仅依赖于人工生成的测试用例。

  4. 改进编程基准:通过自动化测试方法改进编程基准,将有助于更准确地评估代码生成的性能。未来的研究可以继续开发这一方向,提高编程基准的质量和可靠性。

实验设计可尝试:不同温度设置对模型性能的影响,模型在生成多个样本时的表现

有助于深入理解模型的生成行为和性能,以优化模型的使用和应用:

  1. 温度设置对性能的影响:通过尝试四个不同的温度设置(0.2、0.4、0.6、0.8),了解模型在不同温度下的生成表现。
    不同温度可能导致生成样本的多样性和质量有所不同。

  2. 随机采样与贪心解码:通过比较随机采样和零温度的贪心解码,了解不同的生成方法对模型性能的影响
    随机采样通常会生成多个样本,贪心解码只生成一个确定性样本。

  3. Pass@k 和温度

    • 分析模型在不同温度下的 pass@k 表现
    • 确定在给定温度下,模型生成多个样本时的性能
    • 找到在不同温度下实现最佳性能的 pass@k 的取值

评价方向可增加:归纳分析错误最多的几个方面

课堂讨论

目的:解决:原始测试输入不足
首个研究、评估HUMANEVAL数据集不足的论文

主要思路

根据大语言模型的能力,通过提示引导之前没有考虑到的输出
通过类型感知变异,快速生成大量新输出

(没有方法保证、验证函数的输出形式是对的)后面通过添加代码段

LLM样本杀伤力策略

目的:最小化测试数量,确保其他模型合成的所有错误样本 都可以被简化的测试套件检测到
保留更多LLMs模型无法通过的样本
提高效率

2.2测试用例集缩减

最小化子集、减少数据集冗余
分别对策略进行检验效果
这个策略提升的效果最多,并且时间上提升很多

但由于策略的完整性,其他的策略也保留

研究背景

在这里插入图片描述
在这里插入图片描述

HUMANEVAL数据集错误范例

在这里插入图片描述

相关工作

LLM代码生成

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

LLM的代码基准

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

自动化测试生成

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

本文贡献

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

方法:提出了EvalPlus - 一种评估框架,以揭示LLM合成代码的真实正确性。EvalPlus的测试用例生成方法结合了新兴的基于LLM和传统的基于变异的测试输入生成方法。它首先使用基于LLM的策略,以高质量的种子输入引导测试生成器,然后通过类型感知的变异进一步扩展大量的测试输入。

结果:EvalPlus将流行的HUMANEVAL基准测试扩展为HUMANEVAL+,将测试用例规模提高了81倍。通过Test-Suite Reduction,生成HUMANEVAL+ -MINI,将HUMANEVAL+测试压缩了47倍,同时仍然实现了相同水平的测试效果。

我们对19个流行的LLM进行了广泛的评估,惊人地发现新数据集上的pass@k平均比基准HUMANEVAL低13.6-15.3%,这表明测试不足可以大大影响几乎所有最近关于LLM基础代码生成的工作的结果分析。

方法

模型设计

EvalPlus模型图
在这里插入图片描述

系统设计

EvalPlus是一个用于自动化测试输入生成的系统,以支持软件测试和验证任务。其主要步骤如下:

  1. 种子初始化:EvalPlus使用ChatGPT生成一组高质量的种子输入,这些种子将在后续的步骤中用于变异。

  2. 类型感知的输入变异:接下来,EvalPlus使用这些种子输入初始化种子池,并用它们来引导生成流程。每次从种子池中随机选择一个输入(种子),然后对它进行变异,生成一个新的输入(突变体)。只有符合程序合约的新输入会被添加到种子池中。
    程序合约:通过添加代码断言(例如,assert n > 0)来确保函数的测试输入是良好形式的。

  3. 测试套件缩减:选择原始测试套件的子集,以减小测试成本,同时仍然确保维持原始测试的有效性。
    这个问题可以形式化为:The problem can then be formalized as:
    reducing the original test-suite T into Tred, such that ∀r ∈ R (∃t ∈ T , t satisfies r =⇒ ∃t′ ∈ Tred, t′ satisfies r)
    将原始测试套件 T 缩减为 Tred 的任务,其中对于测试要求 R 中的每个要求 r,必须满足以下条件:对于 T 中的某个测试用例 t,如果 t 满足 r,那么必须存在 Tred 中的某个测试用例 t’,使得 t’ 也满足 r。
    在这里插入图片描述

模型评价方向

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

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

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

评价分析

本文目标:旨在评估EvalPlus在HUMANEVAL上的有效性

HUMANEVAL数据集

HUMANEVAL是最广泛使用的代码生成数据集之一。原始的HUMANEVAL包含164个由人类编写的编程任务,每个任务提供一个Python函数签名和一个文档字符串作为LLM的输入。基于这些输入,LLMs完成一个解决方案,其功能正确性由少量单元测试用例判断
在这里插入图片描述

生成测试数量

HUMANEVAL+、HUMANEVAL±mini测试概览

在这里插入图片描述

评价分析指标:无偏版本的pass@k

无偏版本的pass@k(LLM 对于一个问题生成k次,测算其至少能通过一次的概率)

OpenAI 的 HumanEval 论文[11]中提出可以针对每个问题生成 n 个代码 (n>k),然后用下式进行无偏估计:
在这里插入图片描述

[11] M. Chen, J. Tworek, H. Jun, Q. Yuan, H. P. d. O. Pinto, J. Kaplan, H. Edwards, Y. Burda, N. Joseph, G. Brockman, et al. Evaluating large language models trained on code. arXiv preprint arXiv:2107.03374, 2021.

评价方法

对于每个模型,执行以下步骤:

  • 对分别四个temperature设置({0.2,0.4,0.6,0.8})下各生成的200个程序样本进行随机采样
  • 对于随机采样,展示了每个k∈{1,10,100}的最佳表现pass@k和其对应的温度(T∗k)
  • 使用零温度进行贪心解码仅合成针对每个任务的一个确定性样本,并将其通过率评估为pass@1⋆。

[38]E. Nijkamp, B. Pang, H. Hayashi, L. Tu, H. Wang, Y. Zhou, S. Savarese, and C. Xiong. Codegen: An open large language model for code with multi-turn program synthesis. In The Eleventh International Conference on Learning Representations, 2023.

评价分析

在所有LLM、模型大小和k值上,使用HUMANEVAL+时,相比于使用基于HUMANEVAL的评估,所有pass@k的结果都持续下降。值得注意的是,所有模型和k值上的pass@k结果平均降低了13.6-15.3%。这种性能下降不仅出现在流行的开源LLM中,如广泛使用的CodeGen [38](降低了18.5%)和新兴的StarCoder [13](降低了14.1%),还出现在最先进的商业ChatGPT(降低了13.4%)和GPT-4(降低了13.8%)

结论:在HUMANEVAL上的评估不足以检测LLM合成的错误代码

Test-suite Reduction effective 测试

测试数量相比于HUMANEVAL+减少了47倍

在这里插入图片描述

通过率分布

HUMANEVAL和HUMANEVAL+之间的通过率差距表明,HUMANEVAL+能够检测到HUMANEVAL误识别的问题,无论难度级别如何

HUMANEVAL中的问题并不相等,不仅在问题难度上有差异,而且在生成反例和边界情况以深入测试LLM生成的代码的难度上也有差异。

在这里插入图片描述

HUMANEVAL错误最多的几个方面

(i)未处理的边缘情况:5个“ground-truth”无法处理边缘情况的输入(例如,空列表或字符串);
(ii)错误的逻辑:10个“ground-truth”错误地实现了所需的功能;
(iii)性能问题:三个低效的实现导致在合理大小的输入上性能较慢。

逻辑错误示例
在这里插入图片描述

总结

  • 介绍了EvalPlus,一个严格的程序合成评估框架,以自动化测试生成为驱动。
  • EvalPlus将基于LLM(使用ChatGPT进行提示)和基于变异的输入生成相结合,以获得多样化的测试输入集,以准确评估LLM生成代码的功能正确性。
  • 创建了HUMANEVAL+,通过增加高质量和自动生成的测试输入来扩展流行的HUMANEVAL基准测试。
  • 通过测试套件缩减,创建了比HUMANEVAL+小47倍的HUMANEVAL±MINI,同时保持几乎相同的测试效果。
  • 在新的基准测试中,广泛评估了各种不同的LLM,并展示了HUMANEVAL+可以识别出LLM生成的大量以前未被检测到的错误代码,证明了它在增强编程基准测试以进行更准确评估方面的有效性。

展望

  • 正在进行的工作包括将更高质量的测试引入更多的代码基准测试中,例如MBPP。
  • 可以继续探索更多和更好的测试生成技术,以不断提高基准测试的质量。
  • 可以研究如何将EvalPlus与更多形式验证工具(如翻译验证)集成,以提供更强的评估结果保证。
  • 核心测试生成技术还可以用于提醒开发人员对接受的LLM生成代码片段进行潜在缺陷的检查,特别是在AI对编程方面的应用中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单链表,循环链表和双向链表的时间效率比较,顺序表和链表的比较,有序表的合并------用顺序表实现,用链表实现】

文章目录 一、单链表&#xff0c;循环链表和双向链表的时间效率比较二、顺序表和链表的比较三、线性表的应用1.线性表的合并1.1有序表的合并------用顺序表实现1.2有序表的合并--------用链表实现 一、单链表&#xff0c;循环链表和双向链表的时间效率比较 查找表头结点&#…

C语言每日一题(19)回文素数

牛客网 BC157 回文素数 题目描述 描述 现在给出一个素数&#xff0c;这个素数满足两点&#xff1a; 1、 只由1-9组成&#xff0c;并且每个数只出现一次&#xff0c;如13,23,1289。 2、 位数从高到低为递减或递增&#xff0c;如2459&#xff0c;87631。 请你判断一下&am…

React中的Virtual DOM(看这一篇就够了)

文章目录 前言了解Virtual DOMreact创建虚拟dom的方式React Element虚拟dom的流程虚拟dom和真实dom的对比后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react合集 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌…

双非本两年经验,靠这套Java面试题拿下拿下阿里、百度、美团、滴滴、快手、拼多多等大厂offer

背景 博主是双非大学毕业&#xff0c;有两年的互联网经验 社招面试也是一样的流程&#xff1a;项目 八股 算法 项目&#xff1a; 公司项目&#xff0c;涉及的技术包括但不限&#xff1a; 管理域&#xff1a;DDD、CQRS、事件总线、命令总线 运行域&#xff1a;微内核、规则…

卡尔曼滤波(Kalman Filter)原理及Python实现

Kalman-Filter-Example 项目地址 https://github.com/zhengjie9510/kalman-filter-example 理论公式 详细理论可参考DR_CAN关于卡尔曼滤波器的视频讲解。https://www.bilibili.com/video/BV1dV411B7ME 卡尔曼滤波公式分为预测和更新两部分。 预测公式为&#xff1a; x_hat…

IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘t_user‘ 中的标识列插入显式值

出现这个问题的原因 出现这个问题一般都是SQL server数据库&#xff0c;在创建表主键的时候双击修改标识规范默认自增&#xff0c;如果再插入显示的值就会出现这样的问题。这样的问题是非常常见的&#xff0c;通常会出现在大量数据插入表中&#xff0c;列如 解决的办法 在…

最新发布!阿里云卓越架构框架重磅升级

云布道师 10 月 19 日阿里云峰会山东上&#xff0c;阿里云重磅升级《阿里云卓越架构白皮书》&#xff0c;助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相&#xff0c;这是阿里云基于多年服务各行各业客…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的&#xff0c;此时系统会弹出询问权限的对话框&#xff0c;而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Dart HttpClient 网络请示框架的使用详解

Dart的HttpClient库是一个用于发送HTTP请求的库&#xff0c;它提供了一个简单的API来执行HTTP请求和接收响应。下面是一个详细的HttpClient使用指南。 1. 导入HttpClient库 首先&#xff0c;确保你已经将HttpClient库导入到你的Dart项目中。你可以使用pubspec.yaml文件中的de…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable&#xff0c;在 java.lang 包下。 Throwable 类的方法主要有&#xff1a; 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…

【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段

本文实现借助arcgis模型构建器,实现批量为多个土地利用矢量数据添加相同的字段,例如DLMC,DLTB等。 文章目录 问题分析模型构建问题分析 有多个土地利用数据矢量图层,每个图层中有很多个图斑,现在需要给每个图层添加一个或者多个字段,如DLCM,DLBM等。 属性表如下所示: …

javaEE -10(11000字详解5层重要协议)

一&#xff1a;应用层重点协议 1.1&#xff1a; DNS DNS&#xff0c;即Domain Name System&#xff0c;域名系统。DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机&#xff0c;但是IP地址不方便记忆&#xff0c;且不能表达地址组织信息&#x…

python+requests+unittest执行自动化接口测试!

1、安装requests、xlrd、json、unittest库 <1>pip 命令安装&#xff1a; pip install requests pip install xlrd pip install json pip install unittest <2> pycharm里安装 2、利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施…

mysql读取文件

环境地址&#xff1a;phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章&#xff1a; mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客&#xff0c;安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …

linux离线环境中进入docker镜像安装python包

背景 当发现docker镜像因缺少python包执行失败时,需要修改docker镜像,这时候需要用到这个方法 执行失败步骤 (1)、拷贝docker镜像文件 (2)、加载镜像文件 docker load -i jetz_match.tar(3)、执行容器 docker run --name jetz_match -v /opt/jetz_match:/jetzmatch…

第2篇 机器学习基础 —(2)分类和回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习中的分类和回归都是监督学习的问题。分类问题的目标是将输入数据分为不同的类别&#xff0c;而回归问题的目标是预测一个连续的数值。分类问题输出的是物体所属的类别&#xff0c;而回归问题输出的是数值。本节课就…

waf绕过

1.市场Waf分类 硬件Waf&#xff1a;绿盟、安恒、启明、知道创宇等 需要选择模式 透明模式 反向代理分为反向代理&#xff08;代理模式&#xff09;与反向代理&#xff08;牵引模式&#xff09; 反向代理又分为两种模式&#xff0c;反向代理…

C++常见容器实现原理

引言 如果有一天&#xff01;你骄傲离去&#xff01;&#xff08;抱歉搞错了&#xff09;如果有一天&#xff0c;你在简历上写下了这段话&#xff1a; 那么你不得不在面试前实现一下STL常见的容器了。C的常用容器有&#xff1a;vector、string、deque、stack、queue、list、se…

合宙ESP32C3之Arduino、MicroPython上手

此处所说的ESP32C3&#xff0c;是合宙9.9元包邮的那一款&#xff0c;即所谓的“简约款”&#xff0c;无串口芯片。虽然有串口芯片的经典款版本兼容性更好&#xff0c;但随着各种IDE的不断升级&#xff0c;无串口使用起来也能游刃有余。 1.Arduino环境搭建 首先到Arduino.cc上下…