2024年2月3日的FOSDEM会议上,Manticore的联合创始人 彼得·扎伊策夫 和Manticore的首席执行官 谢尔盖·尼古拉耶夫 进行了关于Manticore向量搜索的演讲。此次活动展示了数据库中向量搜索的最新动态。想要更深入了解,可以观看上面扎伊策夫演讲的录音。下面,你可以看到关于这一主题的更详细总结,以文章形式呈现。
引言
在过去的两到三年中,数据库领域经历了几项关键变化:
- 出现了一种新的“向量数据库”类别,涌现出2019年的Milvus、2020年的Vespa、2021年的Weaviate和2022年的Qdrant等开源平台,以及2019年推出的云解决方案Pinecone。这些数据库专注于向量搜索,着眼于各种机器学习模型的使用。然而,它们可能缺乏传统数据库的功能,如事务、分析、数据复制等。
- Elasticsearch于2019年增加了向量搜索功能。
- 然而,从2022年到2023年,包括Redis、OpenSearch、Cassandra、ClickHouse、Oracle、MongoDB和Manticore Search在内的传统数据库,以及来自Azure、Amazon AWS和Cloudflare的云服务,开始提供向量搜索功能。
- 其他知名数据库,如MariaDB,正在整合向量搜索能力。
- 对于PostgreSQL用户,还有自2021年起实现该功能的’pgvector’扩展。
- 尽管MySQL尚未宣布计划原生支持向量搜索功能,但PlanetScale和AlibabaCloud等提供商已提供专有扩展。
向量空间和向量相似性
让我们讨论一下为什么如此多的数据库最近启用了向量搜索功能,以及这到底是什么。
我们从一个具体的例子开始。考虑两种颜色:红色,RGB代码为(255, 0, 0),橙色,RGB代码为(255, 200, 152)。为了比较它们,我们将在三维图上绘制它们,其中每个点代表一种不同的颜色,轴线对应于颜色的红、绿、蓝成分。然后我们从图的原点画出向量到表示我们颜色的点。现在我们有两个向量:一个代表红色,另一个代表橙色。
如果我们想要找到这两种颜色之间的相似性,一个方法是简单地测量这两个向量之间的角度。这个角度可以从0度变化到90度,或者如果我们通过取余弦来归一化,它的值将从0变化到1。然而,这种方法没有考虑到向量的大小,这意味着对于颜色A、A1、A2,余弦将会产生相同的值,尽管它们代表不同的色调。
为了解决这个问题,我们可以使用余弦相似度公式,它考虑到了向量的长度——向量的点积除以它们大小的乘积。
这个概念就是向量搜索的本质。用颜色来可视化这个概念非常简单,但现在想象一下,不是三种颜色轴,而是我们有一个数百或数千维的空间,其中每个轴代表物体的特定特征。尽管我们无法轻易在幻灯片上描绘出来或完全可视化这种情况,但在数学上这是可行的,而且原理保持不变:你在一个多维空间中有向量,并计算它们之间的相似性。
还有一些其他公式可以找到向量相似性:例如点积相似度和欧几里得距离,但正如OpenAI API文档所说,它们之间的差异通常并不是很重要。
Screenshot: https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use
向量特性:稀疏向量
因此,一个对象可能具有各种特征。颜色的红、绿和蓝成分是最简单的例子。在现实中,它通常更复杂。
例如,在文本搜索中,我们可以将文档表示为高维向量。这使我们得到了“词袋”这一概念。该模型将文本转换为向量,其中每个维度对应于一个独特的单词,值可以是该单词存在的二进制指示符、出现次数或基于其频率和倒文档频率(称为TF-IDF)的单词权重,反映了一个词在一个集合中的重要性。这被称为稀疏向量,因为大多数值为零,因为大多数文档实际上并没有很多单词。
在图书馆和像 Lucene 、 Elasticsearch 和 Manticore Search 这样的搜索引擎中谈论全文搜索时,稀疏向量有助于加快搜索速度。基本上,你可以创建一种特殊类型的索引,忽略没有搜索词的文档。因此,你无需每次都检查每个文档。当稀疏向量具有易于理解的特点时,从某种意义上讲,它们是可以逆向工程的。每个维度对应于特定清晰的特征,因此我们可以从我们向量表示回溯到原始文本。这个概念已经存在大约50年了。
向量特性:密集向量
传统文本搜索方法如 TF-IDF ,已经存在几十年,产生的稀疏词向量依赖于术语频率。主要问题是什么?它们通常忽视了单词使用的上下文。例如,术语“苹果”可能与水果和科技公司相关而没有区别,可能在搜索中将它们排名相似。
但考虑这个类比:在一个向量空间中,哪两个对象的接近度更高:猫和狗,还是猫和车?生成稀疏向量的传统方法——如下图顶部所示——可能难以提供一个有意义的答案。稀疏向量通常是高维的,大多数值为零,代表给定文档或上下文中大多数单词的缺失。
然后来了深度学习的革命,推出了上下文嵌入。这些是密集的向量表示,如下图所示。与稀疏向量相比,稀疏向量可能有数以万计的维度,密集向量的维度较低(如图中784维),但包含的连续值捕捉了微妙的语义关系。这意味着同一单词可以根据其上下文具有不同的向量表示,如果不同的单词共享上下文,它们也可以具有相似的向量。像 BERT 和 GPT 这样的技术使用这些密集向量来捕捉复杂的语言特征,包括语义关系,区分同义词和反义词,理解讽刺和俚语——这些任务对于早期方法来说相当具有挑战性。
此外,深度学习不仅限于文本,还能够处理复杂的数据,如图像、音频和视频。这些数据也可以被转化为密集的向量表示,以用于分类、识别和生成等任务。深度学习的崛起与数据可用性和计算能力的爆炸性增长相吻合,使得训练复杂模型成为可能,这些模型能够揭示数据中更深层次和微妙的模式。
嵌入
这些模型提供的向量称为“嵌入”。重要的是要理解,与之前展示的稀疏向量不同,在稀疏向量中,每个元素可以代表文档中存在的明确特征,而嵌入的每个元素也代表一个特定特征,但在大多数情况下,我们连这个特征是什么都不知道。
例如,
Jay Alammar 进行了有趣的实验
,使用 GloVe 模型对维基百科进行向量化,然后用不同颜色可视化一些单词的值。我们可以看到:
- 一条一致的红线在不同的单词中出现,表示在一个维度上的相似性,尽管它代表的具体属性仍然未被识别。
- “女人”和“女孩”或“男人”和“男孩”等术语在多个维度上表现出相似性,暗示相关性。
- 有趣的是,“男孩”和“女孩”的相似性不同于“女人”和“男人”,暗示出一种潜在的青春主题。
- 除了涉及“水”一词的一个实例外,所有分析的单词都与人有关,而“水”则用于区分概念类别。
- “国王”和“女王”之间的独特相似性与其他术语不同,可能暗示出对王室的抽象表现。
图像:
https://jalammar.github.io/illustrated-word2vec/
因此,通过深度学习生成的密集向量嵌入以紧凑的形式捕捉了大量信息。与稀疏向量不同,密集嵌入的每个维度通常都是非零的,并且具有某种语义意义。这种丰富性带来了一个成本——由于每个维度都密集填充了值,我们不能简单跳过不包含特定术语的文档。相反,我们面临比较查询向量与数据集中每个文档向量的计算强度。这是一种自然资源密集型的暴力搜索方法。
然而,已经开发出专门针对密集向量的索引。这些索引,如 KD 树、Ball 树,或更现代的方法,如 HNSW (层次可导航的小世界)图,非常聪明,但有时为了快速,它们必须进行一些猜测。这种猜测意味着它们并不总是100%准确。数据库采用的最流行索引是HNSW,它代表层次可导航的小世界。它被 pgvector 扩展用于 Postgres, Lucene , Opensearch , Redis , SOLR , Cassandra , Manticore Search 和 Elasticsearch 使用。它的算法构建了一个多层图结构。每一层都是一个图,其中每个节点(代表一个数据点)与其最近的邻居相连。底层包含所有节点(数据点),而每个后续的上层包含来自下层的节点子集。最上面的层节点最少。从上层开始搜索,逐渐移动到下层。这种分层的方法使搜索过程高效。简而言之,HNSW 像其他索引一样只是预生成了一些快捷方式,以便您可以用来加速查询处理。还有其他的向量索引,如 Annoy ,由 Spotify 和其他人维护,各自拥有不同的性能、资源消耗和准确性损失的优缺点。
K-最近邻
向量搜索实际上是一个包含各种任务的总称,例如聚类、分类等。但通常,数据库为向量搜索添加的第一个特性是“ K-最近邻搜索”(KNN),或其近亲“ 近似最近邻搜索”(ANN)。它之所以吸引人,是因为它使数据库能够找到与给定文档的向量最相似的文档,从而增强数据库具备强大的搜索引擎功能,这是它们以前所缺乏的。
传统搜索引擎如 Lucene、Elasticsearch、SOLR 和 Manticore Search 处理各种自然语言处理任务——例如形态学、同义词、停用词和例外——都旨在找到与给定查询匹配的文档。 KNN 实现了类似的目标,但通过不同的手段——只是比较与表中文档关联的向量,这些向量通常由外部机器学习模型提供。
让我们以
Manticore Search
为例,探讨数据库中典型的向量搜索是什么样的。
首先,我们创建一个名为 image_vector
的列的表:
create table test ( title text, image_vector float_vector knn_type='hnsw' knn_dims='4' hnsw_similarity='l2' );
这个向量是
浮点类型
,这很重要,因为不支持该数据类型的数据库必须首先添加它,因为稠密向量通常存储在浮点数组中。在此时,您还通常通过指定向量维度大小、向量索引类型及其属性来配置该字段。例如,我们指定要使用 HNSW 索引,向量的维度为 5,相似性函数为 l2
,这就是欧几里得距离。
然后,我们向表中插入几条记录:
insert into test values ( 1, 'yellow bag', (0.653448,0.192478,0.017971,0.339821) ), ( 2, 'white bag', (-0.148894,0.748278,0.091892,-0.095406) );
每条记录都有一个标题和一个对应的向量,在真实场景中,这可以是深度学习模型输出的某种高维数据的编码,例如图像或声音,文本的嵌入,或者来自 OpenAI API 的其他内容。该操作将数据存储在数据库中,并可能触发重建或调整索引。
接下来, 我们通过利用 KNN 函数执行向量搜索 :
select id, knn_dist() from test where knn ( image_vector, 5, (0.286569,-0.031816,0.066684,0.032926) );
+------+------------+
| id | knn_dist() |
+------+------------+
| 1 | 0.28146550 |
| 2 | 0.81527930 |
+------+------------+
2 rows in set (0.00 sec)
在这里,我们正在查询数据库以定位与我们指定的输入向量最接近的向量。括号中的数字定义了我们要查找最近邻的特定向量。此步骤对任何希望实施向量搜索功能的数据库都是至关重要的。在此步骤中,数据库可以利用特定的索引方法,例如 HNSW,或通过比较查询向量与表中的每个向量,进行暴力搜索以找到最接近的匹配项。
返回的结果显示最近向量的标题及其与查询的相应距离。较低的距离值表示与搜索查询的匹配更接近。
嵌入计算
到目前为止,大多数数据库和搜索引擎依赖于外部嵌入。这意味着当您插入文档时,必须事先从外部源获取其嵌入并将其与文档的其他字段一起包含。当搜索类似文档时也是一样:如果搜索是针对用户查询而不是现有文档,则需要使用机器学习模型为其计算嵌入,随后将其传递给数据库。该过程可能导致兼容性问题,需要管理额外的数据处理层,并可能导致搜索性能的不效率。该方法的操作复杂性也高于必要的。除了数据库,您可能还需要保持另一个服务运行以生成嵌入。
一些搜索引擎如 Opensearch、Elasticsearch 和 Typesense 现在通过自动创建嵌入使事情变得更容易。它们甚至可以使用其他公司的工具,比如 OpenAI 来做到这一点。我认为我们很快会看到更多这样的情况。更多的数据库将开始独立生成嵌入,这可能会真正改变我们搜索和分析数据的方式。这一变化意味着数据库将不仅仅是存储数据;它们实际上会理解数据。通过使用机器学习和人工智能,这些数据库将更聪明,能够预测和适应,并以更先进的方式处理数据。
混合搜索方法
一些搜索引擎采用了一种称为混合搜索的方法,它结合了传统的基于关键词的搜索与先进的神经网络技术。混合搜索模型在需要既提供传统搜索技术提供的确切关键词匹配,又提供向量搜索能力所提供的更广泛上下文识别的情况下表现出色。这种平衡的方法可以提高搜索结果的准确性。例如, Vespa 通过将其混合搜索与经典的 BM25 排名和 ColBERT 模型单独比较来衡量 其混合搜索的准确性 。在他们的方法中,他们将经典的 BM25 用作第一阶段排名模型,并仅针对 BM25 模型的前 K 个排名文档计算混合得分。结果发现,混合搜索模式在大多数测试中表现优于它们各自。
另一种更简单的方法是倒数排名融合(RRF),这是一种结合不同搜索算法排名的技术。RRF根据每个项目在每个列表中的排名计算分数,其中更高的排名会获得更好的分数。得分由公式 1 / (rank + k) 决定,其中 ‘rank’ 是项目在列表中的位置,而 ‘k’ 是用于调整低排名影响的常数。通过从每个来源汇总这些修改过的倒数排名,RRF强调了不同系统之间的共识。这种方法融合了各种算法的优势,导致更强大和全面的搜索结果。
表格:
https://blog.vespa.ai/improving-zero-shot-ranking-with-vespa-part-two/
公式:
https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
结论
向量搜索不仅仅是一个概念或搜索引擎的一个小功能;它是一个实用工具,正在改变我们检索数据的方式。在最近几年,数据库领域经历了重大变化,新兴的向量数据库和已有的数据库增加了向量搜索功能。这反映出对更先进搜索功能的强烈需求,而向量搜索可以满足这一需求。先进的索引方法,如 HNSW,使得向量搜索变得更快。
展望未来,我们预计数据库将不仅仅支持向量搜索;它们可能会自己创建嵌入。这将使数据库更易于使用和更强大,将其从基本存储空间转变为能够理解和分析数据的智能系统。简而言之,向量搜索是数据管理和检索中的一项重大转变,标志着该领域的一个激动人心的发展。