跳到主要内容

向量数据库怎么选:19 个方案的实测横评,与企业实际在用哪些的数据

· 阅读需 50 分钟

上一篇开源 RAG 知识库横评里我实测了 14 个 RAG 平台的默认向量库,留下一个没展开的问题:这些向量库本身怎么选?

这篇补上。做四件事:先分类(它们不是同一类东西)→ 用两个独立数据源回答「企业实际在用哪些」(结论和赛道热度是反的)→ 逐家拆解 19 个方案 → 两张表讲清真正的技术分水岭(过滤+ANN、量化)。

文中 star、协议、版本、容器数均为 2026-09-20 实测:GitHub API + LICENSE 原文 + docker-compose + PyPI 下载量。厂商自测的性能数字一律单独标注。凡我没能从一手来源核实的,直接写「未证实」——这次有好几处,包括一整个云厂商。

一、先分类:三条主轴,解决不同问题​

把 Milvus 和 pgvector 摆在一起比「谁更快」,是错的问法。它们解决的不是同一个问题。

类别是什么项目你付出的代价
独立向量库独立进程,向量是一等公民Milvus、Qdrant、Weaviate、Vespa、Typesense、Vald、Infinity多运维一个组件
传统库 + 向量扩展向量只是既有引擎上的一个类型pgvector、Elasticsearch、OpenSearch、Redis、SeekDB、MongoDB Atlas检索能力受宿主引擎约束
嵌入式 / 零运维进程内,无 serverFAISS、LanceDB、sqlite-vec、DuckDB VSS、Milvus Lite、Chroma(local)无并发、无 HA、无多租户

这条分界线决定了一半的选型结论:如果你的系统已经有一个 PostgreSQL,那「再装一个 Milvus」和「加一个扩展」的成本差一个数量级——而且后者往往够用。

二、企业实际在用哪些?两个独立数据源都指向同一个答案​

这是本篇最想先说的部分,因为它和「向量库赛道很热」的体感是反的。

数据源一:14 个 RAG 平台的默认向量库​

我上一篇逐个解析了各家的 docker-compose、.env、pyproject.toml,统计它们的默认选择:

默认类别平台数量
PostgreSQL + pgvector 系FastGPT、MaxKB、WeKnora(ParadeDB)、Khoj、R2R、LightRAG(生产推荐)6
嵌入式(Chroma / LanceDB / FAISS)Open WebUI、Kotaemon、AnythingLLM、Langchain-Chatchat4
搜索引擎扩展(ES / OpenSearch)RAGFlow、Onyx、QAnything(其一)2–3
独立向量库(Milvus / Weaviate)Dify(Weaviate)、QAnything(Milvus)2

pgvector 系 : 独立向量库 = 6 : 2。 原因是 RAG 平台本来就要一个关系库存元数据、存用户、存会话——pgvector 让它们不用多运维一个组件。这不是技术优劣的选择,是运维成本的选择。

数据源二:PyPI 客户端库的真实下载量​

GitHub star 是存量指标,下载量更接近装机量。我拉了各家的 Python 客户端近 30 天下载量(2026-09-20 实测):

包日下载月下载
pgvector541,66329,885,638
weaviate-client ⚠️358,17819,079,055
qdrant-client270,91911,955,065
faiss-cpu305,73011,749,699
lancedb208,82911,213,324
chromadb142,2477,212,230
sqlite-vec123,7355,011,664
pymilvus64,0513,600,048
milvus-lite18,9271,418,309
typesense21,6801,083,810
usearch53,784581,573

两个反直觉的点:

  1. pgvector 排第一,且是第二名的 2.6 倍——和 RAG 框架的默认统计互相印证。两个完全独立的数据源指向同一结论,这是本篇最稳的一条。
  2. pymilvus 垫底。Milvus 是 star 最高的(46.2k),但 Python 客户端下载量排在最后——比 sqlite-vec 还低。

⚠️ 一个必须说明的坑:这组数字刚经历过一次断崖​

上面那张表是「近 30 天」快照。我在别的场合复核这批数据时发现——weaviate-client 在 2026-08-25 单日暴跌 89%(1,971,744 → 224,115),之后再没起来。

真实用户不会在同一天集体消失。这是自动化流量被掐断的特征(CI / 镜像 / 爬虫)。也就是说 8-25 之前那个 300–700 万/天的量级基本是假的,之后的才可能是真实基线。

用同一时间窗重算(都取 8/25 起的 26 天,均为日均):

包8/1–8/248/25 起变化
pgvector1,243,925986,046-21%
faiss-cpu498,915385,098-23%
qdrant-client618,458371,752-40%
weaviate-client3,696,964316,290-91% ⚠️
lancedb544,659262,437-52%
chromadb429,773221,800-48%
sqlite-vec193,370164,919-15%
pymilvus193,532117,611-39%

「weaviate-client 高于 qdrant-client」这个结论因此是错的——修正后它是 316k,落在 qdrant-client 的 372k 之下,排第 4。

三个可以带走的教训:

  1. 别的包也在跌(-15% ~ -52%),但 -91% 是量级上的例外。多拉几个对照组,才能判断一个异常是「整体波动」还是「这个包独有的问题」——只测一个包会得出完全错误的结论;
  2. 「近 30 天」这种滚动窗口会跨越突变点,把两个完全不同的量级平均成一个没有意义的数。看趋势,不看快照;
  3. pgvector 第一这个结论在两个窗口下都成立(986k vs 372k,2.6 倍),它是稳的。这也是为什么我把它写进结论、而把 weaviate 那条撤掉。

⚠️ 但这仍然只是「下载量」这一个维度的证据,口径局限依旧成立(含 CI、传递依赖、镜像;pgvector 包只是 Python 适配库,Postgres 扩展本身走 apt/OS 包安装不计入 PyPI——所以这个数字低估了 pgvector;而它同时是 langchain-postgres 的依赖,这部分又高估了它)。别把倍数当精确比值。

⚠️ 这组数据的口径局限(必须说清)​

  • PyPI 下载量统计 CI、镜像站、教程复现、Docker 构建,不等于生产装机;
  • 部分包是被其他框架作为传递依赖拉取的(chromadb、lancedb、faiss-cpu 尤其可疑);
  • Milvus 用户可能走 REST 或 Java/Go/Node SDK,不体现在 pymilvus 上;
  • 所以这组数字只能说相对量级,不能说精确份额。

但两条独立线索都指向「pgvector 的实际装机量远超独立向量库」这一点,这个方向的结论是稳的。

三、逐家拆解​

A. 独立向量库​

1. Milvus —— 索引最全、规模最大,但 3.0 是刚落地的大改写​

  • 实测:46,166 star,Apache-2.0,Go,最后提交 2026-09-20,近 365 天 42 个 release;
  • 版本有个坑:最新正式 Release 是 v3.0.1(2026-09-09);v3.0.2 存在 git tag(09-18)且官方 standalone compose 已在用 milvusdb/milvus:v3.0.2,但 GitHub 上没有对应的 Release 条目——内容我未证实,引用时注意。2.6 线仍在并行维护(v2.6.24,09-16);
  • 部署比旧资料轻:Standalone = 3 个容器(etcd + minio + milvus)。⚠️ 旧教程说的「必须 Kafka/Pulsar」已过时——2.6 起默认 WAL 是自研的 Woodpecker(云原生、零磁盘、直写对象存储),所以不再需要 mq 容器;
  • 架构说明也更新了:旧资料的「四个 coordinator + 独立 IndexNode」已过时,2.6 起合并为统一 Coordinator,IndexNode 并入 DataNode;
  • 索引全集是全场最全的:稠密 FLAT / IVF_FLAT / IVF_SQ8 / IVF_PQ / IVF_RaBitQ / HNSW 系列 / DISKANN / SCANN / AISAQ(磁盘扩展,官方称 "near-zero DRAM")/ FAISS 透传(可写 OPQ16,IVF64,PQ16x4);稀疏 SINDI / Block-Max WAND / MaxScore;还有 GPU 索引(CAGRA / IVF_FLAT / IVF_PQ / BRUTE_FORCE);
  • 官方给的过滤建议很有用:过滤比低于 85% 用图索引,85–95% 用 IVF,高于 98% 用 FLAT(这条正好接上本站 Milvus 企业级运维 里那个「过滤越严 IVF 召回越差、HNSW 越好」的实测);
  • ⚠️ Milvus Lite 的边界要说清:pip install pymilvus[milvus-lite] 装的是独立仓库(v3.2.1),只支持 FLAT 索引、无 partition/alias/RBAC、一致性仅 Strong。不能拿 Lite 上测的结论推 standalone;
  • 企业特性:多租户 4 档(Database 默认 64 / Collection 默认 65,536 支持 RBAC / Partition 1,024 不支持 RBAC / Partition Key 百万级不支持 RBAC);RBAC 三级有;SSO 开源版没有(Zilliz Cloud 才有);
  • 坑(都是 open issue):读路径无内存准入控制导致 standalone 并发查询 OOM、Proxy 无自保护被 OOM-kill、etcd 抖动导致 Coordinator panic;升级破坏性(2.6→3.0 有 StructArray HNSW 子字段无法加载的 open issue)。3.0 的新架构(StreamingNode / StorageV3 / Woodpecker)在 2026-09 仍有多个稳定性 issue 开着——上新版本要掂量。

2. Qdrant —— 单容器零依赖,过滤做得最细​

  • 实测:34,695 star,Apache-2.0 单一协议(无 BSL/SSPL 切换),Rust,最后提交 09-19;
  • 部署最简单的一个:Rust 单二进制,零外部依赖,docker run 一个容器就完事。⚠️ 但不支持 NFS/对象存储作主存储,32 位系统不支持;
  • 量化有 4 种(源码实证):Scalar(int8, 4x) / Product(最高 64x) / Binary(1–2bit) / Turbo(v1.18.0 新增,官方推荐 4-bit 作多数场景默认);
  • ★ 过滤是它最有价值的部分:官方称 "in-place filtering"——既不是 pre 也不是 post,query planner 按查询在 4 条路径中动态选(filterable HNSW / ACORN / payload index / 全扫)。官方实测数字很醒目:宽值过滤召回降到 90.8%,两个宽值 AND 过滤崩到 39.7%,开 ACORN 后恢复到 100%;
  • 自建版就有 JWT RBAC(role claim)。⚠️ 但官方 quickstart 原文警告:默认无加密、无认证——上线必须自己收口;
  • 内存估算公式(官方):向量数 × 维度 × 4B × 1.5。官方实测在 4GiB 限额下开 rescoring,p50 从 4.3ms 飙到 43.4ms——量化省内存不是免费的;
  • 坑:升级不能跳版本(1.15 → 1.17 必须先把所有节点升到 1.16.3);1.17 移除 RocksDB 改用 gridstore;长期 open 的 #2550「删除点后向量不回收」(2023-08 开至今)。

3. Weaviate —— 已变 Open Core,且有个数据丢失级的老 bug​

  • 实测:16,826 star,GitHub 标 NOASSERTION,真身是双许可(下面协议章节细讲),Go,最后提交 09-19;
  • 版本:稳定 v1.39.5(09-15),另有 v1.40.0-rc.1(09-19,含 Namespaces GA、4-bit RQ)。只维护最近 3 个 minor;
  • 索引 4 种(源码实证):hnsw(默认) / flat / dynamic(flat→hnsw 自动切)/ hfresh(聚类式磁盘友好索引)。官方原话 "HNSW is an in-memory index"——HNSW 必须全内存,这是内存成本的结构性来源;
  • 内存经验公式(官方):Memory usage = 2 × 所有向量的内存占用,多出的 1 倍是 Go GC;
  • ★ ⚠️ 一个数据丢失级的 known issue:read repair 会写入不完整对象——协调者把「只查了部分属性的视图」当真相写回,副本上对象丢失其余属性及向量,而对象 ID 与计数不变、健康检查完全正常。影响 1.36 及更早(从未打补丁)、1.37.0–1.37.13、1.38.0–1.38.6。这条选型时必须知道;
  • ⚠️ 另一个影响所有版本的:not enough memory mappings——撞 OS 的 vm.max_map_count 上限,每个 shard 需要多个 memory mapping,大型多租户部署默认限额不够。官方建议把该值提到当前 3–4 倍。这条直接印证「一租户一 shard」在大租户数下会撞资源天花板;
  • ⚠️ 能力缺口:不支持 sparse vector / SPLADE。Issue #4019(2024-01 提出,24 👍)至今 OPEN,维护者 2025-01 原话:「as far as I know, there are no short-term plans to add this」。想用 SPLADE 做稀疏检索的,直接排除;
  • 多租户 = 一租户一 shard(官方原文),后果是 #4234「给 list tenants 加分页」(2024-02 开,32 评论)至今 OPEN——租户一多,连列举租户都成问题。

4. Vespa —— 能力最强也最重,K8s 是收费的​

  • 实测:7,100 star,Apache-2.0,Java,近 365 天 63 个 release(约 1–2 个/周,发布极频繁);

  • ⚠️ 版本号有个陷阱:最新 tag v8.753.16(09-16)对应的是 Vespa CLI,不是平台。GitHub 上的 Release 条目全是 CLI 与 Language Server,平台本身不发 GitHub Release,只打 tag + 出 Docker/RPM 制品。官方 quick-start 实测的平台镜像是 vespaengine/vespa:8.751.13;

  • ⚠️ 另一个容易写错的:Vespa on Kubernetes 是商业特性。官方文档原文 "Vespa on Kubernetes is an enterprise feature",镜像在 images.ves.pa 需要授权。自托管 K8s 得自己写 StatefulSet。正确的自建形态是 RPM 裸机 / Docker(≥4GB RAM)/ Vespa Cloud;

  • ★ 过滤不是简单的前/后过滤,是三种策略带阈值(这条对选型很有用):

    参数默认语义
    approximateThreshold0.02命中率低于此值退化为精确暴力检索
    postFilterThreshold1.0命中率高于此值改走后过滤(=1.0 即默认关闭后过滤)
    filterFirstThreshold0.2低于此值启用 filter-first(Acorn-1)

    官方明确 filter-first「improves the response time at low hit ratios but causes a dip in recall」;

  • ⚠️ 没有 PQ / 标量量化。社区有 feature request 反证当前无此能力。二进制量化是靠 indexing language 的 binarize + pack_bits 两个 converter 做的,不是索引训练出来的;

  • 一致性上是自认的 AP:官方明写 "Consistency requires the use of a majority consensus algorithm, which Vespa does not currently use"——不提供线性一致性;

  • 企业能力基本全是 Vespa Cloud:自托管下 tenant 恒为 default 占位符、无租户隔离;SSO 仅 Cloud Enterprise;静态加密是 Cloud 专属;

  • 具名用户(官网 case studies):Perplexity(超 1,500 万月活、每周超 1 亿次查询)、Yahoo(约 150 个应用、10 亿用户量级、80 万 QPS)、Spotify R&D、Vinted 等;

  • 社区规模小:Stack Overflow vespa 标签累计仅 262 个问题,GitHub 贡献者 214 人。

5. 其余独立向量库(简述)​

  • Typesense(26,574 star,GPL-3.0,v30.2):内存型,官方原文 "stores the entire search index in-memory"。完全没有量化(30.2 文档 grep "quantiz" 命中 0)。Raft 全量复制、没有分片——官方原文 "will automatically replicate your entire dataset to all nodes",加节点只提升读吞吐与可用性,不提升容量。内存公式:每维 7 字节(4B float + 约 3B HNSW 图开销,且无量化手段降低);
  • Marqo(5,031 star):已废弃。README 原文 "Marqo's Open Source project is deprecated and will no longer receive updates",废弃声明于 2025-11-13 由官方主动提交。主干自 2026-04-10 起零人工提交,2026-04 之后所有 push 都是 dependabot 依赖升级。⚠️ 还有一个未修复的未认证 SSRF(issue #1452,2026-07 报,至今 open,修复 PR #1464 挂着没人审),且开源版无任何认证。⚠️ 另:Marqo 2.x 已完全基于 Vespa,不再依赖 OpenSearch——2022–2023 年说「Marqo 基于 OpenSearch」的资料全过时了;
  • Vald(⚠️ 正确仓库是 vdaas/vald,不是 vald-io;1,730 star):K8s 原生微服务,极重——Helm 默认副本数加起来约 31+ 个 pod。2026 上半年近乎停滞(近 90 天 0 次提交);
  • Infinity(4,712 star,v0.7.3):RAGFlow 母公司出品。⚠️ 纠正一个流传的说法:RAGFlow 默认后端是 Elasticsearch 不是 Infinity(.env 原文 DOC_ENGINE=${DOC_ENGINE:-elasticsearch})。文档严重滞后——仓库 release notes 只写到 v0.5.0(2024-12),v0.6/v0.7 完全没补。

B. 传统数据库 + 向量扩展​

6. pgvector —— 装机量最大的那个,但它是后过滤​

  • 实测:23,094 star,LICENSE 正文是标准 PostgreSQL License(宽松,近似 MIT)。⚠️ GitHub API 返回 NOASSERTION 只是因为文件没有 SPDX 标识符——别误读成「许可证不明」,这点我特别核了原文;

  • 版本:v0.8.6(2026-07-29)。⚠️ 该仓库不使用 GitHub Releases,版本只能看 git tag + CHANGELOG;

  • ★ 最关键的一条(README 原文):

    With approximate indexes, filtering is applied after the index is scanned. If a condition matches 10% of rows, with HNSW and the default hnsw.ef_search of 40, only 4 rows will match on average.

    这是明确的后过滤。0.8.0 起有迭代索引扫描缓解(hnsw.iterative_scan = strict_order|relaxed_order),但这条决定了它不适合「过滤条件很窄」的场景;

  • 索引只有 HNSW 与 IVFFlat 两种,无 DiskANN、无内建 SQ/PQ 索引选项。降精度只有 halfvec(fp16) 与 binary_quantize() 表达式索引两条路;

  • 无内建混合检索/融合器——官方姿态是「用 PG 全文检索自己拼」;

  • 不做分片:README「Scaling」节原文是 "Scale horizontally with replicas, or use Citus, PgDog, or another approach for sharding"。单机上限靠外部分片层解决;

  • 多租户警告(官方):共享近似索引会让租户间互相影响召回和速度,建议 list partitioning 或分表;

  • 稳定性仍在收敛期:0.8.2 修并行 HNSW 构建缓冲区溢出、0.8.3 修 HNSW vacuum 索引损坏。

7. Elasticsearch —— 向量免费,但混合检索的 RRF 是 Enterprise 专属​

  • 实测:77,940 star,三重许可(下面细讲),v9.5.4(09-15);
  • ★ ★ 本篇最该记住的一条:向量检索免费,但 RRF 混合检索要 Enterprise。我在官方订阅页上核实过——免费档列的是 Retrievers: Standard, kNN, pinned, rescorer,而 Retrievers: linear, rule, RRF 与 Reciprocal Rank Fusion (RRF) for hybrid search 出现在付费档;
  • 同页还能看到:Vector search / Similarity functions / Filter on ANN 免费,而 RRF / linear retriever / Rank Vectors(MaxSim) / DiskBBQ / GPU 建索引 都是 Enterprise 层;
  • 含义:免费层要做 hybrid,只能自己拿 knn + query 拼 bool 再手算融合。这是个实打实的选型分水岭;
  • 量化:int8_hnsw(int8)/ int4_hnsw(要求维度为偶数)/ bbq_hnsw。9.0 起 float 向量默认索引就是 int8_hnsw;自动策略是 ≥384 维走 bbq_hnsw、低于 384 维走 int8_hnsw。BBQ 官方原文:reduces each dimension to a single bit precision … reduces the memory footprint by 96% (or 32x) at a larger cost of accuracy;
  • 过滤语义(官方原文):knn 内部的 filter 是 pre-filter,「Query DSL 树里所有其它 filter 都作为 post-filter 应用」——这是个很容易踩的坑;
  • ⚠️ 不要写「向量可以放 frozen tier 省钱」:官方文档没有明确 frozen tier 支持 dense_vector,这条未证实。

8. OpenSearch —— 同一件事,RRF 是免费的​

  • 实测:13,741 star,Apache-2.0 纯净、无附加限制,3.8.0(08-05);
  • 官方 FAQ 原文:"You can use, modify, extend, embed, monetize, resell, and offer OpenSearch as part of your products and services";
  • ★ 与 ES 的对照是这篇最有用的比较之一:OpenSearch 的 RRF 免费(hybrid 自 v2.11 靠 search pipeline,两个处理器:normalization processor 做 z_score 归一化、score ranker processor 做 RRF);
  • 企业特性全部免费:opensearch-project/security 是 Apache-2.0,含传输/节点间加密、AD·LDAP·Kerberos·JWT·OIDC·SAML、集群级+索引级 RBAC + 文档级 DLS + 字段级 FLS、审计日志、GDPR/HIPAA/PCI/SOX 合规模块。无企业版分层;
  • ⚠️ 但它没有 "encryption at rest"——静态加密得靠磁盘或云厂商层;
  • 索引引擎 4 种:Lucene / Faiss(默认) / NMSLIB(legacy,已弃用)/ JVector(DiskANN 风格纯 Java,向量存磁盘、增量精化 codebook 无需完整重建、原生 PQ);
  • 量化:Lucene scalar / Faiss scalar / Faiss PQ / Binary / 压缩级别 2×–32× / 1-bit SQ(3.6.0 新增);
  • 注意内存熔断器:parent 默认 95% JVM heap、fielddata 40%、request 60%。向量负载下是双刃剑——大 k/大 num_candidates 容易被 break。

9. Redis —— 协议分界在版本号上,且开源版有集群天花板​

  • 实测:76,409 star,NOASSERTION(三选一许可),8.10.2(09-17);

  • ★ 协议按版本分界(LICENSE 原文):

    版本许可
    ≤ 7.2BSD-3-Clause
    7.4.x–7.8.xRSALv2 或 SSPLv1(2024-03 变更,催生 Valkey 等 fork)
    ≥ 8.0.0RSALv2 或 SSPLv1 或 AGPLv3

    ⚠️ 官方口径是 "This is not a license change, but rather the inclusion of an option"——RSALv2/SSPLv1 仍保留。而 RSALv2 有一条商业限制:不得「对外提供托管服务」。选 AGPLv3 就没这条限制,选 RSALv2 就有——写合规文档时必须说清「你实际选哪个」;

  • 向量检索能力在 RediSearch 里,受同一套许可约束;

  • FT.HYBRID 确实存在,但自 8.4.0(2025-11-18)才有。⚠️ 任何说「Redis hybrid 早就有」的材料都是错的——此前只能自己拼 FT.SEARCH + 应用层融合。融合两种:RRF 与 LINEAR(带权重),均内建;

  • ⚠️ 量化有个坑:SVS-VAMANA 的官方 Warning 原文说,Intel 的专有 LVQ 与 LeanVec 优化「not available in Redis Open Source」,非 Intel 平台与开源版会回退到基础 8-bit 标量量化——开源用户拿不到宣称的效果;

  • ⚠️ 硬天花板(官方原文):集群里一个索引的文档必须靠 hash tag 落在同一 shard,跨 shard 摊开索引需要企业版组件。另:每 schema 最多 1024 个属性,其中 TEXT 最多 128 个。

10. SeekDB(OceanBase)—— 2025 年底的新项目,注意升级限制​

  • 实测:2,944 star,Apache-2.0,2025-10-21 建仓(项目年龄约 11 个月),近 365 天 1,388 次提交,很活跃;
  • 定位:MySQL 兼容的关系库 + 多模(关系/向量/文本/JSON/GIS),属「关系库 + 向量能力」;单二进制,无 etcd / 无 MinIO 依赖;
  • 索引:HNSW(列最大 4096 维,必须全内存)/ HNSW_SQ(内存约 1/2–1/3)/ HNSW_BQ(RaBitQ,压到 1/32)/ IVF(基于表实现,不占常驻内存)/ IVF_PQ。稀疏 type=sindi 官方标注「实验特性,不推荐生产使用」;
  • 差异化:单条 SQL 完成混合检索(向量 + 全文 + 标量过滤同一执行计划)、标量过滤是 pre-filter、FORK DATABASE/TABLE 内核级 COW 秒级快照;
  • ⚠️ 运维上一条要命的:不支持原地升级。v1.4.0 changelog 原文要求用 OBDUMPER/OBLOADER 或 mysqldump 做逻辑迁移;
  • ⚠️ 性能声明存疑:官方 launch blog 宣称 StreamingWrite「10.7× Milvus、3.2× Elasticsearch」,但官方自己的表格里 recall 仅 0.7397(低于 sync 模式的 0.7429)——厂商自测,被比较方未认可;
  • 真实生产反馈样本极少,社区讨论热度低。

C. 嵌入式 / 零运维​

11. FAISS —— 是库,不是数据库​

  • 实测:40,939 star(本组最高),MIT,v1.15.1(09-16);
  • README 定性原文:"Faiss is a library"。逐条核实它的「没有」:无 server/daemon(源码树无任何服务入口)、无内置持久化/无事务(只有手工 write_index()/read_index(),无 WAL)、无元数据存储(原文:instances are represented as vectors and are identified by an integer)、过滤能力极弱(IDSelector 系列只能按 id 过滤,无 metadata 过滤);
  • 索引全集很丰富:IVF 族 / HNSW / NSG / NNDescent / PQ / RaBitQ / 二进制 / Intel SVS 集成提供的 Vamana(FAISS 里没有叫 DiskANN 的类)。⚠️ ScaNN 不在 FAISS 内,那是 Google 的独立项目;
  • GPU 后端:CUDA / ROCm / cuVS / Metal(Apple,1.15.0 新增);
  • 绑定只有 C++ 与 Python。⚠️ 无官方 Java/JS/Go——issue #105「Java interface of faiss」自 2017-05-02 开到现在;
  • 结论:MIT 纯算法库,无任何企业特性。生产 RAG 用它必须自建 id→原文映射、持久化、过滤、并发。

12. LanceDB —— 列存 + 多模态,但 HNSW 不是顶层索引​

  • 实测:11,473 star,Apache-2.0,Rust,v0.39.0(09-17,同时有 v0.40.0-beta.3)。至今仍是 0.x,无 1.0,v0.39.0 release notes 标题即含 Breaking Changes;
  • 底层格式 Lance(★7,098,v12.0.0 = 09-17):零拷贝版本化(ACID 事务 / time travel / branches,无需额外基础设施)、原生多模态 blob。Lance 同时是 DuckDB 的官方 core extension;
  • ⚠️ 一个容易写错的:HNSW 不是顶层索引。官方原文 "In LanceDB, HNSW is not exposed as a top-level vector index. Instead, it's available as a substructure which further indexes the selected vectors inside each IVF partition"。当前 SDK 无独立 HNSW 或 Flat 索引类型;
  • 量化:PQ(1/64–1/16) / RQ = RaBitQ(1/32) / SQ(1/4)。官方明确:查询常带 where() 过滤时应选 IVF_RQ 或 IVF_PQ,因为 IVF_HNSW_* 在过滤负载下延迟方差更高;
  • 过滤默认 pre-filter(官方原文 "Pre-filtering is enabled by default");
  • ⚠️ OSS 与 Enterprise 的差距是硬数字:对象存储延迟 500–1000ms vs 50–200ms;吞吐 10–50 QPS vs up to 10,000 QPS;OSS 无缓存、索引与 compaction 手动。Distributed search / indexing 都标 "Coming soon"。

13. sqlite-vec —— 停滞,作者说「只能用周末维护」​

  • 实测:8,119 star,Apache-2.0,最后提交 2026-05-18;
  • 作者原话(issue #226,2025-06-26):"sqlite-vec isn't abandoned. I still intend to push update and maintain the project, but I only have time on the weekends to look after it now, since sponsorships have dried up. … sqlite-vec is far from dead.";
  • 我独立核实:作者 GitHub events 显示他 2026-09-16~20 仍在活跃提交,但全在别的仓库,无 sqlite-vec 的 PushEvent。近 90 天 0 次提交,2026-06 至 09 有 15+ 个社区 PR 至今未合并;
  • ⚠️ 纠正一个流传说法:稳定版 v0.1.9 是纯暴力没错,但 v0.1.10-alpha.1(2026-03-31)已加入 ANN(rescore / ivf / DiskANN),源码确认存在。但官方文档完全没写 ANN——处于「代码先行、文档缺位」状态;
  • 社区已出现 fork(vlasky/sqlite-vec)。替代品 sqliteai/sqlite-vector(1,152 star)v1.1.2 = 2026-09-11,活跃。

14. DuckDB VSS —— 官方自己说别用于生产​

  • 实测:duckdb/duckdb-vss 仅 266 star,MIT,无任何 GitHub Release(随 INSTALL vss 分发);
  • ⚠️ 纠正一个常见误解:DuckDB 核心至今没有原生 HNSW / 全文检索。duckdb/duckdb 的 extension/ 目录只有 autocomplete、core_functions、delta、icu、json、parquet 等,无 vss、无 fts。它们是独立仓库的扩展(被官方列为 Core Extensions,INSTALL vss 一键装,容易误认为内建);
  • 索引只有 HNSW(基于 usearch),README 自述是 "an experimental extension … serves as a proof of concept"。度量仅 l2sq 与 cosine,无内积;
  • ⚠️ 最关键的限制(官方原文):HNSW 索引默认只能在内存数据库中创建,除非设 SET hnsw_enable_experimental_persistence = true;而且 "WAL" recovery is not yet properly implemented for custom indexes,崩溃可能导致索引数据丢失或损坏。官方明确 "we still recommend that you do not use this feature in production environments.";
  • 补充:无增量更新——每次 checkpoint 整个索引全量序列化覆写;索引不受 buffer manager 管理、不计入 DuckDB 的 memory_limit。

15. Chroma —— Rust 重写了,但注意 OSS 与云已开始分化​

  • 实测:29,334 star,Apache-2.0,主语言已是 Rust(从 Python 重写),最后提交 09-18;
  • 版本停了:最新 release 1.5.9(2026-05-05),约 4.5 个月无新版本。提交仍在继续,但内容全是分布式基础设施(wal3 / sysdb / work queue / Spanner);
  • ⚠️ 能力边界要看清:OSS 的全文检索是子串 + 正则($contains / $regex,大小写敏感),不是 BM25。Sparse 向量(BM25/SPLADE)、Hybrid RRF、Collection Forking、GroupBy 全在 /cloud/ 文档区——属 Cloud,非 OSS。Issue #1330/#2513「Hybrid Search with BM25」(2023-11 提,78 👍)至今 OPEN;
  • 索引:Single-Node/Local = HNSW;Distributed/Cloud = SPANN,且参数不可自定义(官方原文 "If you set these values they will be ignored by the server");
  • ⚠️ 1.0.0 起 OSS 不再提供内置鉴权;
  • ⚠️ 未修复高危漏洞:#6717「Python Backend Server Side RCE & Python Client SDK RCE」(2026-03-24 创建,至今 OPEN);
  • ⚠️ 官方自述投入倾斜(文档原文):"the majority of our engineering effort is focused on distributed Chroma and the cloud offering. As a result, local Chroma may temporarily lack some features"。开源版与云版能力已开始分化。

四、横评表​

Star协议最新版部署索引种类量化过滤混合检索融合
Milvus46.2kApache-2.0v3.0.13 容器最全(+GPU)SQ/PQ/RaBitQ/AISAQpre + iterativeRRF(k=60) / Weighted
Qdrant34.7kApache-2.0v1.19.11 容器零依赖HNSW4 种含 Turboin-place + ACORNRRF / DBSF
Weaviate16.8kBSD-3 + wl/v1.39.51 容器4 种含 hfreshBQ/PQ/SQ/RQ明确 prerelativeScore / RRF
Vespa7.1kApache-2.0滚动 tagconfig+ZK,重HNSW无 PQ三阈值策略RRF(仅 global-phase)
Typesense26.6kGPL-3.0v30.21 容器HNSW无退化为精确0.7K+0.3S 加权
pgvector23.1kPostgreSQLv0.8.6PG 扩展HNSW/IVFFlathalfvec/binary明确 post无内建
ES77.9k三重许可v9.5.4JVM 集群HNSW 量化系int8/int4/bbqknn 内 pre,其余 postRRF(Enterprise)
OpenSearch13.7kApache-2.03.8.0JVM 集群lucene/faiss/jvector2×–32× / 1-bit SQ检索中 / 后 / 前RRF(免费)
Redis76.4kRSALv2/SSPL/AGPL8.10.21 容器FLAT/HNSW/SVS开源版仅基础 8bit检索期间RRF / LINEAR
FAISS40.9kMITv1.15.1库,无 server最丰富的算法PQ/RaBitQ仅按 id无
LanceDB11.5kApache-2.0v0.39.0嵌入式IVF 系(HNSW 作子结构)PQ/RQ/SQ默认 preRRF / linear / cross-encoder
Chroma29.3kApache-2.01.5.9嵌入式/serverHNSW(云=SPANN)——hybrid 仅 Cloud
sqlite-vec8.1kApache-2.0v0.1.9嵌入式暴力(alpha 有 ANN)——无
DuckDB VSS266MIT随扩展嵌入式HNSW(实验性)无pre无
SeekDB2.9kApache-2.0v1.4.0单二进制HNSW/HNSW_SQ/BQ/IVFRaBitQ 等pre加权(可切 RRF)
Marqo5.0kApache-2.0已废弃—————

「部署」列是最小可用形态的容器数。Milvus 的 3 = etcd + minio + milvus(2.6 起不再需要 mq 容器);集群形态各家都要多得多。

五、性能数字怎么读:三个基准,和它们各自的陷阱​

横评最容易被带偏的地方就在这。我建议你在看任何向量库的性能对比之前,先把这一节读完——因为现存的主流基准没有一个能直接回答「哪个更快」。

VectorDBBench:厂商赞助,且是「等成本」不是「等硬件」​

这是中文圈引用最多的榜。两个必须先知道的事实:

  1. 它有利益冲突,而且自己在 README 里承认了:"VDBBench is sponsored by Zilliz, the leading opensource vectorDB company behind Milvus."
  2. 榜的标题是 "Vector Search Latency and QPS at 1,000 Monthly Cost"——等成本口径。各条目规格完全不同(8cu / 16c64g / 8c60g / p2.x8-1node),所以「谁的 QPS 高」实际是在问「同样花这些钱,谁更快」,不是「同等硬件谁更快」。

1M 数据集(Cohere Medium,1M × 768 float)的部分结果:

系统P99 (ms)QPSRecall
ZillizCloud-8cu-perf213,3160.9383
Milvus-16c64g-sq4u2.39,5760.9189
OpenSearch-16c128g7.23,0550.9066
QdrantCloud-16c64g6.41,2420.9474
Pinecone-p2.x813.71,1470.9262

两个值得注意的点:① Zilliz 自家 QPS 是 QdrantCloud 的 10.7 倍,但 recall 更低——榜单没藏这个;② QdrantCloud 在两个数据集上 QPS 都垫底,recall 却最高。QPS 与召回在这个榜上反向,正是「等成本 ≠ 等硬件」的直接后果。

这份榜里最有信息量的是它的持续写入压力测试(Cohere-10M,边插入边搜)。以 p99 延迟为例(阈值 98ms):

系统静态 p99500 行/秒插入1000 行/秒插入
ZillizCloud2.1 ms6.8 ms10.1 ms
QdrantCloud9.2 ms16.2 ms11.8 ms
ElasticCloud10.8 ms222 ms—
Pinecone14.1 ms1,829 ms5,992 ms

⚠️ 这是 Zilliz 跑出来的、对 Pinecone 不利的数字,属厂商自测中的竞争性数据。但它机制上说明的问题是真的:「静态 benchmark 好看」和「持续写入下还好看」是两回事,很多选型事故就出在这里。

它自己承认的方法学局限(原文):QPS 定义是「所配置并发档中观测到的最高值」,README 明说 "VDBBench does not discover a backend concurrency limit"——它给的是下界,不是饱和吞吐。而且各 client 的默认并发档不一致(pgvector 是 1/10/20,多数是 1/5/10/20/30/40/60/80),这直接改变「最高 QPS」取值。

Big-ANN Benchmarks:唯一同时做到了硬件归一 + 覆盖过滤/流式​

出处是 NeurIPS'21 和 '23 的竞赛。它的规则是硬性的:统一硬件 Azure Standard D8lds v5(8 vCPU / 16 GB DRAM),索引构建限 12 小时;streaming 赛道从 0 点起跑,插入:删除:搜索 ≈ 4:4:1,限 1 小时 + 8 GB DRAM。

NeurIPS'23 的 Filtered 赛道(YFCC-10M + CLIP,192 维 uint8,QPS@90% recall):

名次方案QPS
1Pinecone-filter85,491
2Zilliz84,596
3ParlayANN IVF37,902
基线FAISS3,032

这是全文最干净的一个对照:Pinecone 与 Zilliz 只差 1.1%,而两家官网口径都是「大幅领先对手」。第三方归一化条件下的数字,和厂商叙事完全是两个量级。

⚠️ 两个注意:页面明确标注 "entries by pinecone and zilliz are not open source"——榜首两家不可复现;且 NeurIPS'23 刻意把规模压到约 10M(原文 "limiting the scale of the datasets to about 10 million points"),说明「必须上十亿才算基准」是个误解。

ANN-Benchmarks 已经停更,且它的 ground truth 不能用于过滤场景​

erikbern 那个榜是很多老文章的引用来源,但 README 首句现在写的是:

At this point, ann-benchmarks is no longer actively maintained. Please consider submitting your work to different benchmarks, such as VIBE.

更关键的是口径:它的 ground truth 是「无过滤的 top-100 精确解」。所以直接拿 ANN-Benchmarks 的曲线讨论「过滤场景的召回」必然失真——这是很多横评文章犯的错。它的继任者 VIBE(DMLR 2026)口径干净得多(严格 recall-equalized,门槛 recall ≥ 0.95),但官方明确 "we do not aim to benchmark vector databases or cloud services"——它只比算法,不比数据库,所以不能用来选库。

连厂商自己都承认的事​

  • Qdrant 的 benchmark 页自认有偏见,原文:"Are we biased? Probably, yes. … We build Qdrant and know the most about it." 但它同时给出了全文最有价值的方法论主张:"in any vector search benchmark, two results must be compared only when you have similar precision. However most benchmarks miss this critical aspect." ⚠️ 而它自己表里就有这个坑:dbpedia 数据集上 milvus 的 219 rps 是在 precision 0.9973 下取的,qdrant 的 1,231 在 0.9513——差 4.6 个精度点,不是等精度比较。
  • Pinecone 在自己的压测管线文章里承认:"For heavy query loads, a single load-generating box can become the bottleneck before the index does."——压测客户端本身会成为瓶颈。这句出自厂商之口,比第三方指控更有分量。

所以横评该怎么做​

  1. 先确认精度是否可比。RPS/QPS 在不同 recall 下完全没有意义。Qdrant 的过滤榜里有一行极端例子:weaviate 6.1 rps @0.9956 vs qdrant 1,199.6 rps @0.9124——RPS 差 196 倍,但召回差 8.3 个百分点;
  2. 区分「静态」和「持续写入」。前者是 demo 指标,后者才是生产;
  3. 区分「等成本」和「等硬件」。前者对应采购决策,后者对应技术优劣,两个问题别混;
  4. 自己跑一遍。用你自己的数据、你自己的过滤条件、你自己的 embedding 模型——用 3–5 份最烂的真实文档 + 50–100 条评测集(方法见 RAG 横评那篇第六节)。

六、协议:比 RAG 平台更脏​

向量库的许可比上篇那些 RAG 平台更复杂,有四个必须读原文的地方:

1. Elasticsearch 的「免费」有很多洞​

三重许可:默认全仓是「AGPLv3 / SSPLv1 / Elastic License 2.0 三选一」,只有 x-pack 目录是纯 ELv2。今天(2024-08-29 官宣「再次开源」)加 AGPL 作为并列选项,但没删除任何原有选项。

真正影响选型的是功能分层,不是协议文本:向量检索免费,RRF 混合检索 / linear retriever / Rank Vectors(MaxSim) / DiskBBQ / GPU 建索引都是 Enterprise。⚠️ 另外订阅页表头写的是 "Platinum (Existing Customers Only)"——Platinum 已不再对新客户售卖。

2. Redis 的协议分界在版本号上​

≤7.2 是 BSD-3;7.4–7.8 是 RSALv2/SSPLv1;≥8.0 增加 AGPLv3 作为第三个选项。官方强调这不是「换协议」而是「加选项」——意味着 RSALv2/SSPLv1 仍然有效。

关键:RSALv2 有一条限制是「不得对外提供托管服务」。选 AGPLv3 就没有这条,选 RSALv2 就有。 用 Redis 做向量检索时,"你实际选了哪个"决定了你能做什么生意。

3. Weaviate 已经变成 Open Core​

LICENSE 原文:

Outside of the "wl" directory … licensed under the BSD-3-Clause License … Within the "wl" directory and all its sub-directories … licensed under the Weaviate license … When neither is set, or the key is not well-formed, only BSD-3-Clause-licensed code is executed.

即 LICENSE_KEY 环境变量门控——不配 key,wl/ 的代码根本不会执行。这不是「开源版功能少一点」,是代码路径直接被关闭。

⚠️ 另一个值得注意的事实:公开仓库里 wl/ 目录当前只有一个 LICENSE 文件,商用代码不在公开仓库中。具体哪些功能落在 wl/ 侧,官方未公开清单——未证实。

4. Typesense 是 GPL-3.0,但官方解释得最清楚​

官方 README 专门写了一段解释为什么用 GPL 而不是 AGPL,值得引用:

Typesense Server is server software and we expect users to typically run it as a separate daemon, and not integrate it with their own code. GPL covers and allows for this use case generously (eg: Linux is GPL licensed). AGPL is what makes server software accessed over a network result in derivative work and not GPL. And for that reason we've opted to not use AGPL for Typesense.

含义:以独立守护进程方式使用、不修改不分发,不触发 GPL 传染。这与 Redis(RSALv2 禁止对外托管)和 Elastic(ELv2)的约束方向完全不同。

协议汇总​

约束方向项目
宽松(MIT / Apache-2.0 / PostgreSQL License)Milvus、Qdrant、OpenSearch、LanceDB、FAISS、Chroma、sqlite-vec、SeekDB、Infinity、pgvector
强 copyleft(GPL-3.0)Typesense
网络条款(AGPL)Redis 的选项之一、ES 的选项之一
Open Core 门控Weaviate(wl/ + LICENSE_KEY)、ES(Enterprise 功能层)
非开源 / 商业限制Redis 的 RSALv2、SSPLv1

七、技术分水岭:过滤 + ANN​

如果这篇只能记一件事,记这个。 「向量检索 + 标量过滤」看起来是基本功能,实际上各家做法完全不同,而且它有一个反直觉的失效区间(下面会纠正一个常见误解)。

四种做法:

做法代表表现
后过滤(post)pgvector先扫索引再过滤,条件窄时召回崩塌
前过滤(pre)Weaviate、LanceDB、SeekDB先生成 allow-list 再检索,召回好但慢
检索中 / in-placeOpenSearch、Qdrant、ES 的 knn.filter折中
动态策略Vespa(三阈值)、Qdrant(4 条路径)按命中率自动切换

具体数字(都是有出处的):

  • pgvector(README 原文):"If a condition matches 10% of rows, with HNSW and the default hnsw.ef_search of 40, only 4 rows will match on average."——这是明确的后过滤,靠 0.8.0 的迭代索引扫描缓解;
  • Qdrant(官方实测):宽值过滤召回降到 90.8%,两个宽值 AND 过滤崩到 39.7%,开 ACORN 后恢复 100%;
  • Vespa:approximateThreshold 默认 0.02——命中率低于此值直接退化为精确暴力检索;filterFirstThreshold 默认 0.2,官方承认 filter-first「improves the response time at low hit ratios but causes a dip in recall」;
  • Turbopuffer(闭源厂商的对照表):postfilter = 0% recall / 20ms;prefilter = 100% recall / 10s;目标 = 90% recall / 25ms。它选择自己实现 native filtering(属性索引感知向量索引的聚类层级);
  • Milvus 官方建议:过滤比低于 85% 用图索引、85–95% 用 IVF、高于 98% 用 FLAT。

⚠️ 一个要纠正的常见误解:危险区间在中段,不在最严端​

「过滤越窄召回越差」这个说法只在某个区间成立。VectorDBBench 的 1M 过滤测试(filterRate 从 0.5 到 0.999)给出了原数据:

过滤掉的比例OpenSearchQdrant(payload index)Turbopuffer
0.50.80100.85060.9350
0.80.63000.98040.9698
0.90.49140.98560.9828
0.950.76550.99060.9795
0.981.00000.99500.9681
0.9991.00001.00001.0000

(表内为 recall。filterRate 的方向是被过滤掉的比例,我从 VectorDBBench 源码确认过:int_value = dataset_size * filter_rate。)

召回最差的是中段(过滤掉 0.5–0.95),而到了 0.98–0.999 反而回到 1.000、QPS 还上升。 原因是合理的:剩下 0.1%–2% 时候选集小到可以直接退化为精确扫描,召回必然满分,且扫描比走图更便宜。

真正的危险区间是「过滤掉一半到九成」这一段——此时候选集既不够小到能暴力兜底,又已经被削得让图索引断连。学术侧也有定量刻画:post-filter 的崩塌点约在 s ~ k/K,图内过滤的崩塌点约在 s_c ~ 0.83/M(M 是图的度,度越大越能扛)。

更极端的选择性下,有些实现是「完全失效」而不是「变差」:SIGMOD 的一篇实验(选择性扫到 0.1%)发现 Faiss-HNSW 在 0.1% 选择性下 fails completely,ACORN 同样失败,SeRF/DSG 也失败;而 Milvus 靠分区机制在 0.1% 仍能服务、Faiss-IVFPQ 在所有数据集上都能处理 0.1%(作者归因:HNSW 的单调收敛限制了探索,IVF 非单调反而能扩搜)。

还有一个只在论文里被记录的代价:ACORN 的召回优势是拿构建成本换的。LAION-25M 上 ACORN-γ 建索引 38,007 秒 vs HNSW 1,147 秒(约 33 倍)。只看 QPS 的评测会完全掩盖这一项。

⚠️ 最后是最大的一个坑:过滤场景的 ground truth 必须用「带同一谓词的暴力解」。VectorDBBench 的 GT 是随过滤条件走的(源码确认),学术基准也多如此;但 ANN-Benchmarks 的 ground truth 是无过滤的 top-100 精确解——拿它的曲线讨论过滤召回必然失真。另外,有一篇 2025 年的论文专门批判「平均召回」这个指标:均值会掩盖 query 间方差,让均值好看的系统在困难 query 上崩掉,主张用 Robustness-δ@K(recall 超过 δ 的 query 占比)。

本站已经实测过这个陷阱:Milvus 企业级开发运维方案 §3 那组数据——过滤越严 IVF 召回越差(0.125→0.066)而 HNSW 越好(0.562→1.000),且延迟不变所以监控发现不了。那里有完整的实测方法,这里不重复。

落到选型上:

  • 如果你的查询会过滤掉一半到九成数据(比如按租户 + 时间范围 + 状态,命中几千条),这是最危险的区间。pgvector 明确是后过滤,Milvus/Qdrant/Vespa 这类有动态策略的才对;
  • 如果过滤后只剩几百条甚至更少,反而安全——多数实现会退化为精确扫描,召回满分(代价是延迟);
  • 如果很少过滤、纯语义检索,后过滤的代价可以忽略,pgvector 的运维优势就压过一切;
  • 验收时必须按「过滤掉的比例」扫一组曲线(0.5 / 0.8 / 0.9 / 0.95 / 0.98 / 0.999),而不是只测一个点。这个坑在 demo(无过滤、数据量小)里永远不会暴露。

八、第二道分水岭:量化能力差异极大​

内存成本是向量库的第一大成本。量化决定你能把多少向量塞进同样一台机器。

库量化手段压缩比
QdrantScalar / Product / Binary / Turbo4x / 64x / 32x / 可配
MilvusIVF_SQ8 / IVF_PQ / RaBitQ / AISAQ4x / 显著 / 高 / 磁盘
WeaviateBQ / PQ / SQ / RQ(Rotational)1-bit RQ 约 32x;4-bit RQ 约 8x
Elasticsearchint8 / int4 / bbqint8 4x、bbq 32x
OpenSearchLucene/Faiss scalar、Faiss PQ、Binary压缩级别 2×–32×
SeekDBHNSW_SQ / HNSW_BQ(RaBitQ)2–3x / 1/32
pgvectorhalfvec(fp16) / binary_quantize()2x / 32x
LanceDBPQ / RQ(RaBitQ) / SQ1/64–1/16 / 1/32 / 1/4
Typesense完全没有—
Vespa无 PQ / 无标量量化(只有 converter 做二值化)—
RedisHNSW/FLAT 无量化参数;开源版 SVS 回退到基础 8-bit—

四个要点:

  1. 压缩比的分母是 float32。表里所有「Nx」都是相对 4 字节/维算的。如果你的入库流程已经用 fp16,实际收益要打对折。 而且各家算召回时有没有开 rescore / oversampling 并不统一,横向比较这些倍数意义有限;
  2. ⚠️ 反直觉:PQ 通常是「更省内存但更慢」,不是更快。 Weaviate 的实测:Gist 数据集上 PQ 低参配置延迟从 2,133µs 涨到 7,521µs(慢 3.52 倍),内存只从 4,218MB 降到 1,572MB。原因是 PQ 的距离计算非 SIMD 友好,比 SQ 慢(Milvus 官方也确认「PQ 在同压缩率下召回常优于 SQ,但 SQ 更快」)。「量化 = 加速」是个错误直觉;
  3. 「省内存」和「可生产」是两个不同的阈值。Qdrant 官方实测(1M × 100 维 glove):全内存约需 1.2GB;只 mmap 向量时 OOM 阈值降到 600MB,但内存低于 1000MB 后 RPS 从 687 掉到 25;向量 + HNSW 图都 mmap 时,135MB 就能服务 100 万向量——但只有 0.33 RPS(每次查询 3 秒)。官方原话是这「makes it impossible to use the system in production」。另有一条官方经验规则:内存里少放一半向量,搜索延迟大约翻倍;
  4. Weaviate 有个结构性成本:官方明说 "HNSW is an in-memory index",且内存经验公式是 2 × 向量内存(多出的 1 倍是 Go GC)。没有量化时它的内存开销是同类里偏高的。

附:内存估算公式(选型做预算时直接用)​

组件公式出处
原始向量点数 × 副本 × 维度 × 每维字节(fp32=4 / fp16=2 / uint8=1)Qdrant 容量规划
HNSW 图(Qdrant)点数 × m × 2 × 4 × 1.2(m 默认 16;1.2 覆盖下层与记账)Qdrant 容量规划
HNSW 图(FAISS)每向量 (维度×4 + M×2×4) 字节,M ∈ [4,64]FAISS wiki
HNSW(原论文)每元素 (Mmax0 + mL·Mmax) × 每连接字节,mL ≈ 1/ln(M);索引本体典型 60–450 字节/对象arXiv:1603.09320
RaBitQ(维度/8 + 8) 字节/向量(1-bit 变体)FAISS wiki
DiskANN PQ 码预算向量字段大小(GB) × pq_code_budget_gb_ratioMilvus 文档
总预留再加 20% headroom;节点数 ceil(总内存 / (单节点内存 × 0.8))Qdrant

Milvus 官方给的 1M × 128 维算例(可直接感受量级差):IVF-PQ 无 refine 11.0 MB | IVF-PQ + 10% 原始向量 refine 62.2 MB | IVF-SQ8 131.0 MB | HNSW 640 MB | HNSWPQ 136 MB | IVF-FLAT(不压缩)515.0 MB。

注意最后两行的对比:同一个 HNSW,加 PQ 量化后内存从 640MB 降到 136MB,官方标注相对原始向量是 64x 压缩——这就是量化在内存成本上的分量。

九、混合检索的融合方式,各家不一样​

上篇提过 RRF,这里要补一个重要的纠正:不是所有「混合检索」都走 RRF。

平台默认融合
MilvusRRF(k 默认 60)/ Weighted(arctan 归一化)
QdrantRRF(k 默认 60)/ DBSF
WeaviaterelativeScoreFusion(v1.24 起默认) / rankedFusion(RRF)
ElasticsearchRRF(Enterprise)/ linear(Enterprise)
OpenSearchz_score 归一化 + score ranker(RRF),免费
Typesense加权排名融合 0.7K + 0.3S,不是 RRF 也不是分数归一化
RedisRRF / LINEAR(带权重),FT.HYBRID 内建
VespaRRF 作为 rank feature 组合,只能放 global-phase
Azure AI SearchRRF(k 为小常数,实验上约 60)
Turbopuffer服务端 RRF(rank_constant 默认 10,可带 per-subquery 权重)
SeekDB默认加权,可切 RRF(rank_constant: 60)
pgvector无内建,自己拼

为什么这件事重要:RRF 只看排名不看分数,对分数分布不敏感;而加权/归一化融合对分数尺度很敏感——不同检索器的分数分布差异大时,加权融合会系统性偏向某一路。换库时如果只对比「有没有混合检索」而不对比融合算法,很容易得到一个错误的结论。 融合的数学见本站那篇 多路检索与 RRF。

十、选型决策​

如果只记四句话:

  1. 绝大多数场景,pgvector 就够了。 两个独立数据源都指向这一点——RAG 框架默认值 6 : 2,PyPI 下载量在剔除掉那个断崖后仍是第二名的 2.6 倍。别被赛道热度带偏:多引入一个组件的运维成本,通常大于它带来的性能收益。
  2. 唯二需要考虑换独立向量库的理由:① 查询会过滤掉一半到九成数据(pgvector 是明确的后过滤——README 原文:条件命中 10% 行时,HNSW 默认 ef_search=40 平均只返回 4 行);② 数据量大到单机撑不住(pgvector 不做分片,要 Citus/PgDog 之类外挂)。
  3. 验收时按过滤比例扫一组曲线(0.5 / 0.8 / 0.9 / 0.95 / 0.98 / 0.999),再加一组混合检索用例。这两件事的差异在 demo(无过滤、纯语义、数据量小)里完全暴露不出来,却决定生产可用性。⚠️ 危险区间是中段,不是最严端——见 §7。
  4. 看任何性能对比前,先确认两边精度是否可比。 RPS 在不同召回下没有意义,这是横评里最容易犯的错(详见 §5)。

⚠️ pgvector 具体是怎么失效的​

「pgvector 撑不住」是个太粗糙的说法。真正有用的是一组具体机制——多位互相独立的工程师报告过同一批原因:

机制表现出处
查询规划器放弃 HNSW在半选择性过滤下,Postgres 稳定选了 prefilter 计划,「根本没用上 HNSW 索引」Mem0 CTO(该团队最终迁走)
HNSW 构建吃内存几百万向量上建 HNSW 可能吃掉 10+ GB 内存,且是在你在跑的生产库上、持续数小时Alex Jacobs《The Case Against pgvector》
autovacuum 导致召回衰减不盯着调 autovacuum,召回会大幅下滑;且索引巨大、难以 vacuumHalcyon 工程师
量化跌精度试过 fp16 / int8 / binary,精度都下降,最终退回全精度Sentry 工程博客

边界大致在哪: 一位 GCP 的 ScaNN 作者称,生产环境里的 pgvector HNSW 典型落在 0–1000 万向量区间。多个迁移案例(Mem0、Linear、以及 Reddit 的选型评估)都落在这条线附近。

⚠️ 但这些「迁移收益」数字全部来自新东家的客户故事页,没有第三方审计,也没有一条公布召回率或内存的绝对值。 机制可信,收益幅度存疑。

反面证据必须并列(否则就成了唱衰):

  • Sentry 在生产上跑住了 pgvector——768 维、端到端 sub-100ms、新 issue 创建量降 40%,且这是署名工程师的公开复盘,可信度高;
  • 有开发者在 1000 万规模说「没有大问题」,也有在数千万条、过滤到 5 万条后查询约 10ms 的报告;
  • Qdrant 自己的员工都建议:先用手上已有的方案,随复杂度增长再换专用引擎。

所以正确的表述是:pgvector 的边界在「千万量级 + 多租户/窄过滤」这个组合上,不是「pgvector 撑不住」。而且这个边界高度依赖你的过滤选择性——所以下面这件事比记数字更重要。

把迁移触发条件写进设计文档​

别等线上变慢了才开会讨论。选型时就把「什么情况下该换」写成可判定的条件,出现即触发评估,而不是靠感觉:

  • 尾延迟连续超出业务目标(不是偶发抖动,是连续);
  • 过滤后召回无法达标(按 §7 那组曲线扫,看是不是掉在中段);
  • 索引维护开始影响业务写入(建 HNSW 时业务库被拖慢);
  • 恢复窗口超过允许范围(备份/恢复时间超出 SLA)。

配套要求:维护一套固定的评测集(真实语料 + 真实查询 + 真实过滤条件),换库时用同一套去比——否则你是在拿两份不同试卷的分数做决策。

这条实践来自一篇同行的选型文(开沿科技:向量数据库怎么选),它全文不给任何性能数字、只给判断框架,这个克制本身值得学——「没有真实压测产物的精确 QPS,看起来很专业,实际上最容易误导决策」。

参考​

实测数据来源(2026-09-20):

  • GitHub REST API:star / license / pushed_at / language / releases
  • LICENSE 原文经 raw.githubusercontent.com 直读:pgvector、Weaviate、RediSearch、ES、Open WebUI 等
  • PyPI 下载量:pypistats.org/api/packages/{pkg}/recent(30 天快照)与 /overall(181 天日线,用于看趋势与突变点;两者时间窗不同,不可混用)
  • 官方订阅/定价矩阵:Elastic Subscriptions(RRF 分层已逐行核实)

基准测试:

官方文档与源码:

本站相关:

声明:本文无厂商合作。star 数、协议条款、版本号、下载量均为 2026-09-20 实测快照。 性能数字特别说明:文中所有 benchmark(SeekDB 的「10.7× Milvus」、Milvus 3.0 的「SINDI 10× MaxScore」、OpenSearch 的「ingestion 快 4.2×」、Turbopuffer 的「1T+ 文档」等)均为厂商自测,被比较方未认可,请勿直接当作横向对比结论。 本次调研的明确缺口(如实告知,未做填补):GCP 全线不可核实——cloud.google.com 等域名在本环境网络层不可达,尝试通过公共中继绕行被安全策略拒绝,故 Vertex AI Vector Search / AlloyDB / Cloud SQL pgvector / BigQuery vector search 一条都没能验证;华为云 GaussDB 向量能力全站反爬,同样未取证;Reddit r/vectordatabase 全域连接重置,社区痛点取不到(取不到 ≠ 没有)。凡未能一手核实的,正文已标「未证实」。