共计 1464 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要向量数据库?
传统数据库(如 MySQL)擅长处理结构化数据,比如订单记录、用户信息等。但当我们需要处理图片、音频、文本等非结构化数据时,传统数据库就显得力不从心了。向量数据库的核心能力是将这些非结构化数据转换为向量(一组数字),然后通过计算向量之间的距离来快速找到相似内容。

举个例子:用传统数据库找「与图片 A 相似的图片」需要人工定义特征(如颜色分布),而向量数据库能自动学习深层特征,直接计算相似度。
Chromadb 核心概念
- 集合(Collection):相当于传统数据库的表,用于存储同一类数据(如所有商品图片向量)
- 嵌入(Embedding):通过模型(如 BERT、ResNet)将原始数据转换为向量的过程
- 查询(Query):输入一个向量,返回集合中最相似的 N 个结果
- 元数据(Metadata):附加到向量上的结构化信息(如「图片拍摄时间」)
实战:15 分钟完成第一个检索
安装与初始化
# 安装最新版(需 Python3.8+)pip install chromadb
import chromadb
# 创建内存型客户端(适合实验)client = chromadb.Client()
创建集合与添加数据
# 创建名为 "products" 的集合
collection = client.create_collection("products")
# 添加 3 个示例向量(实际使用需替换为真实嵌入)collection.add(embeddings=[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]], # 3 个 3 维向量
ids=["id1", "id2", "id3"],
metadatas=[{"type": "shoe"}, {"type": "bag"}, {"type": "hat"}]
)
执行相似性查询
# 查询与 [0.12, 0.21, 0.31] 最相似的 1 个结果
results = collection.query(query_embeddings=[[0.12, 0.21, 0.31]],
n_results=1
)
print(results["ids"][0]) # 输出: ['id1']
注意:实际项目中应使用专业模型生成嵌入,如:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(["这是一段示例文本"])
性能优化关键点
- 索引类型:
- 默认使用 HNSW(适合高召回率场景)
-
大数据集可换用 IVF(更快但精度略低)
collection.configure_index("hnsw", {"ef_construction": 200}) # 调整 HNSW 参数 -
批量操作:
- 单条插入性能差,建议攒够 1000 条批量插入
-
使用
collection.upsert()自动处理重复 ID -
持久化配置:
# 生产环境务必使用持久化客户端 client = chromadb.PersistentClient(path="/data/chromadb")
生产环境避坑指南
- 内存爆炸:单个集合超过 100 万向量时,考虑按业务分库
- 并发写入:Chromadb 采用文件锁,高并发需改用客户端分片
- 版本兼容:部署时固定 SDK 版本(如
chromadb==0.4.15)
下一步探索
- 如何实现混合查询(向量搜索 + 元数据过滤)?
- 当数据量超过单机容量时,分布式方案该如何选型?
(提示:Chromadb 企业版支持水平扩展,社区版可通过分片实现)
正文完
发表至: 未分类
近两天内
