共计 1911 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要向量数据库?
在 AI 时代,文本、图像、视频等数据往往被表示为高维向量(比如 BERT 生成 768 维向量)。传统数据库难以高效处理这种数据,而向量数据库专门解决:

- 相似性搜索:快速找到 ” 最像 ” 某张图的图片
- 推荐系统:根据用户历史行为推荐相似内容
- 去重聚类:识别内容几乎相同的文档
Chromadb vs 其他方案
| 数据库 | 优点 | 缺点 |
|---|---|---|
| Chromadb | 轻量级、Python 原生支持 | 不适合超大规模数据(>1 亿条) |
| Pinecone | 全托管服务,开箱即用 | 收费且无法本地部署 |
| Milvus | 分布式架构,支持超大数据量 | 部署复杂,学习曲线陡峭 |
新手建议从 Chromadb 开始,它的 API 设计非常 Pythonic
环境安装(两种方式任选)
方法一:pip 安装
pip install chromadb
方法二:conda 安装
conda install -c conda-forge chromadb
验证安装是否成功:
import chromadb
print(chromadb.__version__) # 应该输出类似 0.4.15 的版本号
第一个向量搜索应用
1. 连接客户端
import chromadb
# 创建本地持久化客户端(数据会保存在./chroma_data 目录)client = chromadb.PersistentClient(path="./chroma_data")
# 如果是远程连接(生产环境常用)# client = chromadb.HttpClient(host="your-server.com", port=8000)
2. 创建集合(collection)
# 创建或获取名为 "my_collection" 的集合
collection = client.get_or_create_collection(
name="my_collection",
metadata={"hnsw:space": "cosine"} # 使用余弦相似度算法
)
3. 插入向量数据
# 模拟数据:3 个文档,每个文档对应一个 768 维向量
ids = ["doc1", "doc2", "doc3"]
documents = ["我爱北京天安门", "上海外滩人很多", "广州塔夜景很美"]
embeddings = [[0.1]*768, # 实际使用时替换为真实 embedding
[0.2]*768,
[0.3]*768
]
# 批量插入数据
collection.add(
documents=documents,
embeddings=embeddings,
ids=ids
)
4. 执行相似性搜索
# 搜索与 "北京景点" 相似的文档(假设 query_embedding 已生成)query_embedding = [0.12]*768
results = collection.query(query_embeddings=[query_embedding],
n_results=2 # 返回最相似的 2 个结果
)
print(results["documents"]) # 输出:[["我爱北京天安门", "上海外滩人很多"]]
生产环境注意事项
持久化存储
- 默认使用 SQLite,适合小型应用
- 生产环境建议配置 PostgreSQL:
client = chromadb.HttpClient( host="localhost", port=5432, settings=chromadb.config.Settings( chroma_db_impl="duckdb+parquet", persist_directory="/path/to/storage" ) )
性能调优
- batch_size:批量插入时建议 100-1000 条 / 批
- 索引类型:大数据量选择 HNSW,小数据用 flat
collection.modify( name="my_collection", metadata={"hnsw:construction_ef": 64} # 调高构建参数 )
常见错误排查
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 400 维度不匹配 | 插入向量维度≠集合定义维度 | 统一所有向量的维度 |
| 500 连接超时 | 服务器过载或网络问题 | 检查服务状态,增加超时时间 |
| 404 集合不存在 | 拼写错误或未创建集合 | 使用 get_or_create_collection |
进阶思考
- 混合检索 :如何结合关键词(如 ” 北京 AND 景点 ”) 与向量搜索?
- 质量评估:除了余弦相似度,还能用什么指标衡量搜索效果?
- 增量更新:当新数据不断加入时,如何避免全量重建索引?
通过这篇指南,你应该已经能在 15 分钟内搭建起一个可运行的向量搜索服务。Chromadb 的 API 设计非常直观,建议多尝试 collection.update() 和collection.delete()等操作来熟悉完整功能。遇到问题不妨查看其 官方文档,源码的注释也非常友好。
正文完
