向量数据库Skill vector-databases

向量数据库技能用于选择和管理向量数据库,包括嵌入存储、近似最近邻算法和向量搜索优化。适用于设计语义搜索系统、优化相似性搜索性能,以及在大规模AI应用如RAG中实现高效检索。关键词:向量数据库、嵌入、向量搜索、相似性搜索、ANN、HNSW、IVF、FAISS、Pinecone、Weaviate、Milvus、Qdrant。

RAG应用 0 次安装 0 次浏览 更新于 3/11/2026

名称:向量数据库 描述:向量数据库选择、嵌入存储、近似最近邻(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