将文本、图像或音频等复杂数据表示为高维向量(嵌入)能帮助我们获取其语义。然而,我们通常用于应用开发的数据库,例如关系型数据库(如PostgreSQL、MySQL)乃至许多NoSQL数据库(如MongoDB、Cassandra),最初并非设计用于处理这些向量所需的主要功能:根据几何距离或方向找出与给定查询向量最相似的向量。试想一个标准的SQL查询:SELECT * FROM products WHERE category = 'electronics' AND price < 500。这依赖于对组织在结构化行和列中的标量值进行精确匹配或比较。传统的索引,如B-树,对于这些操作非常有效。文本搜索通常涉及将关键词映射到文档的倒排索引。向量搜索的运作方式有所不同。其基本查询并非关于精确值匹配,而是在高维空间中寻找“近邻”。给定一个查询向量 $q$,我们想在数据库中找到数据向量 $p$,使得距离函数(如欧几里得距离)最小:$$ d(p, q) = \sqrt{\sum_{i=1}^{n}(p_i - q_i)^2} $$或最大化相似度函数,例如余弦相似度:$$ similarity(p, q) = \frac{p \cdot q}{|p| |q|} $$对数百万甚至数十亿高维向量(其中维度 $n$ 可以是数百或数千)进行详尽的计算,对于实时应用而言是计算上不可行的。这就是向量数据库发挥作用的地方。那么,向量数据库有何特点?从根本上说,向量数据库是一个专门设计并优化用于存储、索引和查询高维向量嵌入的数据库系统,通常还会存储其相关元数据。其主要特点包括:原生向量支持: 向量是第一类数据类型。数据库懂得如何高效地存储并操作这些稠密的数值数组。专门的相似性搜索索引: 这可能是其最为典型的特点。向量数据库实现了近似最近邻(ANN)算法。这些算法构建专门的索引结构(我们将在第三章详细说明),能够快速查找与查询向量相似的向量,相较于精确搜索,它牺牲少量准确性以换取速度和资源利用率的大幅提升。向量相似性查询: 查询语言或API提供进行相似性搜索的功能,可以使用各种距离度量(例如欧几里得距离、余弦相似度、点积)。目的是取回与查询向量最相似的前k个向量。高维度与大数据量的可伸缩性: 它们的架构能够处理包含数十亿向量(每个向量具有数百或数千个维度)的数据集,同时保持可接受的查询延迟。元数据存储与筛选: 尽管向量是主要部分,但应用程序通常需要将元数据(例如原始文本块、产品ID、图像文件名)与其关联。向量数据库允许将这些元数据与向量一同存储,并且常支持预筛选(在向量搜索之前筛选元数据)或后筛选(在向量搜索之后筛选结果)以优化结果。简而言之,传统数据库优化于基于精确匹配或范围比较来筛选和检索结构化数据,而向量数据库则优化于在高维向量空间中基于相似性寻找近似匹配。它们提供所需的基础设施,以构建语义搜索、推荐系统、图像检索系统和异常检测等应用程序,这些应用高度依赖于理解向量嵌入中包含的关系。接下来的章节将考察内部架构、数据模型以及实现这些功能的具体操作。