什么是矢量数据库?
矢量数据库是一种专门设计的数据库系统,旨在高效地索引、查询和检索高维矢量数据。该系统支持高级数据分析和相似性搜索操作,其功能远远超出了传统数据库的传统结构化查询方法。
为什么要使用矢量数据库?
数据洪流是真实存在的。
到2024年,我们将被海量非结构化数据淹没,例如图像、文本和音频,这些数据无法被整齐地组织成表格。然而,我们需要一种方法,才能轻松地从每天产生的近3.3亿TB数据中挖掘出价值。
传统数据库即使具有提供一些矢量处理功能的扩展,也难以应对高维矢量数据的复杂性和需求。
处理向量数据极其耗费资源。传统的向量大小约为 6KB。由此可见,扩展到数百万个向量需要耗费大量的系统内存和计算资源。这对于传统的OLTP和OLAP数据库来说,管理起来非常具有挑战性。
向量数据库通过将非结构化数据表示为向量,可以理解其上下文或概念的相似性,从而实现基于数据相似性的高级分析和检索。
例如,在推荐系统中,向量数据库可以分析用户行为和物品特征,以推荐具有高度个人相关性的产品或内容。
在搜索引擎和研究数据库中,它们通过提供与查询语义相似的结果来增强用户体验,而不是仅仅依赖于在搜索栏中输入的确切单词。
如果您是向量搜索领域的新手,本文将解释您需要了解的关键概念和关系。
那么让我们开始吧。
什么是矢量数据?
为了理解矢量数据库,我们首先定义什么是“矢量”或“矢量数据”。
向量是某些复杂信息的数字表示。
例如,为了表示文本数据,它将封装语言的细微差别,例如语义和上下文。
对于图像来说,矢量数据封装了颜色、纹理和形状等方面的信息。维度与每幅图像的复杂性和信息量有关。
图像中的每个像素都可以看作一个维度,因为它包含数据(例如彩色图像中红、绿、蓝通道的颜色强度值)。因此,即使是包含数千像素的小图像,也转化为数千个维度。
因此从现在开始,当我们谈论高维数据时,我们的意思是数据包含大量的数据点(像素、特征、语义、语法)。
矢量数据的创建(因此我们可以将这些高维数据存储在我们的矢量数据库中)主要通过嵌入来完成。
嵌入如何工作?
嵌入将这种高维数据转换为更易于管理的低维向量形式,更适合机器学习和数据处理应用,通常通过神经网络模型。
例如,在创建文本维度时,该过程涉及分析文本以捕捉其语言元素。
基于 Transformer 的神经网络,如BERT(来自 Transformer 的双向编码器表示)和GPT(生成预训练 Transformer),被广泛用于创建文本嵌入。
每一层提取不同级别的特征,例如上下文、语义和语法。
网络的最后几层将这些信息压缩成一个向量,该向量是图像的紧凑、低维表示,但仍保留了基本信息。
矢量数据库的核心功能
什么是索引?
你有没有试过在一张庞大的人群照片中找到一张特定的脸?嗯,矢量数据库在处理大量高维矢量时也面临着类似的挑战。
现在,想象一下根据头发颜色、眼睛颜色和衣着风格将人群分成更小的群体。每一层都让你更接近你要找的人。矢量数据库使用类似的多层结构(称为索引)来根据矢量的“相似性”来组织它们。
这样,查找相似的图像就变成了跨相关组快速跳转,而不是逐一扫描每张图片。
存在不同的索引方法,每种方法都有其优势。HNSW平衡了速度和准确性,就像人群中一个连接良好的捷径网络。其他方法,例如 IVF 或乘积量化,则专注于特定任务或内存效率。
什么是二进制量化?
量化是一种用于减少数据库总大小的技术。它的工作原理是将向量压缩成更紧凑的表示形式,但会牺牲准确度。
二进制量化是 Qdrant 使用的一种快速索引和数据压缩方法。它支持向量比较,可以显著加快查询处理时间(最高可加快 40 倍!)。
把每个数据点想象成一把尺子。二进制量化会在某个点将这把尺子一分为二,将尺子上方的所有数据标记为“1”,尺子下方的所有数据标记为“0”。这个二值化过程会生成一串比特,代表原始向量。
这种“量化”代码体积更小,也更容易比较。尤其对于 OpenAI 嵌入而言,这种量化已被证明能够以较低的准确度代价实现显著的性能提升。
什么是相似性搜索?
相似性搜索允许您按含义而非关键词进行搜索。这样,您可以搜索唤起相同情绪的类似歌曲、符合您艺术构想的图像,甚至探索文本中的情感模式。
它的工作原理是,当用户查询数据库时,该查询也会被转换为向量(查询向量)。向量搜索从 HNSW 索引的顶层开始,算法会快速识别图中可能包含与查询向量最接近的向量的区域。算法会将您的查询向量与所有其他向量进行比较,并使用“距离”或“相似度”等指标来衡量它们的接近程度。
然后,搜索逐渐向下移动,缩小到更紧密相关的向量。目标是将数据集缩小到最相关的项目。下图说明了这一点。
一旦在底层识别出最接近的向量,这些点就会转换回实际数据,如图像或音乐,代表您的搜索结果。
可扩展性
矢量数据库通常处理包含数十亿个高维矢量的数据集。这些数据不仅规模庞大,而且性质复杂,需要更强大的计算能力和内存来处理。可扩展的系统可以处理这种日益增长的复杂性,而不会降低性能。这是通过分布式架构、动态资源分配、数据分区、负载平衡和优化技术的组合实现的。
像 Qdrant 这样的系统体现了矢量数据库的可扩展性。它充分利用了 Rust 在内存管理和性能方面的高效性,能够在优化资源利用率的情况下处理大规模数据。
高效的查询处理
这些数据库高效查询处理的关键在于其索引方法,这种方法能够快速浏览复杂的数据结构。通过映射和访问高维向量空间,HNSW 和类似的索引技术显著缩短了定位和检索相关数据所需的时间。
其他技术,例如处理计算负载和并行处理,也用于提高性能,尤其是在管理多个并发查询时。此外,还采用策略性缓存来存储频繁访问的数据,以便后续查询更快地检索。
使用元数据和过滤器
过滤器使用元数据来优化数据库中的搜索查询。例如,在包含文本文档的数据库中,用户可能不仅希望根据文本相似性来搜索文档,还希望按出版日期或作者过滤结果。
进行查询时,系统可以同时使用向量数据和元数据来处理查询。换句话说,数据库不仅会查找最接近的向量,还会考虑元数据过滤器设置的附加条件,从而打造更加个性化的搜索体验。
数据安全和访问控制
矢量数据库通常存储敏感信息。这可能包括客户数据库中的个人数据、机密图像或专有文本文档。确保数据安全意味着保护这些信息免受未经授权的访问、泄露和其他形式的网络威胁。
在 Qdrant,这包括以下机制:
- 用户身份验证
- 基于角色的访问控制
- 基于属性的访问控制
- 静态数据和传输中数据的加密
- 保留审计线索
- 高级数据库监控和异常检测
矢量数据库的架构
矢量数据库由多个不同的实体和关系组成。以下是对 Qdrant 术语的概述,以及它们在整体架构中的作用:
集合:集合是一组命名的数据点,其中每个点都是一个带有相关有效载荷的向量。集合中的所有向量必须具有相同的维度,并且可以使用单个指标进行比较。
距离度量:这些度量用于度量向量之间的相似性。距离度量的选择是在创建集合时进行的。这取决于向量的性质及其生成方式,并考虑用于编码的神经网络。
点:每个点由一个向量组成,还可以包含可选的标识符(ID) 和有效载荷。向量表示高维数据,有效载荷以 JSON 格式携带元数据信息,为数据点提供更多上下文或属性。
存储选项:主要有两种存储选项。内存存储选项将所有向量保存在 RAM 中,由于磁盘访问仅在持久化时才需要,因此可以实现最高的数据访问速度。
或者,Memmap 存储选项创建与磁盘上的文件链接的虚拟地址空间,从而在内存使用率和访问速度之间取得平衡。
客户端:Qdrant 支持多种编程语言用于客户端交互,例如 Python、Go、Rust 和 Typescript。因此,开发人员可以使用自己喜欢的编程语言连接 Qdrant 并进行交互。
矢量数据库用例
如果要用一个词概括矢量数据库的用例,那就是“匹配”。它们擅长找到一些不为人知的方法,将数据与给定查询进行对应或“匹配”。无论是通过图像、文本、用户偏好还是数据模式的相似性来实现。
以下是一些如何利用矢量数据库的示例:
个性化推荐系统用于分析和解读复杂的用户数据,例如偏好、行为和互动。例如,在 Spotify 上,如果用户经常听同一首歌或跳过同一首歌,推荐引擎就会记录下来,以便在以后提供个性化建议。
语义搜索使系统能够捕捉单词和文本的深层语义。在现代搜索引擎中,如果有人搜索“春季种植技巧”,它会尝试理解查询背后的意图和上下文含义,而不是仅仅匹配单词本身。以下是一个使用 Qdrant为初创公司开发的矢量搜索引擎示例:
还有许多其他用例,例如用于金融和网络安全等领域的欺诈检测和异常分析,以检测异常和潜在欺诈。以及通过比较矢量表示而非元数据或标签来进行基于内容的图像检索 (CBIR) 。
这些只是几个例子。矢量数据库能够将数据与查询“匹配”,这使得它们对于多种类型的应用至关重要。以下是一些您可以参考的用例。
开始您的第一个矢量数据库项目
现在您已经熟悉了向量数据库的核心概念,是时候开始动手了。首先,借助 Qdrant,只需 5 分钟左右即可构建您自己的科幻书籍语义搜索引擎。您也可以观看我们的视频教程。
准备好深入研究更复杂的项目了吗?那就迈出下一步,开始构建一个拥有完整 API 和数据集的实际神经搜索服务吧。
让我们行动起来吧!
鏂囩珷鏉ユ簮锛�https://dev.to/qdrant/what-is-a-vector-database-2h0b