向量数据库为AI应用提供高效的相似性检索能力。本文对比Milvus、Weaviate与Qdrant三大向量数据库的索引算法、性能特征与适用场景。适用于RAG与AI应用中向量数据库的技术选型决策。通过系统性学习,读者将掌握云原生架构设计、资源管理与运维实践方法,能够将其应用于云平台建设与优化。本文适合云架构师、DevOps工程师与技术管理者参考,助力构建高效稳定的云基础设施。

岗位关联

需要学习向量数据库(Milvus/Weaviate/Qdrant),云原生系统的可观测性是你的核心技术。本篇涵盖微服务、Service Mesh、Serverless、可观测性,帮助你设计现代软件架构。

目录
  1. 可视化演示
  2. 向量数据库的基本概念与核心定义
  3. 向量数据库的工作原理与核心机制(ANN 索引)
  4. 主流向量数据库对比:Milvus / Weaviate / Qdrant
  5. 实际应用场景与案例分析:RAG / 语义检索 / 推荐
  6. 优缺点分析与选型建议
  7. 进阶话题:混合检索、量化优化、GPU 与磁盘索引、发展趋势
  8. 实践指南与最佳实践
  9. AI 应用场景
  10. Python 演示
  11. 常见问答
  12. 常见误区
  13. 参考来源

可视化演示

\u901a\u8fc7\u4e09\u9636\u6bb5\u4ea4\u4e92\u5c55\u793aMilvus\u3001Qdrant\u4e0eWeaviate\u7684\u67b6\u6784\u5dee\u5f02\uff0c\u6db5\u76d6\u5b58\u7b97\u5206\u79bb\u3001HNSW\u7d22\u5f15\u4e0e\u6df7\u5408\u68c0\u7d22\u6d41\u7a0b\u3002

本节配有交互动效(进入视口后自动加载,约 3KB)。

Milvus\u5b58\u7b97\u5206\u79bb\u67b6\u6784 \u5bf9\u8c61\u5b58\u50a8\u6301\u4e45\u5316 \u6d88\u606f\u961f\u5217\u89e3\u8026 QPS=Scale/lat \u5b58\u7b97\u5206\u79bb\u652f\u6301\u72ec\u7acb\u6269\u5c55

向量数据库的基本概念与核心定义

向量数据库(Vector Database)是一种专门用于存储、索引和检索高维向量的数据库系统。它的核心目标不是精确匹配,而是根据向量的相似度在大规模数据中快速找到最接近的若干邻居(k-Nearest Neighbors, kNN)。在 AI 时代,文本、图像、音频、行为序列等对象都可以通过 Embedding 模型被映射为稠密浮点向量,向量数据库正是承载这些向量的基础设施。

与传统关系数据库相比,向量数据库的检索依据是“语义相似”而非“精确相等”。一条查询向量进来后,系统计算它与库中所有向量的距离(或相似度),按从小到大排序返回 top-k。由于维度通常在几百到几千之间,且数据量可达亿级,暴力计算(FLAT)的时间复杂度为 O(N·D),难以满足毫秒级延迟要求,因此必须依赖近似最近邻(ANN)索引来在召回率与速度之间取得平衡。

理解向量数据库需要三块前置知识:一是 Embedding 表示,即如何把对象变成向量;二是相似度度量,即如何定义“接近”;二是索引结构,即如何在海量向量中快速找近邻。Milvus、Weaviate、Qdrant 是当前最具代表性的三个开源向量数据库,分别代表了“云原生存算分离”“模块化内置向量化”“Rust 高性能过滤”三种工程路线。

在选型与使用中要特别注意:向量数据库解决的是“相似检索”问题,它通常不替代关系数据库,而是与其协同——结构化属性仍由关系库管理,向量库负责语义检索,二者通过主键或元数据关联。这种职责划分是 RAG、推荐、语义搜索等系统的常见架构。

余弦相似度
cos⁡θ=a⋅b∥a∥ ∥b∥\cos\theta = \frac{\mathbf{a}\cdot\mathbf{b}}{\lVert\mathbf{a}\rVert\,\lVert\mathbf{b}\rVert}
衡量两个向量方向上的夹角余弦,取值范围 [-1,1],归一化后等价于点积,是文本语义检索中最常用的度量。
欧氏距离(L2)
d2(a,b)=∑i=1n(ai−bi)2d_2(\mathbf{a},\mathbf{b}) = \sqrt{\sum_{i=1}^{n}(a_i - b_i)^2}
各维度差值平方和的平方根,对绝对位置敏感,图像检索中常用。
内积(点积)
a⋅b=∑i=1naibi\mathbf{a}\cdot\mathbf{b} = \sum_{i=1}^{n} a_i b_i
当向量已归一化时,点积等于余弦相似度,常用于最大化内积搜索(MIPS)。

向量数据库的工作原理与核心机制(ANN 索引)

向量数据库的性能核心在于 ANN(Approximate Nearest Neighbor)索引。精确 kNN 需要遍历全部向量,在亿级数据下不可行;ANN 通过牺牲少量召回率换取数量级的速度提升。当前工业界主流的三类索引是:基于图的 HNSW、基于倒排聚类的 IVF、基于量化的 PQ。它们可以单独使用,也可以组合(如 IVF_PQ、HNSW+PQ)以同时优化速度与内存。

HNSW(Hierarchical Navigable Small World)是一种分层小世界图索引。它把向量组织成多层图:顶层稀疏、底层稠密。插入时按指数衰减概率为节点随机选择一个最高层级,从该层向下逐层连接邻居。查询时从顶层入口点出发,每层用贪心搜索快速逼近目标区域,到底层再用大小为 efSearch 的候选列表做精细搜索。其优点是召回高、查询快,缺点是内存占用大(要存图结构)且构建较慢。

IVF(Inverted File)借鉴倒排索引思想:先用 K-Means 把向量聚成 nlist 个簇,每个簇记录成员向量。查询时只扫描距离查询最近的 nprobe 个簇(而非全部),从而把搜索范围从 N 缩小到约 nprobe·(N/nlist)。nprobe 越大召回越高但越慢,这是 IVF 最核心的权衡旋钮。IVF_FLAT 在簇内存原始向量,IVF_PQ 在簇内再做乘积量化压缩。

PQ(Product Quantization)是一种向量压缩技术。它把一个 D 维向量切成 M 个子向量,每个子向量独立用 K-Means 训练一个码本(通常 K=256,即 1 字节编码)。于是每个向量被压缩成 M 字节的编码。查询时采用非对称距离计算(ADC):查询向量不量化,预先计算它到每个子码本 K 个码字的距离表(共 M·K 项),再对每个候选编码查表求和即可得到近似距离,极大降低内存与计算量。代价是引入量化误差,召回有所下降。

召回率 Recall@k
Recall@k=∣Ak∩Gk∣k\text{Recall}@k = \frac{|\mathcal{A}_k \cap \mathcal{G}_k|}{k}
近似结果集合 A 与精确结果集合 G 的交集大小除以 k,是衡量 ANN 质量的关键指标。
HNSW 查询复杂度
Tsearch=O(ef⋅log⁡N)T_{\text{search}} = O(ef \cdot \log N)
ef 为 efSearch,N 为数据量;对数级增长使 HNSW 在大规模下仍保持低延迟。
IVF 查询代价
TIVF∝nprobe⋅NnlistT_{\text{IVF}} \propto n_{\text{probe}} \cdot \frac{N}{n_{\text{list}}}
搜索代价与探测簇数 nprobe 和平均簇大小成正比,nprobe 是精度/速度的主开关。
归一化向量的距离等价关系
∥a−b∥2=2−2cos⁡θ(∥a∥=∥b∥=1)\lVert\mathbf{a}-\mathbf{b}\rVert^2 = 2 - 2\cos\theta \quad (\lVert\mathbf{a}\rVert=\lVert\mathbf{b}\rVert=1)
L2 归一化后,最小化欧氏距离等价于最大化余弦相似度,三种度量在排序上等价。

主流向量数据库对比:Milvus / Weaviate / Qdrant

Milvus 是由 Zilliz 开源的云原生向量数据库,2.x 版本采用存算分离与微服务架构:对象存储(如 S3/MinIO)负责持久化,消息队列(Pulsar/Kafka)负责写入日志与解耦,查询节点(Query Node)加载索引执行检索,数据节点(Data Node)负责刷盘与构建。其索引引擎 Knowhere 统一封装了 FAISS、HNSW、DiskANN 等多种索引与 CPU/GPU 后端。Milvus 适合超大规模、需要弹性伸缩和多云部署的场景,但部署与运维复杂度较高。

Weaviate 同样是开源向量数据库,特色是“模块化”架构:内置 text2vec、text2vec-openai、img2vec 等 vectorizer 模块,可在写入时自动调用 Embedding 模型生成向量,也支持用户自带向量。它同时维护倒排索引(用于 BM25 关键词检索与属性过滤)和向量索引(HNSW),原生支持混合检索(Hybrid Search)。Weaviate 用 Go 实现,强调开发者体验与 GraphQL/REST API,适合需要“一站式”(向量化+存储+检索)的应用。

Qdrant 用 Rust 实现,主打高性能与强过滤能力。它的核心概念是 payload:每个向量可附带任意 JSON 元数据,并可在 payload 上建索引,从而在 ANN 搜索时高效做过滤(过滤感知搜索),避免“先 ANN 后过滤”导致召回塌缩。Qdrant 采用 growing segment(内存可写段)+ sealed segment(建好索引的只读段)+ WAL 的写入模型,支持分布式分片与可调一致性级别,单机性能与过滤效率表现突出。

三者并非互相替代,而是面向不同侧重:Milvus 偏“大规模云原生与多索引生态”,Weaviate 偏“内置向量化与混合检索开箱即用”,Qdrant 偏“Rust 性能与高效元数据过滤”。选型应结合数据规模、过滤需求、运维能力与生态来综合判断,而非单纯比较 benchmark 数字。

向量内存估算
Mmem≈N×D×4 bytes (float32)M_{\text{mem}} \approx N \times D \times 4 \text{ bytes (float32)}
亿级 768 维 float32 向量原始存储约 286GB,凸显量化压缩与磁盘索引的必要性。

实际应用场景与案例分析:RAG / 语义检索 / 推荐

RAG(Retrieval-Augmented Generation)是向量数据库当前最火热的应用。其流程是:将知识库文档切分为 chunk,用 Embedding 模型编码为向量并存入向量库(同时保留原文与元数据);用户提问时,把问题同样编码为向量,在向量库中检索 top-k 相关 chunk,再拼入 Prompt 交给大模型生成回答。向量库的召回质量直接决定 RAG 的上限——检索不到相关知识,再强的模型也无法凭空回答。

语义检索(Semantic Search)是另一典型场景。传统关键词检索受限于字面匹配,无法理解同义表达;而向量检索把“含义相近”的文档召回。例如查询“如何降低成本”能召回内容为“节约开支”的文档。工程上常将向量检索与 BM25 关键词检索做混合(Hybrid Search),用 RRF 等算法融合两路结果,兼顾语义泛化与关键词精确匹配,这是 Weaviate、Qdrant 都内置支持的能力。

在推荐系统中,向量数据库用于召回阶段:把用户和物品都表示为向量,通过近邻检索从百万级物品库中快速选出候选集。由于召回需要在几十毫秒内完成且 QPS 极高,ANN 索引(尤其 HNSW)是标配。配合元数据过滤(如只召回在售、同品类商品),可显著提升推荐相关性与效率。

图像与多模态检索同样依赖向量库。用 CLIP 等模型把图像/文本编码到同一向量空间,即可实现“以图搜图”“以文搜图”。这类场景维度高、数据量大,常需配合 PQ 量化或 DiskANN 磁盘索引来控制成本。案例驱动地看,向量数据库已成为连接“Embedding 模型”与“上层应用”的关键中间件。

优缺点分析与选型建议

HNSW 的核心优势是高召回与低查询延迟,是大多数“延迟敏感”场景的首选;其局限是内存占用大(图结构+原始向量),构建时间长,且对超大规模数据集内存压力显著。IVF 的优势是构建相对快、可控性强(调 nprobe),适合中等规模或需要批量构建的场景;局限是在极高召回要求下仍需较大 nprobe,速度优势缩小。PQ 的核心价值是极致压缩内存,适合“内存受限、可接受一定召回损失”的场景,常作为 IVF_PQ 组合使用。

Milvus 的优势是存算分离带来的弹性伸缩、多云部署与丰富的索引生态,适合亿级以上、对可用性与扩展性要求高的企业级场景;代价是组件多、运维复杂,小团队上手成本高。Weaviate 的优势是内置向量化与混合检索、API 友好,适合快速构建 RAG 与语义搜索的中小型应用;局限是单机扩展性与超大规模下的性能不如专门优化方案。Qdrant 的优势是 Rust 带来的高性能与高效过滤、资源占用低,适合对过滤与延迟要求苛刻的场景;生态相对年轻。

选型建议从五个维度权衡:数据规模(千万以下多数方案都能胜任,亿级以上需关注分片与磁盘索引)、过滤需求(强过滤优先 Qdrant/Weaviate 这类过滤感知方案)、运维能力(小团队优先 Qdrant 单机或 Weaviate,大团队可驾驭 Milvus)、是否需要内置向量化(Weaviate 开箱即用)、以及生态与一致性要求。没有“万能”方案,关键是理解各方案适用边界。

替代方案也需纳入考虑:当数据量不大(百万级以内)时,FAISS/Annoy/ScaNN 等库配合自建服务可能更轻量;当已有 PostgreSQL/Redis 基础设施时,pgvector、RedisVL 等扩展可避免引入新组件。技术选型的本质是在性能、成本、复杂度与团队能力间做权衡,而非盲目追求“最先进”。

QPS-召回权衡
QPS↓  ⟸  Recall↑  ⟸  efSearch/nprobe↑\text{QPS} \downarrow \;\Longleftarrow\; \text{Recall}\uparrow \;\Longleftarrow\; ef_{\text{Search}}/n_{\text{probe}}\uparrow
提升召回通常需放大搜索参数,导致 QPS 下降,需在 Pareto 前沿上选点。

进阶话题:混合检索、量化优化、GPU 与磁盘索引、发展趋势

混合检索(Hybrid Search)是工程实践中提升相关性的关键手段。它同时执行向量稠密检索与 BM25 稀疏关键词检索,再用融合算法合并。最常用的是 RRF(Reciprocal Rank Fusion),它只依赖排名而非分数,对不同检索器的分数尺度鲁棒,公式中 k 常取 60。也可采用加权分数融合,但需归一化各路分数。混合检索在专有名词、ID、精确匹配场景下补足了纯向量检索的短板。

量化优化方面,标准 PQ 的子空间划分是固定的,可能造成各子空间能量不均衡。OPQ(Optimized PQ)在量化前对向量做一次正交旋转优化,使子空间能量更均衡,从而降低量化误差。IVF_PQ 进一步对“残差”(向量减去其所属簇心)而非原始向量做量化,因为残差能量更小、更集中,量化误差更低。这些是提升压缩比下召回率的重要技巧。

DiskANN 是面向超大规模数据集的磁盘索引方案。它把图索引建在 SSD 上,内存只保留少量入口点与压缩后的向量,查询时按需从 SSD 读取图节点,从而在有限内存下支撑十亿级向量。其 Vamana 图构建阶段用 alpha 剪枝控制出度并保留长程边,兼顾搜索效率与召回。GPU 加速方面,GPU-FAISS、Milvus GPU 等利用 GPU 的大规模并行,在批量查询与高维度下显著提升吞吐,但小批量、低延迟场景下 CPU 可能更优。

发展趋势上,向量数据库正向几个方向演进:一是原生多模态与多向量(同一对象多个向量字段)支持;二是更智能的过滤与混合检索;三是与 LLM 深度集成的“记忆层”与 agentic 检索;四是动态数据下的增量索引与一致性优化;五是更高效的量化与磁盘/内存分层。理解这些趋势有助于在做架构决策时具备前瞻性。

PQ 量化误差期望
E[∥x−q(x)∥2]=∑m=1ME[∥x(m)−cim∥2]E[\lVert \mathbf{x} - q(\mathbf{x})\rVert^2] = \sum_{m=1}^{M} E[\lVert \mathbf{x}^{(m)} - c_{i_m}\rVert^2]
总量化误差等于各子空间量化误差之和,因此子空间划分与码本质量决定压缩精度。
ADC 近似距离
d~(x,y)=∑m=1Md ⁣(x(m), cm(ym))\tilde{d}(\mathbf{x},\mathbf{y}) = \sum_{m=1}^{M} d\!\left(\mathbf{x}^{(m)},\, c_{m}(y_m)\right)
查询向量不量化,预计算其各子向量到子码本码字的距离表,候选仅需 M 次查表求和。
PQ 存储开销
SPQ=M⋅log⁡2K bitsS_{\text{PQ}} = M \cdot \log_2 K \text{ bits}
K=256 时每个子向量 1 字节,整向量仅 M 字节,相比 float32 原始存储压缩数十倍。
RRF 融合打分
score(d)=∑r∈R1k+rankr(d)\text{score}(d) = \sum_{r \in R} \frac{1}{k + \text{rank}_r(d)}
对每个检索器 r 中文档 d 的排名求倒数和,k 通常取 60,对分数尺度鲁棒。

实践指南与最佳实践

Embedding 选型是第一步也是影响最大的一步。模型决定了向量空间的语义质量,再好的索引也救不了差的向量。应针对领域评估多个模型(通用如 BGE/E5,专有领域模型)在自身数据上的召回表现,而非仅看榜单。确定模型后要锁定维度与归一化策略:若用余弦相似度,写入前应做 L2 归一化,并保持查询与库内向量一致,避免度量不一致导致的排序错误。

参数调优应围绕“召回-QPS-内存”三角进行。HNSW 的 M(建议 8-64)、efConstruction(建议 100-500)影响建图质量,efSearch(建议 50-500)影响查询召回与速度;IVF 的 nlist 建议取 sqrt(N) 到 4·sqrt(N) 量级,nprobe 在召回达标前提下尽量小;PQ 的 M 与 K 决定压缩比与精度。务必用真实查询集离线评测 Recall@k 与 QPS,找到 Pareto 最优点,再上线。

过滤策略是工程中容易踩坑的环节。当过滤选择性高(过滤后剩余很少)时,“先 ANN 取大 top-k 再过滤”会导致召回不足甚至空结果。应优先使用过滤感知搜索(在图遍历/簇扫描时即应用过滤),如 Qdrant 的 payload 过滤、Milvus 的标量过滤下推。同时合理设计元数据 schema,为高频过滤字段建索引。

运维层面需建立可观测体系:监控查询延迟(P50/P99)、QPS、召回率(可抽样与精确结果比对)、内存与磁盘占用、索引构建进度与段合并情况。动态数据场景要关注 growing/sealed 段的合并策略与一致性级别选择(Strong/Bounded/Stale),在新鲜度与性能间权衡。最后,定期重建索引、评估 Embedding 模型迭代、做好备份与容量规划,是保障向量库长期稳定运行的关键。

L2 归一化
x^=x∥x∥2\hat{\mathbf{x}} = \frac{\mathbf{x}}{\lVert\mathbf{x}\rVert_2}
将向量缩放为单位长度,使余弦相似度、内积、L2 距离排序一致,是写入前推荐预处理。

AI 应用场景

向量数据库在 RAG 知识检索管线中的应用

阶段:推理优化

解决的问题:大模型缺乏私有/最新知识且易幻觉。向量数据库通过语义检索把与问题最相关的知识片段召回,作为上下文注入 Prompt,从根本上提升回答的事实准确性与可信度。

具体案例:某企业把上万份内部文档切分为 chunk,用 BGE 模型编码为 1024 维向量存入 Milvus(HNSW 索引)。员工提问时,问题经同一模型编码后在 Milvus 中检索 top-8 相关 chunk,再拼入 Prompt 交给大模型。上线后内部知识问答准确率从 55% 提升到 88%,且通过调整 efSearch 与 chunk 大小在召回与延迟间取得平衡,P99 检索延迟控制在 120ms 以内。

向量数据库在高并发推理服务中的语义检索部署

阶段:模型部署

解决的问题:推理服务在高并发下需要毫秒级语义检索,且要结合属性过滤(如权限、时效)。向量数据库的 ANN 索引与过滤感知搜索可在保证召回的同时稳定支撑高 QPS。

具体案例:一个语义搜索平台每天处理数百万次查询,要求 P99 低于 200ms,并需按租户、时效过滤。团队选用 Qdrant,在 payload 上建租户与时间索引,使用过滤感知的 HNSW 搜索。相比原先“先 ANN 后过滤”方案,召回从 62% 提升到 91%,P99 从 350ms 降到 170ms,集群规模缩减 30%,显著降低了运营成本。

向量数据库在推荐系统召回与特征工程中的应用

阶段:特征工程

解决的问题:推荐召回需在百万级物品库中按用户兴趣实时选出候选,且特征向量需高频更新。向量库支持高效近邻检索与增量写入,兼顾召回效率与数据新鲜度。

具体案例:某推荐团队将用户与物品行为序列编码为 256 维向量存入 Weaviate,召回阶段用 HNSW 取 top-200 候选,并混合 BM25 检索新品冷启动。借助 growing segment 的实时可写能力,物品向量分钟级更新上线,特征计算延迟从天级降到分钟级,新增特征成本降低约 60%,整体点击率提升 12%。

Python 演示

python57 行
import numpy as np np.random.seed(42)data = np.random.rand(1000, 128).astype(np.float32)query = np.random.rand(128).astype(np.float32)  def brute_force_search(data, query, k=5):    norms = np.linalg.norm(data, axis=1, keepdims=True) + 1e-9    normalized = data / norms    q_norm = query / (np.linalg.norm(query) + 1e-9)    sims = normalized @ q_norm    top_k = np.argsort(-sims)[:k]    return top_k  class SimpleIVF:    def __init__(self, nlist=10):        self.nlist = nlist        self.centroids = None        self.clusters = {}     def train(self, data):        rng = np.random.default_rng(42)        idx = rng.choice(len(data), self.nlist, replace=False)        self.centroids = data[idx].copy()        for _ in range(20):            dists = np.linalg.norm(data[:, None] - self.centroids, axis=2)            assign = np.argmin(dists, axis=1)            for c in range(self.nlist):                self.centroids[c] = data[assign == c].mean(axis=0)        self.assign = assign        for c in range(self.nlist):            self.clusters[c] = np.where(assign == c)[0]     def search(self, data, query, nprobe=3, k=5):        cd = np.linalg.norm(self.centroids - query, axis=1)        probe = np.argsort(cd)[:nprobe]        cand = np.concatenate([self.clusters[c] for c in probe])        sub = data[cand]        sub = sub / (np.linalg.norm(sub, axis=1, keepdims=True) + 1e-9)        sims = sub @ (query / (np.linalg.norm(query) + 1e-9))        order = cand[np.argsort(-sims)[:k]]        return order  def recall(approx, exact):    return len(set(approx.tolist()) & set(exact.tolist())) / len(exact)  exact = brute_force_search(data, query, k=5)ivf = SimpleIVF(nlist=10)ivf.train(data)approx = ivf.search(data, query, nprobe=3, k=5)print("exact:", exact)print("approx:", approx)print("recall:", recall(approx, exact))
目的:用 NumPy 从零实现暴力余弦检索与简化版 IVF 倒排聚类索引,并对比 ANN 近似结果与精确结果的召回率,直观演示向量数据库中精确检索与近似检索的差异及 nprobe 的作用。
  1. import numpy as np导入 NumPy,用于向量运算与距离计算。
  2. data = np.random.rand(1000, 128).astype(np.float32)生成 1000 条 128 维 float32 模拟向量库,float32 是向量库最常见的存储类型。
  3. def brute_force_search(data, query, k=5):定义暴力精确检索函数,作为计算召回率的真值基线。
  4. norms = np.linalg.norm(data, axis=1, keepdims=True) + 1e-9计算每条向量的 L2 范数并加小常数防止除零,用于归一化。
  5. normalized = data / norms对库向量做 L2 归一化,归一化后点积即余弦相似度。
  6. sims = normalized @ q_norm用矩阵乘法一次性计算查询与全部库向量的余弦相似度。
  7. top_k = np.argsort(-sims)[:k]按相似度降序取前 k 个索引,得到精确 top-k 结果。
  8. class SimpleIVF:定义简化版 IVF 索引类,演示倒排聚类检索原理。
  9. self.centroids = data[idx].copy()随机选取 nlist 个向量作为初始聚类中心。
  10. dists = np.linalg.norm(data[:, None] - self.centroids, axis=2)计算每个向量到所有簇心的欧氏距离,用于聚类分配。
  11. assign = np.argmin(dists, axis=1)把每个向量分配到距离最近的簇心,形成倒排关系。
  12. probe = np.argsort(cd)[:nprobe]选出距离查询最近的 nprobe 个簇,nprobe 是 IVF 精度与速度的主开关。
  13. return len(set(approx.tolist()) & set(exact.tolist())) / len(exact)计算近似结果与精确结果的交集占比,即召回率 Recall@k。

常见问答

向量数据库和像 FAISS 这样的向量检索库有什么区别?
FAISS 是一个向量检索算法库,提供索引构建与查询的底层能力,但不提供数据库级特性(持久化、增删改、元数据过滤、分布式、事务、API 服务等)。向量数据库(Milvus/Weaviate/Qdrant)在索引算法之上封装了完整的数据库能力:数据管理、高可用、分布式、过滤、CRUD、多租户与运维监控。可以粗略理解为:FAISS 是引擎,向量数据库是整车。事实上 Milvus 的 Knowhere 引擎就封装了 FAISS。
什么情况下应该用 HNSW,什么情况下用 IVF_PQ?
HNSW 适合“延迟敏感、内存充足、召回要求高”的场景,查询快、召回高,但内存占用大。IVF_PQ 适合“数据量极大、内存受限、可接受一定召回损失”的场景,通过聚类缩小范围再用 PQ 压缩,内存可降一个数量级以上。实践中常先在 HNSW 上评估能否满足内存预算,若不能则退到 IVF_PQ 或 DiskANN,并在召回达标前提下选择更省资源的方案。
为什么过滤条件选择性高时,先 ANN 后过滤会出问题?
若先做 ANN 取 top-k 再过滤,当过滤后剩余比例很低时,top-k 中可能大部分不满足过滤条件而被剔除,导致最终结果远少于 k 甚至为空,召回严重不足。正确做法是过滤感知搜索:在图遍历或簇扫描阶段就应用过滤条件,只把满足条件的向量纳入候选,从而保证返回足够数量且相关的结果。Qdrant、Milvus、Weaviate 都支持这种下推过滤。
余弦相似度、内积、L2 距离该选哪个?
取决于向量是否归一化与应用语义。文本语义检索常用余弦相似度(关注方向);若向量已 L2 归一化,余弦、内积、L2 三者在排序上等价,可统一用内积(计算最快)。图像检索常用 L2(关注绝对位置)。若向量未归一化且模长含语义(如某些推荐场景),用内积做 MIPS。关键是写入与查询使用同一度量,并在需要时统一归一化。
RAG 中向量库召回不好,该从哪里排查?
依次排查:1) Embedding 模型是否匹配领域,可用 query 与正例做相似度抽测;2) chunk 切分策略是否合理(过小丢上下文,过大稀释语义);3) 索引参数(efSearch/nprobe)是否过小导致召回不足;4) 是否缺少混合检索补足关键词;5) 元数据过滤是否误伤。先用离线评测集定位 Recall@k 瓶颈,再针对性优化,避免盲目调参。

常见误区

误区认为向量数据库只是理论概念,与实际工程工作没有直接关系。

正解向量数据库是 RAG、语义搜索、推荐召回等 AI 应用的核心基础设施,直接决定系统上限。从数据处理到模型部署,它的索引原理与选型决策贯穿工程全链路。

为何常见:很多学习者把理论知识与工程实践割裂,认为课堂概念用不上。实际上 ANN 索引、量化、过滤等原理正是解决生产性能问题的关键。

误区认为掌握了向量数据库的基本概念就足够了,不需要深入理解其内部机制。

正解仅了解表面在简单场景够用,但遇到性能调优、召回塌缩、内存爆炸、技术选型时,必须理解 HNSW/IVF/PQ 内部机制才能定位根因、做出正确决策。

为何常见:初学者易满足于“能跑起来”,简单场景下表层知识暂时够用,掩盖了深度理解的必要性。

误区认为向量数据库可以解决所有检索问题,忽略了其适用边界和局限性。

正解向量库擅长语义相似检索,但对精确匹配、范围查询、复杂关联等并不擅长,常需与关系库/倒排索引协同。任何方案都有适用边界,技术选型关键是权衡。

为何常见:掌握一个强大工具后易产生“锤子钉子”效应,认为它适用于所有场景,导致不当选型与系统复杂化。

误区认为向量数据库已经过时,被大模型长上下文取代,不需要花时间学习。

正解长上下文不能替代向量库:成本、时效、私有海量知识、精确过滤、低延迟高并发等场景仍需向量检索。向量库作为“外部记忆”与 LLM 深度协同,反而是 LLM 应用的标配。

为何常见:技术热点更迭快,学习者易追逐新概念而忽视基础。但向量检索的召回、成本、规模优势使其在可预见未来仍不可替代。

参考来源