
ChatGPT 正在迅速发展与传播,新的大型语言模型 (LLM) 正在以越来越快的速度开发。就在过去几个月,有了颠覆性的 ChatGPT 和现在的 GPT-4。明确定义,GPT 代表(Generative Pre-trained Transformer),是底层语言模型,而 ChatGPT是为会话设计的具体实现。比尔·盖茨 (Bill Gates) 回顾 OpenAI 的工作时说,“人工智能时代已经开始”。如果感到难以跟上快速变化的步伐,那么并不孤单。就在刚才,超过 1000 名研究人员签署了一份请愿书,要求在未来六个月内暂停训练比 GPT-4 更强大的 AI 系统。
尽管技术成就显着,但它们仍然是闭门造车。尽管它的名字,OpenAI 长期以来一直受到一些人的批评,因为它没有发布他们的模型,甚至被一些人称为 ClosedAI。研究人员和爱好者都在努力寻找开源替代品。
如果错过了最近的发展,应该看看 Meta 的 LLaMA ( GitHub ),它应该优于 GPT-3。它是在 GNU 许可下获得许可的,虽然它不是严格开源的,但可以在注册后获得权重。这种开放显然是为了 LLaMA 的利益,社区很快就继续开发它。它很快以 llama.cpp 的形式移植到 C/C++,斯坦福大学的研究人员将其扩展到一个指令跟随模型,例如 ChatGPT,并将其命名为 Alpaca。还有 GPT4All,这篇博文是关于它的。
首先,来反思一下社区在短时间内开发开放版本的速度有多快。为了了解这些技术的变革性,下面是各个 GitHub 仓库的 GitHub 星数。作为参考,流行的 PyTorch 框架在六年内收集了大约 65,000 颗星。下面的图表是大约一个月。

但现在,来更深入地介绍 GPT4All。这是 Nomic AI 的助手式聊天机器人,刚刚公开发布。
如何基于现有的语言模型(如 LLaMA)创建类似 ChatGPT 的助手式聊天机器人?答案可能会大吃一惊:与聊天机器人互动并尝试了解它的行为。就 gpt4all 而言,这意味着从公开可用的数据源收集各种问题和提示样本,然后将它们交给 ChatGPT(更具体地说是 GPT-3.5-Turbo)以生成 806,199 个高质量的提示生成对。接下来,整理数据并删除低多样性响应,并确保数据涵盖广泛的主题。训练数据后,发现他们的模型比同类产品表现更好。
对我来说,其中一个主要吸引力在于作者发布了模型的量化 4 位版本。这是什么意思?实际上,在模型中以降低的精度而不是全精度执行某些操作,因此可以拥有更紧凑的模型。虽然像 ChatGPT 这样的模型在 Nvidia 的 A100 等专用硬件上运行,这是一款配备高达 80 GB RAM 的硬件怪兽,价格为 15,000 美元,但对于 GPT4All,意味着可以在消费级硬件上执行该模型。
运行 GPT4All 的说明很简单,只要安装了正在运行的 Python,按照 GitHub 存储库上的设置说明进行操作即可。
4.2 Gb 的大小,完全下载需要一定的时间在 M1 MacBook Pro 上对此进行了测试,这意味着只需导航到 chat- 文件夹并执行 ./gpt4all-lora-quantized-OSX-m1。

设置一切应该需要几分钟,下载是最慢的部分,结果是实时返回的。
现在,准备运行的 GPT4All 量化模型在基准测试时表现如何?虽然有详尽的基准测试集,但以下是可以预期的一些快速见解:

虽然有一些明显的错误(NLP -> NLU),但实际上对输出感到非常惊讶。
可以尝试一些更有创意的东西,比如诗歌:

发现这确实非常有用,同样,考虑到这是在 MacBook Pro 笔记本电脑上运行的。虽然它可能不在 GPT-3.5 甚至 GPT-4 级别,但它肯定有一些魔力。
使用 GPT4All 时,请牢记作者的使用注意事项:
GPT4All 模型重量和数据仅用于研究目的并获得许可,禁止任何商业用途。GPT4All 基于 LLaMA,具有非商业许可。辅助数据是从 OpenAI 的 GPT-3.5-Turbo 收集的,其使用条款禁止开发与 OpenAI 进行商业竞争的模型。
此外,请注意 ChatGPT 具有多项安全功能。
开源项目和社区努力在实施技术和加速创意方面非常强大。GPT4All 就是一个显着的体现。从根本上说,这为闭源模型的业务方面提供了一个有趣的视角。如果提供 AI 作为服务,那么需要多长时间才能让爱好者对 AI 进行足够长的探索以能够模仿它?对于 GPT4All 的案例,论文中有一个有趣的注释:花了四天的时间,GPU 成本 800 美元,OpenAI API 调用 500 美元,这具有足够的吸引力。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下