WizardCoder: Empowering Code Large Language Models with Evol-Instruct


TL;DR

本文提出了一种名为 \(Code Evol-Instruct\) 的方法,通过自动进化和增强编程指令的复杂性,来精调(fine-tune)代码大语言模型,从而创造出在多个基准测试中性能卓越的 \(WizardCoder\) 模型系列。

关键定义

本文的核心是围绕 \(Code Evol-Instruct\) 这一新方法展开的,并由此产生了 \(WizardCoder\) 模型。

相关工作

本文方法

本文的核心贡献是 \(Code Evol-Instruct\) 方法,它通过迭代进化来提升代码指令的质量,并用此数据训练出 \(WizardCoder\) 模型。

方法概览 图注:Code Evol-Instruct 方法示意图。

方法流程

整个流程分为两个步骤:

  1. 指令进化: 首先,以一个基础的代码指令数据集(本文使用 Code Alpaca)作为种子。然后,应用 \(Code Evol-Instruct\) 技术对这些指令进行迭代式进化。
  2. 模型精调: 使用进化产生的高复杂度指令数据集,对预训练好的开源代码大语言模型(如 StarCoder 和 CodeLlama)进行精调,最终得到 \(WizardCoder\) 模型。

创新点:Code Evol-Instruct 的设计

\(Code Evol-Instruct\) 的创新之处在于其专为代码任务设计的进化策略。它通过一个特定的提示模板,驱动一个大型语言模型(如 GPT-3.5)来增强指令难度。

进化提示词模板: ``\(Please increase the difficulty of the given programming test question a bit. You can increase the difficulty using, but not limited to, the following methods: {method} {question}\)`\(其中,\){question}\(是待进化的原始指令,\){method}$$ 是从以下五种专门设计的代码进化启发式方法中随机选择一种:

  1. 增加约束: 为原问题增加新的约束和要求(约增加10个词)。
  2. 替换需求: 将一个编程任务中常用的需求替换为一个不常用且更具体的需求。
  3. 深化推理: 如果原问题只需少量逻辑步骤即可解决,则增加更多的推理步骤。
  4. 引入误导: 提供一段错误的代码作为参考,以增加迷惑性(一种对抗性样本思路)。
  5. 提升复杂度要求: 提出更高的时间或空间复杂度要求(但不频繁使用)。

训练过程

训练数据集的构建始于 Code Alpaca 数据集。通过 \(Code Evol-Instruct\) 对其进行多轮迭代进化,每一轮进化产生的数据都会与之前所有轮次的数据及原始数据合并,用于模型精调。训练过程中会使用一个外部开发集来判断何时停止进化(Evol Stop),以防性能下降。

精调提示词格式: \(`\) Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

Instruction:

{instruction}

Response:

\(`\)

多语言性能对比 图注:WizardCoder-34B 在多种编程语言上相较于当时的开源SOTA模型(CodeLlama-34B系列)展现出显著优势。

实验结论

本文在 HumanEval、HumanEval+、MBPP、DS-1000 和 MultiPL-E 五大代码生成基准上进行了全面评估,实验结果充分验证了 \(WizardCoder\) 的卓越性能。

核心实验结果

EvalPlus 排行榜 图注:在 EvalPlus 排行榜上,WizardCoder-34B 在 HumanEval+ 上的表现优于 GPT-3.5,仅次于 GPT-4。

模型 参数 HumanEval MBPP
闭源模型      
GPT-3.5 (ChatGPT) 未知 48.1 52.2
GPT-4 未知 67.0 -
开源模型      
StarCoder-15B 15B 33.6 43.6*
CodeLlama-Python-34B 34B 53.7 56.2
WizardCoder (本文) 15B 57.3 51.8
WizardCoder (本文) 34B 71.5 61.2

表注:在 HumanEval 和 MBPP 基准上的 pass@1 (%) 结果对比。

深入分析与结论