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 许可证,是 LangChainLlamaIndex 快速入门指南中的默认向量存储。

本指南将带你从 pip install 到生产级 RAG 部署,全程不超过 30 分钟。无需向量数据库经验。

什么是 Chroma?(一句话定义) #

Chroma 是一个开源的、原生嵌入向量数据库,提供 Python 优先的 API,用于存储文档及其向量嵌入,并通过近似最近邻(ANN)搜索检索语义最相似的结果。

与将向量扩展 bolt 到传统数据库上的方案不同,Chroma 从底层就为嵌入工作流而构建:添加文档 → 生成嵌入 → 按语义查询。它同时支持内存模式(开发)和持久化磁盘模式(生产),可在本地、Docker 或 VPS 上运行,零外部依赖。

Chroma 工作原理:架构与核心概念 #

Chroma 的架构刻意保持简洁。理解三个核心概念即可掌握 80% 的内容:

集合(Collections) #

集合是相关文档及其嵌入的容器。类似于 SQL 中的表,但无模式且原生支持向量。每类文档对应一个集合(例如 legal_docsproduct_manualssupport_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 向量12ms0.8ms15x45MB
10,000 向量180ms1.2ms150x120MB
100,000 向量3,200ms2.1ms1,523x850MB
1,000,000 向量52,000ms4.8ms10,833x6.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%
医疗 RAG15 万医学论文临床决策支持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

替代品对比 #

功能ChromaPineconeWeaviatepgvector(PostgreSQL)
自托管✅ 免费❌ 仅云端✅ Docker✅ 扩展
设置时间< 2 分钟~15 分钟(API 密钥)~10 分钟~30 分钟
Python API原生,直观REST 包装GraphQL + PythonSQLAlchemy
元数据过滤✅ 完整支持✅ 完整支持✅ 完整支持✅ 部分支持
HNSW 索引✅ 内置✅ 专有✅ 内置✅ 扩展
多租户✅ 集合✅ 命名空间✅ 类❌ 手动实现
100 万向量成本$0(自托管)~$70/月$0(自托管)$0(自托管)
云端选项✅ Chroma Cloud✅ 唯一选项✅ Weaviate Cloud✅ 托管 PG
GitHub 星数18,000N/A(闭源)11,50012,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 部署经验。

参考资料与延伸阅读 #

  1. Chroma 官方文档:https://docs.trychroma.com/
  2. Chroma GitHub 仓库:https://github.com/chromadb/chroma
  3. HNSW 论文(Malkov & Yashunin, 2016):https://arxiv.org/abs/1603.09320
  4. LangChain Chroma 集成:https://python.langchain.com/docs/integrations/vectorstores/chroma/
  5. LlamaIndex Chroma 向量存储:https://docs.llamaindex.ai/en/stable/examples/vector_stores/ChromaIndexDemo/
  6. “向量数据库对比 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

💬 留言讨论