博客 / 工程

ClickHouse 向量搜索 - 第 1 部分

author avatar
Dale McDiarmid
2023 年 5 月 31 日 - 18 分钟阅读

立即开始使用 ClickHouse Cloud,并获得 300 美元额度。要了解有关我们基于用量的折扣的更多信息,请联系我们或访问我们的定价页面

简介

在过去一年中,大型语言模型 (LLM) 以及 ChatGPT 等产品引起了全世界的关注,并推动了构建在其之上的新一轮功能浪潮。向量和向量搜索的概念是为推荐、问题解答、图像/视频搜索等功能提供支持的核心。

因此,我们看到我们的社区对向量搜索的兴趣显着增加。具体而言,人们有兴趣更好地理解何时需要专门的向量数据库,以及何时不需要。

考虑到这些模型,我们借此机会回顾向量出现之前的搜索,探索什么是向量(和嵌入),了解向量搜索、其应用以及此功能如何融入更广泛的数据领域。

对于那些已经熟悉基本向量搜索概念并想直接了解如何在 ClickHouse 中进行向量搜索的读者,您可以在此处找到第 II 部分。

向量出现之前的搜索

让我们简要介绍一下搜索在 Elasticsearch 和 Solr 等传统引擎中的工作方式(注意:这些技术现在也提供向量搜索功能)。

这些引擎专注于提供文本搜索功能,依靠用户将其内容分解为称为文档的离散文本单元,每个文档都有一个 ID。这些文档可以包含从一本书或网页中的所有文本到单个句子的任何内容,具体取决于用户需要查找相关内容的粒度(长度也会影响搜索效果)。

然后,将每个文档中的文本通过称为分词的过程拆分为其组成词,从而生成词袋模型。在其最简单的形式中,分词将涉及按空格分割、转换为小写和删除标点符号的顺序过程。这些词,也称为术语,然后将用于构建类似于书后索引的索引。此索引将包含文本中每个词的计数、它们出现的文档 ID(称为倒排列表),以及每个术语在文档中出现的频率计数。

bag_of_words_inverted_index.png

请注意,以上内容是对流程的简化,省略了有关分词、词干提取、词形还原和停用词等过程的详细信息,以及位置索引和用于实现快速搜索的巧妙内部数据结构。

搜索时,将访问索引,并识别匹配的文档。然后将对每个文档执行计算,将搜索文本与文档术语进行比较,以按相关性对其进行排序。这种“相关性计算”通常基于匹配术语在更广泛的语料库和文档本身中出现的频率。

在更广泛的语料库中很少见,但在匹配文档中很常见的词,比诸如“和”之类的通用常用词对文档得分的贡献更大,因为“和”提供的意义很少。这些常用词被称为“停用词”,可以有选择地从索引中省略,因为它们对相关性的贡献很低,但会损失某些功能。这个在 1970 年代提出的简单观察构成了术语频率/逆文档频率 (TF/IDF) 公式的基础,该公式虽然简单,但通常很有效。

tf_idf.png

以上是一个简化。它假设术语之间存在逻辑与关系,并且每个术语的分数只是简单地相加。多术语搜索的限制可能较少,例如,OR,使用更精细的评分函数,例如 BM25,以及组合术语分数的方法。

这种方法的挑战在于它无法捕捉词本身的含义或上下文。如果搜索词很接近,位置信息可能会更高度地权衡文档,但这仍然无法捕捉它们之间的语义关系。例如,这种方法无法区分

“猫饶有兴致地隔着窗户看着鸟”和“鸟饶有兴致地隔着窗户看着猫”。

此外,这种方法还存在词汇不匹配问题。更具体地说,如果语料库的词汇与查询文本的词汇不同,用户会发现相关性很差。

虽然手动标记概念、同义词和使用分类法可以在一定程度上解决这些挑战,但这些方法不够灵活、难以维护并且很少能扩展。重要的是,这种方法仅适用于文本内容,并且不能(轻易地)应用于其他数据介质,例如图像。

什么是向量和嵌入?

在我们解释向量如何解决捕捉词语之间语义关系以及允许搜索更丰富数据类型的问题之前,让我们从基本原理开始,并提醒自己什么是向量。

在数学和物理学中,向量被正式定义为具有大小和方向的对象。这通常采用穿过空间的线段或箭头的形式,可用于表示速度、力和加速度等量。在计算机科学中,向量是数字的有限序列。换句话说,它是一种用于存储数值的数据结构。

在机器学习中,向量是我们计算机科学中谈论的相同数据结构,但存储在其中的数值具有特殊的含义。当我们获取一段文本或图像,并将其提炼为它所代表的关键概念时,此过程称为编码。结果输出是机器以数字形式表示的那些关键概念。这是一个嵌入,并存储在向量中。换句话说,当这种上下文含义嵌入向量中时,我们可以将其称为嵌入

虽然所有嵌入都是向量,但并非所有向量都是嵌入 - 向量可以被认为是超类,它可以用于表示任何数据,而嵌入是一种特定类型的向量表示,它经过优化以捕捉对象的语义或上下文含义。

这些嵌入向量通常非常大,长度可能有数百甚至数千个值。此长度也称为维度,它因向量的生成方式及其旨在表示的信息而异。对于包括 ClickHouse 在内的大多数数据库,向量只是一个浮点数数组,即 Array(Float32)

10_dimensional_vector.png

Embedding.png

在这里,我们将一个词表示为嵌入,但同样,嵌入可以表示一个短语、句子甚至一段文本。特定维度上的概念通常难以推理或附加标签,尤其是在更高维度中,但允许在组合时从概念上理解词语。可能更重要的是,向量也可以用于表示其他数据类型,例如图像和音频。这为搜索历史上基于倒排索引的方法难以处理的格式开辟了可能性。

为什么向量和嵌入有用?

将图像或文本编码为这些通用表示形式,即使内容的原始形式不同,也可以在它们之间以及它们所代表的信息之间进行比较。

要理解如何比较向量嵌入,我们可以将嵌入想象成高维空间中的一个点。两个嵌入将是这个空间中的两个点。如果这两个嵌入表示彼此概念上相似的对象,则空间中的这些点在几何距离和角度上将非常接近。

对于二维或三维,我们可以轻松地可视化和理解此距离。下面,我们假设“月光”、“手电筒”和“动物”这三个词的概念可以在 3 个维度中有效地表示

vector_search.png

不幸的是,三个维度不足以编码所有大量文本中的概念,更不用说图像了!幸运的是,用于计算两个向量之间角度或距离的数学(通常是 余弦相似度欧几里得距离)可以扩展到 N 维,即使我们人类无法在视觉上理解它。嵌入的维度通常小于 1000 - 足以编码文本语料库中的大多数概念。当然,这假设我们可以很好地选择我们的概念并将我们的嵌入准确地编码到空间中。

据估计,高达 80%90% 的所有数据都是非结构化数据。因此,这种比较能力为神经网络和 LLM 等算法奠定了基础,以处理历史上企业难以从中提取洞察力并以此为决策依据的一类数据,而且成本很高。

现在,假设我们有一种使用算法生成这些嵌入的方法,并且我们已经为我们想要使其可搜索的所有文本都这样做了。这样做会给我们留下一组嵌入,长度可能达到数亿,甚至数十亿

当用户想要搜索此文本存储库(我们现在拥有相应的嵌入)时,用户的搜索需要转换为嵌入本身。然后,可以将用户的搜索嵌入与文本存储库的嵌入集进行比较,以找到最接近的匹配项。当然,最接近的匹配嵌入表示与用户搜索最密切相关的文本。

以最简单的形式,用户可能只是通过按距离排序来搜索最相关的文档或一组文档,从而复制传统的搜索引擎。然而,这种查找概念上与查询相似的上下文文档的能力对 包括 ChatGPT 在内的其他机器学习管道 具有价值。请记住,嵌入是通过它们在向量空间中的角度或距离进行比较的。

linear_search.png

执行此向量比较过程通常需要一个可以持久存储这些向量的数据存储,然后公开一个查询语法,在该语法中可以传递向量或潜在的原始查询输入(通常是文本)。这导致了 向量数据库 的发展,例如 Pinecone 和 Weviate,除了简单地存储向量之外,还提供了一种将向量生成过程集成到其数据加载管道和查询语法中的方法 - 从而在数据加载和查询时自动执行嵌入编码过程。与此同时,Solr 和 Elasticsearch 等现有搜索引擎已添加对向量搜索的支持,并结合了新功能,允许用户加载和搜索嵌入。

此外,具有完整 SQL 支持的传统数据库(例如 Postgres 和 ClickHouse)已添加对向量存储和检索的本机支持。在 Postgres 的情况下,这是通过 pg_vector 实现的。ClickHouse 支持将向量存储为数组列类型 (Array<Float32>),并提供计算搜索向量与列值之间距离的函数。

精确结果与估算

当使用支持向量搜索的数据存储时,用户可以使用两种高级方法

  • 使用线性搜索的精确结果 - 将输入向量与数据库中的每个向量进行完整比较,按最近距离对结果进行排序,并将结果限制为 K 个命中。这种方法通常称为 K 最近邻 (KNN),虽然可以提供精确的结果并保证最佳质量的匹配,但通常不容易扩展到 1 亿左右,除非对匹配进行大量并行化和/或使用 GPU。根据其定义,匹配时间与需要匹配的向量数量成正比(假设所有其他变量都是常数),即 O(n)。

euclidean.png

  • 使用近似最近邻的近似结果 - 虽然有时需要精确的最接近匹配项,但近似值通常就足够了,尤其是在具有许多高质量匹配项的较大数据集上。近似最佳匹配项的算法旨在通过牺牲一定程度的准确性来加快搜索过程,从而降低 召回率 以提高速度。ANN 算法使用各种技术来快速识别可能是查询向量的最佳匹配项的最近邻居的小子集。这可以显着减少搜索大型数据集所需的时间。虽然 ANN 算法可能并不总是返回精确的 K 个最近邻居,但它们对于许多应用程序来说通常足够准确。ANN 算法在数据集很大且需要快速执行搜索的应用程序中非常有用。此处的示例包括分层可导航小世界 (HNSW) 和 Annoy 算法。

annoy.png

Annoy 算法 来源:Alexey Milovidov

上面显示了 Annoy 算法。它的工作原理是在语料库上构建基于树的索引。此树结构是通过基于使用的距离度量(通常是欧几里得距离)将数据递归划分为更小的子空间来构建的。划分过程一直持续到子空间包含少量数据点或达到树的某个深度。当发出查询时,将从根节点开始遍历树。在树的每一层,选择最接近查询点的节点并评估其子节点。搜索一直持续到到达叶节点,其中包含最接近查询点的数据点子集。然后可以通过计算查询点与叶节点中数据点之间的距离来找到最近邻居。

生成嵌入

文本或更丰富的媒体(例如图像)的详细编码过程是一个很大的主题,我们将在以后的博客文章中推迟讨论。总而言之,这依赖于使用机器学习算法来识别内容和含义,从而为语言或特定领域生成数学表示,称为模型。然后,这些模型可用于将后续文本(或其他资产)转换为向量。基于 Transformer 的模型已被证明在生成基于文本内容的向量方面特别有效。此类模型的早期版本包括 Google 开发的流行 BERT 模型。Transformer 本身比简单地将文本转换为向量更灵活,并且构成了最先进的语言翻译和最近流行的聊天机器人 ChatGPT 的基础。

如前所述,向量超越了概念嵌入。用户还可以选择构建或向向量添加其他特征。这些可以由其他模型学习,也可以由领域专家精心选择,他们试图确保两个向量的近距离捕捉业务问题的含义。有关一些示例,请参阅下面的应用程序。

图像嵌入的生成也是近年来引起广泛关注的研究领域,卷积神经网络架构在生成嵌入时的质量方面占据主导地位。最近,视觉 Transformer (ViT) 在图像分类和特征提取任务中显示出令人鼓舞的结果,尤其是对于大规模数据集。

多模态模型可以处理和编码多种数据类型,例如图像、文本和音频。例如,这些可以为图像和文本生成向量,从而有效地生成一个联合嵌入空间,可以在其中对它们进行比较。这可以用于允许用户使用词语进行搜索并找到概念上匹配的图像!OpenAI 在 2021 年推出了一种这样的算法,称为 CLIP(对比语言-图像预训练)。这种特殊的算法(我们将在以后的文章中使用其嵌入)学习图像及其相关文本标题(在训练期间提供)的联合表示,以便相关图像和标题的嵌入在空间中彼此靠近。除了简单的搜索用例之外,这还允许执行诸如 图像字幕零样本图像分类 等任务。

clip.png 来源:CLIP - https://openai.com/research/clip

值得庆幸的是,训练模型来生成嵌入并非总是必要的,因为现在有开源的预训练模型可用于生成此类嵌入,可以从 Hugging Face 等资源下载。这些可以通过称为“迁移学习”或“微调”的过程进行调整,以适应新的领域,只需进行最少的额外训练。用户还可以下载数据集的生成嵌入以进行实验。一旦用户生成或下载了一组嵌入,通常就需要存储介质 - 从而导致向量数据库的采用。

这篇博文重点介绍了通过生成向量嵌入、存储和检索来提供语义搜索的概念。除了简单地增强现有的传统企业或应用程序搜索体验之外,此功能还有许多应用。可能的用途包括但不限于

  • 推荐 - 向量搜索与电子商务网站尤其相关,可用于查找相关产品。除了简单地将文本含义嵌入到向量中之外,页面浏览量和过去的购买记录等特征也可以编码在向量中。
  • 问题解答 - 问答系统在历史上一直具有挑战性,因为用户很少使用与问题相同的术语。但是,可以使用向量对等效含义进行编码,这些向量非常接近,例如,X 和 Y。
  • 图像和视频搜索 - 使用上述多模态模型,用户可以根据文本搜索图像和视频 - 这对于音乐和电影推荐系统、产品推荐和新闻文章推荐等应用程序非常有用。
  • 欺诈检测 - 我们可以通过将用户的行为或登录模式编码为向量来查找相似或不同的交易。这些可能是异常行为并防止欺诈。
  • 基因组分析 - 向量数据库可用于存储和检索基因组序列的嵌入,这对于基因表达分析、个性化医疗和药物发现等应用非常有用。
  • 多语言搜索 - 多语言模型无需为语言构建索引(通常是一项昂贵的练习,并且成本与语言数量成线性关系),就可以实现跨语言搜索,并且两种语言中的相同概念可以编码为相同的向量。
  • 提供上下文 - 最近,向量数据库已被利用来为由 ChatGPT 等 API 提供支持的聊天应用程序提供上下文内容。例如,可以将内容转换为向量并存储在向量数据库中。当最终用户提出问题时,将查询数据库,并识别相关文档。与其直接将这些返回给用户,不如使用它们为 ChatGPT 提供额外的上下文,以生成更强大的答案。我们在 Supabase 的朋友最近实施了这样一个架构,为其文档提供聊天机器人。

结论

在这篇文章中,我们对向量嵌入和向量数据库进行了高层次的介绍。我们介绍了它们的价值以及它们与更传统的搜索方法的关联,以及大规模匹配向量的一般方法 - 精确匹配或通过近似匹配。

在我们的下一篇文章中,我们将探索 ClickHouse 的实际示例,并回答“我何时使用 ClickHouse 进行向量搜索?”这个问题。

有关计算语言理解历史的更多阅读资料,我们推荐这篇文章

立即开始使用 ClickHouse Cloud,并获得 300 美元额度。在 30 天试用期结束时,继续使用按需付费计划,或联系我们以了解有关我们基于用量的折扣的更多信息。访问我们的定价页面了解详细信息。

分享这篇文章

订阅我们的新闻通讯

随时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image