向量数据库(Vector Database)专用于存储高维稠密/稀疏嵌入向量(Embedding)及其元数据,通过近似最近邻(ANN)索引实现毫秒级相似度检索,是现代 RAG、语义搜索与智能体记忆系统的核心存储底座。
| 业务需求 / 约束条件 | 优先选型方向 | 代表方案 | 核心原因 |
|---|---|---|---|
| 已有 PostgreSQL 技术栈,千万级以内向量 | 关系型库向量扩展 | pgvector (+ halfvec/HNSW) | 复用 ACID 事务、JOIN 与现有运维体系,零新组件引入 |
| 需要全套全文检索 + 向量混合打分 | 搜索引擎扩展 | Elasticsearch / OpenSearch / Vespa | 原生 BM25 倒排与多路召回能力成熟,生态完善 |
| 独立高并发生产服务,重过滤与高性能 | 专用分布式向量库 | Qdrant / Milvus / Weaviate | 专用存储引擎、Payload 预过滤与水平扩展能力强 |
| 本地开发、边缘端、桌面应用或数据湖直读 | 嵌入式 / 列式存储库 | LanceDB / Chroma / FAISS | 无需独立服务端进程,零拷贝对接 Arrow / Parquet |
| 超大规模低频冷热分层、极低存储成本 | 对象存储原生 SaaS | Turbopuffer | 数据直落对象存储(S3/GCS)+ 本地 NVMe 缓存 |
| 完全免运维、深度绑定公有云生态 | 云厂商全托管服务 | Pinecone / Vertex AI Vector Search / Azure AI Search | Serverless 弹性扩缩容,与云上 IAM、监控无缝打通 |
🔗 相关速查表:大模型与智能体技术概念全景词典速查表 · AI 核心算法全景速查表 · PostgreSQL 速查表 · Redis 常用命令速查表 · MongoDB 常用命令速查表
1. 核心概念与距离度量速查
1.1 基础概念词典
| 概念 | 核心定义 | 工程关注点 |
|---|---|---|
| Embedding(嵌入向量) | 将文本、图像、音频等非结构化数据映射为固定维度的浮点数数组 | 常见维度:384 / 768 / 1024 / 1536 / 3072;维度越高表达越细但内存与计算呈线性增长 |
| ANN(近似最近邻) | 牺牲极小召回率(如 95%–99%)换取百倍至千倍检索加速的索引方法 | 精度与延迟的权衡核心,区别于逐条全量扫描的 k-NN(Exact Search) |
| Metadata Filtering | 在向量检索时结合标量字段(时间、租户、权限、类别)进行条件过滤 | 需区分 Pre-filtering、Single-stage/Inline 与 Post-filtering |
| Hybrid Search(混合检索) | 融合稠密向量(语义理解)与稀疏向量 / BM25(精确关键词) | 解决专有名词、型号编码、缩写在纯语义检索中易漏召回的短板 |
| Sparse Vector(稀疏向量) | 绝大部分维度为 0 的高维表示(如 SPLADE、BM25 词袋权重) | 仅存储非零索引与权重,适合与稠密向量做多路融合检索 |
1.2 三大常用距离度量公式与选型
| 度量方式 | 取值含义 | 数学等价关系 | 典型适用场景 |
|---|---|---|---|
| 余弦相似度 (Cosine) | 仅看向量夹角,忽略模长(-1 到 1,距离常记为 1 - cos) | 当向量已做 L₂ 单位归一化时,与内积排序完全等价 | 文本语义检索、RAG、句子嵌入(默认首选) |
| 点积 / 内积 (Inner Product) | 同时受夹角与向量模长影响,计算开销最低 | 若输入已完成单位归一化,直接用 IP 替代 Cosine 可省去开方除法 | 推荐系统双塔召回、已归一化 Embedding(如 OpenAI 向量) |
| 欧氏距离 (L₂) | 空间直线距离,值越小越相似 | 对单位向量满足 L₂² = 2 - 2·cos | 图像/人脸特征比对、坐标聚类、需保留模长差异的特征 |
2. 主流 ANN 索引算法与量化压缩
2.1 常见向量索引算法对比
| 索引类型 | 核心机制 | 内存占用 | 查询速度与召回率 | 适用规模与典型实现 |
|---|---|---|---|---|
| Flat (暴力精确检索) | 全量逐条计算向量距离,无索引构建开销 | 中等(仅存原始/量化向量) | 100% 召回;百万级以上延迟骤增 | 10 万条以内小数据集、高精度评测基准 |
| IVF-Flat (倒排文件) | K-Means 聚类分桶(nlist),查询仅扫描最近邻 nprobe 个桶 | 低(几乎无额外图结构开销) | 依赖 nprobe 调优,召回率中等偏高 | 百万至千万级、内存受限且容忍稍高延迟(FAISS / Milvus / pgvector) |
| IVF-PQ (倒排+乘积量化) | 先分桶再将向量切分做子空间量化编码,大幅压缩体积 | 极低(可压缩至原大小 1/16–1/64) | 速度极快但单阶段召回率下降,通常需精排 | 亿级以上大规模内存检索(FAISS / Milvus / LanceDB) |
| HNSW (分层可导航小世界) | 构建多层跳表式近邻图,高层粗跳、底层精搜 | 高(向量 + 图邻接表全常驻或热常驻内存) | 毫秒级延迟 + 95%–99% 高召回,工业界默认主力 | 百万至亿级实时低延迟在线服务(Qdrant / Milvus / Weaviate / pgvector) |
| DiskANN (Vamana 图) | 专为 SSD 优化的图索引,图邻接与压缩向量放内存,精排向量放 NVMe | 低(内存降幅可达 5–10 倍) | 极低内存实现单机亿级毫秒响应,依赖高速 SSD IOPS | 内存预算紧张的亿级/十亿级场景(Milvus / LanceDB / Azure) |
| ScaNN | 各向异性量化(Anisotropic Vector Quantization)+ 树状分片 | 中低 | 内积检索下同延迟召回率表现极佳 | Google 系大规模推荐与检索(Vertex AI Vector Search / 开源库) |
HNSW 三大核心参数调优规律:
M(每个节点最大双向边数,常见16–64):越大图越稠密,高维向量召回率越高,但索引内存与构建时间成倍增加。efConstruction(建索引时的候选队列长度,常见100–400):仅影响建库耗时,适当调大可显著提升图质量与后续查询召回。efSearch(查询时的动态搜索宽度,需 ≥ 返回数top_k):唯一可在查询时动态调节的参数;增大则召回率上升、QPS 下降。
2.2 向量量化(Quantization)与内存估算
以 1000 万条 1536 维向量(原始 FP32 单精度)为例的纯向量体积估算:
| 量化方案 | 单维存储位宽 | 压缩比 | 1000 万 × 1536 维向量体积 | 精度损失与典型用法 |
|---|---|---|---|---|
| FP32(无压缩) | 32 bit (4 B) | 1× | ~57.2 GB | 基准精度,常驻内存成本高 |
| FP16 / BF16(半精度) | 16 bit (2 B) | 2× | ~28.6 GB | 精度几乎无损(如 pgvector halfvec),性价比极高 |
| SQ8(标量量化 Int8) | 8 bit (1 B) | 4× | ~14.3 GB | 召回率通常保持 97%+,适合通用生产环境标配压缩 |
| PQ(乘积量化) | 取决于子空间数与码本 | 16×–64× | ~1–4 GB | 需训练码本,适合配合多路召回 + 原向量重排(Oversampling + Rescore) |
| BQ(二值量化 1-bit) | 1 bit | 32× | ~1.79 GB | 靠汉明距离极速粗排,强烈建议配合 3×–5× 重排(高维 ≥1024 效果更好) |
3. 主流向量数据库与检索方案分层对比
按架构定位与运维形态分为四层,避免将检索库、数据库扩展与托管 SaaS 混为一谈。
3.1 专用原生向量数据库
| 产品 | 开源协议 / 形态 | 实现语言与存储架构 | 核心索引与特色能力 | 适用定位 |
|---|---|---|---|---|
| Qdrant | Apache 2.0 / 自托管 & Cloud | Rust;支持内存、mmap 磁盘与磁盘量化 | HNSW + 标量/二值量化;支持稀疏向量与极强的 Payload 过滤索引 | 高性能独立向量服务、多租户与复杂过滤场景 |
| Milvus | Apache 2.0 / 分布式 & Zilliz Cloud | Go 控制面 + C++ 执行引擎;存算分离(对象存储 + 消息队列) | IVF、HNSW、DiskANN、GPU 加速索引(CAGRA)与多租户分区 | 十亿级超大规模、高吞吐企业级平台 |
| Weaviate | BSD-3-Clause(部分企业插件闭源) | Go;内置对象存储与倒排引擎 | HNSW + 动态/PQ/BQ 量化;GraphQL/REST、原生模块化向量化管道 | 需要快速串联模型推理插件的 RAG 应用 |
| Chroma | Apache 2.0 / 嵌入式 & Client-Server | Python / Rust 重写内核;SQLite + 本地存储或分布式 | HNSW;API 极简,与 LangChain/LlamaIndex 生态衔接紧密 | AI 原型验证、中小规模 Python RAG 项目 |
| LanceDB | Apache 2.0 / 嵌入式 & Enterprise | Rust;基于 Lance 列式格式与 Apache Arrow | IVF-PQ、HNSW、DiskANN;零拷贝读写、原生多模态(音视频/表格) | 本地嵌入式、Serverless 直读对象存储与多模态数据湖 |
| Pinecone | 闭源全托管 Serverless SaaS | 专有分布式引擎(早期 Pod 模式已演进为 Serverless) | 专有存算分离索引;支持稀疏-稠密混合、命名空间(Namespace)隔离 | 零运维诉求、预算充足的海外云原生商业应用 |
| Turbopuffer | 闭源商业 SaaS / BYOC | Rust;对象存储(S3/GCS)为主存 + NVMe/RAM 热缓存 | **质心索引(SPFresh 类)**而非随机 I/O 密集的图索引;支持全文 + 向量 | 海量冷热不均数据(如 Cursor 代码库索引)、追求极致低存储成本 |
3.2 纯向量检索库(非完整数据库)
| 产品 | 开源协议 | 核心定位与能力边界 | 适用场景 |
|---|---|---|---|
| FAISS (Meta) | MIT | C++ / Python 向量检索算法库(无元数据持久化、无分布式事务、无服务端鉴权);支持 CPU SIMD 与多卡 GPU 暴力/IVF/HNSW | 离线批量相似度计算、算法研究、作为底层内核嵌入自研引擎 |
3.3 传统数据库与搜索引擎的向量扩展
| 产品 | 技术底座 | 向量索引与核心能力 | 优势与局限 |
|---|---|---|---|
| pgvector | PostgreSQL 扩展(含 Supabase 等托管生态) | 支持 vector / halfvec / sparsevec / bit;提供 HNSW 与 IVFFlat 索引 | 优势:ACID 事务、与业务表实时 JOIN、运维零新增;局限:单机千万级以上写放大与内存压力增大 |
| Elasticsearch / OpenSearch | Lucene 倒排 + HNSW 图 | Dense Vector + BM25 文本原生混合检索、RRF 融合与嵌套字段过滤 | 优势:搜索团队技术栈复用度最高;局限:JVM 堆外内存与段合并(Segment Merge)资源消耗较大 |
| Redis (Query Engine) | 内存 KV 数据库 | 支持 Flat 与 HNSW 索引、内存级亚毫秒延迟、实时流式更新 | 优势:极低延迟、适合语义缓存(Semantic Cache)与特征存储;局限:全内存成本高 |
| MongoDB Atlas Search | 文档型数据库(Atlas 托管 / 本地预览) | 基于 Lucene 的 HNSW 向量索引,与 BSON 业务文档同库存储过滤 | 优势:免去文档库与向量库双写同步;局限:核心向量检索能力强绑定 Atlas 平台 |
| SingleStore | 分布式关系型 HTAP 数据库 | SQL + 原生向量操作(点积/欧氏)、支持列存与行存混合 | 适合需要复杂 SQL 实时分析与事务并发的企业级业务 |
| Vespa | Apache 2.0 开源大数据引擎 | HNSW + 精确/近似混合检索、支持多阶段自定义排序(Tensor/XGBoost/ONNX) | 适合超大规模搜索推荐一体化平台,学习与运维门槛较高 |
3.4 公有云全托管向量服务
| 服务名称 | 所属云平台 | 底层核心与特点 |
|---|---|---|
| Vertex AI Vector Search(原 Matching Engine) | Google Cloud (GCP) | 基于 Google ScaNN 算法,支持十亿级超低延迟流式更新与稀疏-稠密混合搜索 |
| Amazon OpenSearch Serverless / Aurora pgvector | AWS | 分别对应独立托管搜索集群与关系型数据库扩展,深度集成 Bedrock 知识库 |
| Azure AI Search | Microsoft Azure | 提供语义重排(Semantic Ranker)、集成向量化管道与企业级 RBAC 文档权限控制 |
4. 过滤机制与混合检索(Hybrid Search)
4.1 元数据过滤三大策略
| 过滤策略 | 执行顺序 | 潜在缺陷与工程应对 |
|---|---|---|
| Pre-filtering(先过滤后搜) | 先按标量索引筛选出符合条件的 ID 位图(Bitmap),再检索向量 | 若过滤条件极苛刻(命中率 < 1%),纯图索引可能退化断连;应对:阈值触发自动回退为暴力精确扫描(Exact Scan) |
| Post-filtering(先搜后过滤) | 先取全库向量 Top-K,再用标量条件剔除不满足项 | 若过滤后剩余结果不足 K 条,会导致返回数量不够甚至为空;应对:极不推荐作为唯一策略,需大幅过采样 |
| Single-stage / Inline(单阶段融合过滤) | 在遍历 HNSW 图的每一步跳跃时,实时检查节点的位图是否满足条件 | 目前最主流方案(Qdrant / Milvus / Weaviate / pgvector 0.8+ 迭代扫描均支持),兼顾召回率与延迟 |
4.2 混合检索倒数排序融合公式(RRF)
当同时执行「稠密向量检索」与「BM25 关键词检索」时,两路分数尺度不同,工程上最常用 RRF(Reciprocal Rank Fusion) 直接按排名融合,无需归一化打分:
5. 高频实操速查片段
5.1 pgvector 生产建表与 HNSW 检索(SQL)
-- 1. 启用扩展并创建包含半精度向量与全文检索列的文档表
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
content TEXT NOT NULL,
embedding halfvec(1536), -- 使用 float16 节省 50% 内存
fts tsvector GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED
);
-- 2. 创建余弦距离 HNSW 索引(M=16, ef_construction=128)与全文 GIN 索引
CREATE INDEX idx_docs_emb_hnsw ON documents
USING hnsw (embedding halfvec_cosine_ops)
WITH (m = 16, ef_construction = 128);
CREATE INDEX idx_docs_fts ON documents USING gin (fts);
-- 3. 查询时动态调整 ef_search 并开启迭代扫描(pgvector 0.8+ 防止过滤后结果不足)
SET hnsw.ef_search = 100;
SET hnsw.iterative_scan = relaxed_order;
SELECT id, content, 1 - (embedding <=> $1::halfvec) AS cosine_sim
FROM documents
WHERE tenant_id = 42
ORDER BY embedding <=> $1::halfvec
LIMIT 10;
pgvector 距离运算符速查:
<->欧氏距离 (L₂) ·<=>余弦距离 (1 - cos) ·<#>负内积(升序排列即最大内积) ·<+>曼哈顿距离 (L₁)。
5.2 Qdrant 建库、二值量化与 Payload 过滤(Python)
from qdrant_client import QdrantClient, models
client = QdrantClient(url="http://localhost:6333")
# 创建集合:开启二值量化(原向量存磁盘,量化索引常驻内存)
client.create_collection(
collection_name="knowledge_base",
vectors_config=models.VectorParams(
size=1536,
distance=models.Distance.COSINE,
on_disk=True,
),
quantization_config=models.BinaryQuantization(
binary=models.BinaryQuantizationConfig(always_ram=True)
),
)
# 为高频过滤字段建标量索引,加速 Inline 过滤
client.create_payload_index(
collection_name="knowledge_base",
field_name="tenant_id",
field_schema=models.PayloadSchemaType.KEYWORD,
)
# 带过滤 + 量化过采样重排查询
hits = client.query_points(
collection_name="knowledge_base",
query=[0.012, -0.045, ...], # 1536 维查询向量
query_filter=models.Filter(
must=[models.FieldCondition(key="tenant_id", match=models.MatchValue(value="org_a"))]
),
search_params=models.SearchParams(
quantization=models.QuantizationSearchParams(rescore=True, oversampling=3.0)
),
limit=10,
).points