这篇笔记的目标,不是把向量库当成一个“AI 时代的新中间件名词”简单过一遍,而是把它拆回工程本质:向量库到底在存什么、查什么、快在哪里、为什么 ANN 索引会成为核心,以及它和关系型数据库、搜索引擎、RAG 系统之间到底是什么关系。
这篇内容重点覆盖四件事:一是向量检索的基本计算模型,二是 HNSW / IVF / PQ 这类常见索引的取舍,三是过滤、混合检索、重排、更新删除这些真实线上问题,四是
pgvector、Milvus、Qdrant、Weaviate、Pinecone这类方案在架构和运维上的差异。它更偏“整体视图 + 原理拆解 + 工程边界”,不是某个单一产品的使用手册。
参考资料:
Faiss: A library for efficient similarity search and clustering of dense vectors
Milvus Docs - What is a Vector Database
[TOC]
一、先把问题摆正:向量库到底解决什么问题
如果先用一句话概括向量库的价值,我会写成:
它不是帮你“按字段精确查数据”,而是帮你“按语义相似度查近邻”。
传统数据库最擅长的是下面这类查询:
- 主键等值查询
- 范围过滤
- 聚合统计
- 事务更新
- 基于结构化字段的索引访问
搜索引擎最擅长的是:
- 关键词召回
- 倒排索引
- BM25 相关性排序
- 布尔条件过滤
而向量库最擅长的是另一类问题:
- 这段文本和哪些文本“表达的意思接近”
- 这张图片和哪些图片“视觉语义相近”
- 这个用户兴趣向量和哪些商品向量“距离最近”
- 这个问题最可能对应哪几段知识片段
所以它的核心任务不是“存一堆浮点数”,而是:
- 存储高维向量以及它对应的原始数据和元数据
- 在高维空间里快速做近邻搜索
- 在语义检索和过滤约束之间做平衡
- 在可接受延迟内尽量保持较高召回率
这也是为什么向量库会在 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,可以粗略理解成一种“分层导航图”。
它的核心思路不是先把空间切成很多桶,而是:
- 每个向量都是图中的一个节点
- 节点之间维护若干近邻边
- 上层图更稀疏,用于快速跳转到目标区域
- 下层图更密集,用于精细搜索
查询时可以理解成:
- 从高层某个入口点开始
- 不断跳向“离目标更近”的节点
- 逐层下沉
- 在底层图里做更细致的近邻扩展
HNSW 的特点通常是:
- 召回率高
- 查询快
- 调参相对直观
- 对在线检索很友好
但它的问题也很明显:
- 内存占用偏大
- 建图成本不低
- 大规模更新和删除需要额外维护策略
很多现代向量库默认主力索引就是 HNSW,例如 Qdrant、Weaviate,pgvector 也支持 HNSW 索引。
4.2 IVF:先粗召回,再细搜索
IVF,Inverted File Index,核心思想是先聚类,再查局部。
大致流程是:
- 对全量向量做聚类,得到多个中心点
- 每条向量归入最近的簇
- 查询时先找到最接近 query 的若干簇
- 只在这些簇里继续搜索
它适合解决的问题是:
- 数据量大
- 全量扫描不现实
- 可以接受先粗筛再细查
IVF 的优点:
- 搜索范围显著缩小
- 结构相对清晰
- 配合量化后压缩效果好
IVF 的缺点:
- 聚类质量会直接影响召回
- 如果 query 落在簇边界附近,容易漏掉候选
- 对动态数据分布变化更敏感
4.3 PQ:降低存储和计算成本
PQ,Product Quantization,不是独立的召回逻辑,而更像一种向量压缩策略。
它会把高维向量切成多个子空间,再分别量化编码,从而把原始 float 向量压缩成更短的编码表示。这样做的收益通常是:
- 占用更少内存
- 缓存命中率更好
- 距离计算成本更低
- 更适合超大规模向量集合
但代价也很直接:
- 有压缩误差
- 召回精度可能下降
- 调参和评估更复杂
因此,PQ 经常与 IVF 组合使用,例如 IVF_PQ。这类设计非常适合超大规模场景,但如果你的数据量还远没到这个级别,过早上复杂压缩策略,反而容易把系统复杂度拉高。
4.4 一个实用判断:先问规模,再问算法
很多人上来就比较 HNSW 和 IVF,其实更好的顺序通常是:
- 数据规模是几十万、几百万,还是几亿
- 延迟目标是几十毫秒,还是几毫秒
- 写入更新频率高不高
- 是否大量依赖过滤
- 内存是否足够
对中小规模、读多写少、希望尽快拿到高召回效果的系统,HNSW 往往是一个很自然的起点。
对超大规模、成本敏感、需要压缩存储的系统,IVF + PQ 这一类方案更值得认真评估。
五、向量库不只是“向量索引”,还包含元数据过滤
如果只有相似度检索,很多线上场景其实并不能直接落地。
比如你要做企业知识库问答,通常会带上这样的限制:
- 只查当前租户的数据
- 只查某个知识库集合
- 只查最近 30 天更新的数据
- 只查权限范围内的文档
- 只查
language = zh的片段
这就意味着,一条真实查询常常是:
- 先带过滤条件缩小候选范围
- 在候选集合内做向量近邻搜索
- 再按相似度、业务分数或时间衰减排序
因此一个成熟向量库往往不只是提供:
- 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,跨段信息断裂
因此“向量库效果不好”这个判断,往往需要拆开看:
- 是 embedding 模型不合适
- 还是 chunk 策略不合理
- 还是过滤条件限制过强
- 还是 top k 太小
- 还是 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 更新不是“改一行数据”那么简单
向量数据的更新通常意味着:
- 原始文本变了
- chunk 结果可能变了
- embedding 需要重算
- 索引里的向量要替换
- 某些引用关系、统计信息也可能要同步调整
如果你把文档切成多个 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”,也意味着后面可能会遇到边界:
- 数据规模持续增长
- 查询延迟目标越来越严
- 过滤和检索组合越来越复杂
- 需要更专业的分布式向量能力
于是演进路径常常是:
- 先用
pgvector快速验证价值 - 当规模和复杂度上来后,再评估
Qdrant、Milvus、Weaviate或托管方案
所以它的真正价值,是:
用最小的组织成本,把“语义检索是否值得做”这件事先验证出来。
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”,而是:
- 先保留现有方案继续服务
- 并行评估
Qdrant、Milvus、Weaviate或托管方案 - 用真实业务样本做离线评测和灰度迁移
所以更准确的结论是:
pgvector适合用来验证价值,专用向量库更适合承接已经被验证过、且会继续扩张的检索系统。
11.5 向量库里到底存不存原文
很多人第一次接触向量库时会默认认为:
- 只要存 embedding 就够了
但真实工程里,通常不会只存向量,而是至少还会带上:
- 原始 chunk 文本
- 文档 ID / chunk ID
- 标题、章节、时间、租户、权限等 metadata
原因很简单:
- 检索出来后,你还要把可读文本返给上层
- 你还要做过滤、权限判断、去重和聚合
- 你还要知道这段 chunk 属于哪篇文档、哪个版本
所以更稳妥的理解是:
向量库不是只存一个
vector列,而是经常要同时存“向量 + 原文片段 + 元数据 + 标识信息”。
当然,也有团队会把原文放对象存储或主库,向量库里只保留引用 ID。这个方案不是不行,但会把查询链路、回表成本和一致性问题都带进来,所以要看系统复杂度是否值得。
11.6 是不是所有场景都要 hybrid search
不一定。
如果你的数据和查询更偏下面这些:
- 自然语言表达很多
- 同义改写很多
- 精确术语不是主矛盾
- 用户更像在“问意思”,不是在“搜关键字”
那么纯向量检索就可能已经够用。
但如果你的数据里大量包含下面这些元素,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 句话:
- 向量库的核心价值不是存储,而是高维近邻检索
- Embedding 决定语义表达,索引决定检索效率
- ANN 追求的是召回率、延迟、内存、成本之间的平衡
- 线上效果往往取决于 chunk、filter、hybrid、rerank 的整体协作
- 选型不要只看 benchmark,要看数据规模、写入模式、过滤复杂度和团队运维能力
如果继续往下深挖,我认为最值得延伸的几个主题是:
HNSW参数调优,例如M、ef_construction、ef_searchpgvector与专用向量库在生产环境里的边界- RAG 中 hybrid retrieval 与 rerank 的组合策略
- 文档更新、重嵌入、索引重建的工程治理