向量库扫盲

从 Embedding、ANN 索引、混合检索到工程选型,系统理解向量数据库到底解决什么问题

Posted by Ekko on June 7, 2026

这篇笔记的目标,不是把向量库当成一个“AI 时代的新中间件名词”简单过一遍,而是把它拆回工程本质:向量库到底在存什么、查什么、快在哪里、为什么 ANN 索引会成为核心,以及它和关系型数据库、搜索引擎、RAG 系统之间到底是什么关系。

这篇内容重点覆盖四件事:一是向量检索的基本计算模型,二是 HNSW / IVF / PQ 这类常见索引的取舍,三是过滤、混合检索、重排、更新删除这些真实线上问题,四是 pgvectorMilvusQdrantWeaviatePinecone 这类方案在架构和运维上的差异。它更偏“整体视图 + 原理拆解 + 工程边界”,不是某个单一产品的使用手册。

参考资料:

Faiss: A library for efficient similarity search and clustering of dense vectors

Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs

Milvus Docs - What is a Vector Database

Qdrant Documentation

Weaviate Concepts

Pinecone Learn - Vector Databases

pgvector README

[TOC]


一、先把问题摆正:向量库到底解决什么问题

如果先用一句话概括向量库的价值,我会写成:

它不是帮你“按字段精确查数据”,而是帮你“按语义相似度查近邻”。

传统数据库最擅长的是下面这类查询:

  • 主键等值查询
  • 范围过滤
  • 聚合统计
  • 事务更新
  • 基于结构化字段的索引访问

搜索引擎最擅长的是:

  • 关键词召回
  • 倒排索引
  • BM25 相关性排序
  • 布尔条件过滤

而向量库最擅长的是另一类问题:

  • 这段文本和哪些文本“表达的意思接近”
  • 这张图片和哪些图片“视觉语义相近”
  • 这个用户兴趣向量和哪些商品向量“距离最近”
  • 这个问题最可能对应哪几段知识片段

所以它的核心任务不是“存一堆浮点数”,而是:

  1. 存储高维向量以及它对应的原始数据和元数据
  2. 在高维空间里快速做近邻搜索
  3. 在语义检索和过滤约束之间做平衡
  4. 在可接受延迟内尽量保持较高召回率

这也是为什么向量库会在 RAG、推荐系统、图像检索、相似内容去重、异常检测这些场景里集中出现。

1.1 向量库不是 Embedding 模型

这一点很容易混淆。

  • Embedding 模型负责把文本、图片、音频编码成向量
  • 向量库负责存储、索引、过滤、检索、排序和返回结果

前者决定“语义空间长什么样”,后者决定“这个语义空间怎么查得快、查得准、查得稳”。

如果 embedding 质量很差,向量库再强也救不了召回质量;但如果 embedding 质量不错,没有合适的向量索引,查询延迟和成本又会失控。两者是上下游关系,不是替代关系。

1.2 向量库也不是 RAG 的全部

很多文章会把“RAG = Embedding + 向量库”写成一个简化公式,这能帮助入门,但不够准确。

一个完整的 RAG 系统通常至少包含:

  • 文档清洗与切块
  • embedding 生成
  • 向量索引和元数据存储
  • 查询改写
  • 检索召回
  • 重排
  • 上下文压缩
  • 提示词组织
  • 大模型生成

向量库只负责其中“检索底座”的一部分,而且还不是全部检索逻辑。真正影响最终回答质量的,常常不是只把 top k 查出来,而是:

  • chunk 是否切得合理
  • 元数据过滤是否正确
  • 是否做 hybrid search
  • 是否做 rerank
  • 是否控制上下文冗余

所以理解向量库,最好把它看成:

RAG 检索阶段的核心基础设施,而不是整个 RAG 本身。

二、向量检索的基本计算模型

2.1 什么是向量

向量可以简单理解成一个长度固定的实数数组,例如:

1
[0.12, -0.35, 0.04, ..., 0.91]

这个数组通常有几百到几千维。维度本身未必具备直接可解释性,但整体位置能表达语义信息。

当两段文本表达相近含义时,它们对应的向量在高维空间里通常更接近;当语义差异较大时,距离通常更远。

因此,向量检索的核心操作不是:

  • where title = 'Redis'

而是:

  • find top k nearest vectors to query_vector

2.2 常见相似度度量

向量库的查询结果,本质上由距离函数决定。常见的有三类。

2.2.1 Cosine Similarity

余弦相似度衡量的是两个向量夹角是否接近:

1
cos(A, B) = (A · B) / (|A| * |B|)

它更关注方向而不是长度,所以常见于文本 embedding。

如果 embedding 模型输出向量已经归一化,那么 cosine similarity 和 inner product 在排序上往往会接近。

2.2.2 Euclidean Distance

欧氏距离衡量的是几何空间中的直线距离:

1
L2(A, B) = sqrt(sum((Ai - Bi)^2))

它保留了向量长度信息,在某些图像或特征检索场景更常见。

2.2.3 Inner Product

内积既受方向影响,也受向量长度影响。很多系统会支持最大内积搜索。

这类度量能否使用,不只取决于向量库支持什么,还取决于 embedding 模型训练时默认假设的相似度定义是什么。

2.3 为什么“暴力扫描”很快就不行了

假设你有 1000 万条文档,每条向量维度是 1536,那么一次查询如果要和每一条向量都做完整距离计算,成本会非常可观。

即便先不考虑 IO,只看计算量,也会遇到几个问题:

  • 查询延迟不可接受
  • CPU 成本线性增长
  • 并发一上来,机器资源会被快速吃满
  • 数据量继续增长后几乎无法横向扩展

所以,向量库的核心不只是“存向量”,而是“给向量建索引”,也就是:

用更少的候选访问,尽量找到足够接近真实最近邻的结果。

这就是 ANN,Approximate Nearest Neighbor,近似最近邻搜索。

三、为什么向量检索大多是 ANN,而不是精确搜索

3.1 精确搜索的问题不在正确性,而在规模

精确搜索的好处非常明确:

  • 一定能找到真正的 top k
  • 结果稳定
  • 没有近似误差

但一旦规模上来,它的问题也非常明确:

  • 复杂度基本随数据量线性增长
  • 延迟高
  • 成本高
  • 很难在在线系统里兼顾大规模和低时延

因此现实工程里通常做的是:

  • 离线评估时保留一部分精确搜索作为 ground truth
  • 在线服务时使用 ANN 索引做近似召回
  • 再通过参数调优、重排、过滤策略,把误差控制在可接受范围内

所以要有一个工程认知:

向量库追求的不是数学上绝对正确,而是“延迟、吞吐、内存、召回率”之间的综合最优。

3.2 召回率、延迟、内存经常是三角关系

在向量库里,几乎所有核心参数都在做 trade-off:

  • 搜得更深,召回更高,但延迟更大
  • 图更密,召回更高,但内存更大
  • 压缩更狠,成本更低,但精度可能下降
  • 分桶更细,搜索更快,但训练和维护成本更高

所以真正线上调优时,通常不是问:

  • 哪个索引算法最好

而是问:

  • 在我的数据规模、写入模式、过滤需求、延迟目标下,哪个方案最合适

四、常见索引结构:HNSW、IVF、PQ 到底在解决什么

4.1 HNSW:今天最常见的通用型方案

HNSW,Hierarchical Navigable Small World,可以粗略理解成一种“分层导航图”。

它的核心思路不是先把空间切成很多桶,而是:

  • 每个向量都是图中的一个节点
  • 节点之间维护若干近邻边
  • 上层图更稀疏,用于快速跳转到目标区域
  • 下层图更密集,用于精细搜索

查询时可以理解成:

  1. 从高层某个入口点开始
  2. 不断跳向“离目标更近”的节点
  3. 逐层下沉
  4. 在底层图里做更细致的近邻扩展

HNSW 的特点通常是:

  • 召回率高
  • 查询快
  • 调参相对直观
  • 对在线检索很友好

但它的问题也很明显:

  • 内存占用偏大
  • 建图成本不低
  • 大规模更新和删除需要额外维护策略

很多现代向量库默认主力索引就是 HNSW,例如 QdrantWeaviatepgvector 也支持 HNSW 索引。

4.2 IVF:先粗召回,再细搜索

IVF,Inverted File Index,核心思想是先聚类,再查局部。

大致流程是:

  1. 对全量向量做聚类,得到多个中心点
  2. 每条向量归入最近的簇
  3. 查询时先找到最接近 query 的若干簇
  4. 只在这些簇里继续搜索

它适合解决的问题是:

  • 数据量大
  • 全量扫描不现实
  • 可以接受先粗筛再细查

IVF 的优点:

  • 搜索范围显著缩小
  • 结构相对清晰
  • 配合量化后压缩效果好

IVF 的缺点:

  • 聚类质量会直接影响召回
  • 如果 query 落在簇边界附近,容易漏掉候选
  • 对动态数据分布变化更敏感

4.3 PQ:降低存储和计算成本

PQ,Product Quantization,不是独立的召回逻辑,而更像一种向量压缩策略。

它会把高维向量切成多个子空间,再分别量化编码,从而把原始 float 向量压缩成更短的编码表示。这样做的收益通常是:

  • 占用更少内存
  • 缓存命中率更好
  • 距离计算成本更低
  • 更适合超大规模向量集合

但代价也很直接:

  • 有压缩误差
  • 召回精度可能下降
  • 调参和评估更复杂

因此,PQ 经常与 IVF 组合使用,例如 IVF_PQ。这类设计非常适合超大规模场景,但如果你的数据量还远没到这个级别,过早上复杂压缩策略,反而容易把系统复杂度拉高。

4.4 一个实用判断:先问规模,再问算法

很多人上来就比较 HNSW 和 IVF,其实更好的顺序通常是:

  1. 数据规模是几十万、几百万,还是几亿
  2. 延迟目标是几十毫秒,还是几毫秒
  3. 写入更新频率高不高
  4. 是否大量依赖过滤
  5. 内存是否足够

对中小规模、读多写少、希望尽快拿到高召回效果的系统,HNSW 往往是一个很自然的起点。

对超大规模、成本敏感、需要压缩存储的系统,IVF + PQ 这一类方案更值得认真评估。

五、向量库不只是“向量索引”,还包含元数据过滤

如果只有相似度检索,很多线上场景其实并不能直接落地。

比如你要做企业知识库问答,通常会带上这样的限制:

  • 只查当前租户的数据
  • 只查某个知识库集合
  • 只查最近 30 天更新的数据
  • 只查权限范围内的文档
  • 只查 language = zh 的片段

这就意味着,一条真实查询常常是:

  1. 先带过滤条件缩小候选范围
  2. 在候选集合内做向量近邻搜索
  3. 再按相似度、业务分数或时间衰减排序

因此一个成熟向量库往往不只是提供:

  • vector index

还要提供:

  • payload / metadata 存储
  • 标量过滤
  • 过滤索引
  • 混合排序
  • 分片与副本机制

5.1 为什么过滤会把问题变复杂

如果查询只是“全库 top k 最近邻”,很多 ANN 结构都能较稳定发挥。

但一旦加上复杂过滤,比如:

  • 先过滤出某个租户的一小部分数据
  • 再在这部分数据上做 ANN

就会出现几个难点:

  • 原始全局索引未必对过滤后子集仍然高效
  • 过滤过严时,候选不足,结果质量会抖动
  • 先过滤再检索、先检索再过滤,效果和成本都不一样
  • payload 索引和 vector 索引之间需要协同

这也是为什么很多向量库的真正差异,不在“支持不支持 HNSW”,而在:

  • 过滤性能是否稳定
  • 混合查询能力是否成熟
  • 写入更新后的索引维护是否平滑

六、混合检索:为什么很多系统最后都不是“纯向量”

“纯向量检索”有明显优点:

  • 能找到语义接近但字面不同的内容
  • 对表达方式更鲁棒

但它也有典型短板:

  • 对精确术语、缩写、编号未必敏感
  • 对时间、版本号、错误码这种精确 token 可能表现一般
  • 某些场景容易被“语义相近但答案不对”的片段干扰

所以很多线上系统会做 hybrid search,也就是:

  • 一部分分数来自关键词检索,例如 BM25
  • 一部分分数来自向量相似度
  • 最终再融合排序

典型适用场景包括:

  • API 文档检索
  • 运维告警知识库
  • 电商搜索
  • 法务条款检索
  • 包含大量术语和编号的企业内部文档

一个重要认知是:

向量检索并没有淘汰倒排索引,很多时候两者结合反而更强。

七、把一次 RAG 检索链路拆开:向量库到底处在哪

一个比较典型的链路可以写成:

1
2
3
4
5
6
7
8
9
10
11
原始文档
  -> 清洗与切块
  -> embedding
  -> 写入向量库(vector + metadata + raw text)
  -> 用户查询
  -> query embedding
  -> metadata filter
  -> ANN recall
  -> rerank
  -> 组装上下文
  -> LLM 生成

7.1 最容易被低估的不是索引,而是切块

很多检索质量问题,最后查下来并不是向量库不行,而是 chunk 设计出了问题。

常见表现包括:

  • 切得太碎,语义上下文不完整
  • 切得太大,主题过于混杂
  • 标题和正文没有一起进入 embedding
  • 表格、列表、代码块在清洗时丢失结构
  • 相邻 chunk 没有 overlap,跨段信息断裂

因此“向量库效果不好”这个判断,往往需要拆开看:

  1. 是 embedding 模型不合适
  2. 还是 chunk 策略不合理
  3. 还是过滤条件限制过强
  4. 还是 top k 太小
  5. 还是 rerank 缺失

7.2 rerank 常常比“再换一家向量库”更有效

很多团队在召回不稳时第一反应是换数据库,但实践里更常见的情况是:

  • ANN 负责从海量候选中快速筛出前几十条
  • reranker 再用更贵但更精确的模型重新排序

这一步尤其适合:

  • 知识问答
  • 法律合同检索
  • 医疗文本检索
  • 需要细粒度相关性判断的长文档场景

也就是说,向量库负责的是“高效召回”,而不是最终语义判断的全部责任。

7.3 一张 RAG 落地最小方案图

如果把一个最小可用的 RAG 系统继续压缩,我会先记下面这条链路:

1
2
3
4
5
6
7
8
9
10
11
原始文档
  -> 清洗
  -> 切块
  -> embedding
  -> 存储(向量 + 原文 + metadata)
  -> 用户提问
  -> query embedding
  -> 检索
  -> rerank
  -> 组装上下文
  -> LLM 生成答案

如果再把它翻译成更偏工程实现的两条路径,可以理解成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
离线入库链路:
文档/PDF/网页
  -> 清洗与结构化
  -> chunk 切分
  -> embedding
  -> 写入向量库

在线查询链路:
用户问题
  -> query embedding
  -> metadata filter + ANN recall
  -> rerank
  -> 拼接 context
  -> LLM answer

这张图看起来简单,但它至少说明了三件事:

  • RAG 不只是“提问 -> 查向量库 -> 出答案”
  • 离线入库链路和在线查询链路是两条不同的系统路径
  • 真正决定最终效果的,不只有数据库,还包括切块、过滤、rerank 和 context 组织

如果你是第一次落地 RAG,我反而建议先按这张最小链路跑通,再决定哪些环节值得继续做复杂化。

八、写入、更新、删除:真实系统最容易被忽略的一面

如果只是做 demo,大家通常只关心:

  • 能不能 insert
  • 能不能 query

但线上系统更棘手的问题往往是:

  • 文档更新后旧向量怎么失效
  • 删除是否真的从索引里清掉
  • 批量导入时索引构建如何控成本
  • 实时写入会不会影响查询延迟
  • embedding 模型升级后是否需要全量重建

8.1 更新不是“改一行数据”那么简单

向量数据的更新通常意味着:

  1. 原始文本变了
  2. chunk 结果可能变了
  3. embedding 需要重算
  4. 索引里的向量要替换
  5. 某些引用关系、统计信息也可能要同步调整

如果你把文档切成多个 chunk,那么一次文档修改,常常不是 update 一条,而是:

  • 删除旧 chunk 集合
  • 重新生成并写入一组新 chunk

这会直接影响主键设计、幂等写入、版本管理和索引重建策略。

8.2 删除、重建、压缩都是运维问题

不同向量库对删除的处理方式可能不同:

  • 立即物理删除
  • 逻辑删除后延迟清理
  • 标记 tombstone,等待后台 compact

如果系统长期高频更新,而没有有效的 compaction 或重建机制,索引质量和查询性能都可能逐步下降。

所以生产环境里,常见配套能力包括:

  • bulk load
  • segment compaction
  • background indexing
  • snapshot / backup
  • index rebuild

这些能力看起来不像“算法”,却直接决定系统是否可长期维护。

九、如何理解主流产品的分工差异

9.1 pgvector:最小心智成本的入口方案

pgvector 的核心价值不是“性能一定最强”,而是:

  • 你已经有 PostgreSQL
  • 你不想引入新基础设施
  • 你需要事务、SQL、权限、备份体系复用
  • 数据规模还没有大到必须上独立向量引擎

它特别适合:

  • 中小规模知识库
  • 后台管理系统里的语义搜索
  • 需要和现有业务表强关联的场景
  • 希望快速验证 AI 检索能力的团队

它的边界通常在于:

  • 超大规模场景的扩展性
  • 极致低延迟
  • 复杂混合检索与分布式能力

所以可以把它理解成:

“先在现有数据库体系里把向量检索跑起来”的工程化折中方案。

9.2 Milvus:更偏独立分布式向量引擎

Milvus 更适合强调:

  • 独立向量检索能力
  • 更大规模数据集
  • 分布式部署
  • 更明确的数据段、索引构建、查询节点分工

如果团队愿意接受新基础设施和更高运维复杂度,它会给你更完整的专用向量引擎能力。

9.3 Qdrant:过滤和工程体验都比较均衡

Qdrant 的讨论度高,很大一部分原因不是“宣传做得好”,而是它在很多真实业务场景里比较均衡:

  • HNSW 能力成熟
  • payload 过滤体验较好
  • API 清晰
  • 自托管门槛相对不高

如果你的重点是“RAG 线上服务 + 元数据过滤 + 自托管可控”,它经常会进入候选名单。

9.4 Weaviate:更强调语义应用层能力组合

Weaviate 除了基础向量检索,也常被提到:

  • 混合搜索
  • 模块化集成
  • 多模态场景
  • 对上层语义应用更友好的接口设计

它给人的感觉常常不是“一个只负责索引的引擎”,而是更接近“面向 AI 应用的数据层平台”。

9.5 Pinecone:托管服务思路更强

Pinecone 的核心价值往往在于:

  • 托管化
  • 更少自运维负担
  • SDK 和云服务体验完整
  • 团队能更聚焦业务而不是底层集群维护

如果你的主要诉求是:

  • 更快上线
  • SLA
  • 更少 infra 维护

那么它的吸引力会很强;如果你更强调自托管、成本精控、底层可见性,那你可能会更偏开源方案。

9.6 一张表先建立整体印象

如果只是为了快速复习,我会先记下面这张表,再回头看每个产品的细节。因为大多数选型讨论,本质上都在下面几列里做取舍:

方案 更像什么 是否开源 免费方式 费用感知 适合场景 主要优势 主要短板 一句话判断
pgvector PostgreSQL 的向量扩展 扩展本身免费,自托管成本主要来自现有 PostgreSQL 资源 最低,很多时候几乎等于“沿用原数据库成本” 已有 Postgres 的中小规模语义检索、知识库、业务表联查 不引入新基础设施,直接复用 SQL、事务、权限、备份体系 超大规模、极致低延迟、复杂分布式能力不如专用向量库 如果你已经有 PostgreSQL,它通常是最低心智成本的起点
Milvus 独立分布式向量引擎 开源自托管免费,也可走 Zilliz Cloud 托管 自建时软件免费但运维成本高,托管版通常高于“顺手复用现有数据库”的方案 大规模向量检索、专门的 AI 检索平台、愿意投入专用基础设施的团队 专用引擎能力完整,面向大规模和分布式场景,索引类型和系统组件更专业 部署和运维复杂度更高,学习成本也更高 如果你追求的是“专门把向量检索这件事做大做深”,它很值得认真评估
Qdrant 工程体验较均衡的专用向量库 开源自托管免费,也有云服务可选 自托管成本相对可控,云服务一般介于托管便利和自建节省之间 RAG 线上服务、强过滤需求、自托管部署 HNSW 能力成熟,payload filter 体验好,API 清晰,自托管门槛相对友好 不是所有场景都比托管服务省事,也仍然需要独立运维 如果你想在“效果、过滤、自托管难度”之间找平衡,它很常进入首选名单
Weaviate 更偏 AI 应用平台的数据层 开源自托管免费,也有云托管方案 比纯自建数据库贵,但能换来更多现成能力;托管成本通常不算低 混合检索、多模态、希望减少上层拼装工作的语义应用 混合搜索、多模态、模块化集成能力更强,对 AI 应用层更友好 系统能力更丰富,也意味着认知和配置面更宽 如果你不只想要向量索引,还想要更完整的语义应用能力组合,可以优先看它
Pinecone 托管式向量数据库服务 一般提供试用或小额度体验,但核心思路仍是商业托管 通常最高,省的是基础设施和运维人力,不一定省云账单 希望快速上线、少运维、有 SLA 诉求的团队 托管化程度高,云服务和 SDK 体验完整,能把更多精力放在业务本身 成本、平台绑定、自托管可见性和可控性通常不如开源自建方案 如果你的核心目标是“快上线、少折腾基础设施”,它会很有吸引力

这里的“费用感知”不要只按软件 license 理解,更应该按总拥有成本看,也就是:

  • 软件本身是否收费
  • 是否需要新机器、新集群、新运维人力
  • 查询量、数据量、写入量上来后的弹性成本
  • 团队为了接入和维护这套系统要付出多少工程复杂度

9.7 复习时怎么快速区分这 5 个方案

如果把这 5 个方案再压缩成更容易记忆的判断,可以直接记成下面 5 句话:

  • pgvector:我已经有 PostgreSQL,先别新上基础设施
  • Milvus:我要的是独立、专业、可分布式扩展的向量引擎
  • Qdrant:我需要较强过滤能力,也希望自托管不要太重
  • Weaviate:我更看重混合检索、多模态和上层 AI 应用整合
  • Pinecone:我优先要托管化、上线速度和更少运维负担

如果再往前走一步,把它们映射成实际决策问题,可以这样理解:

  • 团队几乎没有额外 infra 预算或人力,先看 pgvector
  • 团队要做专门的 AI 检索平台,且规模和复杂度都会继续上升,重点看 Milvus
  • 团队是典型 RAG 场景,过滤很多,想自己掌控部署,重点看 Qdrant
  • 团队不只做文本检索,还希望把 hybrid search、多模态、模块能力一起考虑,重点看 Weaviate
  • 团队更像业务产品团队,不想自己维护底层集群,重点看 Pinecone

9.8 给一张更实用的选型决策树

如果你不想先看一堆横评,而是希望快速缩小范围,可以先走下面这张决策树:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
你是否已经稳定使用 PostgreSQL,且向量检索只是现有业务的一部分?
  -> 是:
       数据规模是否还在中小规模,可接受先用一套库把功能跑起来?
         -> 是:优先看 pgvector
         -> 否:继续往下看专用向量库
  -> 否:继续往下

你是否强烈希望“少运维、快上线、有人兜 SLA”?
  -> 是:优先看 Pinecone
  -> 否:继续往下

你是否希望系统完全可自托管,并且过滤能力对业务非常关键?
  -> 是:优先看 Qdrant
  -> 否:继续往下

你是否不只做基础向量检索,还很看重 hybrid search、多模态、AI 应用层整合?
  -> 是:优先看 Weaviate
  -> 否:继续往下

你的目标是否是更大规模、更专业、可分布式扩展的独立向量引擎?
  -> 是:优先看 Milvus
  -> 否:默认仍可从 pgvector 或 Qdrant 起步

这张决策树不是“绝对正确”的产品推荐,而是为了先把问题分层:

  • 你是复用现有数据库,还是引入专用引擎
  • 你是优先少运维,还是优先可控
  • 你是偏中小规模快速上线,还是偏长期大规模平台化
  • 你是只要向量检索,还是还要 hybrid search、多模态、应用层能力

只有先把这些问题问清楚,后面的横向比较才有意义。

十、选型时真正该问的问题

很多“向量库选型”文章最后会变成产品横评,但真正有用的问题通常只有这些:

10.1 数据规模多大

  • 10 万级和 1 亿级不是一个问题
  • 原始向量是 384 维还是 3072 维,成本差很多
  • 是否需要多副本、多分片,也会显著改变资源模型

10.2 写入模式怎样

  • 主要是离线批量导入
  • 还是持续实时增量写入
  • 更新和删除多不多

读多写少、写后很少变的数据,和高频变更的数据,最适合的索引策略可能完全不同。

10.3 过滤需求复杂吗

如果业务对 metadata filter 非常依赖,那么光比较 ANN 算法意义不大,应该重点看:

  • payload 索引能力
  • 过滤和向量查询的组合性能
  • 多租户隔离方式

10.4 运维能力强不强

  • 团队能不能维护独立集群
  • 能不能接受数据迁移和索引重建
  • 是否有备份恢复和容量规划经验

这决定了你更适合:

  • 托管服务
  • 自托管专用向量库
  • 还是先用 pgvector

10.5 最终目标是“搜得到”,还是“答得对”

这是最关键的。

如果最终目标是一个 RAG 问答系统,那么你要优化的终点不是 ANN benchmark 分数,而是:

  • 最终回答正确率
  • 幻觉率
  • 上下文相关性
  • 查询延迟
  • 单次请求成本

很多时候,把预算全砸在底层向量库上,不如补上:

  • 更合适的 embedding 模型
  • 更好的 chunk 策略
  • 混合检索
  • rerank
  • 查询改写

十一、几个特别常见的追问

11.1 为什么不用 Elasticsearch 直接代替向量库

这个问题背后真正想问的是:

  • Elasticsearch 已经能做搜索了
  • 它也支持向量检索
  • 那为什么还要专门再上一个向量库

答案不是“绝对不能替代”,而是:

要看你的核心问题,到底是“通用搜索平台顺带做向量检索”,还是“向量检索本身就是系统核心”。

如果你的需求更偏下面这些:

  • 关键词检索本来就很重要
  • 倒排索引、过滤、聚合、日志分析本来就是主业务
  • 向量检索只是现有搜索体系上的新增能力
  • 你团队已经非常熟悉 Elasticsearch

那么直接在 Elasticsearch 里做向量检索,是完全合理的工程选择。

但如果你的系统更偏下面这些:

  • RAG 检索是核心路径
  • 高维向量召回质量和查询成本非常关键
  • 数据规模大,ANN 索引是核心能力
  • 元数据过滤要和向量检索深度协同
  • 后续会持续调索引、调召回、调 rerank

那么专用向量库通常会更合适。因为这时你优化的重心已经不再是“通用搜索能力”,而是:

  • 向量索引结构
  • ANN 查询效率
  • 过滤与向量检索的协同
  • 写入、压缩、重建、分片、副本这些向量场景特有问题

所以更准确的结论不是:

  • Elasticsearch 不行

而是:

  • Elasticsearch 更像“通用搜索平台 + 向量能力”
  • 专用向量库更像“以向量检索为核心的一等基础设施”

如果你的主战场是企业站内搜索、日志检索、商品搜索,且本来就重度依赖倒排和 BM25,那么 Elasticsearch 完全可以是一个现实方案。

如果你的主战场是 AI 检索、知识库问答、推荐召回、长文档语义匹配,专用向量库往往会更顺手。

11.2 Elasticsearch / pgvector / 专用向量库,三者到底怎么选

如果把讨论再压缩成一张复习表,我会记下面这张:

维度 Elasticsearch pgvector 专用向量库
更像什么 通用搜索平台,向量检索是其能力之一 关系型数据库上的向量扩展 以向量检索为核心设计的专用引擎
核心强项 倒排索引、BM25、过滤、聚合、全文搜索生态 SQL、事务、联表、权限体系、低心智接入 ANN、向量索引、过滤协同、分布式检索、向量场景调优
最适合什么场景 站内搜索、商品搜索、日志检索、关键词和结构化过滤都很重的系统 已有 PostgreSQL、中小规模语义检索、业务表和向量强关联的场景 RAG、推荐召回、长文档语义匹配、多租户知识库、向量检索是核心路径的系统
成本结构 如果团队已重度使用 ES,增量接入成本可控;单独为向量检索上 ES 未必划算 通常最低,很多时候复用原数据库即可起步 软件可开源免费,但机器、集群、运维、托管费用通常更高
上手难度 如果团队已熟悉 ES,会很顺;否则体系也不轻 最低,尤其适合先验证需求 中等到高,取决于自托管还是托管
主要优势 关键词检索和过滤能力成熟,hybrid search 也容易理解 最小组织成本,和现有业务数据天然贴近 在向量检索质量、规模、延迟、过滤协同上更像“正面战场”方案
主要短板 向量检索通常不是它唯一核心,纯向量场景不一定最优 容量、延迟、复杂分布式能力有边界 新基础设施、新运维、新迁移成本都更高
一句话判断 你本来就在做搜索平台,且关键词体系很重,就先认真看它 你想先低成本把语义检索跑起来,就先看它 你已经确定向量检索是核心基础设施,就优先看它

如果只想记一句非常粗的决策规则,可以记成:

  • 已有成熟搜索体系,且关键词检索是主轴,优先看 Elasticsearch
  • 已有 PostgreSQL,且现在最重要的是低成本验证价值,优先看 pgvector
  • 已经确认向量检索是主路径,且后续规模、过滤、性能都会持续升级,优先看专用向量库

11.3 为什么很多团队会先用 pgvector

更准确一点说,这一节其实是在回答:

  • 为什么不是先上最“专业”的那套
  • 为什么很多团队宁可先做一个不那么极致的方案
  • 为什么工程里“先验证价值”经常比“先上最强架构”更重要

原因往往不是“pgvector 一定是最强的”,而是它在很多团队里是最容易启动、最容易证明价值的方案。

第一,它几乎不改变团队的基础设施版图。

  • 原来就在用 PostgreSQL
  • 现在只是加一个 extension
  • 权限、备份、监控、迁移流程很多都能沿用

第二,它很适合“先把功能跑通”。

很多团队刚开始做 RAG 或语义搜索时,真正不确定的不是数据库,而是:

  • chunk 怎么切
  • embedding 模型选哪个
  • 检索效果能不能接受
  • 业务到底有没有真实需求

在这个阶段,最怕的是还没验证需求,就先把 infra 搭复杂了。

第三,它特别适合和业务表强关联的场景。

比如:

  • 文档表和向量列就在同一库
  • 用户权限、租户字段、时间字段本来就在业务表里
  • 需要 SQL 联查、事务写入、一致性保障

这时 pgvector 的优势会非常直接。

当然,很多团队“先用 pgvector”,也意味着后面可能会遇到边界:

  • 数据规模持续增长
  • 查询延迟目标越来越严
  • 过滤和检索组合越来越复杂
  • 需要更专业的分布式向量能力

于是演进路径常常是:

  1. 先用 pgvector 快速验证价值
  2. 当规模和复杂度上来后,再评估 QdrantMilvusWeaviate 或托管方案

所以它的真正价值,是:

用最小的组织成本,把“语义检索是否值得做”这件事先验证出来。

11.4 什么时候该从 pgvector 升级到专用向量库

这个问题的关键不在于:

  • pgvector 行不行

而在于:

  • 它是不是已经开始限制你的系统继续往前走

一个比较实用的判断方法,是看你是否已经连续遇到下面这些信号。

11.4.1 数据规模和性能目标开始碰到边界

比如:

  • 向量量级已经持续上升,查询延迟越来越难压
  • 高峰期并发上来后,数据库负载明显不稳
  • 你开始频繁纠结索引构建时间、内存占用和查询抖动
  • 向量检索已经不再是“顺带做一下”,而是系统的核心路径

这时你就要开始认真评估:

  • 是否需要更专业的 ANN 能力
  • 是否需要把检索压力从主业务库里拆出去

11.4.2 过滤、召回、重排的组合越来越复杂

如果你的查询越来越像下面这样:

  • 多租户过滤
  • 权限过滤
  • 时间范围过滤
  • hybrid search
  • rerank
  • 去重、聚合、按文档回收结果

那说明你已经不再只是“给 PostgreSQL 多加一列向量”,而是在做一个真正的检索系统。

这个阶段继续把所有复杂度都压在一套通用业务库里,往往会越来越吃力。

11.4.3 运维目标已经从“先跑起来”变成“稳定扩展”

pgvector 很适合验证价值,但当系统进入稳定运营期后,你关心的问题会变成:

  • 索引重建能不能更平滑
  • 批量导入能不能更快
  • 删除和 compact 能不能更可控
  • 副本、分片、隔离、扩容能不能更专业

如果这些问题越来越频繁出现,就说明你开始需要一套“以向量检索为一等公民”的基础设施。

11.4.4 一个很实用的升级判断

如果你满足下面任意两到三条,其实就已经值得把升级提上日程了:

  • 向量检索是核心请求链路,不再只是附属能力
  • 数据规模和并发增长已经开始明显影响主库稳定性
  • 查询强依赖复杂过滤、hybrid search 或 rerank 协同
  • 团队开始频繁遇到索引重建、导入、删除、扩容方面的运维问题
  • 你已经知道自己后面还会继续加规模,而不是一次性的小功能

这时候更合理的做法通常不是“死守 pgvector”,而是:

  1. 先保留现有方案继续服务
  2. 并行评估 QdrantMilvusWeaviate 或托管方案
  3. 用真实业务样本做离线评测和灰度迁移

所以更准确的结论是:

pgvector 适合用来验证价值,专用向量库更适合承接已经被验证过、且会继续扩张的检索系统。

11.5 向量库里到底存不存原文

很多人第一次接触向量库时会默认认为:

  • 只要存 embedding 就够了

但真实工程里,通常不会只存向量,而是至少还会带上:

  • 原始 chunk 文本
  • 文档 ID / chunk ID
  • 标题、章节、时间、租户、权限等 metadata

原因很简单:

  • 检索出来后,你还要把可读文本返给上层
  • 你还要做过滤、权限判断、去重和聚合
  • 你还要知道这段 chunk 属于哪篇文档、哪个版本

所以更稳妥的理解是:

向量库不是只存一个 vector 列,而是经常要同时存“向量 + 原文片段 + 元数据 + 标识信息”。

当然,也有团队会把原文放对象存储或主库,向量库里只保留引用 ID。这个方案不是不行,但会把查询链路、回表成本和一致性问题都带进来,所以要看系统复杂度是否值得。

不一定。

如果你的数据和查询更偏下面这些:

  • 自然语言表达很多
  • 同义改写很多
  • 精确术语不是主矛盾
  • 用户更像在“问意思”,不是在“搜关键字”

那么纯向量检索就可能已经够用。

但如果你的数据里大量包含下面这些元素,hybrid search 通常更值得考虑:

  • 专有名词
  • API 名称
  • 错误码
  • 订单号、编号、版本号
  • 法条编号、字段名、类名、函数名

因为这类 token 往往具有强精确匹配价值,单靠纯语义相似度未必稳定。

所以更实用的结论是:

  • 先别把 hybrid search 当信仰
  • 先拿业务样本验证纯向量够不够
  • 如果关键字召回明显能补足纯向量短板,再上 hybrid search

十二、几个特别容易踩的坑

12.1 混用不同 embedding 模型

如果历史数据和新数据不是用同一个 embedding 模型生成的,甚至维度都不同,那么同库检索通常会出现明显问题。即使维度一样,不同模型的语义空间也可能不一致。

所以要把“embedding 版本”当成一等元数据来管理。

12.2 只看 top k,不看上下文冗余

很多系统把 top_k = 10 当成固定参数,但如果前 10 条其实高度重复,真实有效信息量可能很低。检索结果去重、按文档聚合、按章节裁剪,往往能比单纯调大 top k 更有效。

12.3 把相似度分数当成绝对真理

不同库、不同度量、不同模型下的分数不可直接横向比较。线上更可靠的做法通常是:

  • 基于业务样本做离线评测
  • 看 NDCG、Recall@K、MRR 之类指标
  • 用 A/B 测试验证最终效果

12.4 忽视重建成本

当 embedding 模型升级、chunk 策略变化、索引参数调整时,往往不是改个配置就结束,而是需要:

  • 全量重嵌入
  • 全量重建索引
  • 双写或灰度迁移

如果一开始没有把这件事当成必然会发生的运维动作,后面迁移成本通常会很高。

十三、最后给一个工作中的理解框架

如果要把向量库压缩成一套最值得记住的理解框架,我会记下面 5 句话:

  1. 向量库的核心价值不是存储,而是高维近邻检索
  2. Embedding 决定语义表达,索引决定检索效率
  3. ANN 追求的是召回率、延迟、内存、成本之间的平衡
  4. 线上效果往往取决于 chunk、filter、hybrid、rerank 的整体协作
  5. 选型不要只看 benchmark,要看数据规模、写入模式、过滤复杂度和团队运维能力

如果继续往下深挖,我认为最值得延伸的几个主题是:

  • HNSW 参数调优,例如 Mef_constructionef_search
  • pgvector 与专用向量库在生产环境里的边界
  • RAG 中 hybrid retrieval 与 rerank 的组合策略
  • 文档更新、重嵌入、索引重建的工程治理