向量数据库手册

向量数据库手册 14.7 KB 原文

向量数据库手册

一套按「产品」拆分的向量检索手册,16 篇,分 4 组。事实核实时间:2026-11。

与根目录的《XX 常用运维指令手册》互补:那边按系统/数据库讲「这台机器怎么管」,这套按向量检索链路讲「该选谁、怎么接进来、检索为什么不准、上线怎么运维」。每篇统一结构:定位与选型 → 版本与许可 → 安装 → 数据模型 → 完整 CRUD → 索引与检索进阶 → 生产运维 → 故障排障 → 避坑清单 → 速查表 → 参考。

重要:向量数据库是近三年变化最快的品类之一,SDK 方法名几乎每年都会换一轮。凡涉及版本、方法名、参数的命令,执行前请以对应产品官方文档复核;本册中标注「未核实 / 官方未明确」的事项,见文末证据标注约定。


怎么用

你的状态 从哪开始
还没选型,不知道该用哪类 先分类 → 选型决策表
已确定产品,要装、要接代码 直接点开分类索引里对应分册的第 3、5 章
代码是从旧教程抄的,跑不通 版本与 API 变动对照
检索结果不准 / 慢 / 过滤后变少 核心概念速通 + 对应分册第 6、8 章
准备上线 上线前检查清单 + 通用避坑十二条

先分类:你需要的到底是不是「向量数据库」

选型第一步不是比性能,是先确定品类。四类东西都常被叫做「向量数据库」,但运维责任完全不同:

类别 本质 你要自己负责什么 典型产品 翻哪组
专用向量数据库 独立服务,为向量重新设计存储与查询链路 部署、索引、扩容、备份、监控全套 Milvus、Qdrant、Weaviate、Chroma、LanceDB、Vespa 01
融合型向量能力 已有数据库/搜索引擎加一个向量类型和索引 只管一个扩展/字段;事务、备份、HA 复用宿主 pgvector、ES/OpenSearch、Redis、ClickHouse、OceanBase、GaussDB 02
向量索引库 进程内算法库,只算 top-k 其余全部:持久化、并发、鉴权、CRUD、元数据 Faiss、hnswlib、Annoy、ScaNN 03
云托管服务 买的是运维责任转移 计费、配额、密钥、网络与数据合规 Pinecone、Zilliz Cloud、腾讯云/阿里云/百度智能云 04

三条最常被忽略的判断:

  1. 已有 PostgreSQL 且数据量在百万级以内,通常不需要新引入一套向量库 —— 直接 CREATE EXTENSION vector 的运维收益往往大于性能差异;见 pgvector.md。
  2. Faiss 不是数据库。它不保存业务数据、不处理并发写入、不认识「用户权限」。拿它做 RAG 后端,意味着这些能力都得自己写;见 Faiss.md。
  3. 托管服务没有「稳定版本号」,只有 API version 与控制台配额。升级节奏不由你控制,SDK 升级可能带来控制面 breaking change;见 Pinecone.md。

分类索引

01 专用向量数据库(6 篇)

文档 形态 一句话定位 典型场景
Milvus Lite / 单机 / 分布式 面向海量向量的分布式专用库,索引种类最全 亿级向量、需 K8s 横向扩展、稠密+稀疏混合
Qdrant 单二进制 / 集群 Rust 实现,payload 过滤与 HNSW 结合紧密 带复杂元数据过滤的 RAG、多租户
Weaviate 单机 / 集群 / Cloud schema-first,内置向量化模块与 BM25 混合检索 需要关键词+语义融合、模块化接入
Chroma 嵌入式 / 本地服务 / Cloud 上手最快的原型与 LangChain 生态默认选项 PoC、本地知识库、单测;Cloud 另有独立 API
LanceDB 嵌入式(无服务端) 基于 Lance 列式格式,可直接读写对象存储 多模态数据湖、离线批处理、边缘/无服务部署
Vespa 集群 / Vespa Cloud schema-first + YQL,检索与排序阶段可编程 大规模搜索排序一体化、复杂 ranking

02 融合型向量能力(5 篇)

文档 宿主 一句话定位 典型场景
pgvector PostgreSQL 一个扩展把 PG 变成向量库,事务/JOIN/备份全复用 已有 PG、中小规模、要求强一致
Elasticsearch-OpenSearch ES 9.x / OpenSearch 3.x 全文检索与 kNN 在同一查询里融合(RRF) 已有搜索集群、关键词+语义混合召回
Redis-Vector-Search Redis 8+ Vector Sets 与 Query Engine 两条独立向量路径 低延迟、缓存型语义检索、在线特征
ClickHouse ClickHouse 25.8+ vector_similarity skip index,分析+向量同表 日志/行为分析顺带做近邻
国产数据库向量能力 OceanBase / GaussDB / 金仓 关系库内核内置向量类型,SQL 直接查 信创、等保、要求事务一致性的政企

03 向量索引库(2 篇)

文档 一句话定位 典型场景
Faiss 事实标准的 ANN 算法库,精确/IVF/HNSW/PQ/GPU 全覆盖 离线建索引、算法评测、自研检索服务底座
hnswlib-Annoy-ScaNN 三个轻量索引库横向对照与维护状态 嵌入式小索引、只读静态索引、极限召回研究

04 云托管服务(3 篇)

文档 一句话定位 典型场景
Pinecone Serverless 全托管标杆,2026-07 API 已改为资源式 SDK 不想自建、要快速上线、接受 SaaS 锁定
Zilliz-Cloud Milvus 原班团队的全托管 Milvus,直接用 pymilvus 自建 Milvus 上云、需 AUTOINDEX
国内云向量数据库 腾讯云 / 阿里三条产品线 / 百度双引擎对照 数据不出境、信创合规、已有云厂商合同

核心概念速通

一条 RAG 检索链路,向量库只占中间一格

文档 → 切分 chunk → embedding 模型 → 向量 + 元数据
                                      ↓
                        【写入向量库:建集合 / 建索引】
                                      ↓
用户问题 → 同一个 embedding 模型 → 查询向量
                                      ↓
        【向量库:相似度检索 + 标量过滤 → top-k 候选】
                                      ↓
                     重排 / RRF 融合 → 拼 context → LLM

向量库不负责生成 embedding、不负责最终排序、不负责答案生成。检索效果差时,先怀疑切分策略与 embedding 模型,再调索引参数——这是排查顺序,反过来会浪费大量时间。

必须分清的八个词

词 含义 最容易搞错的点
Embedding / 维度 模型把文本/图片映射成定长浮点数组,常见 768 / 1024 / 1536 维 写入与查询必须用同一个模型、同一个维度;换模型等于全量重灌
ANN 近似最近邻,用索引换速度,返回的是「大概率最近」 加了 ANN 索引后结果与精确检索不完全一致,这是设计而非 bug
召回率 recall@k ANN 返回的 top-k 中,命中精确 top-k 的比例 调大查询参数(ef / nprobe)提升召回,代价是延迟
距离度量 L2 / cosine / dot / IP 等 方向不同:L2 类通常越小越相似,cosine/IP 通常越大越相似;建索引与查询必须用同一度量
HNSW 图索引,查询快、召回好,但内存与构建成本高 几乎各库默认;M、ef_construction、ef_search 三个参数决定三角权衡
IVF / PQ 先聚类分桶再查,PQ 做乘积量化压缩 IVF 类通常需要训练/预建中心;PQ 有不可逆精度损失
量化 int8 / 二值 / RaBitQ / BBQ,把浮点向量压成更短表示 省内存但掉召回;改量化策略往往需要重建索引
标量过滤 where tenant_id = x and date > y 关键是 pre-filter 还是 post-filter,直接决定「过滤后结果变少」

HNSW 与 IVF 的取舍(经验性)

维度 HNSW IVF / IVF_PQ
查询延迟 通常更低 依赖 nprobe / probes
召回上限 通常更高 受聚类质量限制
内存占用 高(要存图) 低,PQ 可大幅压缩
构建代价 慢、内存峰值高 通常需要训练样本
带过滤查询 高选择性过滤下可能退化 更可控
适合 中小规模、低延迟、高召回 亿级、内存受限、可接受少量精度损失

内存与容量估算(经验公式,务必用自己的数据压测)

原始向量      = 条数 × 维度 × 4 字节            # float32
半精度 halfvec= 条数 × 维度 × 2 字节
HNSW 图开销   ≈ 条数 × M × 2 × 4 字节 + 链接与元数据(经验量级,各实现差异大)
总内存        ≈ 原始向量 + 索引结构 + 副本数 × (以上) + 30% 以上增长余量

举例(经验估算,非官方承诺):100 万条 × 768 维 float32 ≈ 2.9 GB 原始向量;再叠加 HNSW 图、payload 索引、操作系统页缓存与副本,规划时按原始向量的 2~4 倍起算是比较稳妥的起点。

pre-filter 与 post-filter:过滤后结果变少的根因

行为 过程 后果
pre-filter(检索时剪枝) 在 ANN 图遍历/桶扫描时就排除不满足条件的候选 结果数稳定,但过滤条件极严时可能变慢
post-filter(检索后过滤) 先取 top-k 近邻,再按条件筛掉 返回条数可能远少于 k,甚至为 0

各库行为不一致,且同一库不同版本会变。已知要点:ES 的 knn query filter 是 pre-filter,而 bool.filter 是 post-filter;pgvector 的 ANN 索引默认扫描后过滤,需开 hnsw.iterative_scan;OpenSearch ANN 的 filter 官方文档明确为检索后过滤。具体见各分册第 6 章。

混合检索与 RRF

关键词检索(BM25)擅长专有名词、编号、精确匹配;向量检索擅长语义。生产 RAG 通常需要两者融合,常见做法是 RRF(Reciprocal Rank Fusion)——不比较两路分数绝对值,只按名次加权合并,避免不同量纲的分数难以归一:

RRF_score(d) = Σ  1 / (rank_constant + rank_i(d))       # rank_constant 常用 60

ES 的 retriever.rrf、Weaviate 的 near_text + BM25、Redis 8.4 的 FT.HYBRID、百度自研引擎的 RRF 都是这个思路的不同实现。


选型决策表

场景 首选 备选 关键理由
已有 PostgreSQL,向量百万级以内 pgvector Qdrant 不多引入一套系统,事务/备份/权限全复用
已有 ES/OpenSearch 搜索集群,要加语义召回 ES / OpenSearch kNN Weaviate 复用倒排索引、分词、集群与运维体系
已有 Redis 8,要极低延迟的小规模语义缓存 Redis Vector Sets Qdrant 无需新增组件;注意与 FT.* 是两套 API
第一个 RAG 原型 / 本地演示 Chroma LanceDB 三行代码起,无服务端
需要复杂元数据过滤、多租户、自建 Qdrant Weaviate payload 过滤与 HNSW 结合紧密、单二进制好运维
关键词+语义融合、要内置向量化模块 Weaviate ES BM25 与向量原生融合,模块可插拔
亿级以上、需要分布式与 GPU 索引 Milvus Vespa 计算/存储分离,索引类型最多;代价是组件多
排序逻辑复杂、要自定义 ranking 阶段 Vespa Milvus YQL + rank profile,检索与打分可编程
多模态数据湖、直接读对象存储、无服务 LanceDB Chroma 嵌入式 + Lance 列式格式,无需起服务
完全不想运维、接受 SaaS Pinecone Zilliz Cloud Serverless 免运维;注意 egress 计费与锁定
自建 Milvus 想上云、代码不想改 Zilliz Cloud 阿里云 Milvus 版 直接用 pymilvus,迁移成本最低
数据不出境 / 信创 / 等保 国产云或国产关系库向量能力 自建 Milvus 合规优先;先确认 SDK 兼容性再定架构
只做离线算法评测、自建检索内核 Faiss hnswlib / ScaNN 算法最全,但要自己补齐所有数据库能力
日志分析顺带做近邻、已在用 ClickHouse ClickHouse pgvector 25.8+ 有 vector_similarity skip index

表格是缩小 PoC 候选用的,不是替代实测。务必用你自己的数据分布、过滤条件、并发量压测:三份第三方对比结论互相矛盾时,只信自己跑出来的 recall@10 与 P99。


横向对比总表

产品 形态 许可 / 模式 主要索引 距离度量(已确认部分) 服务端口 客户端
Milvus Lite/单机/分布式 Apache 2.0 HNSW、IVF_*、SCANN、DISKANN、稀疏倒排 L2 / IP / COSINE(默认 COSINE) 19530、9091 pymilvus
Qdrant 单机/集群 Apache 2.0 Dense 仅 HNSW + 稀疏索引 + 量化 Distance.DOT 已确认;完整枚举官方未明确 6333、6334 qdrant-client
Weaviate 单机/集群/Cloud BSD-3 + 企业许可(wl/) hnsw / flat / dynamic / hfresh cosine(默认)/ dot / l2-squared / hamming / manhattan 8080、50051、2112 weaviate-client v4
Chroma 嵌入式/本地服务/Cloud Apache 2.0 HNSW(Single Node) cosine 已确认;完整取值官方未明确 8000 chromadb
LanceDB 嵌入式无服务端 Apache 2.0 IVF_PQ / IVF_RQ / IVF_HNSW_* l2(默认)/ cosine / dot 无 lancedb
Vespa 集群 / Cloud Apache 2.0 HNSW(tensor)+ 精确 nearestNeighbor angular / prenormalized-angular 已确认 8080、19071 pyvespa / YQL
pgvector PG 扩展 PostgreSQL License(正文未直接核验) HNSW / IVFFlat <-> L2、<#> 负内积、<=> 余弦等 沿用 PG 任意 PG 驱动
Elasticsearch 搜索集群 ELv2 / SSPL / AGPL hnsw、int8/int4/bbq_hnsw、bbq_disk l2_norm / dot_product / cosine(默认)/ max_inner_product 沿用 ES ES 客户端
OpenSearch 搜索集群 Apache 2.0(正文未直接核验) k-NN 插件:lucene / faiss(HNSW、IVF、PQ) l1/l2/linf/cosinesimil/innerproduct 等 沿用 OS OpenSearch 客户端
Redis 内存库 RSALv2 / SSPLv1 / AGPLv3 三选一 Vector Sets 内置 HNSW;Query Engine FLAT/HNSW/SVS-VAMANA COSINE / L2 / IP 沿用 Redis redis-cli / 各语言客户端
ClickHouse 分析库 未核实 vector_similarity skip index(HNSW) L2 / cosine / dot 沿用 CH SQL 客户端
OceanBase / GaussDB 关系库内核 未核实 HNSW / IVF / HNSW_BQ;GsIVFFLAT / GsDiskANN L2、cosine 等 沿用各自 SQL / pyobvector
Faiss 进程内库 正文未直接核验 Flat / HNSW / IVF / PQ / GPU L2(平方)、IP 无 faiss-cpu / faiss-gpu
hnswlib / Annoy / ScaNN 进程内库 部分未核实 HNSW / 随机投影树 / 各向异性量化 以各库文档为准 无 各库 Python 包
Pinecone 全托管 SaaS 闭源按量 托管侧自管(不公开索引细节) cosine / dotproduct / euclidean HTTPS 端点 pinecone v10
Zilliz Cloud 全托管 Milvus 商业 + Free 额度 AUTOINDEX COSINE / L2 / IP 等 HTTPS 端点 pymilvus
腾讯云 / 阿里 / 百度 全托管 商业 HNSW、DiskANN、PUCK 等(按产品) COSINE / IP / L2 等 HTTPS / VPC 端点 tcvectordb 或 pymilvus

端口列中「沿用 XX」表示沿用宿主实例端口,未在向量能力文档中单独核实;「未核实 / 官方未明确」的条目请勿写进方案评审材料当作确定结论。


版本与 API 变动对照:最容易被旧教程坑的地方

这张表是本册最值得先读的部分。向量库教程的半衰期很短,搜到的老博客几乎必然踩中其中一条。

产品 旧写法 / 旧认知 当前写法(2026-11 核实) 不换的后果
Milvus connections.connect() + Collection() + utility.* MilvusClient(v2.4+),官方明确 NEVER use 旧 ORM 与新版 schema / 索引 API 对不上
Milvus 2.x Lite 的 .db 文件直接给 3.x 用 3.x Lite 建的是目录,须先导出再迁移 数据打不开
Milvus Helm 仓库 milvus-io/milvus-helm zilliztech/milvus-helm(旧仓库已归档) chart 停更、版本拉不下来
Qdrant client.search() client.query_points(..., query_filter=Filter(must=[...])) 全部 search 变体已废弃
Weaviate weaviate.Client(...) + data_object.create + with_near_vector({...}) v4:connect_to_local() + client.collections.* + query.near_vector(near_vector=...) + Filter.by_property v4 已 gRPC 化,旧代码整体失效
Weaviate 镜像 semitechnologies/weaviate cr.weaviate.io/semitechnologies/weaviate 镜像源迁移
Chroma metadata={"hnsw:space": "cosine"} configuration={"hnsw": {"space": "cosine"}} 集合配置不生效
Chroma 本地 .query() 与 Cloud 一套代码 新 Search API(Search / Knn / Rrf)仅 Chroma Cloud;Cloud 用 CloudClient 本地代码搬到 Cloud 报错
LanceDB 省略 metric 显式指定 metric(旧 SDK 默认发 l2) 非 l2 索引退化为 flat 全扫
Vespa 写死「当前稳定版 vX.Y」 滚动发布,固定某个构建号,勿用 latest 环境不可复现
pgvector 认为最新是 0.9.0 稳定版 0.8.7;0.9.0 unreleased 且已丢弃 PG13/14 装上不存在的版本 / 升级断供
pgvector ANN + WHERE 直接查 开 hnsw.iterative_scan / ivfflat.iterative_scan 过滤后召回不足
Redis 还要装 Redis Stack 才能用向量 Redis 8 起已内置,Redis Stack 已 EOL 重复部署、版本打架
Redis VADD/VSIM 与 FT.* 混用 Vector Sets 与 Query Engine 是两套独立 API 命令互不认识
Elasticsearch bool.filter 当 pre-filter knn query 自带的 filter 才是 pre-filter 返回条数少于 k
OpenSearch nmslib 引擎 已弃用,选 lucene / faiss 新版本不再可用
Pinecone pinecone.init() / pc.Index() / create_index(..., ServerlessSpec) Pinecone() / pc.index();2026-07 API 用 SchemaBuilder + index.documents.* v3→v10 多次 breaking change
Pinecone pod-based 索引 Serverless 是当前架构,pod-based 已 legacy 新账号无法创建
阿里云 名字带「向量」就当兼容 Milvus 只有「向量检索服务 Milvus 版」能用 pymilvus;ADB MySQL/PG 是 SQL 接口 SDK 完全不兼容

通用避坑十二条

  1. 换 embedding 模型 = 全量重灌。维度、归一化方式、语义空间都变了,旧向量与新查询向量不可混查;换模型前先规划双写与灰度。
  2. 建集合时就要定死维度和度量,多数产品不支持改;改了要新建集合再迁数据。
  3. 归一化与度量要配套。cosine 与 dot 在向量已归一化时等价,未归一化时结果完全不同;写入前统一 L2 归一化是最省事的做法。
  4. 高危:删除集合/索引没有回收站。向量库普遍不提供 recyclebin,drop_collection / DROP TABLE / 删除集群前必须先有可恢复备份;Zilliz Free 集群删除后明确不可从回收站恢复。
  5. 高危:不要只备份向量不备份元数据与索引配置。恢复后维度、度量、过滤字段索引对不上,等于白备;Milvus 需同时覆盖 etcd 元数据与对象存储。
  6. ANN 索引是异步构建的居多。写入返回成功 ≠ 立刻可检索;Chroma Cloud 的文档、Pinecone 的 index.documents.upsert 都有可见性等待,LanceDB 追加行不会自动进索引。
  7. 过滤字段要单独建索引。多数专用库未建标量索引的字段不能过滤或退化成全扫;腾讯云 VectorDB 明确「未建 Filter 索引的字段不可过滤」。
  8. 别用厂商 benchmark 做容量决策。用真实数据分布、真实过滤选择率、真实并发压测,记录 recall@10 与 P99;过滤条件越严,各库差异越大。
  9. 量化与索引参数改动通常要重建索引。ES 改 index_options.type 不会重索引已有向量;pgvector 改 HNSW 建索引参数需 REINDEX;ClickHouse 加索引只对新写入生效、存量必须 MATERIALIZE INDEX。
  10. 版本线要分清。Milvus 的服务端 / PyMilvus / Lite、LanceDB 的 SDK / Lance 格式、Weaviate 的最新 tag / 官方维护线,都是不同口径,别拿 SDK 版本推断服务端能力。
  11. 托管服务先算 egress 与配额。Pinecone 自 2026-09-01 起计量读返回流量且额度用尽可能阻断读;Zilliz Free 集群 7 天无操作自动挂起、最多 5 个 collection;把回显字段(output_fields / include_fields)开成 * 会直接推高成本。
  12. 合规先于性能。embedding 是原文派生数据,同样受数据出境与等保约束;政企场景优先评估国产关系库内置向量能力或国内云托管,再考虑自建 Milvus。

上线前检查清单

  1. 写入与查询是否同一个 embedding 模型、同一维度、同一归一化策略。
  2. 距离度量与 SDK 返回值的方向是否已实测确认(越大越相似还是越小越相似)。
  3. 是否用真实过滤条件测过 pre/post-filter 下的返回条数与 recall@10。
  4. 索引构建是否完成、写入可见性等待是否处理、load / refresh 是否到位。
  5. 备份是否覆盖元数据 + 原始向量 + 索引配置,并做过一次真实恢复演练。
  6. 认证、TLS、RBAC、网络暴露面是否关掉匿名访问(Weaviate 的 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED 是本地示例配置,勿带上生产)。
  7. 监控是否覆盖存活、写入失败率、查询 P99、内存/磁盘水位、索引构建状态;日志是否接了轮转。
  8. 容量是否按「原始向量 + 索引 + 副本 + 30% 增长余量」估算并留了扩容路径。
  9. SDK 版本是否 pin 死,升级前是否查过 release notes 的 breaking changes。
  10. 托管服务:配额、计费告警、密钥轮换、数据驻留区域、退出与迁移方案是否确认。

证据标注约定

本册的事实来自 2026-11 对官方文档、GitHub Releases、PyPI 元数据的联网核查,核查记录留存在工作区 .workbuddy/向量数据库事实核查-2026-11.md。为了不把推测写成事实,正文使用以下标注:

标注 含义 使用建议
未核实 / 官方未明确 本次核查未取得官方说明(如完整枚举、健康检查端点、Helm chart、某产品是否兼容 Milvus SDK) 方案评审中当作「待确认」,执行前查官方文档
以官方文档为准 / 以实测为准 属通用经验、第三方资料或版本敏感项 按自己环境验证后再落配置
经验值 / 非官方承诺 规模量级、容量公式、告警阈值、调优范围 只作起点,必须压测
版本差异 跨版本行为不同或已废弃 抄旧教程前先看这一条
高危 可能造成不可逆数据丢失或线上事故 先备份、先 --dry-run、双人复核

各分册第 11 章都集中列出了本篇的「未核实」清单,落地前建议通读一遍。


与现有手册的关系

需求 翻哪份
PostgreSQL 安装、WAL/PITR、流复制、VACUUM 《PostgreSQL 常用运维指令手册》
Redis 持久化、Sentinel、Cluster、大 key 治理 《Redis 常用运维指令手册》
Docker / Compose / K8s / Helm 部署与排障 《容器平台常规运维指令手册》、《Docker 常用运维指令手册》
通用 Linux 命令、systemd、网络、日志 《运维常用工具手册》
向量库怎么选、怎么接、检索为什么不准 本套手册

维护建议

  • 与具体环境强相关的部分(内网端点、VPC、配额、密钥、计费口径、备份路径)建议替换成团队实际值,沉淀为内部 SOP。
  • 向量库 SDK 更新频繁,建议每季度复核一次版本与 API 变动对照,并把踩过的新坑补进对应分册第 9 章。
  • 涉及商用/闭源产品的功能与价格,仅以厂商官网为准;本册刻意不列举未经官方核实的定价数字。
  • 后续可按需增补:Vald、Marqo、Typesense、Voyager、Astra DB、SingleStore、腾讯云/阿里云具体实例规格与压测报告、以及各库 recall/P99 的横向实测数据。
向量数据库手册 - 知识库 - 起航社区