GPT4All发布可以在CPU+Windows的消费级硬件上生成embeddings向量的模型:低成本、高质量、易上手的embedding生成新选择
文本embedding是当前大模型应用中一个十分重要的角色。在长上下文支持、私有数据问答等方面有非常重要的应用。但是相比较开源领域快速发布的大模型节奏,开源的embedding模型和数据却非常少。今天,GPT4All宣布在其软件中增加embedding的支持,这是一个完全免费且可商用的产品,最重要的是可以在我们本地用CPU来做推理。

GPT4All简介
GPT4All是NomicAI维护的一个大模型软件生态系统,当前主要的目标是让大模型可以在消费级CPU上本地运行。虽然大模型效果很好,但是大多数大模型都是基于GPU+Linux生态系统打造,部署和训练都需要一定的软硬件条件。而GPT4All则尝试自己包装预训练结果文件,使其可以在消费级的电脑上使用,特别是可以在没有显卡的条件下快速运行大模型。
为此,GPT4All收集了业界相当多的模型并对其进行CPU推理的优化来使其在CPU硬件上快速运行。
GPT4All目前支持如下模型:

下载链接和具体信息参考模型卡:https://www.datalearner.com/ai-models/pretrained-models/GPT4All
可以看到,大多数模型都是经过量化的预训练结果,其物理文件大小都在8GB以内,正常情况16G内存都可以完全载入使用。需要注意的是,上述模型中很多模型是不支持商用的(基础模型是LLaMA都不行),因此选择的时候需要注意。
GPT4All本身提供了软件界面供大家使用,具体参考:GPT4All:一个可以直接在本地运行各大商业友好的开源大模型解决方案,本文不再赘述。
简单总结一下GPT4All的优点:
- 可以在Windows+CPU下运行,16GB内存即可
- 支持业界多个开源可商用以及非商用的模型
- 支持基于本地文档的问答
- 支持文本embeddings
- 有一个人机交互的页面操作,也支持python库引入
大家要注意的是上表最后一个模型,即Bert,其实完整文件名是ggml-all-MiniLM-L6-v2-f16.bin,是一个用以生成embedding的模型,也是2023年7月15日刚新增的一个用来生成embedding的模型。是本文要介绍的功能。
GPT4All为什么要支持Embedding模型
嵌入(Embedding)是深度学习方法处理自然语言文本最重要的方式之一。它将人类的自然语言和文本转换成一个浮点型的向量。向量之间的距离代表了它们的关系。
但是,大语言模型时代,例如ChatGPT这样的模型流行之后,大家发现embedding有了新的价值,即解决大模型的输入限制。
像 GPT-3 这样的语言模型有一个限制,即它们可以处理的输入文本量有限。这个限制通常在几千到数万个tokens之间,具体取决于模型架构和可用的硬件资源。
这意味着对于更长的文本,例如整本书或长文章,可能无法一次将所有文本输入到语言模型中。在这种情况下,文本必须被分成较小的块或“片段”,可以由语言模型单独处理。但是,这种分段可能会导致输出的上下文连贯性和整体连贯性问题,从而降低生成文本的质量。
这就是Embedding的重要性所在。通过将单词和短语表示为高维向量,Embedding允许语言模型以紧凑高效的方式编码输入文本的上下文信息。然后,模型可以使用这些上下文信息来生成更连贯和上下文适当的输出文本,即使输入文本被分成多个片段。
此前,OpenAI官方也发布了一个案例,即如何使用embedding来解决长文本输入问题,我们DataLearner官方博客也介绍了这个教程:OpenAI官方教程:如何使用基于embeddings检索来解决GPT无法处理长文本和最新数据的问题。
Embed4All简介
Embed4All是GPT4All在2023年7月15日发布的一个新能力。此前GPT4All的模型主要是生成模型,支持文本生成和聊天的应用。而Embed4All则是根据文本内容生成embedding向量结果。
根据官方的描述,GPT4All发布的embedding功能最大的特点如下:
- 支持消费级的CPU和内存运行,成本低,模型仅45MB,1GB内存即可运行
- 速度很快:每秒支持最高8000个token的embedding生成
- 除了C,没有其它依赖
- 效果好,选用的是MiniLM模型,在MTEB综合测评排名25,得分56.26,第一名得分62.25,差距很小(考虑到这是CPU运行的,很可以了)
目前Embed4All仅支持从python代码引入调用,界面我测试还不行。
不过,目前它的输出仅有384维,但是速度很快:
Tokens数量 | 128 | 512 | 2048 | 8129 | 16384 |
---|---|---|---|---|---|
时间 | 0.02秒 | 0.08秒 | 0.24秒 | 0.96秒 | 1.9秒 |
每秒处理的tokens数 | 6508 | 6431 | 8622 | 8509 | 8369 |
我测试的结果是9400个中文,需要9秒生成,CPU是i5-8600K~~
Embed4All用于大模型基于私有化数据问答的实际小案例
这里我们用一个例子来测试一下这个embedding对于大模型带来的价值。主要是如何提高大模型基于私有数据进行问答的价值。
假设有这个场景,我们使用了一个业界的通用模型,如MPT,我们提问如下问题:when does claude2 published?
由于Cluade 2是Anthropic在2023年7月12日发布的第二代大模型(具体参考:最像OpenAI的企业Anthropic的重大产品更新:GPT-4最强竞争模型Claude2发布!免费!具有更强的代码能力与更长的上下文!)。显然,这个数据很新,MPT是无法知道的。测试结果如下:

可以看到,MPT在胡说八道,其实它根本不知道,随便给了一个错误答案。
那么,现在假设我们DataLearner的模型库记录了所有的模型信息,并且一直更新(DataLearner模型库在此:https://www.datalearner.com/ai-models/pretrained-models )。这里我们记录了ChatGPT,也记录了Claude2等业界各种模型的信息,包括参数大小、发布日期等。假设我们有2条文本分别记录了上面的ChatGPT和Claude2模型:
claude_text = 'Anthropic is a company focused on artificial intelligence (AI) research, founded by former OpenAI researcher Dario Amodei. Claude is the large language model based on the transformer architecture released by Anthropic, which is considered to be the closest commercial product to ChatGPT. On July 12, 2023, Anthropic announced the official launch of Claude 2.'
chatgpt_text = "ChatGPT is a large language model trained by OpenAI based on the GPT-3.5 architecture. It is designed to understand and generate natural language text and is capable of answering various questions, providing information, solving problems, and engaging in interesting conversations. ChatGPT was released in late November 2022."
显然,我们的数据库中是记录了这个Claude2的准确发布日期的答案的。那么,我们可以按如下步骤操作:
私有数据向量化
首先将我们数据库中这些信息转成embedding向量,即每一个模型信息卡信息抽取一个向量embeddding结果,如下图所示,我们将这两段文本转成一个向量:

问题向量化
当用户提问之后,再将的提问转成一个embedding:

搜索最相似的文本
根据embedding相似度计算,找出最相似的文本:

基于检索得到的私有数据改造问题,回答用户
显然,可以看到我们的claude_embedding与提问更像,那么我们把这部分内容拿出来,改造一下用户提问:

也就是说,我们让MPT大模型根据我们提供的数据进行回答,结果发现回答非常准确!
通过这个案例我们可以看到,embeddding的强大,以及对大模型的应用重大意义。而这里是基于GPT4All提供的免费低成本方案,我们可以看到即便是差不多的文本,也可以计算准确结果!
GPT4All的embedding总结
GPT4All此前最早是支持将部分模型做量化后直接用图形化界面调用,方便初学者使用,降低了大模型的使用门槛。此后,又增加了基于本地PDF文件的问答能力,大大提升了GPT4All的价值。而今天提供的embedding模型则将GPT4All的易用性带到了新阶段。
但是所有这一切都有一个前提,那就是这些模型都是基于CPU和消费级硬件所优化的。这对于动不动就要GPU来说是非常友好的。同时,对于学习大模型的人来说也是非常有价值的。基于这样的方案搭建小工具也是没有问题的。不过,如果是商用场景,那么似乎可能方向还是不够广阔~
感谢GPT4All,让大模型的研究与探索成本降低了很多!
Embedding知识总结
Embedding很重要,DataLearner之前也总结过很多,大家可以根据下面内容参考:
- OpenAI官方教程:如何使用基于embeddings检索来解决GPT无法处理长文本和最新数据的问题:https://www.datalearner.com/blog/1051681543488862
- OpenAI发布最新Embedding模型——可惜又是一个收费API:https://www.datalearner.com/blog/1051671197436590
- AI大模型领域的热门技术——Embedding入门介绍以及为什么Embedding在大语言模型中很重要:https://www.datalearner.com/blog/1051683647195362
- 开源界最新力作!230万篇arXiv的论文标题和摘要的所有embeddings向量数据集免费开放!:https://www.datalearner.com/blog/1051685116232908
附:案例代码
代码本身是用jupyter notebook写的,分块呈现比较容易,全文如下:
原始提问测试
model = GPT4All(model_name='ggml-mpt-7b-chat.bin', model_path="D:/data/llm/gpt4all")
with model.chat_session():
response = model.generate(prompt=f'when does Claude 2 published? ', top_k=1)
print(response)
知识库embedding
from gpt4all import GPT4All, Embed4All
embedder = Embed4All()
claude_text = 'Anthropic is a company focused on artificial intelligence (AI) research, founded by former OpenAI researcher Dario Amodei. Claude is the large language model based on the transformer architecture released by Anthropic, which is considered to be the closest commercial product to ChatGPT. On July 12, 2023, Anthropic announced the official launch of Claude 2.'
claude_embedding = embedder.embed(claude_text)
print(claude_embedding)
chatgpt_text = "ChatGPT is a large language model trained by OpenAI based on the GPT-3.5 architecture. It is designed to understand and generate natural language text and is capable of answering various questions, providing information, solving problems, and engaging in interesting conversations. ChatGPT was released in late November 2022."
chatgpt_embedding = embedder.embed(chatgpt_text)
print(chatgpt_embedding)
提问embedding
user_question = 'when does claude2 published?'
user_question_embedding = embedder.embed(user_question)
print(user_question_embedding)
余弦相似度计算
import numpy as np
def compute_cosine_v(a, b):
vector1 = np.array(a)
vector2 = np.array(b)
# 计算向量的内积
dot_product = np.dot(vector1, vector2)
# 计算向量的范数
norm1 = np.linalg.norm(vector1)
norm2 = np.linalg.norm(vector2)
# 计算余弦相似性
cosine_similarity_value = dot_product / (norm1 * norm2)
return cosine_similarity_value
sim1 = compute_cosine_v(user_question_embedding, claude_embedding)
sim2 = compute_cosine_v(user_question_embedding, chatgpt_embedding)
print(f"sim1:{sim1}")
print(f"sim2:{sim2}")
结合知识库重新回答
model = GPT4All(model_name='ggml-mpt-7b-chat.bin', model_path="D:/data/llm/gpt4all")
with model.chat_session():
response = model.generate(prompt=f'when does claude2 published? you can answer me by following content:{claude_text}', top_k=1)
print(response)
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
