共计 1571 个字符,预计需要花费 4 分钟才能阅读完成。
为什么 AI 需要向量数据库?
传统数据库(如 MySQL、PostgreSQL)擅长处理结构化数据,但在 AI 场景中,我们经常需要处理高维向量数据(例如图像特征、文本嵌入)。这类数据的特点是维度高(通常 128 维以上)、距离计算复杂(如余弦相似度),传统数据库的 B 树索引完全失效,导致查询性能极差。

- 传统数据库的局限性 :
- 无法高效执行近似最近邻搜索(ANN)
- 高维数据导致索引膨胀,存储和查询成本飙升
-
缺乏原生向量距离计算支持
-
向量数据库的优势 :
- 专为高维向量优化,支持毫秒级相似性搜索
- 内置 IVF、HNSW 等专用索引算法
- 横向扩展能力强,适合海量向量存储
主流向量数据库对比
| 数据库 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| FAISS | 高性能,Facebook 开源 | 无持久化,需自行管理内存 | 小规模、纯内存计算 |
| Milvus | 支持分布式,生态完善 | 部署复杂 | 中大规模生产环境 |
| Pinecone | 全托管服务,开箱即用 | 成本高,灵活性低 | 云原生快速验证 |
向量索引工作原理
1. IVF(Inverted File System)
- 核心思想 :通过聚类将向量空间划分为多个单元(Voronoi 图),搜索时只需比较目标单元内的向量
- 适用场景 :数据分布均匀,适合中等维度(<1000 维)
- 参数调优 :
nlist(单元数量)越大精度越高但速度越慢
2. HNSW(Hierarchical Navigable Small World)
- 核心思想 :构建多层图结构,高层用于快速导航,底层保留细节
- 适用场景 :超高维度(>1000 维),对精度要求高
- 参数调优 :
efConstruction控制建图质量,efSearch影响查询速度
实战代码示例
import numpy as np
from pymilvus import MilvusClient
# 1. 连接数据库
client = MilvusClient(uri="http://localhost:19530")
# 2. 创建集合(表)schema = {
"collection_name": "image_vectors",
"dimension": 512, # 向量维度
"metric_type": "COSINE" # 相似度计算方式
}
client.create_collection(schema)
# 3. 插入数据
vectors = np.random.rand(1000, 512).tolist() # 生成随机向量
client.insert(collection_name="image_vectors", data=vectors)
# 4. 相似性搜索
query_vector = np.random.rand(1, 512).tolist()[0]
results = client.search(
collection_name="image_vectors",
data=[query_vector],
limit=5 # 返回最相似的 5 个结果
)
print(f"Top 5 matches: {results}")
性能优化策略
- 索引选择 :
- 低延迟场景:优先选 HNSW
-
高吞吐场景:考虑 IVF_PQ(乘积量化)
-
硬件配置 :
- 使用 GPU 加速(如 FAISS-GPU)
-
SSD 存储提升 IO 性能
-
查询优化 :
- 合理设置
nprobe(IVF)或efSearch(HNSW) - 批量查询优于单条查询
新手常见错误
- 索引参数不当
- 现象:搜索速度慢或结果不准确
-
解决:先用小数据集测试不同参数组合
-
内存溢出
- 现象:插入大量数据后进程崩溃
-
解决:分批次插入,或选择支持持久化的数据库
-
距离度量选择错误
- 现象:相似度排序不符合预期
- 解决:文本通常用 COSINE,图像可用 L2
实践任务
尝试用 Milvus 构建一个电影推荐系统:
1. 使用 Sentence-BERT 将电影描述转换为 384 维向量
2. 存储 1000 部电影的特征向量
3. 实现根据用户输入描述返回最相似的 3 部电影
提示:可以参考 HuggingFace 的 all-MiniLM-L6-v2 模型生成文本嵌入。
正文完
