随着人工智能技术的深入发展,从图像识别到自然语言处理,从智能推荐到自动驾驶,AI的应用场景日益广泛。
而在这背后, 这种变革技术的核心数据概念是矢量。通过矢量化和大型语言模型(LLM) 的强大功能,生成式 AI 实现了其改变游戏规则的潜力。
在生成式人工智能时代,矢量嵌入奠定了基础;矢量数据库扩大了其影响。(注意:矢量即向量,很多地方也称为向量数据库)
矢量数据库,为复杂数据应用铺开未知领域。无论是语义搜索、推荐引擎还是人工智能,它在高效处理高维数据、改进搜索和提升机器学习集成等方面发挥关键作用。
矢量
要了解矢量数据库,首先需要了解矢量。
矢量是指同时具有大小和方向的几何对象。例如物理学中的速度、加速度、力等等都是矢量。
直观上,矢量通常被标示为一个带箭头的线段。线段的长度可以表示矢量的大小,而矢量的方向也就是箭头所指的方向。
在数学中,矢量可以抽象为向量,即有方向的量。矢量可以用线段来表示,线段的长度表示矢量的大小,而箭头指向的方向表示矢量的方向。
与矢量相对的是只有大小而没有方向的标量。
在计算机科学中,矢量的概念常常被泛化。事实上,你会多次听到用“列表”代替“矢量”这个词。在这种概念中,矢量不过是一个属性列表,我们可以用它来表示任何东西。
假设我们要根据房屋的三个属性来表示房屋:
-
卧室数
-
卫生间数
-
使用面积,单位平方米
上图中我们有两个矢量。
-
第一个代表一个有3间卧室、2间卫生间和115平方米使用面积的房子;
-
第二个代表一个有1间卧室、1个卫生间和45平方米的房子。
当然,如果对房子的其他属性感兴趣,可以创建一个更长的矢量。在这种情况下,我们会说矢量不是3维,而是n维。在机器学习中,通常可以有成百上千个维度。
矢量可以表示任何类型的数据,包括非结构化数据(或没有预定义数据模型或架构的数据)——从文本到图像、音频到视频。
矢量运算
我们可以对矢量执行一些操作,其中最简单的就是两个矢量之间的加法,以及一个矢量与一个标量(即一个简单的数字)的乘法。
计算2个矢量加法,可以使用平行四边形规则。也就是说,绘制与要加的矢量平行的矢量,然后画出对角线。对角线将是加法的结果矢量。如下面的例子:
而与标量相乘则将矢量拉长N个单位。如下例:
单位矢量
一个矢量实际上总是用其它矢量表示。
例如,我们把两个长度为1且相互正交的矢量i和j作为参考矢量。
现在定义一个新的矢量r,它从原点开始,即从i和j的交点开始,比i长a倍,比j长b倍。
更常见,我们使用坐标 r = [a,b] 来引用矢量,这样我们就可以在矢量空间中识别各种矢量。
用“矢量量化“处理语音、图像数据
矢量量化(VQ,VectorQuantization)是一种极其重要的信号压缩方法。VQ在语音信号处理中占十分重要的地位。广泛应用于语音编码、语音识别和语音合成等领域。
VectorQuantization (VQ)是一种基于块编码规则的有损数据压缩方法。
事实上,在 JPEG 和 MPEG-4 等多媒体压缩格式里都有 VQ 这一步。它的基本思想是:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。
VQ实际上是一种逼近,和“四舍五入”有异曲同工之妙,是用一个和一个数最接近的整数来近似表示这个数。
一维VQ的例子:
这里,小于-2的数都近似为-3,在-2和0之间的数都近似为-1,在0和2之间的数都近似为1,大于2的数都近似为3。
这样任意一个数都会被近似为-3、-1、1、3这四个数中的一个。
而我们编码这四个数只需要两个二进制位就行了。所以这是1-dimensional,2-bitVQ,它的rate(量化速率)为2bits/dimension。
二维的例子:
这里,我们用蓝色实线将这张图划分为16个区域。
任意的一对数(也就是横轴x和纵轴y组成的任意的一个坐标点(x, y))都会落到上面这张图中的某一特定区域。然后它就会被该区域的红星的点近似。
这里有16块不同区域,就是16个红星点。然后这16个值就可以用4位的二进制码来编码表示(2^4=16)。
因此,这是个2-dimensional,4-bit VQ,它的速率同样是2bits/dimension。上面这些红星点就是量化矢量,表示图中的任意一个点都可以量化为这16个矢量中的其中一个。
对于二维,我们还可以用图像压缩来说明。
类似于将图像的每个像素点当作一个数据,跑一下K-means 聚类,假设将图像聚为k类,就会得到每类的质心centroids,共k个,然后用这些质心的像素值来代替对应的类里的所有点的像素值。
这样就起到压缩的目的了,因为只需要编码k个像素值(和图像每个像素点的对这k个值得索引)就可以表示整张图像了。
当然,这样会存在失真,失真程度就是k的个数。最偏激的就是原图像每个像素就是一个类,那就没有失真了,当然这也没有了压缩。
矢量数据库
矢量数据库,在最初的概念中,主要是指用于存储、检索和管理地理信息系统(GIS)中的空间数据的数据库。这些空间数据通常包括点、线、多边形等几何形状,它们能够表征现实世界中的地理特征和位置信息。
进入2023年,矢量数据库的概念和应用发生了显著的变革。
人工智能,尤其是大规模语言模型与其相关的技术,如机器学习模型的embedding(嵌入向量)表示需要高效、可伸缩的存储和检索机制,以支持复杂的查询和分析操作。于是,满足大规模嵌入向量的存储和相似性搜索需求,具有高效检索能力的矢量数据库成为了炙手可热的技术解决方案。
矢量数据库在不同的上下文中有不同的含义。
从地理信息系统(GIS)角度来说,矢量数据库指的是存储地理空间数据的数据库系统,其中的数据主要是以矢量形式表示的地理要素,如点、线和多边形。这些矢量数据可以代表城市的街道、建筑物边界、行政区域等地理特征。
在更广义的数据处理和人工智能领域,“矢量数据库”通常指的是能够存储和检索高维向量数据的数据库系统。在机器学习和人工智能中,许多类型的数据,如图像、文本和视频,可通过模型转换成高维空间中的点,即“向量”,用于表示复杂的特征和模式。
这些向量需要特殊的存储和检索技术,尤其是当需要快速进行相似性搜索时。因此,矢量数据库的主要能力即为实现一种或多种近似最近邻(ANN:Approximate Nearest Neighbor) 算法,以便可以使用查询矢量搜索数据库以检索最接近匹配的数据库记录。矢量数据库主要用于存储、检索和搜索矢量。
将数据表示为多维空间中的点,而不是关系数据库中典型的行和列。矢量数据库非常适合需要基于相似性而不是精确值快速准确地匹配数据的应用程序。
矢量数据库中存储的矢量通常是高维的,代表一些原始数据项(例如文本文档、图像或数据)的特征视频。
这些特征矢量可以使用机器学习方法从原始数据计算出来,例如特征提取算法、词嵌入或深度学习网络。目标是语义相似的数据项接收彼此接近的特征矢量。
“将矢量数据库想象成一个巨大的仓库,将人工智能想象成熟练的仓库经理。在这个仓库中,每个项目(数据)都存储在一个盒子(矢量)中,在多维空间的货架上整齐地组织起来,” 马克·辛克尔 (Mark
Hinkle) 在《新堆栈》中写道.
矢量嵌入
嵌入是值或文本、图像和音频等对象的表示,旨在供机器学习模型和语义搜索算法使用。它们根据每个物体可能有或可能没有的因素或特征,以及它们所属的类别,将这些物体转化为数学形式。
嵌入能让机器学习模型找到相似的对象。给定一张照片或一份文档,使用嵌入的机器学习模型就能找到类似的照片或文档。
由于嵌入可以让计算机理解单词与其他对象之间的关系,因此嵌入是人工智能 (AI) 的基础。
例如,这个二维空间右上方的文档可能彼此相关:
从技术上讲,嵌入是机器学习模型创建的向量,目的是获取有关每个对象的有意义数据。
矢量嵌入是非结构化数据的矢量化表示,因为它们以语义相似性由 n 维矢量空间中的距离表示的方式映射内容。这使得搜索相似性、在知识库中查找相关内容或检索与复杂的用户生成的查询最匹配的项目变得容易。
虽然一些专用数据库仅支持矢量嵌入,但其他数据库除了矢量嵌入之外还支持许多其他数据和查询类型。对各种数据类型和查询类型的支持对于在丰富的真实数据之上构建生成式
AI 应用程序至关重要。随着使用矢量嵌入的语义查询的好处变得显而易见,大多数数据库将添加矢量支持。
矢量数据库如何工作?
矢量数据库功能的核心是嵌入原则。本质上,矢量或嵌入模型将数据转换为一致的格式:矢量。
虽然矢量本质上是一组有序的数字,但嵌入将其(包括文本、图像和音频)转换为各种数据类型的表示。
转换(将数据从一种格式转换为另一种格式的过程)将矢量置于多维矢量空间中。
这种空间排列最显着的特征之一是具有相似属性或特征的数据点自然地相互吸引,形成集群。
矢量嵌入不仅仅是数值翻译;它们封装了原始数据更深层的语义本质和上下文的细微差别。这使得它们成为一系列人工智能应用的宝贵资产——从自然语言处理(NLP) 到情感分析到文本分类。
查询矢量数据库与查询传统数据库不同。矢量数据库不是在相同矢量之间寻找精确匹配,而是使用相似性搜索来识别多维空间内与给定查询矢量非常接近的矢量。这种方法不仅更符合数据的固有性质,而且提供了传统搜索无法比拟的速度和效率。
与其他数据类型一样,高效查询大量矢量需要索引,并且矢量数据库支持矢量的专用索引。与具有单一逻辑顺序的许多其他数据类型(如文本或数字)不同,矢量不具有与实际用例相对应的自然顺序。相反,最常见的用例是查询在点积、余弦相似度或欧几里得距离等距离度量方面最接近其他某个矢量的 k 个矢量。
这种查询称为“k(精确)最近邻”或“KNN”查询。
但没有有效的 KNN 查询的通用算法——为了保证找到给定矢量 q 的 k 个最近邻,需要计算 q 与每个其他矢量之间的距离。然而,有一些有效的算法可以找到 k 个 近似最近邻(“ANN”)。这些 ANN 算法牺牲了一些准确性(特别是 召回率,该算法可能会忽略一些实际的最近邻居)以大幅提高速度。由于许多用例已经将计算矢量嵌入的过程视为有些不精确,因此它们通常可以容忍一些召回损失,以换取性能的大幅提高。
为了使 ANN 能够根据与其他矢量的距离来查询矢量,矢量索引的结构方式是将附近矢量的簇通常分组在一起。
常见的矢量索引类型可以构造为一组列表,其中每个列表代表给定簇中的矢量;每个矢量都连接到其最近邻的几个矢量的图;树的分支对应于父节点簇的子集;和更多。
每种索引类型都在查找速度、召回率、内存消耗、索引创建时间和其他因素之间进行权衡。
不过,大多数数据库查询不仅仅基于语义相似性。
例如,用户可能正在寻找一本描述类似于“关于孩子和狗的温馨故事”的书,但他们也希望将其限制为 20 美元以下的平装本书籍。专用矢量数据库可能提供一些有限的附加过滤功能(有时称为“限制”),而通用数据库可以使用 SQL 等标准语言组成丰富的谓词,这些谓词可以与矢量相似性排序相结合,以实现非常强大、富有表现力的查询。
单词、句子甚至整个文档都可以转换为捕捉其本质的矢量。
例如,标准的词嵌入方法是Word2Vec。使用Word2Vec,具有相似含义的单词由多维空间中接近的矢量表示。
最著名的例子是:国王-男人+女人=女王。添加与“国王”和“女人”相关的矢量,同时减去“男人”,等于与“女王”相关的矢量。
即使图像具有复杂的图案和颜色,也可以转换为矢量。例如,在充满动物图像的数据集中,训练有素的卷积神经网络
(CNN) 会将所有狗图像紧密地聚集在一起,与猫或鸟的集群明显分开。
通过捕获固有的数据结构和数据中的模式,矢量嵌入提供了语义丰富的描述。这种丰富性不仅有助于更深入地理解数据,而且还加快了与确定关系和衡量不同实体之间的相似性相关的计算。
矢量搜索
由于其独特的数据检索方法,矢量搜索对于矢量数据库至关重要。
矢量搜索可利用 Machine Learning (ML) 来捕获非结构化数据(包括文本和图像)的含义和上下文,并将其转换为数字化表示形式。
矢量搜索常用于语义搜索,通过利用相似最近邻 (ANN) 算法来找到相似数据。与传统的关键字搜索相比,矢量搜索产生的结果相关度更高,执行速度也更快。
与依赖精确匹配的传统数据库不同,在矢量数据库中,矢量搜索基于相似性进行操作。这种语义理解意味着即使两条数据不相同但在上下文或语义上相似,它们也可以匹配。
例如:
“数据科学”和“科幻小说”等搜索查询指的是不同类型的内容,尽管两者都有一个共同的词(“科学”)。
传统的搜索技术会匹配常用短语以返回相关结果,在这种情况下这将是不准确的。
矢量相似性搜索将考虑这些搜索查询的实际搜索意图和含义,以返回更准确的响应。
另外,传统的关键字搜索在精确定位文档或表格中的特定术语时表现出色。然而,它们无法处理非结构化数据,例如视频、书籍、社交媒体帖子、PDF 和音频文件。
矢量搜索通过在非结构化数据中进行搜索来填补这一空白。它不仅寻找精确匹配,还根据语义相似性识别内容,了解搜索词之间的内在关系。
向量相似度搜索:VSS
向量相似性搜索通过将其转换为称为向量或嵌入的数字表示,从大量结构化或非结构化数据中查找和检索上下文相似的信息。
VSS 可以管理各种数据格式,包括数字、分类、文本、图像和视频。它将数据语料库中的每个对象转换为与其相关格式相对应的高维向量表示(在下一节中讨论)。
最常见的是,VSS 定位可比较的对象,例如相似的短语或段落,或者在庞大的图像检索系统中查找相关图像。
有效的 VSS 方法主要包含三个基本组成部分:
1.向量嵌入:嵌入以数学格式表示不同的数据类型,即有序数组或数字集。他们使用数学计算来识别数据中的模式。
2.距离或相似性度量:这些是计算两个向量的相似或密切相关程度的数学函数。
3.搜索算法:算法帮助找到与给定搜索查询相似的向量。例如, K最近邻居或KNN 算法经常用于支持 VSS 的搜索系统中,以确定数据集中与给定输入查询最相似的 K 个向量。
实现向量相似性搜索的第一步是将数据语料库中的对象表示或描述为向量嵌入。它使用不同的向量嵌入方法,例如 手套, 词向量及 BERT,将对象映射到向量空间。
对于每种数据格式,如文本、音频和视频,VSS 构建不同的嵌入模型,但此过程的最终结果是数值数组表示。
下一步是创建一个索引,可以使用这些数字表示将相似的对象排列在一起。像 KNN 这样的算法是实现搜索相似性的基础。
然而,为了索引相似的术语,搜索系统使用现代方法,例如 局部敏感哈希 (LSH) 和 近似最近邻 (ANNOY).
此外,VSS 算法还计算相似性或距离度量,例如欧几里德距离、余弦相似性或杰卡德相似性,以比较数据集合中的所有向量表示并响应用户查询返回相似内容。
处理高维数据时,矢量数据库擅长处理跨越数百甚至数千维的数据点,可以快速识别这个广阔空间中最相似的矢量,而无需扫描每个矢量。这种效率意味着更快、更节省资源的搜索。
灵活性是矢量搜索另一个显着的优势。只需最少的调整即可适应新的数据类型、不断发展的数据结构和不断变化的搜索要求。
矢量相似性搜索业务用例
在商业业务中,VSS 技术可以彻底改变广泛的行业和应用。其中一些用例包括:
-
问答:向量相似度搜索可以在问答论坛中找到几乎相同的相关问题,从而为最终用户提供更准确、更中肯的答复。
-
语义网络搜索:矢量相似性搜索可以根据矢量表示的“接近程度”来定位相关文档或网页。它的目的是提高网络搜索结果的相关性。
-
产品推荐:向量相似度搜索可以根据消费者的浏览或搜索历史做出个性化的产品推荐。
-
更好的医疗服务:医疗保健研究人员和从业人员利用向量相似性搜索,通过分析相关医学研究的向量表示来优化临床试验。
案例:矢量数据库
-
图像和视频识别:视觉内容主导着我们的视觉文化,矢量数据库在其中大放异彩。他们擅长筛选大量图像和视频存储库,以找出与给定输入惊人相似的图像和视频。这不仅仅是逐像素匹配;这是关于理解潜在的模式和特征。这些功能对于面部识别、物体检测,甚至媒体平台中的版权侵权检测等应用至关重要。
-
自然语言处理和文本搜索:同义词、释义和上下文可能使精确的文本匹配成为一项艰巨的任务。然而,矢量数据库可以辨别短语或句子的语义本质,使它们能够识别措辞可能不相同但上下文相似的匹配。这种能力改变了聊天机器人的游戏规则,确保它们正确响应用户的查询。同样,搜索引擎可以提供更相关的结果,从而增强用户体验。
-
推荐系统:矢量数据库在个性化中发挥着关键作用。通过了解用户偏好和分析模式,这些数据库可以推荐与听众品味产生共鸣的歌曲或符合购物者偏好的产品。这一切都是为了衡量相似性并提供引起用户共鸣的内容或产品。
-
新兴应用:矢量数据库的范围不断扩大。在医疗保健领域,他们通过分析分子结构以获得潜在的治疗特性来帮助药物发现。在金融领域,矢量数据库正在协助异常检测,发现可能表明欺诈活动的异常模式。
随着生成式人工智能的兴起,矢量数据库成为重要的推动者,帮助开发人员将复杂的人工智能蓝图转变为实用的、价值驱动的工具。
矢量数据库VS传统数据库
与在行和列中存储多种标准数据类型(如字符串、数字和其他标量数据类型)的传统数据库不同,矢量数据库引入了一种新的数据类型(矢量),并围绕该数据类型专门进行了优化,以实现快速存储,检索和最近邻搜索语义。
在传统数据库中,使用索引或键值对对数据库中的行进行查询,这些索引或键值对寻找精确匹配并返回这些查询的相关行。传统的关系数据库经过优化,可以围绕结构数据提供垂直可扩展性,而传统的NOSQL 数据库则可以为非结构化数据提供水平可扩展性。
矢量数据库等解决方案旨在提供结构化和非结构化数据的优化,并且添加了存储矢量嵌入的功能,矢量数据库等解决方案非常适合传统和基于人工智能的存储模型。
与矢量数据库最大的区别之一是传统模型被设计为提供精确的结果,但矢量数据库数据存储为一系列浮点数,搜索和匹配数据不必是精确匹配,而是可以是查找与我们的查询最相似的结果的操作。
矢量数据库使用许多不同的算法,这些算法都参与近似最近邻 (ANN) 搜索,并允许快速有效地检索大量相关信息。专门构建的矢量数据库为生成式 AI 应用程序提供显着优势的地方。传统数据库根本无法扩展到需要搜索的高维数据量。人工智能应用程序需要能够在高度分布式、高度灵活的解决方案中存储、检索和查询密切相关的数据。
矢量数据库的优点
矢量数据库很重要,因为它们可以用来解决各种单独使用关系谓词或文本搜索技术难以或不可能解决的问题。
矢量数据库非常适合生成式人工智能应用程序,因为它们可以轻松检索关键业务和应用程序上下文(例如相关聊天历史记录或特定于业务的非结构化内容),以帮助
LLM响应复杂的用户查询。
它们还可以轻松地使用自然语言搜索内容或通过示例进行查询。
矢量数据库具有几个关键优势,使其在各种人工智能应用中非常有价值,特别是那些涉及复杂和大规模数据分析的应用。以下是一些主要优点:
-
高效处理高维数据:矢量数据库专为高效管理高维数据而设计。传统数据库经常与这些数据集的复杂性和大小作斗争,但矢量数据库擅长从高维空间存储、处理和检索数据,而不会显着降低性能。
-
增强的搜索功能:矢量数据库最显着的优势之一是它们执行相似性和语义搜索的能力。他们可以快速找到与给定查询最相似的数据点,这对于推荐引擎、图像识别和自然语言处理等应用至关重要。
-
可扩展性:矢量数据库必须具有高度可扩展性,能够处理大量数据集而不损失性能。这种可扩展性对于定期生成和处理大量数据的企业和应用程序至关重要。
-
速度和准确性:与传统数据库相比,它们提供更快的查询响应,特别是在处理大型数据集中的复杂查询时。这种速度并不以准确性为代价,因为矢量数据库凭借其先进的算法可以提供高度相关的结果。有关速度和准确性的更多信息,请参阅GigaOm 关于矢量数据库性能比较的报告。
-
改进的机器学习和人工智能集成 :矢量数据库特别适合人工智能和机器学习应用。它们可以存储和处理训练和运行机器学习模型所需的数据,特别是在深度学习和自然语言处理等领域。
-
促进高级分析和见解:通过支持复杂的数据建模和分析,矢量数据库使组织能够从数据中获得更深入的见解。此功能对于数据驱动的决策和预测分析至关重要。
-
个性化:这些数据库通过分析用户行为和偏好来支持个性化用户体验的开发。这在营销、电子商务和内容交付平台中特别有用,在这些平台中,个性化可以显着提高用户参与度和满意度。
10个顶级矢量数据库
1、Elasticsearch
ElasticSearch是一个支持各种类型数据的分布式搜索和分析引擎。Elasticsearch 支持的数据类型之一是矢量字段,它存储密集的数值矢量。
在 7.10 版本中,Elasticsearch 添加了对将向量索引到专用数据结构的支持,以支持通过 kNN 搜索 API 进行快速 kNN 检索。在 8.0 版本中,Elasticsearch 添加了对带有向量场的原生自然语言处理 (NLP) 的支持。
2、Faiss
Meta的Faiss是一个用于高效相似性搜索和密集向量聚类的库。它包含搜索任意大小的向量集的算法,直到可能不适合 RAM 的向量集。它还包含用于评估和参数调整的支持代码。
3、Milvus
Milvus是一个开源矢量数据库,可以管理万亿矢量数据集,支持多种矢量搜索索引和内置过滤。
4、Weaviate
Weaviate是一个开源向量数据库,允许你存储数据对象和来自你最喜欢的 ML 模型的向量嵌入,并无缝扩展到数十亿个数据对象。
5、Pinecone
Pinecone专为机器学习应用程序设计的矢量数据库。它速度快、可扩展,并支持多种机器学习算法。
Pinecone 建立在 Faiss 之上,Faiss 是一个用于密集向量高效相似性搜索的库。
6、Qdrant
Qdrant是一个矢量相似度搜索引擎和矢量数据库。它提供了一个生产就绪的服务,带有一个方便的 API 来存储、搜索和管理点——带有额外有效负载的矢量。
Qdrant 专为扩展过滤支持而定制。它使它可用于各种神经网络或基于语义的匹配、分面搜索和其他应用程序。
7、Vespa
Vespa是一个功能齐全的搜索引擎和矢量数据库。它支持向量搜索 (ANN)、词法搜索和结构化数据搜索,所有这些都在同一个查询中。集成的机器学习模型推理允许你应用 AI 来实时理解你的数据。
8、Vald
Vald是一个高度可扩展的分布式快速近似最近邻密集向量搜索引擎。Vald是基于Cloud-Native架构设计和实现的。它使用最快的 ANN 算法 NGT 来搜索邻居。
Vald 具有自动向量索引和索引备份,以及水平缩放,可从数十亿特征向量数据中进行搜索。
9、ScaNN (Google Research)
ScaNN(Scalable Nearest
Neighbours)是一个用于高效向量相似性搜索的库,它找到 k 个与查询向量最近的向量,通过相似性度量来衡量。矢量相似性搜索对于图像搜索、自然语言处理、推荐系统和异常检测等应用非常有用。
10、pgvector
pgvector是PostgreSQL 的开源扩展,允许你在数据库中存储和查询向量嵌入。它建立在 Faiss 库之上,Faiss 库是一个流行的密集向量高效相似性搜索库。pgvector 易于使用,只需一条命令即可安装。