点击上方“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的整体架构,主要分为两个阶段:教学阶段和自学习阶段。在教学阶段,模型主要通过从教师模型中提取知识来学习。在自学习阶段,它自主进行学习。如下图所示:
其中在「教学阶段」,旨在获取开源代码片段,并使用GPT-4 Turbo作为教师模型进行补充和修正。该过程主要由四个主要步骤组成:
「关于自学习阶段」,首先进入自学习阶段的前提是学习模型结果要好于教师模型结果。怎么说呢?这里作者将教学阶段生成的数据集按照1:9的比例分成测试集和训练集。利用训练集来训练学生模型(就是本文作者提出的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 在基础模型上表现出更强的改进。