博客 / 工程

ClickHouse 向量搜索 - 第 1 部分

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

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

简介

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

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

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

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

向量搜索之前的搜索

让我们简要介绍一下传统引擎(如 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
©2025ClickHouse, Inc. 总部位于加利福尼亚州湾区和荷兰阿姆斯特丹。