众所周知,在 ChatGPT 的问题上 OpenAI 并不 Open,从 Meta 那里开源的羊驼系列模型也因为数据集等问题「仅限于学术研究类应用」,在人们还在因为寻找绕过限制方法的时候,主打 100% 开源的大模型来了。
4 月 12 日,Databricks 发布了 Dolly 2.0,这是两周前发布的类 ChatGPT 人类交互性(指令遵循)大语言模型(LLM)的又一个新版本。
Databricks 表示,Dolly 2.0 是业内第一个开源、遵循指令的 LLM,它在透明且免费提供的数据集上进行了微调,该数据集也是开源的,可用于商业目的。这意味着 Dolly 2.0 可用于构建商业应用程序,无需支付 API 访问费用或与第三方共享数据。

根据 Databricks 首席执行官 Ali Ghodsi 的说法,虽然已有其他大模型可以用于商业目的,但「它们不会像 Dolly 2.0 那样与你交谈。」而且基于 Dolly 2.0 模型,用户可以修改和改进训练数据,因为它是在开源许可下免费提供的。所以你可以制作你自己的 Dolly 版本。
Databricks 还发布了 Dolly 2.0 在其上进行微调的数据集,称为 databricks-dolly-15k。这是由数千名 Databricks 员工生成的超过 1.5 万条记录的语料库,Databricks 称这是「第一个开源的、人工生成的指令语料库,专门设计用于让大型语言能够展示出 ChatGPT 的神奇交互性。」
在过去的两个月里,业界、学界纷纷追赶 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 团队期望新模型和开源数据集将作为众多后续工作的种子,帮助引导出更强大的语言模型。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#