魔术编码师:为什么它是最好的编码模型存在

编码术士的魔力:为什么它是最优秀的编码模型之选

在这个博客中,我们将深入探讨WizardCoder是什么,以及为什么它在该领域中独树一帜。我们还将探索为什么它在HumanEval基准测试中的性能异常出色。此外,我们还将深入研究数据集准备和微调过程如何促成WizardCoder的成功。

首先从对WizardCoder的简介开始,WizardCoder是一个在Llama2上进行微调的代码大型语言模型(LLM),在显著的代码生成基准测试中表现出卓越的性能,胜过其他开源和闭源LLM。

Source: WizardCoder paper

WizardCoder的独特之处

人们可能想知道是什么让WizardCoder在HumanEval上的表现如此出色,尤其考虑到其相对较小的体积。为了让您了解情况,我们来比较一下WizardCoder-python-34B和CoderLlama-Python-34B:

HumanEval Pass@1

WizardCoder-python-34B = 73.2%

CoderLlama-Python-34B = 53.7%

造成HumanEval基准测试性能差异如此之大的独特而重要的因素是模型训练所使用的数据集

数据的力量:WizardCoder的独特数据集

造成WizardCoder出色表现的一个关键因素是它的训练数据集。大多数模型依赖于一种典型的数据集结构,其中通常包括:

  • 大量简单指令
  • 较少的复杂指令
  • 以及极少量的真正复杂指令
Source: https://www.youtube.com/watch?v=0R_2layS6Ho

为了训练在评估基准上性能达到巅峰的模型,训练数据集应该在简单指令、复杂指令和真正复杂指令之间保持平衡。

Source: https://www.youtube.com/watch?v=0R_2layS6Ho

这就是WizardCoder的数据集优势所在。它拥有:

  • 相当数量的真正复杂指令
  • 相当数量的复杂指令
  • 大量简单指令作为基础

但是存在一个挑战:创建包含复杂指令的数据集本质上是困难的,而简单指令则容易获得。

Evol Instruct

Evol-Instruct是一种使用LLMs(GPT-4)生成多样复杂指令数据集的进化算法。它旨在通过提供难以手动创建的高质量指令,来提升LLMs的性能。

Source: https://www.youtube.com/watch?v=0R_2layS6Ho

在简单的团队中,Evol-Instruct是一个由合成生成(GPT-4)指令数据集的复杂级联。

指令演进

LLM可以使用特定提示使给定的指令更加复杂和困难。此外,它们可以生成完全不同但同样复杂的全新指令。利用这一点,我们可以迭代演化初始指令数据集,提高难度水平,扩展其丰富性和多样性。

A.指令演进器

指令演进器是一个使用提示来演进(开发)指令的LLM,有两种类型:

  1. 深度演进。
  2. 广度演进。

给定一个基础数据集(例如,通过自我指导生成的Alpaca数据集或由真实用户共享的70k ShareGPT),利用这个基础数据集,我们可以创建一个更加复杂和多样的数据集。

a)深度演进

深度演进通过五种类型的提示使指令更加复杂和困难:

深度演进的提示

深度演进的目标是:

(i)添加约束

(ii)深化

(iii)具象化(更加具体)

(iv)增加推理步骤

(v)复杂化输入

深度演进的提示的核心部分是

“您的目标是将给定的提示重新编写成一个更加复杂的版本,以使那些著名的Al系统(例如ChatGPT和GPT4 [3])更加难以处理。但是,重新编写的提示必须是合理的、可理解的,并且可以由人类做出回应。”

添加约束的示例提示是:

我希望你扮演一个提示重写者的角色。

您的目标是将给定的提示重新编写成一个更加复杂的版本,以使那些著名的

Al系统(例如ChatGPT和GPT4)更加难以处理。但是,重新编写的提示必须是合理的,并且必须被人类理解和回应。您的重写不能省略诸如表格和代码在#给定提示#中的非文本部分。此外,请不要省略#给定提示#中的输入。

您应该尽力通过以下方法使给定提示复杂化:

请在#给定提示#中增加一个更多的约束要求

您应该尽量不使#重新编写提示#变得啰嗦,#重新编写提示#只能在#给定提示#中添加10到20个单词。

#给定提示#,#重新编写提示#,和’给定提示’和’重新编写提示’都不允许出现在#重新编写提示#中。

#给定提示#

<这是一条指令。>

#重新编写提示#:

这些提示有助于生成一个复杂的指令数据集,其他类型的深度演进也有类似的模板。

b)广度演进

广度演进解决了开放域指令微调数据集(例如Alpaca,ShareGPT等)的限制,这些数据集在规模上经常很小,缺乏主题和技能的多样性。广度演进通过设计一个提示来要求基于给定指令生成一个全新的指令,使新指令更加尾部长。

广度演进的提示

广度演进的目标是:

1.增强主题覆盖面

2.技能覆盖面

3.整体数据集的多样性

广度演进的提示如下:

我希望你扮演一个提示创作者的角色。

您的目标是从#给定提示#中汲取灵感,创造一个全新的提示。

这个新的提示应该属于与#给定提示#相同的领域,但更加罕见。

#创建的提示#的长度和难度水平应与#给定提示#相似。

#创建的提示#必须是合理的,并且必须被人类理解和回应。

#给定提示#,#创建的提示#,’给定提示’和’创建的提示’都不允许出现在#创建的提示#中。

#给定提示#:

«这是一条指令.>

#创建的提示#:

B. 响应生成

使用相同的LLM来生成演化指令的对应响应,使用提示:<这是指令>

C. 消除演化(指令消除器)

演化的指令可能会挑战LLM的响应生成。有时,当生成的响应包含“抱歉”并且长度相对较短(即少于80个字),通常表明LLM难以对演化的指令做出响应。因此,我们可以使用这个规则做出判断。

LLM生成的响应仅包含标点符号和停用词。

D. 对演化指令进行微调

一旦所有演化完成,将初始指令数据集(Alpaca的52K指令数据集)与所有时代的演化指令数据合并,并对样本进行随机重排,以创建最终的微调数据集。此处理确保数据集中包含难度不同的指令的均匀分布,最大程度地提高模型微调的平滑度。

Wizardlm通过将演化指令与开源模型LLaMA 7B进行微调,并评估其性能来验证Evol-Instruct,并为该模型命名为WizardLM。

Evol-Instruct的工作原理是通过生成一系列初始指令(Alpaca的52k指令数据集),然后通过一系列步骤对其进行演化,创建更复杂和多样化的指令。生成指令池后,使用它对LLM进行微调,从而创建一个名为WizardCoder的新模型。微调过程包括在指令数据上训练LLM,以提高其对于各种输入的生成连贯和流畅文本的能力。

提示格式

对于WizardCoder,提示应按以下方式设置:

下面是描述任务的指令。编写一个适当完成请求的响应。### 指令:{指令}### 响应:

最佳使用案例

WizardCoder可用于多种与代码相关的任务,包括代码生成、代码补全和代码摘要。以下是可以与该模型一起使用的输入提示的一些示例:

  • 代码生成:根据编程任务的描述,生成相应的代码。示例输入:“编写一个Python函数,接受一个整数列表作为输入,并返回列表中所有偶数的和。”
  • 代码补全:补全不完整的代码片段。示例输入:“def multiply(a, b): \n return a * b _”
  • 代码摘要:根据长代码片段生成摘要。示例输入:“编写一个Python程序,读取CSV文件并计算特定列的平均值。”

34B模型不仅是一个编码助手,而且是一个功能强大的工具,可以:

  1. 自动化DevOps脚本:为自动化任务生成Shell脚本或Python脚本。
  2. 数据分析:为数据预处理、分析和可视化生成Python代码。
  3. 机器学习流程:生成端到端的机器学习流程,从数据收集到模型部署。
  4. 网页抓取:生成用于网页抓取任务的代码。
  5. API开发:生成用于RESTful API的样板代码。
  6. 区块链:为以太坊或其他区块链平台生成智能合约。

评估

根据人工评估、人工评估+、MBPP和DS-100等四项生成代码基准测试的实验结果,WizardCoder击败了所有其他开源编码LLM,达到了最先进的(SOTA)性能。

WizardCoder-Python-34B在与代码相关的任务上表现出了卓越的性能。该模型在著名的代码生成基准测试中的表现优于其他开源和闭源LLM,包括HumanEval(73.2%),HumanEval+和MBPP(61.2%)

WizardCoder-Python-34B-V1.0在HumanEval基准测试中排名第二,胜过GPT4(2023/03/15,73.2 vs. 67.0),ChatGPT-3.5(73.2 vs. 72.5)和Claude2(73.2 vs. 71.2)。+

来源:WizardCoder paper

WizardCoder-15B-v1.0 模型在 HumanEval Benchmarks 上实现了 57.3 pass@1 的成绩,比 SOTA 开源 Code LLMs 高出 22.3 分,包括 StarCoder、CodeGen、CodeGee 和 CodeT5+。此外,WizardCoder 在包括指示微调的所有开源 Code LLMs 中,包括 InstructCodeT5+、StarCoder-GPTeacher 和 Instruct-Codegen-16B 在内,表现都优于它们。

来源:WizardCoder paper

总之,WizardCoder 的成功归功于其独特的数据集和创新性地使用 Evol-Instruct 来增强指示复杂性,从而在各种代码相关任务和基准测试中取得出色的表现。

参考资料

YouTube:WizardCoder 34B:复杂微调解释

GitHub

论文:WizardLM-使大型语言模型能够遵循复杂指示

论文:WizardCoder:利用Evol-Instruct赋能代码大型语言模型