名称:向量数据库
描述:向量数据库选择、嵌入存储、近似最近邻(ANN)算法和向量搜索优化。适用于选择向量存储、设计语义搜索或优化相似性搜索性能。
允许工具:Read、Glob、Grep
向量数据库
何时使用此技能
使用此技能当:
- 在向量数据库选项之间选择
- 设计语义/相似性搜索系统
- 优化向量搜索性能
- 理解ANN算法权衡
- 扩展向量搜索基础设施
- 实现混合搜索(向量 + 过滤器)
关键词: 向量数据库、嵌入、向量搜索、相似性搜索、ANN、近似最近邻、HNSW、IVF、FAISS、Pinecone、Weaviate、Milvus、Qdrant、Chroma、pgvector、余弦相似度、语义搜索
向量数据库比较
托管服务
| 数据库 |
优势 |
限制 |
最佳适用场景 |
| Pinecone |
完全托管、易于扩展、企业级 |
供应商锁定、大规模成本 |
企业生产环境 |
| Weaviate Cloud |
GraphQL、混合搜索、模块 |
复杂性 |
知识图谱 |
| Zilliz Cloud |
基于Milvus、高性能 |
学习曲线 |
高规模生产环境 |
| MongoDB Atlas Vector |
现有MongoDB用户 |
新功能 |
MongoDB用户 |
| Elastic Vector |
现有Elastic堆栈 |
资源密集 |
搜索平台 |
自托管选项
| 数据库 |
优势 |
限制 |
最佳适用场景 |
| Milvus |
功能丰富、可扩展、GPU支持 |
操作复杂性 |
大规模生产环境 |
| Qdrant |
Rust性能、过滤、易用 |
生态系统较小 |
性能导向 |
| Weaviate |
模块、语义、混合 |
内存使用 |
知识应用 |
| Chroma |
简单、Python原生 |
规模有限 |
开发、原型设计 |
| pgvector |
PostgreSQL扩展 |
性能限制 |
Postgres用户 |
| FAISS |
库、非数据库、最快 |
无持久性、无过滤 |
研究、嵌入式 |
选择决策树
需要托管,不想操作?
├── 是 → Pinecone(最简单)或 Weaviate Cloud
└── 否(自托管)
└── 已在使用PostgreSQL?
├── 是,<1M向量 → pgvector
└── 否
└── 需要大规模最大性能?
├── 是 → Milvus 或 Qdrant
└── 否
└── 原型设计/开发?
├── 是 → Chroma
└── 否 → Qdrant(平衡选择)
ANN算法
算法概述
精确KNN:
• 搜索所有向量
• O(n)时间复杂度
• 完美准确性
• 大规模不实用
近似NN(ANN):
• 搜索向量子集
• O(log n)到O(1)复杂度
• 接近完美准确性
• 任何规模都实用
HNSW(分层可导航小世界)
层3: ○───────────────────────○ (稀疏,长连接)
│ │
层2: ○───○───────○───────○───○ (中等密度)
│ │ │ │ │
层1: ○─○─○─○─○─○─○─○─○─○─○─○─○ (更密集)
│││││││││││││││││││││││
层0: ○○○○○○○○○○○○○○○○○○○○○○○○○ (所有向量)
搜索:从顶层开始,贪婪下降
• 快速:O(log n)搜索时间
• 高召回率:通常>95%
• 内存:额外图存储
HNSW参数:
| 参数 |
描述 |
权衡 |
M |
每个节点连接数 |
内存 vs. 召回率 |
ef_construction |
构建时搜索宽度 |
构建时间 vs. 召回率 |
ef_search |
查询时搜索宽度 |
延迟 vs. 召回率 |
IVF(倒排文件索引)
聚类阶段:
┌─────────────────────────────────────────┐
│ 将向量聚类为K个质心 │
│ │
│ ● ● ● ● │
│ /│\ /│\ /│\ /│\ │
│ ○○○○○ ○○○○○ ○○○○○ ○○○○○ │
│ 簇1 簇2 簇3 簇4 │
└─────────────────────────────────────────┘
搜索阶段:
1. 找到nprobe个最近质心
2. 仅搜索那些簇
3. 比穷举搜索快得多
IVF参数:
| 参数 |
描述 |
权衡 |
nlist |
簇数 |
构建时间 vs. 搜索质量 |
nprobe |
搜索的簇数 |
延迟 vs. 召回率 |
IVF-PQ(乘积量化)
原始向量(128维):
[0.1, 0.2, ..., 0.9] (128 × 4字节 = 512字节)
PQ压缩(8个子向量,8位码):
[23, 45, 12, 89, 56, 34, 78, 90] (8字节)
内存减少:64倍
准确性权衡:约5%召回率下降
算法比较
| 算法 |
搜索速度 |
内存 |
构建时间 |
召回率 |
| 平/暴力 |
慢(O(n)) |
低 |
无 |
100% |
| IVF |
快 |
低 |
中 |
90-95% |
| IVF-PQ |
非常快 |
非常低 |
中 |
85-92% |
| HNSW |
非常快 |
高 |
慢 |
95-99% |
| HNSW+PQ |
非常快 |
中 |
慢 |
90-95% |
何时使用哪个
< 100K向量:
└── 平索引(精确搜索足够快)
100K - 1M向量:
└── HNSW(最佳召回率/速度权衡)
1M - 100M向量:
├── 内存可用 → HNSW
└── 内存受限 → IVF-PQ 或 HNSW+PQ
> 100M向量:
└── 分片IVF-PQ 或 分布式HNSW
距离度量
常见度量
| 度量 |
公式 |
范围 |
最佳适用场景 |
| 余弦相似度 |
A·B / (||A|| ||B||) |
[-1, 1] |
归一化嵌入 |
| 点积 |
A·B |
(-∞, ∞) |
当幅度重要时 |
| 欧几里得(L2) |
√Σ(A-B)² |
[0, ∞) |
绝对距离 |
| 曼哈顿(L1) |
Σ|A-B| |
[0, ∞) |
高维稀疏 |
度量选择
嵌入预归一化(单位向量)?
├── 是 → 余弦 = 点积(使用点积,更快)
└── 否
└── 幅度有意义?
├── 是 → 点积
└── 否 → 余弦相似度
注意:大多数嵌入模型输出归一化向量
→ 点积通常是最佳选择
过滤和混合搜索
预过滤 vs 后过滤
预过滤(过滤 → 搜索):
┌─────────────────────────────────────────┐
│ 1. 应用元数据过滤器 │
│ (类别 = "电子产品") │
│ 结果:1M向量中的10K向量 │
│ │
│ 2. 在10K向量上进行向量搜索 │
│ 更快,保证过滤器匹配 │
└─────────────────────────────────────────┘
后过滤(搜索 → 过滤):
┌─────────────────────────────────────────┐
│ 1. 在1M向量上进行向量搜索 │
│ 返回前1000 │
│ │
│ 2. 应用元数据过滤器 │
│ 可能返回 < K个结果! │
└─────────────────────────────────────────┘
混合搜索架构
查询:"无线耳机低于100美元"
│
┌─────┴─────┐
▼ ▼
┌───────┐ ┌───────┐
│向量 │ │过滤器 │
│搜索 │ │构建 │
│"无线 │ │价格 │
│耳机" │ │< 100 │
│ │ │ │
│ │ │ │
└───────┘ └───────┘
│ │
└─────┬─────┘
▼
┌───────────┐
│ 组合 │
│ 结果 │
└───────────┘
元数据索引设计
| 元数据类型 |
索引策略 |
查询示例 |
| 分类 |
位图/哈希索引 |
类别 = “书籍” |
| 数值范围 |
B-树 |
价格在10到50之间 |
| 关键词搜索 |
倒排索引 |
标签包含"促销" |
| 地理空间 |
R-树/地理哈希 |
位置靠近(纬度,经度) |
扩展策略
分片方法
朴素分片(按ID):
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 分片1 │ │ 分片2 │ │ 分片3 │
│ ID 0-N │ │ID N-2N │ │ID 2N-3N │
└─────────┘ └─────────┘ └─────────┘
查询 → 搜索所有分片 → 合并结果
语义分片(按簇):
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 分片1 │ │ 分片2 │ │ 分片3 │
│ 技术 │ │ 健康 │ │ 金融 │
│ 文档 │ │ 文档 │ │ 文档 │
└─────────┘ └─────────┘ └─────────┘
查询 → 路由到相关分片 → 更快!
复制
┌─────────────────────────────────────────┐
│ 负载均衡器 │
└─────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│副本1 │ │副本2 │ │副本3 │
│ (读) │ │ (读) │ │ (读) │
└─────────┘ └─────────┘ └─────────┘
│ │ │
└───────────┼───────────┘
│
┌─────────┐
│ 主节点 │
│ (写) │
└─────────┘
扩展决策矩阵
| 规模(向量) |
架构 |
复制 |
| < 1M |
单节点 |
可选 |
| 1-10M |
单节点,更多RAM |
用于高可用 |
| 10-100M |
分片,少量节点 |
必需 |
| 100M-1B |
分片,多节点 |
必需 |
| > 1B |
分片 + 分层 |
必需 |
性能优化
索引构建优化
| 优化 |
描述 |
影响 |
| 批量插入 |
以1K-10K批次插入 |
10倍更快 |
| 并行构建 |
多线程索引构建 |
2-4倍更快 |
| 增量索引 |
添加到现有索引 |
避免重建 |
| GPU加速 |
使用GPU进行训练(IVF) |
10-100倍更快 |
查询优化
| 优化 |
描述 |
影响 |
| 预热缓存 |
将索引保留在内存中 |
10倍延迟减少 |
| 查询批处理 |
批处理相似查询 |
更高吞吐量 |
| 减少维度 |
PCA、随机投影 |
2-4倍更快 |
| 早期终止 |
当"足够好"时停止 |
更低延迟 |
内存优化
每向量内存:
┌────────────────────────────────────────┐
│ 1536维 × 4字节 = 6KB每向量 │
│ │
│ 1M向量: │
│ 原始:6GB │
│ + HNSW图:+2-4GB(取决于M) │
│ = 8-10GB总计 │
│ │
│ 使用PQ(64个子量化器): │
│ 1M向量:~64MB │
│ = 100倍减少 │
└────────────────────────────────────────┘
操作考虑
备份和恢复
| 策略 |
描述 |
RPO/RTO |
| 快照 |
定期完全备份 |
小时 |
| WAL复制 |
写入前日志流 |
分钟 |
| 实时同步 |
同步复制 |
秒 |
监控指标
| 指标 |
描述 |
警报阈值 |
| 查询延迟p99 |
第99百分位延迟 |
> 100ms |
| 召回率 |
搜索准确性 |
< 90% |
| QPS |
每秒查询数 |
容量相关 |
| 内存使用 |
索引内存 |
> 80% |
| 索引新鲜度 |
自上次更新的时间 |
领域相关 |
索引维护
┌─────────────────────────────────────────┐
│ 索引维护任务 │
├─────────────────────────────────────────┤
│ • 压缩:合并小段 │
│ • 重新索引:重建退化索引 │
│ • 清理:删除已删除向量 │
│ • 优化:调整参数 │
│ │
│ 在低流量时段安排 │
└─────────────────────────────────────────┘
常见模式
多租户向量搜索
选项1:每个租户的命名空间/集合
┌─────────────────────────────────────────┐
│ 租户1集合 │
│ 租户2集合 │
│ 租户3集合 │
└─────────────────────────────────────────┘
优点:完全隔离
缺点:许多索引,操作开销
选项2:单个集合 + 租户过滤器
┌─────────────────────────────────────────┐
│ 共享集合 │
│ 元数据:{ tenant_id: "..." } │
│ 按tenant_id预过滤 │
└─────────────────────────────────────────┘
优点:操作更简单
缺点:需要高效过滤
实时更新
写入路径:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 写入 │ │ 缓冲 │ │ 合并 │
│ 请求 │───▶│ (内存) │───▶│ 到索引 │
└─────────────┘ └─────────────┘ └─────────────┘
策略:
1. 在内存中缓冲写入
2. 定期合并到主索引
3. 搜索:主索引 + 缓冲
4. 定期压缩
嵌入版本控制
版本1嵌入 ──┐
│
版本2嵌入 ──┼──▶ 迁移期间的并行索引
│
│ ┌─────────────────────┐
└───▶│ 逐步重新索引 │
│ 蓝绿切换 │
└─────────────────────┘
成本估算
存储成本
成本 = (向量 × 维度 × 字节 × 复制数) / GB × $/GB/月
示例:
10M向量 × 1536维 × 4字节 × 3复制 = 184 GB
以$0.10/GB/月计 = $18.40/月存储
注意:服务内存成本高于存储
计算成本
因素:
• QPS(每秒查询数)
• 延迟要求
• 索引类型(HNSW需要更多RAM)
• 过滤复杂性
经验法则:
• 1M向量,HNSW,<50ms延迟:16GB RAM
• 10M向量,HNSW,<50ms延迟:64-128GB RAM
• 100M向量:需要分布式系统
相关技能
rag-architecture - 在RAG系统中使用向量数据库
llm-serving-patterns - LLM推理与向量检索
ml-system-design - 端到端ML管道设计
estimation-techniques - 向量系统容量规划
版本历史
- v1.0.0 (2025-12-26):初始版本 - 系统设计的向量数据库模式
最后更新
日期: 2025-12-26