首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >向量搜索与ClickHouse-Part I

向量搜索与ClickHouse-Part I

作者头像
用户3578099
发布2023-09-01 09:33:00
发布2023-09-01 09:33:00
9240
举报
文章被收录于专栏:AI科技时讯AI科技时讯

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

因此,我们看到社区中矢量搜索的兴趣显着增加。具体来说,当需要专门的矢量数据库时,以及当不需要时,对更好地理解的兴趣。

有了这些模型,我们借此机会重新审视向量之前的搜索,探索向量(和嵌入)是什么,了解向量搜索及其应用,以及此功能如何适应更广泛的数据环境。

对于那些已经熟悉基本矢量搜索概念并想直接跳到如何在ClickHouse中完成矢量搜索的读者,您可以在这里找到第二部分。

让我们简要介绍一下搜索如何与Elasticsearch和Solr等传统引擎一起工作(注意:这些技术现在还提供矢量搜索功能)。

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

然后,每个文档中的文本将通过一个称为标记化的过程拆分为其组成的单词,这产生了一袋单词。最简单的形式是,标记化将涉及一个顺序过程,包括在空格上拆分、小写字母和删除标点符号。这些单词,也称为术语,然后将用于构建一个类似于在书后面找到的索引。该索引将包含文本中每个单词的计数、它们出现的文档ID,称为帖子,以及每个术语在文档中出现的频率的计数。

请注意,以上是一个简化,省略了标记化、词干化、词类化和停用词等过程的细节,以及用于提供快速搜索的位置索引和巧妙的内部数据结构。

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

在更广泛的语料库中很少见但在匹配文档中很常见的词,比“和”等通常常见的词对文档得分的贡献更大。这些频繁出现的词被称为“停用词”,由于它们对相关性的贡献较小,并在一定程度上失去了特征,可以选择从索引中省略。这一在20世纪70年代进行的简单观察,构成了术语频率/逆文档频率(TF/IDF)公式的基础,该公式虽然简单,但通常是有效的。

以上是一个简化。它假设术语之间存在逻辑与,并且每个术语的分数被简单地求和。多术语搜索可以不那么严格,例如OR,使用更复杂的评分函数,例如BM25和组合术语分数的方法。

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

“猫饶有兴趣地透过窗户看鸟”和“鸟饶有兴趣地透过窗户看猫”。

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

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

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

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

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

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

这些嵌入向量通常非常大,可以是数百甚至数千个值。这个长度,也称为维度,取决于向量的生成方式和它们打算表示的信息。对于大多数数据库,包括ClickHouse,向量只是浮点数数组,即数组(Float32)

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

即使内容的原始形式不同,将图像或文本编码为这些常见表示形式也允许它们与它们所代表的信息进行比较。

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

对于二维或三维,我们可以很容易地想象和理解这个距离。下面,我们假设“月光”、“手电筒”和“动物”三个词的概念可以有效地用3个维度来表示:

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

据估计,多达80%到90%的数据是非结构化的。因此,这种比较能力为神经网络和LLM等算法处理一个类提供了基础,这个类在历史上对企业来说是具有挑战性和成本高昂的,以提取洞察力并从中做出决策。

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

当用户想要搜索这个文本仓库(我们现在有相应的嵌入)时,需要将用户的搜索转换为嵌入本身。然后,可以将用户的搜索嵌入与文本仓库的嵌入集合进行比较,以找到最接近的匹配。最接近的匹配嵌入当然代表了与用户搜索最接近的文本。

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

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

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

在使用支持向量搜索的数据存储时,向用户提供了两种高级方法:

  • 线性搜索的精确结果-输入向量与数据库中每个向量的完整比较,按最近距离对结果进行排序,并限制为K次命中。这种方法通常称为K最近邻(KNN),虽然在保证最佳质量匹配的情况下提供精确的结果,但在匹配和/或使用GPU没有显着并行化的情况下,通常不容易扩展到1亿左右。根据其定义,匹配时间与需要匹配的向量数量成正比(假设所有其他变量都是常数),即O(n)。
  • 近似最近邻的近似结果-虽然有时需要精确的最接近匹配,但近似通常就足够了,尤其是在具有许多高质量匹配的大型数据集上。近似最佳匹配的算法旨在通过减少召回来换取速度,从而牺牲一定程度的准确性来加快搜索过程。ANN算法使用各种技术来快速识别可能是查询向量最佳匹配的最近邻的一小部分子集。这可以显着减少搜索大型数据集所需的时间。虽然ANN算法可能并不总是返回确切的K个最近邻,但对于许多应用程序来说,它们通常足够准确。ANN算法在数据集较大且需要快速执行搜索的应用中是有益的。这里的示例包括分层可通航小世界图(HNSW)和Annoy算法。

烦人的算法信用:阿列克谢·米洛维多夫

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

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

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

图像嵌入的生成也是近年来备受关注的一个研究领域,卷积神经网络架构在生成嵌入时在质量方面占主导地位。最近,视觉变形金刚(ViT)在图像分类和特征提取任务方面显示出有希望的结果,尤其是对于大规模数据集。

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

信用: CLIP- https://openai.com/research/clip

谢天谢地,训练模型以生成嵌入并不总是必要的,因为现在有开源的预训练模型可用于生成此类嵌入,可从拥抱脸等资源下载,这些模型可以在称为“迁移学习”或“微调”的过程中以最少的额外训练适应新领域。用户还可以下载数据集的生成嵌入进行实验。一旦用户生成或下载了一组嵌入,通常就需要存储介质——从而采用矢量数据库。

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

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

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

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

🔗 原文链接: https://clickhouse.com/blog/vector-...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技时讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档