Cheat Sheet速查表
跳转到主要内容

向量数据库与检索架构速查表:核心概念、索引算法、量化压缩与主流选型

向量数据库(Vector Database)专用于存储高维稠密/稀疏嵌入向量(Embedding)及其元数据,通过近似最近邻(ANN)索引实现毫秒级相似度检索,是现代 RAG、语义搜索与智能体记忆系统的核心存储底座。

业务需求 / 约束条件优先选型方向代表方案核心原因
已有 PostgreSQL 技术栈,千万级以内向量关系型库向量扩展pgvector (+ halfvec/HNSW)复用 ACID 事务、JOIN 与现有运维体系,零新组件引入
需要全套全文检索 + 向量混合打分搜索引擎扩展Elasticsearch / OpenSearch / Vespa原生 BM25 倒排与多路召回能力成熟,生态完善
独立高并发生产服务,重过滤与高性能专用分布式向量库Qdrant / Milvus / Weaviate专用存储引擎、Payload 预过滤与水平扩展能力强
本地开发、边缘端、桌面应用或数据湖直读嵌入式 / 列式存储库LanceDB / Chroma / FAISS无需独立服务端进程,零拷贝对接 Arrow / Parquet
超大规模低频冷热分层、极低存储成本对象存储原生 SaaSTurbopuffer数据直落对象存储(S3/GCS)+ 本地 NVMe 缓存
完全免运维、深度绑定公有云生态云厂商全托管服务Pinecone / Vertex AI Vector Search / Azure AI SearchServerless 弹性扩缩容,与云上 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(u,v)=u⋅v∥u∥2∥v∥2,IP(u,v)=u⋅v=∑i=1duivi,L2(u,v)=∑i=1d(ui−vi)2\text{Cosine}(\mathbf{u},\mathbf{v}) = \frac{\mathbf{u}\cdot\mathbf{v}}{\|\mathbf{u}\|_2 \|\mathbf{v}\|_2},\qquad \text{IP}(\mathbf{u},\mathbf{v}) = \mathbf{u}\cdot\mathbf{v} = \sum_{i=1}^d u_i v_i,\qquad L_2(\mathbf{u},\mathbf{v}) = \sqrt{\sum_{i=1}^d (u_i - v_i)^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 单精度)为例的纯向量体积估算:

原始向量体积≈N×D×4 Bytes(HNSW 图结构另需约 1.2×∼1.5× 额外内存)\text{原始向量体积} \approx N \times D \times 4\text{ Bytes} \quad(\text{HNSW 图结构另需约 } 1.2\times \sim 1.5\times \text{ 额外内存})
量化方案单维存储位宽压缩比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 bit32×~1.79 GB靠汉明距离极速粗排,强烈建议配合 3×–5× 重排(高维 ≥1024 效果更好)

3. 主流向量数据库与检索方案分层对比

按架构定位与运维形态分为四层,避免将检索库、数据库扩展与托管 SaaS 混为一谈。

3.1 专用原生向量数据库

产品开源协议 / 形态实现语言与存储架构核心索引与特色能力适用定位
QdrantApache 2.0 / 自托管 & CloudRust;支持内存、mmap 磁盘与磁盘量化HNSW + 标量/二值量化;支持稀疏向量与极强的 Payload 过滤索引高性能独立向量服务、多租户与复杂过滤场景
MilvusApache 2.0 / 分布式 & Zilliz CloudGo 控制面 + C++ 执行引擎;存算分离(对象存储 + 消息队列)IVF、HNSW、DiskANN、GPU 加速索引(CAGRA)与多租户分区十亿级超大规模、高吞吐企业级平台
WeaviateBSD-3-Clause(部分企业插件闭源)Go;内置对象存储与倒排引擎HNSW + 动态/PQ/BQ 量化;GraphQL/REST、原生模块化向量化管道需要快速串联模型推理插件的 RAG 应用
ChromaApache 2.0 / 嵌入式 & Client-ServerPython / Rust 重写内核;SQLite + 本地存储或分布式HNSW;API 极简,与 LangChain/LlamaIndex 生态衔接紧密AI 原型验证、中小规模 Python RAG 项目
LanceDBApache 2.0 / 嵌入式 & EnterpriseRust;基于 Lance 列式格式与 Apache ArrowIVF-PQ、HNSW、DiskANN;零拷贝读写、原生多模态(音视频/表格)本地嵌入式、Serverless 直读对象存储与多模态数据湖
Pinecone闭源全托管 Serverless SaaS专有分布式引擎(早期 Pod 模式已演进为 Serverless)专有存算分离索引;支持稀疏-稠密混合、命名空间(Namespace)隔离零运维诉求、预算充足的海外云原生商业应用
Turbopuffer闭源商业 SaaS / BYOCRust;对象存储(S3/GCS)为主存 + NVMe/RAM 热缓存**质心索引(SPFresh 类)**而非随机 I/O 密集的图索引;支持全文 + 向量海量冷热不均数据(如 Cursor 代码库索引)、追求极致低存储成本

3.2 纯向量检索库(非完整数据库)

产品开源协议核心定位与能力边界适用场景
FAISS (Meta)MITC++ / Python 向量检索算法库(无元数据持久化、无分布式事务、无服务端鉴权);支持 CPU SIMD 与多卡 GPU 暴力/IVF/HNSW离线批量相似度计算、算法研究、作为底层内核嵌入自研引擎

3.3 传统数据库与搜索引擎的向量扩展

产品技术底座向量索引与核心能力优势与局限
pgvectorPostgreSQL 扩展(含 Supabase 等托管生态)支持 vector / halfvec / sparsevec / bit;提供 HNSW 与 IVFFlat 索引优势:ACID 事务、与业务表实时 JOIN、运维零新增;局限:单机千万级以上写放大与内存压力增大
Elasticsearch / OpenSearchLucene 倒排 + 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 实时分析与事务并发的企业级业务
VespaApache 2.0 开源大数据引擎HNSW + 精确/近似混合检索、支持多阶段自定义排序(Tensor/XGBoost/ONNX)适合超大规模搜索推荐一体化平台,学习与运维门槛较高

3.4 公有云全托管向量服务

服务名称所属云平台底层核心与特点
Vertex AI Vector Search(原 Matching Engine)Google Cloud (GCP)基于 Google ScaNN 算法,支持十亿级超低延迟流式更新与稀疏-稠密混合搜索
Amazon OpenSearch Serverless / Aurora pgvectorAWS分别对应独立托管搜索集群与关系型数据库扩展,深度集成 Bedrock 知识库
Azure AI SearchMicrosoft Azure提供语义重排(Semantic Ranker)、集成向量化管道与企业级 RBAC 文档权限控制

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) 直接按排名融合,无需归一化打分:

RRF_Score(d)=∑r∈R1k+rankr(d)(经验平滑常数 k=60)\text{RRF\_Score}(d) = \sum_{r \in R} \frac{1}{k + \text{rank}_r(d)} \qquad (\text{经验平滑常数 } k = 60)

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