深度解读AI大模型的矢量数据库(上)
一、前言
在生成式AI时代(更确切地说,自从 ChatGPT 发布以来),你至少听说过“向量数据库”这个词。如果你不知道它们是什么,没关系,因为这篇文章就是为了详细解释向量数据库的一切。
由于篇幅较长,所以分成了三篇文章,这是第一篇,主要讲述什么是矢量数据库,以及使用矢量数据库的两个案例。
二、什么是矢量数据库
首先,我们必须意识到矢量数据库并不是新事物。
事实上,它们已经存在了相当长的时间了,在它们广泛流行之前,你每天都在间接地与它们互动,比如我们的推荐系统和搜索引擎等应用程序。
简单来说,向量数据库以向量嵌入的形式存储非结构化数据(文本、图像、音频、视频等) 。
无论是单词、文档、图像还是任何其他实体,都可以使用机器学习技术转换为数值向量(在数学上称为矩阵)。
这种数值向量称为嵌入(Embeddings),并且模型的训练方式就是让这些向量捕获基础数据的基本特性和特征。
例如下图,考虑到词嵌入,我们可能会发现在嵌入空间中,水果因为彼此的嵌入接近,从而会形成一个集群(因为嵌入是数字向量,所以可以利用一些算法判断是否相近),而城市又会形成另一个集群等。
这表明嵌入可以学习它们所表示的实体的语义特征(前提是它们经过适当的训练)。
一旦存储在矢量数据库中,我们就可以这个数据库中检索非结构化数据,比如下图我们输入Venice(威尼斯),并检索哪个城市离它最近
换句话说,对非结构化数据进行编码使我们能够对其运行许多复杂的操作,例如相似性搜索、聚类和分类,而这对于传统数据库来说是很困难的。
在我们讨论技术细节之前,让我给你几个直观的例子来理解矢量数据库及其巨大的实用性。
Example 1 图库
想象一下,我们手机的图库收集了多年来我们在各个假期拍摄的照片。每张照片都捕捉了不同的场景,如海滩、山脉、城市和森林。
现在,我们希望以一种更容易快速找到相似照片的方式组织这些照片(这个功能目前很多手机的图库都有了)。
在传统设计上,它可能会按照拍摄日期或拍摄地点来组织它们。
然而,我们可以采取更复杂的方法,将这些图片编码为向量。
更具体地说,我们可以将每张照片表示为一组捕捉图像本质的数值向量,而不是仅仅依赖日期或位置。
假设我们使用一种算法,根据每张照片的颜色构成、突出的形状、纹理、人物等将其转换为矢量。
现在,每张照片都表示为多维空间中的一个点,其中维度对应于图像中的不同视觉特征和元素。
现在,当我们想要查找相似的照片时,比如,我们想找到山脉相关的图片,这时候我们输入“Mountain images”,输入的文本会被编码为文本向量,并在向量数据库中匹配最接近该文本向量的图片向量,最后再根据这些图片向量反查找到图片。
这里需要注意的一点是,矢量数据库不仅仅是一个只保存嵌入(数值向量)的数据库,相反,它维护嵌入和生成这些嵌入的原始数据(文本、图片等)。
T为什么要这么设计呢?
再次回忆下上述图像检索任务,如果我们的矢量数据库仅由矢量组成,我们还需要一种重建图像的方法,因为这是用户最终所需要的。
当用户查询山脉图像时,他们会收到表示相似图像的矢量列表,但没有实际图像。
ALT通过存储嵌入(表示图像的向量)和原始图像数据,向量数据库确保当用户查询相似图像时,它不仅返回最接近的匹配向量,而且还提供对原始图像的访问。
Example 2 新闻搜索
在这个示例中,考虑全文本非结构化数据,例如数千篇新闻文章,我们希望从该数据中搜索答案。
ALT传统的搜索方法依赖于精确的关键词搜索(模糊搜索或者倒排索引),这完全是一种蛮力的方法,没有考虑文本数据固有的复杂性。
换句话说,语言的细微差别令人难以置信,每种语言都提供了多种方式来表达相同的想法或提出相同的问题。
比如一个简单的查询,如“今天天气怎么样?”,就可以用多种方式表达,例如“今天天气怎么样?”、“外面晴朗吗?”或“当前天气状况如何?”。
这种语言多样性使得传统的基于关键词的搜索方法变得不是很令人满意。
正如你可能已经猜到的,在这种情况下,将这些数据表示为向量也是非常可行的一个方法。
我们首先可以在高维向量空间中表示文本数据并将其存储在向量数据库中,而不是仅仅依赖关键字并进行暴力搜索。
ALT当用户提出查询时,矢量数据库可以将查询的矢量表示与文本数据的矢量表示进行比较,即使它们不具有完全相同的措辞。
以上就是对矢量数据库的开篇介绍,对你有帮助的话可以麻烦点个赞!