矢量数据库简介

复杂数据正以极快的速度增长。 这些是非结构化形式的数据,包括网络上的文档、图像、视频和纯文本。 许多组织将从存储和分析复杂数据中获益,但复杂数据对于以结构化数据为基础构建的传统数据库来说可能很困难。 仅使用关键字和元数据对复杂数据进行分类可能不足以完全表示其所有各种特征。

幸运的是,机器学习 (ML) 技术可以通过将复杂数据转换为向量嵌入来提供更有帮助的复杂数据表示。 矢量嵌入将复杂的数据对象描述为成百上千个不同维度的数值。

存在许多用于构建向量的技术,从单词或句子的向量表示到跨媒体文本、图像、音频和视频。 有几种现有的高性能且易于使用的公共模型。 这些模型可以针对特定应用进行微调,你也可以从头开始训练新模型,尽管这种情况不太常见。

矢量数据库专门用于处理矢量嵌入的独特结构。 它们通过比较值并找到彼此最相似的值来索引向量,以便于搜索和检索。 然而,它们很难实施。

到目前为止,矢量数据库仅供少数拥有开发和管理资源的科技巨头使用。 除非经过适当校准,否则它们可能无法在不花费一大笔钱的情况下提供用户所需的性能。

使用构建良好的矢量数据库可为应用程序提供卓越的搜索能力,同时满足性能和成本目标。 有多种解决方案可以使其更易于实施。 这些解决方案的范围从插件和开源项目到处理安全性、可用性和性能的完全托管服务。 本文档将介绍矢量数据库的常见用途、核心组件以及如何入门。

1、什么是矢量数据库?

矢量数据库索引和存储矢量嵌入以进行快速检索和相似性搜索,具有 CRUD 操作、元数据过滤和水平缩放等功能。

Verctor:矢量,名词,发音:ˈvek-tər,在机器学习中,矢量是一组描述和表示对象各种特征的数值测量

Database:数据库,名词,发音:ˈdā-tə-ˌbās,专门为快速搜索和检索(如通过计算机)而组织的大量数据。

当我们说向量数据库索引向量嵌入时,我们的意思是它们以一种我们可以将任何向量相互比较或与搜索查询的向量进行比较的方式组织它们。 我们将进一步介绍用于索引向量的算法。 矢量数据库还负责执行 CRUD 操作(创建、读取、更新和删除)和元数据过滤。 传统数据库功能与在索引中搜索和比较矢量的能力相结合,使矢量数据库成为强大的工具。

矢量数据库擅长相似性搜索或“矢量搜索”。 矢量搜索使用户能够描述他们想要查找的内容,而不必知道哪些关键字或元数据分类归于存储的对象。 矢量搜索还可以返回相似或近邻匹配的结果,提供更全面的结果列表,否则可能会隐藏起来。

2、为什么使用矢量数据库?

生产中的矢量搜索是使用矢量数据库的最常见原因。 矢量搜索将多个对象的相似性与搜索查询或主题项进行比较。 为了找到相似的匹配项,可以使用用于创建矢量嵌入的相同 ML 嵌入模型将主题项或查询转换为矢量。 矢量数据库比较这些对象的相似性以找到最接近的匹配项,提供准确的结果,同时消除传统搜索技术可能返回的不相关结果。

让我们看一下矢量搜索的一些常见用例:

2. 1 语义搜索

搜索文本和文档通常可以通过两种方式完成。 词法搜索寻找模式和精确的单词或字符串匹配,而语义搜索使用你的搜索查询或问题的含义并将其放入上下文中。 矢量数据库存储和索引来自自然语言处理模型的矢量嵌入,以理解文本、句子和整个文档字符串的含义和上下文,从而获得更准确和相关的搜索结果。

使用自然语言查询来查找相关结果是一种更好的体验,并允许用户更快地找到他们需要的内容,而无需了解有关数据分类方式的细节。

2.2 非结构化数据的相似度搜索

图像、音频、视频和其他非结构化数据集在传统数据库中分类和存储可能非常具有挑战性。 这通常需要将关键字、描述和元数据手动应用于每个对象。 一个人对复杂数据对象之一进行分类的方式对另一个人来说可能并不明显。 因此,搜索复杂的数据可能会很碰运气。 这种方法要求搜索者了解数据的结构,并构建与原始数据模型相匹配的查询。

2.3 排名和推荐引擎

矢量数据库是为排名和推荐引擎提供动力的绝佳解决方案。 对于在线零售商,它们可用于推荐与过去购买的商品或客户正在研究的当前商品相似的商品。 流媒体服务可以应用用户的歌曲评分来为个人量身定制完美匹配的推荐,而不是依赖协同过滤或流行列表。

基于最近匹配项查找相似项目的能力使矢量数据库成为提供相关建议的理想选择,并且可以轻松地根据相似性分数对项目进行排名。

2.4 去重和记录匹配

矢量相似性搜索的另一个用例是记录匹配和重复数据删除。 使用相似性服务查找几乎重复的记录可用于广泛的应用程序。 考虑一个应用程序,该应用程序从目录中删除重复项以使其更加可用和相关。

2.5 异常检测

与矢量数据库在查找相似对象方面一样好,它们也可以查找与预期结果相距甚远或不同的对象。 这些异常在用于威胁评估、欺诈检测和 IT 运营的应用程序中很有价值。 可以识别最相关的异常以进行进一步分析,而不会因高误报率而占用大量资源。

3、矢量数据库的功能

3.1 搜索和检索的向量索引

矢量数据库使用专门设计的算法来有效地索引和检索矢量。 不同的用例需要确定准确性、延迟或内存使用的优先级,这些可以使用不同的算法进行微调。 选择和优化这些算法本身就是一门科学,为满足用例要求的不同数据集找到最佳算法可能具有挑战性。

除了索引,还有相似性和距离度量。 这些指标衡量向量嵌入之间的相关性/相似性。 一些指标比其他指标具有更好的召回率和准确率。 矢量索引中的常见指标包括欧氏距离、余弦相似度和点积。

矢量数据库使用“最近邻”索引来评估对象之间或与搜索查询的相似程度。 传统的最近邻搜索对于大型索引存在问题,因为它们需要在搜索查询和每个索引向量之间进行比较。 比较每个向量都需要时间。

近似最近邻 (ANN) 搜索通过近似和检索最相似向量的最佳猜测来规避此问题。 虽然 ANN 不保证返回最接近的精确匹配,但它在非常好的精度和非常快的性能之间取得了平衡。

HNSW、IVF 或 PQ 等技术是用于构建有效 ANN 索引的一些最流行的组件。 每种技术都专注于提高特定的性能属性,例如使用 PQ 减少内存或使用 HNSW 和 IVF 快速但准确的搜索时间。 通常的做法是混合多个组件来生成“复合”索引,以实现给定用例的最佳性能。

没有矢量数据库,设计和构建有效的索引并不容易。 如果使用 Faiss 这样的独立框架,索引的设计和部署需要一个经验丰富的工程师团队,他们对索引和检索算法有很好的掌握。 至少,必须使用另一个存储和检索管道将这些向量映射回原始数据(因为独立索引不支持这一点)。 索引需要定期重新训练和跟踪已删除、已替换或新数据的机制。 团队必须考虑这些增加的要求和任何正在进行的操作。

3.2 单级过滤

过滤允许你根据矢量元数据限制搜索结果。 这可以通过根据限制条件返回可用匹配的子集来提高搜索结果的相关性。

后过滤首先应用近似最近邻搜索,然后将结果限制为元数据过滤限制。 ANN 通常会返回一组请求的最接近的匹配项,但不知道其中有多少(如果有的话)将匹配元数据标准。 这通常很快,但可能会返回太少的与过滤器匹配的向量(如果有的话)。

使用元数据预过滤向量会缩小数据集,并可能返回高度相关的结果。 然而,由于预过滤首先对索引中的每个向量应用匹配标准,它也会严重降低向量数据库的性能。

单级过滤对于有效的矢量数据库是必不可少的。 它结合了预过滤的准确性和相关性以及与后过滤一样快或更快的速度。 通过将矢量和元数据索引合并为一个索引,单级过滤提供了两种方法的最佳选择。

3.3 数据分片

什么是不缩放的矢量数据库? ANN 算法以惊人的效率搜索向量。 但无论它们的效率如何,硬件限制了单台机器上的可能性。 您可以垂直扩展——增加单台机器的容量并并行化 ANN 例程的各个方面。 但是,无论是成本还是巨型机器的可用性,您都将达到极限。 输入水平缩放。 我们可以将向量划分为分片和副本,以跨许多商品级机器进行扩展,以实现可扩展且具有成本效益的性能。

想象一下,一位朋友用 100 张小纸条装满了一个桶。 假设她在每张纸条上写下某人的名字以及他们的生日、月份和日期以及实际出生时间。 然后她要求:“找到出生日期和时间最接近你的人”。 因此,您筛选存储桶以找到最接近的匹配项。 这样一来,纸条就像向量,你就像CPU,桶就像RAM。

现在假设你的朋友给了你一个包含 1000 个名字和生日的桶——你将要搜索一段时间! 相反,您将 1000 个名字分成 10 个桶,并邀请 10 个朋友帮忙。 你们每个人只搜索 100 个名字以在桶中找到最佳匹配,然后比较你们每个人找到的结果以找到最佳匹配。 结果,您在 1000 个名称中找到最佳匹配所需的时间几乎与在 100 个名称中找到最佳匹配所用的时间相同。 你已经横向扩展了自己!

矢量数据库将矢量平均划分为碎片,搜索每个碎片,最后组合所有碎片的结果以确定最佳匹配。 通常,它会使用 Kubernetes 并为每个分片分配至少一个 CPU 和一些 RAM 的 Kubernetes pod。 Pod 并行工作以搜索向量。

因此,在一个 pod 搜索一个分片所花费的时间中,你很快就会得到答案。 有20M向量? 使用 20 个 pod 并在一个 pod 搜索 1M 向量所需的时间内获得结果,或者使用 40 个 pod(每个分片 500K 个向量)更快地获得结果。 还有更多,但简单地说,每个 pod 的向量更少,查询延迟更低,并允许你在合理的时间内搜索多达数十亿个向量。

2.4 复制

矢量数据库需要优雅地处理许多请求。 分片允许它并行使用许多 pod 来更快地执行向量搜索。 但是,如果你需要同时或快速连续执行许多不同的矢量搜索怎么办? 如果新请求的速度足够快,即使是快速的矢量搜索也会得到支持。 输入副本。

顾名思义,副本复制整个 Pod 集以并行处理更多请求。 如果我们回想一下桶中名称的类比,这就像创建十个桶的副本并要求另外十个朋友处理任何新的匹配请求。 假设十个 Pod 可以在 100 毫秒内搜索 10M 向量。 如果你每秒发出一个请求,你就很好。 如果每秒发出 20 个不同的请求,则需要备份。 添加一个副本(在本例中为十多个 pod)以满足需求。

副本也提高了可用性。 机器出故障——这是生活中的事实。 矢量数据库需要在发生故障后尽快恢复 Pod。 但“尽快”并不总是足够快。 理想情况下,它需要立即处理故障而不会错过任何一个节拍。 云提供商提供了极不可能同时发生故障的所谓可用性区域。

矢量数据库可以将副本分布到不同的可用性区域,以确保高可用性。 但是你,用户,在这里也有一个角色——你需要有多个副本和副本容量,这样在发生故障的情况下,更少的副本可以在可接受的延迟下处理查询负载。

2.5 混合存储

矢量搜索通常完全在内存 (RAM) 中运行。 对于目录中拥有超过 10 亿个项目的公司,仅内存成本就可能使矢量搜索过于昂贵而无法考虑。 一些矢量搜索库可以选择将所有内容存储在磁盘上,但这可能会以搜索延迟变得高得无法接受为代价。

在混合存储配置中,压缩矢量索引存储在内存中,原始全分辨率矢量索引存储在磁盘上。 内存索引用于定位一小组候选对象以在磁盘上的完整索引中进行搜索。 此方法可提供快速准确的搜索结果,同时可将基础架构成本降低多达 10 倍。

混合存储允许你在相同的数据足迹中存储更多矢量,通过提高整体存储容量而不会对数据库性能产生负面影响来降低运营矢量数据库的成本。

2.6 API

矢量数据库应该减轻开发人员构建和维护矢量搜索功能的负担,这样他们就可以专注于使他们的应用程序达到最佳状态。 API 使开发人员可以轻松地从任何其他应用程序使用或管理矢量数据库。

应用程序对矢量数据库进行 API 调用以执行操作,例如将矢量更新插入数据库、检索查询结果或删除矢量。

REST API 通过从任何可以进行 HTTPS 调用的环境启动矢量数据库的功能来增加灵活性。 开发人员还可以使用 Python、Java 和 Go 等语言通过客户端直接访问它。


原文链接:What is a Vector Database?

BimAnt翻译整理,转载请标明出处