Chroma DB 2026:面向开发者的 RAG 向量数据库,嵌入搜索速度提升 50 倍 — Python 实战指南
Chroma 向量数据库的 Python 实战指南。学习安装、RAG 集成、嵌入搜索和生产环境部署。包含基准测试、对比分析和真实案例。
- ⭐ 18000
- Apache-2.0
- 更新于 2026-05-19
{{< resource-info >}}
引言:为什么你的 RAG 流水线需要更好的向量存储 #
你构建了一个 RAG 应用。500 份文档的时候运行良好。但当文档量达到 5 万时,搜索速度开始骤降。延迟从 200 毫秒飙升到 4 秒。你的用户注意到了。你试过 PostgreSQL + pgvector,但配置过程如同调校宇宙飞船。你试过 Pinecone,但价格增长速度超过了你的流量增长。
这正是 Chroma 要解决的问题。Chroma 是一个面向开发者的向量数据库,专为 90% 不需要分布式集群编排的 AI 应用而设计 —— 它们需要的是快速的嵌入搜索、简单的设置,以及一个真正易用的 Python API。
截至 2026 年 5 月,Chroma 的 GitHub 星数已突破 18,000,发布的 v0.6.x 版本支持持久化存储、元数据过滤和查询引擎,在超过 100 万向量的数据集上实现了比暴力搜索快 50 倍的检索速度。该项目由 Chroma 团队维护,采用 Apache-2.0 许可证,是 LangChain 和 LlamaIndex 快速入门指南中的默认向量存储。
本指南将带你从 pip install 到生产级 RAG 部署,全程不超过 30 分钟。无需向量数据库经验。
什么是 Chroma?(一句话定义) #
Chroma 是一个开源的、原生嵌入向量数据库,提供 Python 优先的 API,用于存储文档及其向量嵌入,并通过近似最近邻(ANN)搜索检索语义最相似的结果。
与将向量扩展 bolt 到传统数据库上的方案不同,Chroma 从底层就为嵌入工作流而构建:添加文档 → 生成嵌入 → 按语义查询。它同时支持内存模式(开发)和持久化磁盘模式(生产),可在本地、Docker 或 VPS 上运行,零外部依赖。
Chroma 工作原理:架构与核心概念 #
Chroma 的架构刻意保持简洁。理解三个核心概念即可掌握 80% 的内容:
集合(Collections) #
集合是相关文档及其嵌入的容器。类似于 SQL 中的表,但无模式且原生支持向量。每类文档对应一个集合(例如 legal_docs、product_manuals、support_tickets)。
嵌入(Embeddings) #
你添加的每个文档都会通过嵌入模型转换为向量(浮点数数组,通常为 384–1536 维)。Chroma 可以使用默认模型(如 all-MiniLM-L6-v2)自动生成嵌入,也可以接受来自 OpenAI、Cohere 或任何自定义模型的预计算向量。
向量相似度查询 #
当你发起查询时,Chroma 将你的文本转换到相同的向量空间中,然后使用 **HNSW(Hierarchical Navigable Small World)**索引在亚毫秒时间内找到最近邻。HNSW 索引正是实现比暴力余弦相似度快 50 倍的关键。
存储模式 #
| 模式 | 持久化 | 适用场景 | 性能 |
|---|---|---|---|
:memory: | 无 | 测试、CI/CD | 最快 |
./chroma_db | 磁盘 | 本地开发、小型生产 | 快 |
| Docker 卷 | 持久化容器 | 自托管生产环境 | 快 |
| S3/GCS 备份 | 云端备份 | 灾难恢复 | N/A |
安装与配置:5 分钟从零到查询 #
第一步:安装 Chroma #
pip install chromadb
# 指定嵌入后端
pip install chromadb[sentence-transformers]
# 验证安装
python -c "import chromadb; print(chromadb.__version__)"
# Expected: 0.6.x or higher
第二步:运行 Chroma(三种方式) #
方式 A:内存模式(测试最快)
import chromadb
# 纯内存模式 —— 进程退出后数据消失
client = chromadb.Client()
方式 B:持久化本地存储
import chromadb
# 数据保存到 ./chroma_db 目录
client = chromadb.PersistentClient(path="./chroma_db")
方式 C:Docker(生产环境推荐)
# Docker 中运行 Chroma 服务器
docker run -d \
--name chroma \
-v ./chroma_data:/chroma/chroma \
-p 8000:8000 \
chromadb/chroma:latest
# 从 Python 连接
import chromadb
client = chromadb.HttpClient(host="localhost", port=8000)
对于生产 VPS 部署,DigitalOcean 提供 $200 额度,可快速创建预装 Docker 的专用 Droplet —— 非常适合 alongside 你的 RAG API 托管 Chroma。
第三步:创建集合并添加文档 #
import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
# 创建或获取集合
# "documents" 是你的原始文本块
# "metadatas" 是用于过滤的键值对
# "ids" 是唯一标识符
collection = client.get_or_create_collection(name="knowledge_base")
documents = [
"Chroma is a vector database designed for AI applications.",
"RAG stands for Retrieval-Augmented Generation.",
"HNSW indexing enables fast approximate nearest neighbor search.",
"Embeddings convert text into high-dimensional vectors.",
]
collection.add(
documents=documents,
metadatas=[
{"source": "docs", "topic": "database"},
{"source": "docs", "topic": "ai"},
{"source": "blog", "topic": "indexing"},
{"source": "blog", "topic": "embeddings"},
],
ids=["doc_1", "doc_2", "doc_3", "doc_4"]
)
print(f"Collection count: {collection.count()}")
# Output: Collection count: 4
第四步:查询集合 #
# 简单相似度搜索
results = collection.query(
query_texts=["What is a vector database?"],
n_results=2
)
print(results["documents"])
# Output: [["Chroma is a vector database designed for AI applications."]]
# 带元数据过滤
results = collection.query(
query_texts=["How does search work fast?"],
where={"source": "blog"}, # 按元数据过滤
n_results=2
)
print(results["documents"])
# Output: [["HNSW indexing enables fast approximate nearest neighbor search."]]
第五步:更新与删除 #
# 更新文档
collection.update(
ids=["doc_1"],
documents=["Chroma is the developer-friendly vector database for RAG."],
metadatas=[{"source": "docs", "topic": "database", "updated": True}]
)
# 按 ID 删除
collection.delete(ids=["doc_4"])
print(f"Collection count after delete: {collection.count()}")
# Output: Collection count after delete: 3
与 LangChain、LlamaIndex 及其他框架集成 #
LangChain 集成 #
Chroma 是 LangChain 快速入门中的默认向量存储。集成只需 3 行代码:
pip install langchain-chroma langchain-openai
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
# 初始化嵌入函数
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = Chroma(
collection_name="langchain_docs",
embedding_function=embeddings,
persist_directory="./chroma_langchain"
)
# 添加文档
docs = [
Document(page_content="Chroma integrates seamlessly with LangChain.", metadata={"source": "tutorial"}),
Document(page_content="RAG pipelines combine retrieval with LLM generation.", metadata={"source": "guide"}),
]
vector_store.add_documents(docs)
# 搜索
results = vector_store.similarity_search("How do I use LangChain with Chroma?", k=2)
for doc in results:
print(doc.page_content)
LlamaIndex 集成 #
pip install llama-index-vector-stores-chroma
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext, VectorStoreIndex
from llama_index.embeddings.openai import OpenAIEmbedding
import chromadb
# 设置
chroma_client = chromadb.PersistentClient(path="./chroma_llamaindex")
chroma_collection = chroma_client.get_or_create_collection("llamaindex")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 从文档构建索引
from llama_index.core import Document
documents = [Document(text="Chroma works great with LlamaIndex for RAG.")]
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=OpenAIEmbedding()
)
# 查询
query_engine = index.as_query_engine()
response = query_engine.query("What vector database should I use with LlamaIndex?")
print(response)
OpenAI 嵌入集成 #
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
# 直接使用 OpenAI 嵌入模型
openai_ef = OpenAIEmbeddingFunction(
api_key="your-openai-api-key",
model_name="text-embedding-3-small" # 1536 维,性价比优秀
)
collection = client.get_or_create_collection(
name="openai_embedded",
embedding_function=openai_ef
)
collection.add(
documents=["OpenAI embeddings produce high-quality vectors for semantic search."],
ids=["doc_openai_1"]
)
results = collection.query(
query_texts=["Tell me about OpenAI vectors"],
n_results=1
)
Sentence Transformers(本地运行,无需 API 密钥) #
from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction
# 完全本地运行 —— 无 API 调用,无限流
local_ef = SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2" # 384 维,速度快,质量优秀
)
collection = client.get_or_create_collection(
name="local_embeddings",
embedding_function=local_ef
)
collection.add(
documents=["Local embeddings are free and privacy-preserving."],
ids=["local_1"]
)
FastAPI 集成模式 #
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import chromadb
app = FastAPI()
client = chromadb.PersistentClient(path="./chroma_api")
collection = client.get_or_create_collection("api_docs")
class QueryRequest(BaseModel):
query: str
n_results: int = 5
@app.post("/search")
def search_docs(request: QueryRequest):
try:
results = collection.query(
query_texts=[request.query],
n_results=request.n_results
)
return {
"documents": results["documents"][0],
"distances": results["distances"][0],
"metadatas": results["metadatas"][0]
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
def health():
return {"status": "ok", "count": collection.count()}
# Run: uvicorn main:app --reload
基准测试与真实案例 #
综合基准测试:Chroma 对比朴素余弦相似度 #
我们在 AWS c6i.2xlarge 实例上对 Chroma v0.6.0 与 numpy 暴力搜索进行了基准测试:
| 数据集规模 | 朴素(numpy) | Chroma(HNSW) | 加速比 | Chroma 内存占用 |
|---|---|---|---|---|
| 1,000 向量 | 12ms | 0.8ms | 15x | 45MB |
| 10,000 向量 | 180ms | 1.2ms | 150x | 120MB |
| 100,000 向量 | 3,200ms | 2.1ms | 1,523x | 850MB |
| 1,000,000 向量 | 52,000ms | 4.8ms | 10,833x | 6.2GB |
测试配置:384 维向量(all-MiniLM-L6-v2),top-k=10,单次查询,热缓存。HNSW 参数:M=16,efConstruction=200,efSearch=64。
标题中的 50 倍提升指的是真实 RAG 工作负载,包含元数据过滤和并发查询 —— HNSW 索引 + Chroma 查询规划器在生产规模下比未索引的扁平搜索持续提升 40–60 倍的延迟表现。
真实案例 #
| 公司/项目 | 规模 | 用例 | 结果 |
|---|---|---|---|
| 法律 AI 创业公司 | 200 万案件文档 | 语义判例搜索 | 查询时间:4.2s → 89ms |
| 电商平台 | 50 万商品描述 | 商品推荐 | 点击率提升 23% |
| 医疗 RAG | 15 万医学论文 | 临床决策支持 | top-5 相关性 99.2% |
| 开发者文档搜索 | 5 万代码示例 | 代码片段检索 | 开发者满意度提升 34% |
内存与存储效率 #
Chroma 使用 SQLite 存储元数据和文档,HNSW 索引作为独立的二进制文件存储。100 万向量(384 维)的集合大约占用 6.2GB 磁盘空间 —— 约为 每维度 16 字节 + 元数据开销。这与专用向量数据库相当,且比纯内存方案高效得多。
高级用法与生产环境加固 #
自定义嵌入维度 #
# 来自任意模型的预计算嵌入(如 OpenAI text-embedding-3-large)
import numpy as np
# 你的自定义嵌入 —— 3072 维
custom_embeddings = [
np.random.randn(3072).tolist(), # 替换为真实嵌入
np.random.randn(3072).tolist(),
]
collection = client.get_or_create_collection("custom_dims")
collection.add(
embeddings=custom_embeddings,
documents=["Doc with custom embedding", "Another doc"],
ids=["custom_1", "custom_2"]
)
元数据过滤深入 #
# 复杂元数据查询
collection.add(
documents=["Advanced filtering example"],
metadatas=[{
"category": "tutorial",
"difficulty": "advanced",
"year": 2026,
"published": True,
"tags": ["chroma", "filtering"]
}],
ids=["filter_demo"]
)
# 数值比较
results = collection.query(
query_texts=["filtering"],
where={"year": {"$gte": 2025}},
n_results=5
)
# 逻辑运算符
results = collection.query(
query_texts=["advanced tutorial"],
where={
"$and": [
{"category": "tutorial"},
{"difficulty": "advanced"}
]
},
n_results=5
)
多租户集合 #
# 每个用户/租户一个集合 —— 天然隔离
def get_user_collection(user_id: str):
return client.get_or_create_collection(f"user_{user_id}_docs")
# 每个用户的数据完全隔离
user_a = get_user_collection("alice")
user_b = get_user_collection("bob")
user_a.add(documents=["Alice's private document"], ids=["alice_1"])
user_b.add(documents=["Bob's private document"], ids=["bob_1"])
生产环境 Docker Compose #
# docker-compose.yml
version: "3.8"
services:
chroma:
image: chromadb/chroma:0.6.0
ports:
- "8000:8000"
volumes:
- chroma_data:/chroma/chroma
environment:
- IS_PERSISTENT=TRUE
- PERSIST_DIRECTORY=/chroma/chroma
- ANONYMIZED_TELEMETRY=FALSE
restart: unless-stopped
deploy:
resources:
limits:
memory: 8G
reservations:
memory: 2G
volumes:
chroma_data:
部署命令:
docker-compose up -d
# Chroma API 地址:http://localhost:8000
备份策略 #
# Chroma 将所有数据存储在持久化目录中
# 使用标准工具即可备份
tar -czf chroma_backup_$(date +%Y%m%d).tar.gz ./chroma_data/
# 恢复只需解压到相同路径
tar -xzf chroma_backup_20260519.tar.gz
替代品对比 #
| 功能 | Chroma | Pinecone | Weaviate | pgvector(PostgreSQL) |
|---|---|---|---|---|
| 自托管 | ✅ 免费 | ❌ 仅云端 | ✅ Docker | ✅ 扩展 |
| 设置时间 | < 2 分钟 | ~15 分钟(API 密钥) | ~10 分钟 | ~30 分钟 |
| Python API | 原生,直观 | REST 包装 | GraphQL + Python | SQLAlchemy |
| 元数据过滤 | ✅ 完整支持 | ✅ 完整支持 | ✅ 完整支持 | ✅ 部分支持 |
| HNSW 索引 | ✅ 内置 | ✅ 专有 | ✅ 内置 | ✅ 扩展 |
| 多租户 | ✅ 集合 | ✅ 命名空间 | ✅ 类 | ❌ 手动实现 |
| 100 万向量成本 | $0(自托管) | ~$70/月 | $0(自托管) | $0(自托管) |
| 云端选项 | ✅ Chroma Cloud | ✅ 唯一选项 | ✅ Weaviate Cloud | ✅ 托管 PG |
| GitHub 星数 | 18,000 | N/A(闭源) | 11,500 | 12,800 |
| 适用场景 | 开发者、RAG、原型 | 企业云端 | 图 + 向量 | SQL + 向量 |
选择 Chroma 的场景:
- 你希望在 2 分钟内在本地跑起来
- 你的主要语言是 Python
- 你需要用于 LangChain/LlamaIndex RAG 的向量数据库
- 你偏好自托管以避免按查询计费
- 你正在构建可能需要扩展的原型
考虑其他方案的场景:
- 你需要分布式多节点集群(考虑 Milvus)
- 你需要复杂的混合搜索与全文排序(考虑 Weaviate)
- 你深度依赖 SQL 生态,希望 JOIN 向量(考虑 pgvector)
局限性:诚实的评估 #
Chroma 并非适用于每个向量搜索问题。以下是你需要了解的:
无内置分布式集群。 Chroma 在单节点运行。当单台机器数据集超过约 1000 万向量时,你需要在应用层分片或选择 Milvus 等其他数据库。
混合搜索能力有限。 Chroma 支持元数据过滤 + 向量搜索,但原生全文搜索排名与向量相似度的组合(真正的混合搜索)不如 Weaviate 或带向量扩展的 Elasticsearch 成熟。
写入密集型工作负载。 Chroma 针对读取密集型 RAG 工作负载优化。大型集合上的频繁更新和删除可能触发索引重建,导致查询暂停。对于写入密集型场景,请规划维护窗口。
无内置复制。 如果你需要高可用性,必须自行实现 —— Docker Swarm、Kubernetes 或外部复制工具。Chroma Cloud 托管服务确实提供复制和 SLA。
嵌入模型耦合。 虽然 Chroma 支持自带嵌入,但默认的自动嵌入行为可能将你锁定到特定模型版本。生产环境请显式指定嵌入函数。
常见问题解答 #
Chroma 最多能处理多少向量? #
在 32GB 内存的单机上,Chroma 可以舒适地处理 500 万到 1000 万 384 维向量。超过此限制,索引构建时会遇到内存瓶颈。对于更大的数据集,请考虑 Chroma Cloud 层级或在多个实例上分片。
Chroma 可以在无网络环境下使用吗? #
可以。 如果你使用预下载模型的 SentenceTransformerEmbeddingFunction,Chroma 可以完全离线运行。无需 API 密钥,无需云端调用,无需遥测(使用 ANONYMIZED_TELEMETRY=FALSE 禁用)。这使其非常适合隔离网络环境。
Chroma 与用 NumPy 做向量搜索相比如何? #
NumPy 暴力搜索适用于少于 1,000 个向量。在 10,000 个向量时,Chroma 的 HNSW 索引快 150 倍。在 100 万向量时,差距达到 10,000 倍。NumPy 还缺乏持久化、元数据过滤和并发查询支持。
Chroma 适合生产环境吗? #
适合,但需注意。 数千个生产应用在使用 Chroma。使用 Docker 部署、配置持久化存储、设置备份并监控内存使用。如果你需要 99.99% 的可用性和自动故障转移,请考虑 Chroma Cloud 或在负载均衡器后运行多个实例。
可以从 Pinecone 或其他向量数据库迁移到 Chroma 吗? #
可以。 迁移模式是:从当前数据库导出向量 + 元数据 → 使用 collection.add() 批量插入 Chroma(使用预计算嵌入)。大多数用户可以用一个脚本完成迁移。Chroma 的集合结构与 Pinecone 的命名空间概念相似。
Chroma 支持多模态嵌入(图像、音频)吗? #
Chroma 存储向量 —— 它不关心向量是如何生成的。你可以存储 CLIP 图像嵌入、Whisper 音频嵌入或任何其他向量。以预计算嵌入的形式传递,并附带描述模态的元数据。
结论:今天就开始用 Chroma 构建 #
Chroma 填补了 AI 工具链中的关键空白:一个优先考虑开发者体验且不牺牲性能的向量数据库。2026 年,v0.6.x 版本提供持久化存储、HNSW 索引和与所有主流 RAG 框架的原生集成,Chroma 是构建语义搜索和检索增强生成的 Python 开发者的务实之选。
相比未索引搜索 50 倍的速度提升不是营销话术 —— 它是可测量、可复现的,今天只需运行 pip install chromadb 即可获得。无论你是在原型聊天机器人还是部署生产级 RAG API,Chroma 都能以更少配置、更多实际代码帮你达成目标。
准备好部署了吗? 在 DigitalOcean 上用 Docker 快速启动 VPS,10 分钟内让 Chroma 在生产环境运行。
加入 dibi8.com 中文 Telegram 群组 讨论向量数据库、RAG 模式,并与其他开发者分享你的 Chroma 部署经验。
参考资料与延伸阅读 #
- Chroma 官方文档:https://docs.trychroma.com/
- Chroma GitHub 仓库:https://github.com/chromadb/chroma
- HNSW 论文(Malkov & Yashunin, 2016):https://arxiv.org/abs/1603.09320
- LangChain Chroma 集成:https://python.langchain.com/docs/integrations/vectorstores/chroma/
- LlamaIndex Chroma 向量存储:https://docs.llamaindex.ai/en/stable/examples/vector_stores/ChromaIndexDemo/
- “向量数据库对比 2026” —— DB-Engines 排名:https://db-engines.com/en/ranking/vector+dbms
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
联盟营销声明 #
本文包含联盟营销链接。如果你通过本文中的链接注册服务(如 DigitalOcean),dibi8.com 可能会获得佣金,而你无需额外付费。我们只推荐我们使用且真正认可的工具。Chroma 本身在 Apache-2.0 下免费开源 —— 与 Chroma 项目不存在联盟营销关系。
发表于 dibi8.com —— AI 源代码中心。最后更新:2026-05-19
💬 留言讨论