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

举个实际例子:用传统数据库找「与图片 A 相似的图片」需要人工定义特征规则,而向量数据库能自动提取特征并快速返回相似结果。
Chromadb 核心概念三件套
- 集合(Collection):相当于传统数据库的表,用于存储同一类数据
- 嵌入(Embedding):将文本 / 图片等转换为向量的过程(如使用 BERT 模型)
- 查询(Query):输入一个向量,返回集合中最相似的若干向量
手把手完成第一次检索
先安装必备环境:
pip install chromadb sentence-transformers # 后者用于生成文本向量
然后是最简示例代码(建议保存为 demo.py):
import chromadb
from sentence_transformers import SentenceTransformer
# 初始化模型和客户端
embed_model = SentenceTransformer('paraphrase-MiniLM-L6-v2') # 轻量级文本向量模型
client = chromadb.Client()
# 创建集合(相当于建表)collection = client.create_collection(name="my_books")
# 准备测试数据
documents = ["Harry Potter and the Philosopher's Stone","The Lord of the Rings: The Fellowship of the Ring","The Hitchhiker's Guide to the Galaxy"]
# 生成向量并存入数据库
embeddings = embed_model.encode(documents).tolist()
collection.add(
documents=documents,
embeddings=embeddings,
ids=["id1", "id2", "id3"] # 必须提供唯一 ID
)
# 执行相似性查询
query = "A fantasy novel about wizards"
query_embedding = embed_model.encode(query).tolist()
results = collection.query(query_embeddings=[query_embedding],
n_results=2
)
print(f"最相似的 2 本书:{results['documents'][0]}")
注意:
– 首次运行会自动下载模型(约 80MB)
– 默认使用内存模式,重启后数据会丢失
让性能飞起来的三个诀窍
- 选对索引类型:
- 默认的「Flat」索引精度高但速度慢
-
大数据集建议改用「HNSW」:
collection.create_index(index_type="hnsw") -
批量操作:
- 单条插入会导致频繁 IO,改用
add方法的批量模式 -
示例:
collection.add(documents=documents_batch, embeddings=embeddings_batch, ids=ids_batch) -
合理设置维度:
- 比如 BERT-base 有 768 维,但对大多数场景 MiniLM 的 384 维足够用
- 降维能显著减少存储和计算量
生产环境必须知道的坑
内存管理:
– 默认全量加载数据到内存,大数据集需要启用持久化:
client = chromadb.PersistentClient(path="./chroma_db")
并发安全:
– 多进程写入时需加锁,建议用文件锁(fasteners库)
– 或者直接采用客户端 / 服务器模式:
chroma run --path /db_path --port 8000
持久化备份:
– Chroma 不提供内置备份方案
– 需要定期拷贝整个数据库目录
– 或者通过 collection.get() 获取全部数据后自行存储
下一步可以探索什么?
- 如何实现混合查询(向量搜索 + 传统条件过滤)?
- 当单机内存不足时,怎样搭建分布式向量数据库集群?
经过完整测试的代码已上传 GitHub 仓库(虚构示例),如果有其他具体场景需求,欢迎在评论区交流实际遇到的挑战。
正文完
