Chroma向量数据库入门指南:轻量开源,专为LLM和RAG应用设计
Chroma 是一个开源的向量数据库(Vector Database),专为人工智能和大型语言模型(LLM)应用而设计。它的核心目标是让开发者能够轻松存储、检索和搜索由非结构化数据(如文本、图像、音频)生成的向量嵌入(Embeddings)。
常用地址
官方网站:https://www.trychroma.com/
开源项目:https://github.com/chroma-core/chroma
核心特点
轻量与易用
相比 Milvus 等工业级向量数据库,Chroma 极为轻量。它可以在内存中运行,也可以持久化到磁盘。
提供简洁的 Python 和 JavaScript API,几行代码即可创建数据库、添加文档并执行相似性搜索。
原生集成 LLM 生态
与 LangChain、LlamaIndex 等主流 AI 编排框架无缝集成。
内置支持多种 Embedding 模型(如 OpenAI、Hugging Face、Google PaLM 等),也可使用自定义模型。
多种检索模式
支持精确的向量相似性搜索(余弦、欧氏距离等)。
支持基于元数据的过滤,实现“向量搜索 + 标量过滤”的混合查询。
未来计划支持全文搜索(关键词匹配)和混合检索(Hybrid Search)。
开源与本地化部署
Apache 2.0 协议,代码托管在 GitHub(chroma-core/chroma)。
可完全本地运行,无需连接外部服务,保障数据隐私安全。
客户端-服务器架构
提供 HTTP 客户端模式,支持多进程/多用户访问后端服务器;也支持内存模式(适合开发测试)。
安装方法
pip install chromadb
典型应用场景
检索增强生成(RAG)
这是 Chroma 最核心的应用。将私密文档(如 PDF、网页、公司内部资料)切片并向量化存储到 Chroma。当用户提问时,先检索相关片段,再将片段+问题一起提交给 LLM,从而获得准确、基于事实的回答,同时避免幻觉(Hallucination)。
语义缓存(Semantic Cache)
缓存 LLM 的响应,当遇到语义相似的新问题时,直接返回缓存答案,节省成本和时间。
相似性匹配
查找与给定文本最相似的文档(如推荐系统、问答匹配、去重检测)。
代理记忆(Agent Memory)
为基于 LLM 的智能代理(Agent)提供长期记忆,让代理能记住历史交互或环境信息。
与其他向量数据库的对比
| 特性 | Chroma | Pinecone | Weaviate | Milvus |
|---|---|---|---|---|
| 开源 | ✅ | ❌ | ✅ | ✅ |
| 本地部署 | ✅ | ❌ | ✅ | ✅ |
| 易用性 | 极高 | 高 | 中 | 中 |
| 生产级扩展性 | 中 | 高 | 高 | 极高 |
| 适用场景 | 原型、小规模RAG | 商业SaaS | 通用 | 大规模、高性能 |
| 依赖 | 轻量,可无外部依赖 | 付费服务 | 需Docker/K8s | 需K8s或云服务 |
示例
根据id获取文档和根据文本查询文档
import chromadb
# 创建客户端
chroma_client = chromadb.Client()
# 创建集合
collection = chroma_client.create_collection(name="my_collection")
# 添加文档
collection.add(
ids=["id1", "id2"],
documents=[
"This is a document about pineapple",
"This is a document about oranges",
],
)
# 获取文档
result = collection.get(ids=["id1"])
print(result)
# 查询文档
results = collection.query(
query_texts=["This is a query document about hawaii"],
n_results=2,
)
print(results)
根据向量距离和过滤条件查询文档
import chromadb
# 创建客户端
chroma_client = chromadb.Client()
# 创建集合
collection = chroma_client.create_collection(name="my_collection")
# 添加文档
collection.add(
ids=["id1", "id2"],
embeddings=[
[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6],
],
metadatas=[{"category": "pineapple"}, {"category": "orange"}],
documents=[
"This is a document about pineapple",
"This is a document about oranges",
],
)
# 根据距离查询文档
results = collection.query(
query_embeddings=[[0.4, 0.5, 0.6]], # 使用3维向量
n_results=1,
)
print("基于向量距离的查询结果:")
print(results)
# 过滤文档
results = collection.query(
query_embeddings=[[0.1, 0.2, 0.3]], where={"category": "pineapple"} # 使用3维向量
)
print("\n基于过滤条件的查询结果:")
print(results)
总结
Chroma 适合:
- 快速搭建 RAG 原型或小型应用(个人项目、黑客马拉松、教学演示)。
- 对数据隐私敏感、必须完全本地运行的环境。
- 开发者希望用最简单的代码实现向量搜索。
不适合:
- 亿级规模向量、高并发、分布式生产环境(此时应考虑 Milvus、Qdrant 或云服务 Pinecone)。
Chroma 凭借其“极简主义”设计,已成为 LangChain 文档中默认推荐的向量数据库,是入门 RAG 技术的最佳起点之一。