共计 1914 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要向量数据库?
在 AI 应用爆炸式增长的今天,我们经常需要处理文本、图像等非结构化数据。传统数据库擅长处理表格数据,但对向量这类高维数据的存储和检索效率很低。这就是向量数据库的用武之地——它能快速找到最相似的向量,广泛应用于推荐系统、语义搜索等领域。

Chroma 的特点
Chroma 是一款开源的轻量级向量数据库,有以下几个突出优势:
- 安装简单,Python 接口友好
- 支持内存和持久化两种模式
- 提供简洁的 API 实现 CRUD 操作
- 内置多种相似度计算方法
环境准备
安装步骤
- 确保已安装 Python 3.8+(推荐使用 conda 管理环境)
- 通过 pip 安装最新稳定版:
pip install chromadb - 验证安装:
import chromadb print(chromadb.__version__)
依赖说明
主要依赖包括:
- numpy:处理向量运算
- onnxruntime:加速相似度计算
- hnswlib:高效近似最近邻搜索
核心功能实践
1. 创建集合(Collection)
集合是 Chroma 中的基本组织单位,相当于传统数据库的表:
import chromadb
# 创建客户端(默认内存模式)client = chromadb.Client()
# 创建集合
collection = client.create_collection("my_vectors")
2. 插入向量数据
支持单条插入和批量插入两种方式:
# 单条插入
collection.add(embeddings=[[0.1, 0.2, 0.3]], # 向量值
ids=["vec1"], # 唯一 ID
metadatas=[{"source": "test"}] # 可选元数据
)
# 批量插入(推荐)import numpy as np
vectors = np.random.rand(100, 128) # 生成 100 个 128 维向量
collection.add(embeddings=vectors.tolist(),
ids=[f"vec_{i}" for i in range(100)]
)
3. 相似性搜索
最核心的查询功能:
# 查询最相似的 5 个向量
results = collection.query(query_embeddings=[[0.15, 0.25, 0.35]],
n_results=5
)
print(results['ids'][0]) # 输出相似向量 ID
4. 元数据管理
可以附加业务相关的元数据,实现更丰富的查询:
# 带元数据过滤的查询
results = collection.query(query_embeddings=[[0.15, 0.25, 0.35]],
n_results=5,
where={"source": "test"} # 只查询 source=test 的向量
)
性能优化技巧
批量操作
相比单条插入,批量操作能显著提升性能。测试数据:
| 操作方式 | 1000 条耗时(ms) |
|---|---|
| 单条插入 | 5200 |
| 批量插入 | 320 |
索引选择
通过 get_settings() 获取当前配置:
collection.modify(
hnsw_ef=32, # 增大搜索范围,提高准确率
hnsw_m=16 # 增加图的连接数
)
常见问题排查
- 维度不匹配错误:
- 确保所有向量的维度相同
-
创建集合时可通过
embedding_dimension指定维度 -
内存不足:
-
大数据集建议使用持久化模式
client = chromadb.PersistentClient(path="./chroma_data") -
查询速度慢:
- 减少
n_results参数 - 调整 hnsw 参数平衡速度与准确率
动手实践
挑战任务:
- 使用 Chroma 构建一个简易电影推荐系统
- 数据集:电影名称 + 剧情摘要(可人工构造 5 -10 条)
- 要求:
- 将摘要文本转换为嵌入向量(可用 SentenceTransformer)
- 实现按剧情相似度推荐
- 添加类型 (genre) 元数据实现混合查询
示例代码框架:
from sentence_transformers import SentenceTransformer
# 初始化模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 生成嵌入
summaries = ["space war between aliens", "romantic story in Paris"]
embeddings = model.encode(summaries)
# 存入 Chroma 并实现查询...
总结
通过本教程,我们完成了 Chroma 的核心功能实践。建议下一步:
- 尝试持久化模式保存数据
- 结合 LLM 实现问答系统
- 探索与其他向量库(如 FAISS)的性能对比
在实际项目中,Chroma 的轻量级特性使其非常适合作为嵌入式向量存储方案。遇到问题时,不妨查阅其 官方文档 获取最新信息。
正文完
发表至: 未分类
近三天内
