前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >牛叉!UConn | 提出代码生成大模型:AutoCoder,性能超越GPT-4o!

牛叉!UConn | 提出代码生成大模型:AutoCoder,性能超越GPT-4o!

作者头像
ShuYini
发布2024-05-29 14:32:06
4360
发布2024-05-29 14:32:06
举报

点击上方“AINLPer“,设为星标

更多干货,第一时间送达

引言

大模型训练需要高质量数据集,这对于代码生成任务来说尤其重要。为此本文提出了一种新型大规模代码指令数据集标注方法:AIEV-INSTRUCT,得到了一个高质量代码指令数据集:AutoCoder-AIEV-Instruct,基于该数据集,作者训练了代码生成大模型:AutoCoder,该模型在HE基准测试集上的pass@1指标超过了GPT-4 Turbo和GPT-4o,并且还提供了一个可自动安装外部依赖包的代码解释器。

https://arxiv.org/pdf/2405.14906

背景介绍

代码生成是当前软件开发人员的必备工具。它在代码标准化、软件原型设计、降低代码错误、复杂系统开发等方面,极大的提高了开发人员的工作效率。最近随着大模型技术(GPT-4、GPT-4o、 CodeQwen1.5 等)的发展,其在代码生成方面取得了重大的进步。这些模型在代码生成方面展现出了很高的准确性,并已实际应用在了软件开发中

训练大模型需要大量的高质量数据,这对于需要高精度的代码生成任务尤其重要。OpenAI 就曾经找人注释 Code Instruct 数据集来训练 InstructGPT。然而,手动注释大量的代码指令数据集既费时又费力

为了应对这一问题,先前的研究人员提出了各种自动化代码注释方法,例如:SELF-INSTRUCT 、EVOL-INSTRUCT和OSS-INSTRUCT。其中,SELF-INSTRUCT 通过使用强大的教师模型生成综合编码指令来微调较弱的学生模型,从而增强LLMs的指令跟随能力。OSS-INSTRUCT 通过从开源代码片段中汲取灵感,生成多样化的编码问题。此类方法的本质在于应用强大的教师模型(例如 GPT-4 Turbo)的知识来指导较小的模型。

这就带来了一个问题:虽然小模型可以实现显着的性能提升,但小模型的最终精度不太可能超越教师模型。因为教师模型中正确和错误的知识都会转移到小模型中。此外,尽管与手动标注相比,使用闭源模型降低了成本,但使用闭源模型的成本仍然很高。就拿OpenAI的 GPT-4 Turbo 模型来说,生成6,500条高质量代码指令数据集就需要1000美元。

那么问题来了:

  • 能否纠正教师模型生成的不正确案例,为学生模型提供更准确的学习案例呢?
  • 能否让学生模型自主学习,而不是依赖昂贵的闭源模型呢?

针对以上两个问题,本文作者提出了一种新型大规模代码指令数据集标注方法,称为 AIEV-INSTRUCT,该方法将Agent交互和代码执行验证相结合,保证了生成代码数据集的准确性,并以此训练了得到了代码生成模型:AutoCoder,在HEB数据集上的效果超过了GPT-4 Turbo和GPT-4o。

AIEV-INSTRUCT

AIEV-INSTRUCT的整体架构,主要分为两个阶段:教学阶段自学习阶段。在教学阶段,模型主要通过从教师模型中提取知识来学习。在自学习阶段,它自主进行学习。如下图所示:

其中在「教学阶段」,旨在获取开源代码片段,并使用GPT-4 Turbo作为教师模型进行补充和修正。该过程主要由四个主要步骤组成:

  • 「I:组件初始化」 对一些必要的组件进行初始化。将GPT-4 Turbo配置成两个角色:提问者和编程者。它可以确保生成的数据是多样化的,从而产生更均匀的概率分布,而不是收敛到特定的对话模板。对话消息被初始化为一个空列表,它将在整个过程中用于存储数据。最终,这个列表将包含多轮对话,整个对话将作为单个数据条目添加到最终数据集中。此外,还需要初始化一个 Docker 容器作为代码解释器。这个容器负责安装所需的外部包并执行整个过程中需要验证的代码。
  • 「II:提出问题」 首先利用GPT-4 Turbo执行OSS-Instruct,设计问题描述和具体解决方案,其中包括基于开源代码片段的代码片段。其中的区别是本文需要 GPT-4 Turbo 来提供一些单元测试。这些单元测试进一步确保了数据集中代码的准确性。上一步初始化的对话消息按顺序附加问题描述 (➀)、解决方案和单元测试 (➁)。
  • 「III:执行反馈」 作者采用多轮执行反馈来检查生成的代码,从而提高数据集的质量。首先,将第二步生成的代码片段输入到代码解释器中。如果发生执行错误,对话消息会附加详细的 Stderr 输出 (➂)。同时,将此 Stderr 信息提供给提问者,提问者将根据 Stderr 生成自然语言描述。这种自然语言描述也附加到对话消息中 (➃)。接下来,自然语言描述和Stderr都作为新问题提供给编程人员,编程人员将继续修改代码。对话消息将附加其生成的新代码 (➄) 并重复此过程。
  • 「在IV:过程终止」,作者还使用代码解释器来运行编程人员生成的代码。如果程序成功执行,标准输出将附加到对话消息 (➅)。这样就完成了一项数据条目的分析。

「关于自学习阶段」,首先进入自学习阶段的前提是学习模型结果要好于教师模型结果。怎么说呢?这里作者将教学阶段生成的数据集按照1:9的比例分成测试集和训练集。利用训练集来训练学生模型(就是本文作者提出的AutoCoder),训练完成后,作者使用测试集来评估教师模型和学生模型的表现。

如果教师模型表现好,那么将继续执行教学阶段、如果学生模型表现更好,那么才会进入自学习阶段,其中自学阶段和教学阶段的区别在于,在自学阶段,是用学生模型代替了原来的教师模型。学生模型本身被指定为提问者和编程人员,完成整个执行反馈过程。

AutoCoder

「代码解释器功能」 对于协助模型调试和代码执行至关重要。但是构建码解释器需要模型准确识别其需要运行的代码块,当前只有GPT-4 Turbo 和 InternLM-Chat 等少数模型支持代码解释器,然而此类代码解释器在封闭环境中,无法与外界系统交互,所以并不能执行安装外部包的代码。AutoCoder 通过允许执行 bash 命令来安装必要的包来解决这个问题,这就需要让教授模型在适当的时候运行bash命令来实现依赖包的安装。为了实现这一点,作者对 AutoCoder-AIEV-Instruct 数据集执行一些后处理。

如上图所示,对于一个简单的单次执行反馈示例,原始数据条目包含三部分:来自用户的自然语言;来自Assistant 的自然语言+bash命令+自然语言+代码块+自然语言;代码解释器的执行结果。

在后处理阶段,作者将代码执行请求的自然语言与用户的自然语言混合,使模型能够正确学习何时执行代码。然后,将代码执行请求响应混合到助手的响应中,这样它就可以生成连贯的答案。最后,在 Assistant 的原始响应中的 bash 命令和代码块之前和之后添加特殊标记,使模型能够学习正确识别需要执行的 bash 命令和代码块。

「AutoCoder训练」 作者使用AutoCoder-AIEV-Instruct数据集对两个基本模型 Deepseek-Coder 6.7B 和 33B 进行微调,以获得 AutoCoder 33B 和 AutoCoder-S 6.7B。我们利用Transformer库中的 AutoTokenizer 包向这些模型添加四个特殊标记,以启用 AutoCoder 的代码解释器功能。

实验结果

如下图,在python文本到代码生成方面,作者采用了HumanEval、MBPP进行测试,实验结果发现在HumanEval数据集上的 Pass@1超过了GPT4系列模型,达到了SOTA,并且结果超过绝大部分开源模型。

如下图,在多语言代码生成方面,AutoCoder 在 Java、C++ 和 Rust 中表现异常出色,分别达到了 61.4%、68.9% 和 60.8% Pass@1。 在其他三种语言中,其性能仅被CodeQwen1.5-Chat等少数模型超越。 这证明了 AutoCoder 在多语言代码生成方面的强大功能。

为了更直观地比较 AutoCoder 对基础模型带来的改进,本文将其与在与 AutoCoder 相同的基础模型上训练的几个模型进行了比较,可以发现AutoCoder 在基础模型上表现出更强的改进。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AINLPer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 背景介绍
  • AIEV-INSTRUCT
  • AutoCoder
  • 实验结果
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档