Chroma(Python 包名 chromadb)是一个开源的嵌入式向量数据库,核心定位是为 RAG(检索增强生成)、语义搜索、Embedding 存储提供“零配置、可持久化、可扩展”的检索底座。它把向量索引、文档原文和元数据统一存在一个集合中,默认基于 SQLite 落盘,开发者不需要单独部署数据库服务,几行代码就能完成“写入向量 → 语义查询 → 元数据过滤”的完整链路。本指南覆盖安装、核心 API、生产部署、版本演进与选型对比,帮助你在 30 分钟内判断它是否适合当前项目,并直接上手使用。

岗位关联

对 AI 工程师而言,Chroma 是理解向量数据库通用设计语言的最佳入门样本:集合、嵌入函数、元数据过滤、客户端/服务端模式这套概念,在切换其他向量库时同样适用。

目录
  1. 为什么需要 Chroma:不搭数据库,也能做 RAG
  2. 安装与环境配置:3 步就绪
  3. 快速上手:5 分钟跑通第一个集合查询
  4. 核心能力详解:4 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
嵌入式向量数据库(开源)
开发商
Chroma, Inc.(美国)
开源协议
Apache 2.0(可商用)
GitHub Stars
无
主要语言
Python / Rust
当前版本
0.6.x 系列(2024-12 发布 0.6.0)
安装方式
pip install chromadb
官方文档
上手难度
★★☆☆☆(低)
适合人群
RAG 工程师、NLP 研究者、AI 应用开发
同类工具
FAISS、Pinecone、Qdrant
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 Chroma:不搭数据库,也能做 RAG

传统 RAG 方案在选型向量检索组件时,常常陷入两难。直接用 NumPy 暴力计算相似度,在万级向量以上速度明显下降;用 FAISS 一类的算法库,则要自己处理索引落盘、元数据过滤、服务接口封装;引入 PostgreSQL + pgvector 或独立向量数据库,又需要额外的运维负担。对一个刚起步的 AI 项目来说,这些工作都偏离了“先验证效果”的核心目标。

Chroma 把这些散落的环节整合成一个统一的嵌入式组件:默认通过 SQLite 将数据持久化到本地目录,提供 Python / JavaScript API,支持在集合上同时存储向量、文档全文和元数据,并在查询时一次完成相似度排序与条件过滤。开发者不需要先启动一个数据库进程,在脚本里写好 client = chromadb.PersistentClient(path="./data") 即可获得一个可复用的向量检索环境。

与同类工具相比,Chroma 的气质介于“算法库”和“数据库服务”之间:比 FAISS 多了应用层语义和持久化管理,比 Pinecone 这类托管服务少了部署和网络依赖。它最适合把检索链路先跑通,再根据规模决定是否迁移到更重型的服务。

安装与环境配置:3 步就绪

第一步,创建 Python 虚拟环境。Chroma 依赖较广,建议使用 Python 3.9 及以上版本,并将它装在独立环境里,避免与 PyTorch、LangChain 等框架的依赖互相冲突。第二步,通过 pip 安装。第三步,打印版本号验证安装成功。

验证安装:

看到类似 0.6.x 的输出即表示安装完成。需要说明的是,Chroma 在首次创建集合并写入数据时,会自动下载默认的嵌入模型 all-MiniLM-L6-v2(约 80–90 MB),因此第一次运行需要保持网络通畅;后续该模型会缓存在本地,不再重复下载。

bash3 行
python -m venv .venvsource .venv/bin/activate        # Windows 使用 .venv\Scripts\activatepip install chromadb
bash1 行
python -c "import chromadb; print(chromadb.__version__)"

快速上手:5 分钟跑通第一个集合查询

核心思路是四步:创建持久化客户端 → 创建或获取集合 → 写入带元数据的文档 → 查询并打印结果。下面这段代码使用默认嵌入模型自动完成文本向量化,无需手动调用任何模型接口。

运行后会输出与“智能手机新闻”语义最相近的两条记录,并且只返回 category 为 tech 的那一条。结果中的 document、metadata、distance 字段分别对应原文、附加信息和相似度距离。进阶技巧:正式项目里建议显式指定嵌入函数(如 OpenAI、HuggingFace 或自定义函数),避免团队内不同机器因默认模型版本不一致产生检索结果漂移。

python22 行
import chromadb client = chromadb.PersistentClient(path="./chroma_store")collection = client.get_or_create_collection("demo") collection.add(    documents=["苹果公司发布新款 iPhone",               "北京今天天气晴朗",               "AI 投融资月度报告"],    metadatas=[{"category": "tech"},               {"category": "weather"},               {"category": "ai"}],    ids=["doc-01", "doc-02", "doc-03"],) result = collection.query(    query_texts=["智能手机新闻"],    n_results=2,    where={"category": "tech"},)print(result["ids"])print(result["documents"])

核心能力详解:4 大支柱

支柱一:嵌入函数抽象。 Chroma 把“文本 → 向量”的过程封装为 embedding_function 对象。默认使用 all-MiniLM-L6-v2,也内置了 OpenAI、Cohere、HuggingFace 等适配器。用户还可以实现自定义函数,接入内部训练的模型,从而在向量化环节保持完全可控。

支柱二:集合与三类数据统一管理。 一个 collection 同时保存向量、原始文档和元数据。add()、update()、upsert()、delete() 四个方法覆盖了增改删的主要场景,其中 upsert() 会同时处理“插入新 ID”和“更新旧 ID”两种情况,是数据同步场景中最常用的入口。

支柱三:语义查询与元数据过滤的组合。 query() 支持同时传入 query_texts(自动向量化)、n_results(返回条数)、where(元数据过滤)和 where_document(文档内容过滤)。这意味着可以实现“在某个分类下做语义搜索”,而不是对所有向量做全局暴力匹配,显著提升检索精确度。

支柱四:嵌入式与 Server 双模式。 单机脚本中使用 PersistentClient,数据落盘到本地路径;当需要多进程并发访问时,可启动独立服务,改用 HttpClient 连接。两种模式共用同一套 Collection API,切换成本极低。

生产部署与监控:从上线到运维

部署方式一:嵌入式 + 离线批量。适合单进程的数据处理任务,例如定时将新文档写入本地知识库,或是在 Jupyter 环境中做实验。数据目录通过 PersistentClient(path="/data/chroma") 指定,备份时直接复制该目录即可。

部署方式二:Docker 启动服务端,配合 HTTP 客户端。适合 Web 后端多进程并发场景:

可观测性方面,Chroma 没有内置图形化监控面板。建议关注三类指标:宿主机磁盘占用与 inode 使用率(SQLite 文件会持续增长)、进程内存占用(向量索引常驻内存)、查询延迟与错误率(通过应用层日志统计)。备份策略上,服务模式直接备份挂载的 /data 卷;嵌入式模式则应先停止写入进程再复制数据目录,避免 SQLite 文件处于不一致状态。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>默认 Client() 只存内存:直接使用 chromadb.Client() 创建客户端时,数据仅保存在内存中,进程结束即丢失;生产或长期开发请改用 PersistentClient。</li><li>更换 embedding_function 不会自动重新嵌入旧数据:新旧向量在不同语义空间,查询结果会失真,需要重建集合或对已有数据重新写入。</li><li>嵌入式模式不能多进程共享同一数据目录:多个 worker 同时读写同一 SQLite 路径会出错,多进程场景应使用 HttpClient 连接独立服务。</li><li>HttpClient 默认无鉴权:服务本身不提供用户认证,直接暴露公网会导致数据泄露,必须放在内网或通过反向代理增加鉴权层。</li></ul>

bash1 行
docker run -d --name chroma -p 8000:8000 -v /data/chroma:/data chromadb/chroma
python4 行
import chromadbclient = chromadb.HttpClient(host="localhost", port=8000)collection = client.get_or_create_collection("prod_collection")print(collection.count())
维度ChromaFAISSPineconeQdrant
定位嵌入式向量数据库向量检索算法库全托管向量数据库服务独立向量数据库服务
编排范式以 collection 组织,数据落盘本地目录以 Index 为对象,只管向量与 ID以 Index 为对象,通过 API 访问以 collection 组织,独立 HTTP/gRPC 服务
类型约束内置文档、元数据、向量的三类模型仅向量与 ID,元数据需外部关联支持稀疏向量与元数据Payload 支持强类型,过滤能力强
学习曲线低,几行代码跑通中,需理解索引类型与调参低,但需学习 API 与配额管理中,需掌握部署与服务配置
生态集成LangChain、LlamaIndex 官方集成被大量算法框架内置引用LangChain、OpenAI、LlamaIndex 插件丰富多语言客户端及主流框架适配器
生产部署Docker 单节点,适合中小规模需自建服务封装与持久化全托管,免运维,按量计费可单机、可集群,支持高可用部署
LicenseApache 2.0MIT闭源商业Apache 2.0
适合谁RAG 原型、中小知识库、嵌入式应用大规模离线向量索引、算法研究不想运维、按量付费的团队需要复杂过滤与自托管高性能检索的团队

选型建议:追求“最快跑通验证”选 Chroma;已有成熟算法栈、只需向量索引库选 FAISS;没有运维人力、预算充足选 Pinecone;需要大规模、高并发且强过滤能力时选 Qdrant。Chroma 与 Qdrant 在大多数 RAG 场景中能力重叠,数据量超过百万级且检索延迟敏感时优先考虑 Qdrant。

版本迭代

Chroma 的演进主线是先保证本地嵌入式场景的易用性,再逐步加强服务化能力。早期版本完善 collection API 与持久化;0.4 起重构存储分段结构;0.5 引入更稳定的网络客户端/服务端;0.6 开始落地 Rust 底层组件,为规模化打下基础。截至训练数据,可能已有更新版本。

版本时间变化提升
0.3.02023-02首轮核心功能完善支持 Collection 管理、本地持久化、基础过滤查询
0.4.02023-11存储结构重构,引入分段架构大规模集合查询性能提升,内存占用下降
0.5.02024-06新网络栈与集合限额配置客户端/服务端模式并发与稳定性增强
0.6.02024-12底层存储引擎 Rust 化API 保持兼容,集群化功能接口开始落地
结论

从版本节奏看,Chroma 在保持 API 稳定的前提下,把改进重心从“能用”转向“好用”:0.4 提升单机性能,0.5 强化服务化稳定性,0.6 为多租户与集群打基础。选型时不必担心 API 大版本断裂,0.4 之后的核心用法至今兼容。

AI 应用场景

RAG 原型快速验证

阶段:RAG 管道构建

解决的问题:搭建检索增强生成应用时,传统方式要先选型、部署、维护一个独立的搜索服务,光环境准备就要半天。Chroma 通过嵌入式持久化,将“写入文档 + 语义检索”压缩为十几行 Python 代码,让团队把时间花在 Prompt 调优而非基础设施上。

具体案例:某团队将 1 万篇内部技术文档写入本地 Chroma 集合,接入 LLM 后构建知识库问答系统。从环境搭建到跑通「文档检索 → 上下文组装 → 问答生成」全链路,用时从预估的 2 天缩短到 2 小时;检索侧本地无网络依赖,离线演示环境也能正常演示。

多租户知识库数据隔离

阶段:向量检索与数据隔离

解决的问题:在企业内部知识平台中,不同部门使用同一套检索服务,但数据彼此不能互相可见。若为每个部门单独部署一套向量库,成本成倍增加。

具体案例:通过为每个部门创建独立 collection,并以 部门ID 作为元数据字段,查询时在 where 中加入租户条件。结果能同时做到“物理隔离”和“逻辑隔离”:collection 间本就互不可见,同一 collection 内也通过过滤限制访问范围。某 SaaS 服务商由此在单节点 Chroma 上支撑了 20 余个企业租户的检索需求。

内容平台的分类语义搜索

阶段:文档智能与检索过滤

解决的问题:传统关键词搜索对同义表达无能为力,而纯向量搜索又会跨分类返回无关结果。需要把“语义相关性”和“结构化分类”结合。

具体案例:内容平台将文章标题、摘要写入 Chroma,并给每条记录打上 category 与 publish_date 元数据。用户搜索“智能驾驶最新进展”时,通过 where={"category": "tech"} 限定范围,再按向量相似度排序,有效召回率较旧版关键词搜索提升约 35%,结果中跨领域噪音明显减少。

常见误区

误区网上教程里 Chroma 都是几行代码跑在 Jupyter 里,看起来像玩具,真实项目应该直接用大型云数据库。

正解Chroma 提供独立的 HTTP 服务模式,数据持久化在服务端,支持并发访问与 Docker 部署。在千万级向量以下、单节点可满足延时的场景里,它完全能作为生产组件。官方也提供 Chroma Cloud 托管方案,说明它定位的从来不只是原型工具。判断是否适合生产,应看数据规模、并发 QPS 和可用性要求,而不是工具是否“轻量”。

为何常见:多数入门教程只展示嵌入式 Client 用法,没有介绍 Server 模式和运维细节,给初学者留下“只能本地跑”的印象。

误区我用 `chromadb.Client()` 创建客户端,数据保存到本地路径了,下次重启还能查到。

正解Client() 默认是内存模式,数据只存在于当前进程,进程退出后全部消失。要持久化必须显式使用 PersistentClient(path="..."),或连接服务端 HttpClient。官方文档在“运行模式”一节明确区分了三种客户端,默认选哪种取决于你是否传入路径,而不是自动落盘。

为何常见:很多教程使用默认客户端演示,读者误以为这与“能保存数据”绑定,忽略了构造函数的实际差异。

误区我把 embedding_function 从 BERT 换成了 OpenAI,集合里之前的数据就会用新模型自动重算。

正解嵌入函数只作用于写入时和查询时的新文本。已存在集合中的向量不会再被重新计算,修改函数后,旧向量与新查询向量处于不同的语义空间,检索结果基本不可用。正确做法是新建集合并用新函数重新写入全部数据,或在原集合上执行删除后重灌。

为何常见:向量数据库通常将“向量化”和“存储”解耦,用户容易把 embedding 当作数据库的内部索引而不是外部输入。

误区Chroma 看起来是个数据库,应该能用 SQL 做联表查询、聚合统计这类操作。

正解Chroma 是面向向量的专用存储,它的“过滤”能力限定在元数据等值/范围匹配和文档内容包含匹配,不支持 JOIN、子查询、聚合函数等标准 SQL 能力。需要复杂分析时应把元数据同步到关系型数据库,Chroma 只负责向量召回阶段的粗筛。

为何常见:名字里带“数据库”让新人默认其具备通用数据库能力,实际它更像“支持简单过滤的向量索引”。

面试题

Q1. Chroma 中负责本地磁盘持久化的客户端类是?

单选题 · easy

  • A.chromadb.Client
  • B.chromadb.HttpClient
  • C.chromadb.PersistentClient← 正确答案
  • D.chromadb.EphemeralClient

答案:C。PersistentClient 将数据持久化到本地 SQLite 文件;Client() 是内存模式,进程退出后数据消失;HttpClient 用于连接远端服务;不存在 EphemeralClient 这个公开类。

Q2. 安装 Chroma 的正确 pip 命令是?

单选题 · easy

  • A.pip install chroma
  • B.pip install chromadb← 正确答案
  • C.pip install chroma-vector
  • D.pip install vector-chroma

答案:B。Chroma 的 Python 包名是 chromadb,不是 chroma。PyPI 上的包发布名为 chromadb,安装后通过 import chromadb 使用。

Q3. 以下哪些是 Chroma Collection 提供的正式操作方法?

多选题 · mid

  • A.collection.add()← 正确答案
  • B.collection.query()← 正确答案
  • C.collection.upsert()← 正确答案
  • D.collection.train()

答案:ABC。add 用于新增,query 用于查询,upsert 用于插入或更新。train 不存在,因为 Chroma 不负责模型训练,向量化由 embedding_function 负责。

Q4. Chroma 默认使用的嵌入模型是?

单选题 · mid

  • A.OpenAI text-ada-002
  • B.BAAI bge-base-zh
  • C.all-MiniLM-L6-v2← 正确答案
  • D.text-embedding-3-large

答案:C。默认嵌入函数为 all-MiniLM-L6-v2,通过 ONNX Runtime 在本地运行,首次使用自动下载。其他选项均为需显式配置的第三方模型。

Q5. 调用 collection.query() 时,以下哪些是有效参数?

多选题 · mid

  • A.where 过滤条件← 正确答案
  • B.where_document 条件← 正确答案
  • C.n_results 返回数← 正确答案
  • D.filter 关键字

答案:ABC。where 用于元数据过滤,where_document 用于文档内容过滤,n_results 指定返回条数。filter 不是 Chroma query 的参数名,属于混淆项。

Q6. 修改 Collection 的 embedding_function 后,集合中已有向量的行为是?

单选题 · hard

  • A.将立即用新函数重算
  • B.立即抛出异常
  • C.旧向量保留,新写入使用新函数← 正确答案
  • D.查询时动态转换

答案:C。embedding_function 只在写入和查询时调用,已有向量不会自动重算。此时新旧向量语义空间不一致,需重建集合或重新写入数据。

Q7. 以下哪些是 Chroma 适合作为 RAG 检索组件的理由?

多选题 · hard

  • A.支持高精度精确检索
  • B.支持元数据过滤与文档过滤← 正确答案
  • C.可独立部署并支持并发查询← 正确答案
  • D.同进程内零配置开发← 正确答案

答案:BCD。Chroma 默认使用 HNSW 近似最近邻检索,不是精确检索,A 错误。B 是它的核心过滤能力;C 对应 HttpClient 服务模式;D 对应嵌入式 PersistentClient 模式。

Q8. Chroma 服务端默认监听的端口是?

单选题 · easy

  • A.8000← 正确答案
  • B.8080
  • C.6379
  • D.5000

答案:A。Docker 启动 chromadb/chroma 时默认暴露 8000 端口,HttpClient 不传 port 时也默认连接 8000。6379 是 Redis 默认端口。

Q9. 关于 Chroma 数据持久化,正确的说法是?

多选题 · hard

  • A.PersistentClient 将数据保存到 SQLite← 正确答案
  • B.默认 Client 不会落盘← 正确答案
  • C.需要外部数据库维护索引
  • D.服务模式下数据由服务端管理← 正确答案

答案:ABD。PersistentClient 指定 path 后使用 SQLite 落盘;默认 Client() 是内存模式;服务端模式下数据在服务进程目录中。C 错误,Chroma 自带存储引擎,不需要外部数据库。

Q10. Chroma 的 query() 返回结果中会包含哪些字段?

多选题 · hard

  • A.ids 字段← 正确答案
  • B.documents 字段← 正确答案
  • C.distances 字段← 正确答案
  • D.scores 字段

答案:ABC。查询结果包含 ids、documents、metadatas、distances、embeddings 等字段。返回的是距离值而非覆盖率分数,因此 scores 不是标准返回字段。