草庐IT

世界首款真开源类ChatGPT大模型Dolly 2.0,可随意修改商用

机器之心 2023-05-10 原文

众所周知,在 ChatGPT 的问题上 OpenAI 并不 Open,从 Meta 那里开源的羊驼系列模型也因为数据集等问题「仅限于学术研究类应用」,在人们还在因为寻找绕过限制方法的时候,主打 100% 开源的大模型来了。

4 月 12 日,Databricks 发布了 Dolly 2.0,这是两周前发布的类 ChatGPT 人类交互性(指令遵循)大语言模型(LLM)的又一个新版本。

Databricks 表示,Dolly 2.0 是业内第一个开源、遵循指令的 LLM,它在透明且免费提供的数据集上进行了微调,该数据集也是开源的,可用于商业目的。这意味着 Dolly 2.0 可用于构建商业应用程序,无需支付 API 访问费用或与第三方共享数据。

  • 项目链接:https://huggingface.co/databricks/dolly-v2-12b
  • 数据集:https://github.com/databrickslabs/dolly/tree/master/data

根据 Databricks 首席执行官 Ali Ghodsi 的说法,虽然已有其他大模型可以用于商业目的,但「它们不会像 Dolly 2.0 那样与你交谈。」而且基于 Dolly 2.0 模型,用户可以修改和改进训练数据,因为它是在开源许可下免费提供的。所以你可以制作你自己的 Dolly 版本。

Databricks 还发布了 Dolly 2.0 在其上进行微调的数据集,称为 databricks-dolly-15k。这是由数千名 Databricks 员工生成的超过 1.5 万条记录的语料库,Databricks 称这是「第一个开源的、人工生成的指令语料库,专门设计用于让大型语言能够展示出 ChatGPT 的神奇交互性。」

Dolly 2.0 是怎么诞生的

在过去的两个月里,业界、学界纷纷追赶 OpenAI 提出了一波遵循指令的类 ChatGPT 大模型,这些版本被许多定义视为开源(或提供某种程度的开放性或有限访问)。其中 Meta 的 LLaMA 最受人关注,它引发了大量进一步改进的模型,如 Alpaca、Koala、Vicuna 以及 Databricks 的 Dolly 1.0。

但另一方面,许多这些「开放」模型都处于「工业限制」之下,因为它们接受了旨在限制商业用途的条款的数据集的训练 —— 例如来自 StanfordAlpaca 项目的 5.2 万个问答数据集,是根据 OpenAI 的 ChatGPT 的输出进行训练的。而 OpenAI 的使用条款包括一条规则,即你不能使用 OpenAI 的服务反过来与其竞争。

Databricks 思考了解决这个问题的方法:新提出的 Dolly 2.0 是一个 120 亿参数的语言模型,它基于开源 EleutherAI pythia 模型系列,专门针对小型开源指令记录语料库进行了微调(databricks-dolly-15k),该数据集由 Databricks 员工生成,许可条款允许出于任何目的使用、修改和扩展,包括学术或商业应用。

到目前为止,在 ChatGPT 的输出上训练的模型一直处于合法的灰色地带。「整个社区一直在小心翼翼地解决这个问题,每个人都在发布这些模型,但没有一个可以用于商业用途,」Ghodsi 表示。「这就是我们非常兴奋的原因。」

「其他人都想做得更大,但我们实际上对更小的东西感兴趣,」Ghodsi 在谈到 Dolly 的微缩规模时说。「其次,我们翻阅了所有的答案,它是高质量的。」

Ghodsi 表示,他相信 Dolly 2.0 将启动「雪球」效应,让人工智能领域的其他人加入并提出其他替代方案。他解释说,对商业用途的限制是一个需要克服的大障碍:「我们现在很兴奋,因为我们终于找到了一个绕过它的方法。我保证你会看到人们将这 15000 个问题应用于现有的每一个模型,他们会看到这些模型中有多少突然变得有点神奇,你可以与它们互动。」

手搓数据集

要下载 Dolly 2.0 模型的权重,只需访问 Databricks Hugging Face 页面,并访问 databricks-labs 的 Dolly repo,下载 databricks-dolly-15k 数据集。

「databricks-dolly-15k」数据集包含 15000 个高质量的人类生成的 prompt / 回复对,由 5000 多名 Databricks 员工在 2023 年 3 月和 4 月期间撰写,专门设计用于指令调优大型语言模型。这些训练记录自然、富有表现力,旨在代表广泛的行为,从头脑风暴、内容生成到信息提取和总结。

根据该数据集的许可条款(Creative Commons Attribution-ShareAlike 3.0 Unported License),任何人都可因任何目的使用、修改或扩展这个数据集,包括商业应用。

目前,这一数据集是首个开源的、由人类生成的指令数据集

为什么要创建这样一个数据集?团队也在博客中解释了原因。

创建 Dolly 1.0 或任何遵循 LLM 的指令的一个关键步骤是,在指令和回复对的数据集上训练模型。Dolly 1.0 的训练费用为 30 美元,使用的是斯坦福大学 Alpaca 团队用 OpenAI API 创建的数据集。

在 Dolly 1.0 发布之后,就有很多人要求试用,此外还有一部分用户希望在商业上使用这个模型。

但是训练数据集包含 ChatGPT 的输出,正如斯坦福大学团队所指出的,服务条款试图阻止任何人创建一个与 OpenAI 竞争的模型。

此前,所有的知名指令遵循模型(Alpaca、Koala、GPT4All、Vicuna)都受到这种限制:禁止商业使用。为了解决这个难题,Dolly 团队开始寻找方法来创建一个没有商业用途限制的新数据集。

具体而言,团队从 OpenAI 公布的研究论文中得知,最初的 InstructGPT 模型是在一个由 13000 个指令遵循行为演示组成的数据集上训练出来的。受此启发,他们开始研究是否可以在 Databricks 员工的带领下取得类似的结果。

结果发现,生成 13000 个问题和答案比想象中更难。因为每个答案都必须是原创的,不能从 ChatGPT 或网络上的任何地方复制,否则会「污染」数据集。但 Databricks 有超过 5000 名员工,他们对 LLM 非常感兴趣。因此,团队进行了一次众包实验,创造出了比 40 位标注者为 OpenAI 创造的更高质量的数据集。

当然,这项工作耗时耗力,为了激励大家,团队设立置一个竞赛,前 20 名的标注者将获得惊喜大奖。同时,他们也列出了 7 项非常具体的任务:

  • 公开问答:例如「为什么人们喜欢喜剧电影?」或「法国的首都是什么?」在某些情况下,没有一个正确的答案,而在其他情况下,需要借助于整个世界的知识;
  • 封闭式问答:这些问题只用一段参考文献中的信息就可以回答。例如,给定维基百科中关于原子的一段,人们可能会问:「原子核中质子和中子的比例是多少?」;
  • 从维基百科中提取信息:在这里,标注者会从维基百科上复制一个段落,并从该段落中提取实体或其他事实信息,如重量或测量;
  • 总结维基百科上的信息:对于这一点,注释者从维基百科上提供了一段话,并被要求将其提炼为一个简短的摘要;
  • 集思广益:这项任务要求进行开放式的构思,并列出相关的可能选项。例如「这个周末我可以和我的朋友做哪些有趣的活动?」;
  • 分类:在这项任务中,标注者被要求对类别成员进行判断(例如,列表中的项目是动物、矿物还是蔬菜),或者判断一段短文的属性,例如电影评论的情绪;
  • 创意写作:这项任务将包括写一首诗或一封情书等内容。

以下是一些示例:

最开始,团队对于是否能达到 10000 个结果持怀疑态度。但通过每晚的排行榜游戏,一周内就成功地突破了 15000 个结果。

随后,出于对「占用员工生产力」的担心,团队关闭了比赛(这很合理)。

商业化的可行性

在数据集火速创建完成之后,团队开始考虑商业应用的问题了。

他们想制作一个可在商业上使用的开源模型。尽管 databricks-dolly-15k 比 Alpaca(训练 Dolly 1.0 的数据集)小得多,但基于 EleutherAI pythia-12b 的 Dolly 2.0 模型却表现出高质量的指令遵循行为。

事后看来,这并不令人惊讶。毕竟最近几个月发布的许多指令调优数据集包含合成数据,这些数据往往包含幻觉和事实错误。

另一方面,databricks-dolly-15k 是由专业人士生成的,质量很高,而且包含大多数任务的长篇答案。

以下是 Dolly 2.0 用于总结和内容生成的一些例子:

Dolly 团队表示,根据最初的客户反馈,像这样的能力可在整个企业中进行广泛的应用。因为很多企业希望拥有自己的模型,以此为自己的特定领域应用创建更高质量的模型,而不是将自己的敏感数据交给第三方。

Dolly 2 的开源为构建更好的大模型生态开了一个好头。开放源代码的数据集和模型鼓励评论、研究和创新,有助于确保每个人都从人工智能技术的进步中受益。Dolly 团队期望新模型和开源数据集将作为众多后续工作的种子,帮助引导出更强大的语言模型。

有关世界首款真开源类ChatGPT大模型Dolly 2.0,可随意修改商用的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

随机推荐