向量数据库与嵌入检索系统
向量数据库是一类专门用于存储和执行高维向量相似性搜索的数据库。它们是现代 AI 应用(尤其是 RAG(Retrieval-Augmented Generation)系统)的核心组成部分。
什么是向量数据库?
传统数据库主要优化精确匹配查询,而向量数据库则专注于**近似最近邻(ANN)**搜索。
核心概念
Embedding: 数据(文本、图像、音频)的数值向量表示。
"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (e.g., 1536 dimensions)
相似性搜索: 查找与查询向量最接近的向量。
query_vector → Top-K most similar vectors
距离度量:
- Cosine Similarity: 方向相似度。
- Euclidean Distance (L2): 几何距离。
- Dot Product: 向量内积。
相似性度量:详细解析
Cosine Similarity
cos(A, B) = (A · B) / (||A|| × ||B||)
取值范围: [-1, 1]
- 1: 方向相同(完全一致)
- 0: 正交(无关)
- -1: 方向相反
适用场景: 文本相似度、语义搜索。
Euclidean Distance (L2)
d(A, B) = √(Σ(Aᵢ - Bᵢ)²)
取值范围: [0, ∞)
适用场景: 图像相似度、聚类。
Dot Product
A · B = Σ(Aᵢ × Bᵢ)
适用场景: 对归一化向量等价于 Cosine Similarity。
索引算法
1. Brute Force(暴力检索 / Flat Index)
将查询向量与数据库中每个向量进行比较。
复杂度: O(n × d)
- n: 向量数量
- d: 维度
优点: 100% 准确度
缺点: 数据量大时非常慢
2. IVF(Inverted File Index)
通过将向量划分为多个聚类来缩小搜索范围。
算法步骤:
- 使用 K-means 创建聚类中心。
- 将每个向量分配到最近的聚类中心。
- 查询时,仅搜索最接近的 nprobe 个聚类。
1Parameters: 2- nlist: Number of clusters (typically √n) 3- nprobe: Number of clusters to search 4 5Trade-off: Higher nprobe → higher accuracy, lower speed.
3. HNSW(Hierarchical Navigable Small World)
一种基于图的方式,也是目前最流行的方法。
结构:
1Layer 2: o-------o-------o (sparse) 2 | | | 3Layer 1: o-o-o---o-o-o---o-o-o (medium) 4 | | | | | | | | | 5Layer 0: o-o-o-o-o-o-o-o-o-o-o-o (dense)
参数:
- M: 每个节点的最大连接数
- ef_construction: 构建索引时的候选节点数量
- ef_search: 查询时的候选节点数量
优势:
- 搜索速度极快:O(log n)
- 高召回率
- 支持动态插入/删除
4. Product Quantization(PQ)
通过压缩向量来减少内存占用。
方法:
- 将向量分成 M 个子向量。
- 将每个子向量映射到 K 个聚类中心之一。
- 存储聚类中心 ID,而不是原始向量数值。
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x
5. Scalar Quantization(SQ)
将 Float32 表示转换为 Int8。
1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## 流行向量数据库对比 5 6### Pinecone 7 8**特性:** 9- 全托管云服务。 10- 自动扩展。 11- Metadata 过滤。 12- Namespace 隔离。 13 14**使用示例:** 15```python 16import pinecone 17 18pinecone.init(api_key="xxx", environment="us-west1-gcp") 19index = pinecone.Index("my-index") 20 21# Upsert 22index.upsert(vectors=[ 23 {"id": "vec1", "values": [0.1, 0.2, ...], "metadata": {"category": "tech"}} 24]) 25 26# Query 27results = index.query(vector=[0.1, 0.2, ...], top_k=10, filter={"category": "tech"})
Weaviate
特性:
- 开源。
- 内置向量化功能。
- 支持 GraphQL API。
- 支持混合搜索(向量 + 关键字)。
Qdrant
特性:
- 以 Rust 编写,性能高。
- 提供丰富的过滤选项。
- 支持 Payload 索引。
- 支持分布式部署。
Milvus
特性:
- GPU 加速。
- 多向量搜索。
- 时间旅行(版本管理)。
- Kubernetes 原生架构。
ChromaDB
特性:
- 面向开发者且易于设置。
- 支持内存 + 持久化模式。
- Python-first 设计。
- 非常适合原型开发。
对比表
| 功能 | Pinecone | Weaviate | Qdrant | Milvus |
|---|---|---|---|---|
| 托管方式 | Cloud | Both | Both | Both |
| 可扩展性 | Auto | Manual | Manual | Auto |
| 混合搜索 | ✓ | ✓ | ✓ | ✓ |
| GPU 支持 | - | - | ✓ | ✓ |
| 定价 | Per vector | Free/Paid | Free/Paid | Free/Paid |
过滤与 Metadata
预过滤 vs 后过滤
预过滤:
- 先应用 metadata 过滤。
- 在过滤后的集合中执行向量搜索。
- 优点: 更快。
- 缺点: 可能降低召回率。
后过滤:
- 通过向量搜索获取 Top-K × multiplier 的结果。
- 对这些结果应用 metadata 过滤。
- 返回最终的 Top K。
- 优点: 更高召回率。
- 缺点: 性能较慢。
混合搜索
结合 Keyword(BM25) + 向量搜索:
final_score = α × vector_score + (1-α) × keyword_score
性能优化
索引参数
最佳 HNSW 设置:
1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100
批处理
1# Poor: Singular insert 2for vec in vectors: 3 index.upsert([vec]) 4 5# Good: Batch insert 6index.upsert(vectors, batch_size=100)
连接池
1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Parallel connections 6)
企业级架构示例
1┌─────────────────────────────────────────────────────┐ 2│ Application │ 3└──────────────────────┬──────────────────────────────┘ 4 │ 5┌──────────────────────▼──────────────────────────────┐ 6│ Vector Search Service │ 7│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 8│ │ Query │ │ Reranker │ │ Cache │ │ 9│ │ Engine │ │ Service │ │ (Redis) │ │ 10│ └─────────────┘ └─────────────┘ └─────────────┘ │ 11└──────────────────────┬──────────────────────────────┘ 12 │ 13┌──────────────────────▼──────────────────────────────┐ 14│ Vector Database Cluster │ 15│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 16│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │ 17│ └─────────┘ └─────────┘ └─────────┘ │ 18└─────────────────────────────────────────────────────┘
监控与可观测性
关键指标
- 查询延迟(p50, p95, p99)
- 召回率
- QPS(Queries Per Second)
- 索引大小
- 内存使用量
告警阈值
1alerts: 2 - name: high_latency 3 condition: p99_latency > 200ms 4 severity: warning 5 6 - name: low_recall 7 condition: recall < 0.9 8 severity: critical 9## 结论 10 11向量数据库是现代 AI 应用中不可或缺的组成部分。通过选择合适的数据库、索引策略和优化方案,你可以构建高性能的语义搜索系统。 12 13在 Veni AI,我们提供企业级向量搜索解决方案。欢迎联系我们以获取更多支持。
