共计 1984 个字符,预计需要花费 5 分钟才能阅读完成。
1. 为什么需要向量搜索?
传统的关键词搜索(如数据库 LIKE 操作或 Elasticsearch)存在明显短板:

- 无法理解语义(搜索 ” 苹果 ” 不会返回 ”iPhone” 相关内容)
- 受限于关键词匹配(错别字或同义词会导致漏检)
- 难以处理非结构化数据(图片、语音等)
向量搜索通过将数据转换为高维向量,使计算机能够:
- 计算语义相似度(” 猫 ” 和 ” 喵星人 ” 的向量距离很近)
- 支持多模态搜索(统一处理文本 / 图片 / 视频)
- 实现近似最近邻(ANN)检索,百万级数据毫秒响应
2. ChromaDB 核心优势
相比 Faiss、Milvus 等方案,ChromaDB 的特点是:
- 轻量级 :单机版无需额外服务,pip 安装即用
- 开发者友好 :Python-first 设计,API 简洁
- 功能完整 :内置持久化、多租户、过滤查询
| 特性 | ChromaDB | Faiss | Milvus |
|---|---|---|---|
| 安装复杂度 | ⭐ | ⭐⭐ | ⭐⭐⭐ |
| 分布式支持 | ❌ | ❌ | ✅ |
| 生产就绪 | ⭐⭐ | ⭐ | ⭐⭐⭐ |
3. 手把手实战教程
环境准备
pip install chromadb sentence-transformers # 安装核心库和嵌入模型
基本 CRUD 操作
import chromadb
from sentence_transformers import SentenceTransformer
# 初始化模型和客户端
encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
client = chromadb.Client()
# 创建集合(类似数据库表)collection = client.create_collection("products")
# 添加数据(自动生成向量)docs = ["iPhone 13", "MacBook Pro", "AirPods Pro"]
collection.add(
documents=docs,
ids=["p1", "p2", "p3"] # 必须唯一
)
# 语义搜索
results = collection.query(query_texts=["苹果手机"], # 中文查询
n_results=2
)
print(results["documents"]) # 输出:['iPhone 13', 'AirPods Pro']
进阶功能示例
自定义向量
# 使用自己生成的向量
custom_vectors = encoder.encode(["华为 Mate50", "小米平板"])
collection.add(embeddings=custom_vectors.tolist(),
documents=["华为 Mate50", "小米平板"],
ids=["p4", "p5"]
)
混合搜索(向量 + 过滤)
# 先过滤品类再向量搜索
collection.query(query_texts=["高性能笔记本"],
n_results=3,
where={"category": {"$eq": "laptop"}} # JSON 格式条件
)
4. 性能优化技巧
- 批量操作 :add/update 时尽量批量提交(每次 100-1000 条)
- 索引选择 :
- 默认的 HNSW 适合高召回率场景
- 对内存敏感可用 Annoy
- 向量归一化 :所有向量 L2 归一化可提升距离计算效率
# 创建时指定索引参数
client.create_collection(
"large_data",
metadata={"hnsw:ef_construction": 200} # 调整 HNSW 参数
)
5. 生产环境注意事项
- 持久化存储 :
# 指定持久化目录 client = chromadb.PersistentClient(path="/data/chroma") - 错误处理 :
try: collection.get(ids=["nonexist_id"]) except chromadb.errors.NoDatapointException: print("处理 ID 不存在情况") - 并发控制 :读写比例高时启用只读副本
6. 扩展应用方向
结合 NLP 模型可以:
- 实现多语言搜索(相同语义不同语言向量相近)
- 构建推荐系统(用户历史行为向量化)
- 异常检测(偏离正常向量分布的数据)
# 使用多语言模型
multi_encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
zh_vector = multi_encoder.encode("中国")
fr_vector = multi_encoder.encode("France")
# 两者余弦相似度约 0.8
总结
通过本文实践,我们用不到 50 行代码搭建了具备语义理解能力的搜索系统。ChromaDB 特别适合:
- 需要快速验证想法的 PoC 阶段
- 中小规模数据(单机千万级向量)
- 注重开发效率的场景
下一步建议尝试:
- 接入 OpenAI embeddings 获得更强大语义表示
- 结合 FastAPI 构建搜索 API 服务
- 在 AWS Lambda 等 Serverless 环境部署
正文完
