在本文中,您将了解矢量数据库的工作原理,从相似性搜索的基本思想到使大规模检索实用的索引策略。
我们将讨论的主题包括:
- 嵌入如何将非结构化数据转换为可以通过相似性搜索的向量。
- 矢量数据库如何支持最近邻搜索、元数据过滤和混合检索。
- HNSW、IVF 和 PQ 等索引技术如何帮助矢量搜索在生产中扩展。
我们不要再浪费时间了。
按 3 个难度级别解释矢量数据库
作者提供的图片
介绍
传统数据库回答了一个明确的问题:是否存在符合这些条件的记录? 矢量数据库 回答不同的一个:哪些记录与此最相似?这种转变很重要,因为大量的现代数据——文档、图像、用户行为、音频—— 不能 通过精确匹配进行搜索。因此,正确的查询不是“找到这个”,而是“找到与此接近的东西”。 嵌入模型 通过将原始内容转换为向量来实现这一点,其中几何接近度对应于语义相似度。
然而,问题在于规模。将查询向量与每个存储的向量进行比较意味着在生产数据大小上需要进行数十亿次浮点运算,而这种数学运算使得实时搜索变得不切实际。矢量数据库通过近似最近邻算法解决了这个问题,该算法会跳过绝大多数候选者,并且仍然返回与穷举搜索几乎相同的结果,而成本只是其一小部分。
本文从三个层面解释了它是如何工作的:核心相似性问题和向量支持什么,生产系统如何通过过滤和混合搜索来存储和查询嵌入,最后是使其大规模工作的索引算法和架构决策。
第一级:理解相似性问题
传统数据库存储结构化数据——行、列、整数、字符串——并通过精确查找或范围查询来检索它。 SQL 对此来说是快速且精确的。但现实世界中的许多数据并不是结构化的。文本文档、图像、音频和用户行为日志不能整齐地放入列中,“完全匹配”对它们来说是错误的查询。
解决方案是将这些数据表示为向量:固定长度的浮点数数组。像这样的嵌入模型 OpenAI 的 text-embedding-3-small,或图像的视觉模型,将原始内容转换为捕获其语义的向量。相似的内容会产生相似的向量。例如,单词“dog”和单词“puppy”最终在向量空间中几何上接近。一张猫的照片和一张猫的图画也很接近。
向量数据库存储这些嵌入,并让您可以通过相似性进行搜索:“找到与此查询向量最接近的 10 个向量。”这称为最近邻搜索。
第 2 级:存储和查询向量
嵌入
在矢量数据库可以执行任何操作之前,需要将内容转换为矢量。这是通过嵌入模型来完成的——将输入映射到密集向量空间的神经网络,通常具有 256 到 4096 维,具体取决于模型。向量中的具体数字没有直接的解释;重要的是几何形状: 接近的向量意味着相似的内容。
您可以调用嵌入 API 或自行运行模型,获取浮点数组,并将该数组与文档元数据一起存储。
距离度量
相似度以向量之间的几何距离来衡量。三个指标是常见的:
- 余弦相似度 测量两个向量之间的角度,忽略大小。它通常用于文本嵌入,其中方向比长度更重要。
- 欧氏距离 测量向量空间中的直线距离。当大小具有意义时,它很有用。
- 点积 当向量归一化时速度很快并且效果很好。许多嵌入模型都经过训练可以使用它。
指标的选择应与嵌入模型的训练方式相匹配。使用错误的指标会降低结果质量。
最近邻问题
在小数据集中找到精确的最近邻是微不足道的:计算从查询到每个向量的距离,对结果进行排序,然后返回顶部 K。这称为暴力搜索或平面搜索,并且 100% 准确。它还随着数据集大小线性缩放。对于 1000 万个向量(每个向量有 1536 个维度),平面搜索对于实时查询来说太慢了。
解决办法是 近似最近邻(ANN) 算法。这些以少量的准确性换取了速度的大幅提升。生产向量数据库在底层运行 ANN 算法。具体的算法、它们的参数以及它们的权衡是我们将在下一级别中研究的内容。
元数据过滤
纯矢量搜索会返回全局语义最相似的项目。在实践中,您通常想要更接近的内容:“查找属于该用户且在此日期之后创建的最相似的文档。”这就是混合检索:向量相似度与属性过滤器相结合。
实施情况各不相同。预过滤首先应用属性过滤器,然后对剩余子集运行 ANN。后过滤首先运行 ANN,然后过滤结果。对于选择性查询,预过滤更准确,但成本更高。大多数生产数据库使用某种带有智能索引的预过滤变体来保持快速。
混合搜索:密集+稀疏
纯密集向量搜索可能会错过关键字级精度。对“GPT-5 发布日期”的查询可能在语义上偏向一般人工智能主题,而不是包含确切短语的特定文档。混合搜索将密集 ANN 与稀疏检索(BM25 或 TF-IDF)相结合,以同时获得语义理解和关键字精度。
标准方法是并行运行密集和稀疏搜索,然后使用组合分数 倒数秩融合(RRF) — 一种基于排名的合并算法,不需要分数归一化。现在大多数生产系统本身都支持混合搜索。
第 3 级:规模索引
近似最近邻算法
三种最重要的近似最近邻算法各自在速度、内存使用和召回率之间的权衡面上占据不同的点。
分层可导航小世界 (HNSW) 构建一个多层图,其中每个向量都是一个节点,边连接相似的邻居。较高层稀疏,可实现快速长程遍历;较低层更密集,可实现精确的局部搜索。在查询时,算法会通过该图跳向最近的邻居。 HNSW 速度快、占用内存大,并且能提供出色的召回率。这是许多现代系统中的默认设置。
分层可导航小世界如何运作
倒排文件索引 (IVF) 使用 k 均值将向量聚类成组,构建一个将每个聚类映射到其成员的倒排索引,然后在查询时仅搜索最近的聚类。 IVF 使用的内存比 HNSW 少,但通常速度较慢,并且需要训练步骤来构建集群。
倒排文件索引的工作原理
产品量化 (PQ) 通过将向量划分为子向量并将每个子向量量化为码本来压缩向量。这可以将内存使用量减少 4-32 倍,从而支持数十亿规模的数据集。它通常与 IVF 结合使用,如 IVF-PQ,用于系统中,例如 费斯。
产品量化的工作原理
索引配置
HNSW 有两个主要参数: ef_construction 和 M:
ef_construction控制在索引构建期间考虑的邻居数量。较高的值通常会提高召回率,但需要更长的时间来构建。M控制每个节点的双向链路数量。更高M通常可以提高记忆力,但会增加内存使用量。
您可以根据您的回忆、延迟和内存预算来调整这些。
在查询时, ef_search 控制探索多少候选者。增加它可以提高召回率,但代价是延迟。这是一个运行时参数,您可以在不重建索引的情况下进行调整。
对于体外受精, nlist 设置簇的数量,以及 nprobe 设置查询时要搜索的簇数。更多的簇可以提高精度,但也需要更多的内存。更高 nprobe 提高了召回率,但增加了延迟。读 IVF 索引的参数(例如簇数)如何 nlist 和探针的数量 nprobe)进行调整以以尽可能快的查询速度实现目标召回? 了解更多。
召回率与延迟
人工神经网络生活在一个权衡面上。您始终可以通过搜索更多索引来获得更好的召回率,但您会付出延迟和计算的代价。对您的特定数据集和查询模式进行基准测试。对于搜索应用程序来说,recall@10 为 0.95 可能非常好;推荐系统可能需要 0.99。
规模和分片
单个 HNSW 索引可以在一台机器的内存中容纳最多大约 50-1 亿个向量,具体取决于维数和可用 RAM。除此之外,您还可以进行分片:跨节点对向量空间进行分区,并跨分片扇出查询,然后合并结果。这会带来协调开销,并且需要仔细选择分片键以避免热点。要了解更多信息,请阅读 矢量搜索如何随数据大小缩放?
存储后端
向量通常存储在 RAM 中以进行快速 ANN 搜索。元数据通常单独存储,通常存储在键值存储或列式存储中。某些系统支持内存映射文件来索引大于 RAM 的数据集,并在需要时溢出到磁盘。这会牺牲一些延迟来换取规模。
磁盘上的 ANN 索引,例如 磁盘 (由 Microsoft 开发)设计为通过具有最小 RAM 的 SSD 运行。对于内存是绑定约束的非常大的数据集,它们实现了良好的召回率和吞吐量。
矢量数据库选项
矢量搜索工具通常分为三类。
首先,您可以选择 专门构建的矢量数据库 例如:
- 松果:完全托管、无需运营的解决方案
- 奎德兰特:一个基于 Rust 的开源系统,具有强大的过滤功能
- 韦维阿特:具有内置模式和模块化功能的开源选项
- 风筝:高性能开源矢量数据库,专为大规模相似性搜索而设计,支持分布式部署和GPU加速
其次,对现有系统进行扩展,例如 Postgres 的 pgvector,在中小型规模下效果很好。
第三,有一些库,例如:
对于中等规模的新检索增强生成 (RAG) 应用程序,如果您已经在使用 Postgres,那么 pgvector 通常是一个很好的起点,因为它可以最大限度地减少操作开销。随着您的需求增长(尤其是数据集更大或更复杂的过滤),Qdrant 或 Weaviate 可能成为更具吸引力的选择,如果您更喜欢无需维护基础设施的完全托管解决方案,那么 Pinecone 是理想选择。
总结
矢量数据库解决了一个真正的问题:快速查找大规模语义相似的内容。核心思想很简单:将内容嵌入为向量并按距离搜索。实施细节——HNSW 与 IVF、召回调整、混合搜索和分片——在生产规模上非常重要。
您可以进一步探索以下一些资源:
快乐学习!

