Chroma(Python 包名 chromadb)是一个开源的嵌入式向量数据库,核心定位是为 RAG(检索增强生成)、语义搜索、Embedding 存储提供“零配置、可持久化、可扩展”的检索底座。它把向量索引、文档原文和元数据统一存在一个集合中,默认基于 SQLite 落盘,开发者不需要单独部署数据库服务,几行代码就能完成“写入向量 → 语义查询 → 元数据过滤”的完整链路。本指南覆盖安装、核心 API、生产部署、版本演进与选型对比,帮助你在 30 分钟内判断它是否适合当前项目,并直接上手使用。
对 AI 工程师而言,Chroma 是理解向量数据库通用设计语言的最佳入门样本:集合、嵌入函数、元数据过滤、客户端/服务端模式这套概念,在切换其他向量库时同样适用。
目录
速览卡是工具类内容的固定首屏模块: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),因此第一次运行需要保持网络通畅;后续该模型会缓存在本地,不再重复下载。
python -m venv .venvsource .venv/bin/activate # Windows 使用 .venv\Scripts\activatepip install chromadb
python -c "import chromadb; print(chromadb.__version__)"快速上手:5 分钟跑通第一个集合查询
核心思路是四步:创建持久化客户端 → 创建或获取集合 → 写入带元数据的文档 → 查询并打印结果。下面这段代码使用默认嵌入模型自动完成文本向量化,无需手动调用任何模型接口。
运行后会输出与“智能手机新闻”语义最相近的两条记录,并且只返回 category 为 tech 的那一条。结果中的 document、metadata、distance 字段分别对应原文、附加信息和相似度距离。进阶技巧:正式项目里建议显式指定嵌入函数(如 OpenAI、HuggingFace 或自定义函数),避免团队内不同机器因默认模型版本不一致产生检索结果漂移。
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>
docker run -d --name chroma -p 8000:8000 -v /data/chroma:/data chromadb/chromaimport chromadbclient = chromadb.HttpClient(host="localhost", port=8000)collection = client.get_or_create_collection("prod_collection")print(collection.count())
| 维度 | Chroma | FAISS | Pinecone | Qdrant |
|---|---|---|---|---|
| 定位 | 嵌入式向量数据库 | 向量检索算法库 | 全托管向量数据库服务 | 独立向量数据库服务 |
| 编排范式 | 以 collection 组织,数据落盘本地目录 | 以 Index 为对象,只管向量与 ID | 以 Index 为对象,通过 API 访问 | 以 collection 组织,独立 HTTP/gRPC 服务 |
| 类型约束 | 内置文档、元数据、向量的三类模型 | 仅向量与 ID,元数据需外部关联 | 支持稀疏向量与元数据 | Payload 支持强类型,过滤能力强 |
| 学习曲线 | 低,几行代码跑通 | 中,需理解索引类型与调参 | 低,但需学习 API 与配额管理 | 中,需掌握部署与服务配置 |
| 生态集成 | LangChain、LlamaIndex 官方集成 | 被大量算法框架内置引用 | LangChain、OpenAI、LlamaIndex 插件丰富 | 多语言客户端及主流框架适配器 |
| 生产部署 | Docker 单节点,适合中小规模 | 需自建服务封装与持久化 | 全托管,免运维,按量计费 | 可单机、可集群,支持高可用部署 |
| License | Apache 2.0 | MIT | 闭源商业 | Apache 2.0 |
| 适合谁 | RAG 原型、中小知识库、嵌入式应用 | 大规模离线向量索引、算法研究 | 不想运维、按量付费的团队 | 需要复杂过滤与自托管高性能检索的团队 |
选型建议:追求“最快跑通验证”选 Chroma;已有成熟算法栈、只需向量索引库选 FAISS;没有运维人力、预算充足选 Pinecone;需要大规模、高并发且强过滤能力时选 Qdrant。Chroma 与 Qdrant 在大多数 RAG 场景中能力重叠,数据量超过百万级且检索延迟敏感时优先考虑 Qdrant。
版本迭代
Chroma 的演进主线是先保证本地嵌入式场景的易用性,再逐步加强服务化能力。早期版本完善 collection API 与持久化;0.4 起重构存储分段结构;0.5 引入更稳定的网络客户端/服务端;0.6 开始落地 Rust 底层组件,为规模化打下基础。截至训练数据,可能已有更新版本。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 0.3.0 | 2023-02 | 首轮核心功能完善 | 支持 Collection 管理、本地持久化、基础过滤查询 |
| 0.4.0 | 2023-11 | 存储结构重构,引入分段架构 | 大规模集合查询性能提升,内存占用下降 |
| 0.5.0 | 2024-06 | 新网络栈与集合限额配置 | 客户端/服务端模式并发与稳定性增强 |
| 0.6.0 | 2024-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 中负责本地磁盘持久化的客户端类是?
- A.chromadb.Client
- B.chromadb.HttpClient
- C.chromadb.PersistentClient← 正确答案
- D.chromadb.EphemeralClient
答案:C。PersistentClient 将数据持久化到本地 SQLite 文件;Client() 是内存模式,进程退出后数据消失;HttpClient 用于连接远端服务;不存在 EphemeralClient 这个公开类。
Q2. 安装 Chroma 的正确 pip 命令是?
- 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 提供的正式操作方法?
- A.collection.add()← 正确答案
- B.collection.query()← 正确答案
- C.collection.upsert()← 正确答案
- D.collection.train()
答案:ABC。add 用于新增,query 用于查询,upsert 用于插入或更新。train 不存在,因为 Chroma 不负责模型训练,向量化由 embedding_function 负责。
Q4. Chroma 默认使用的嵌入模型是?
- 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() 时,以下哪些是有效参数?
- A.where 过滤条件← 正确答案
- B.where_document 条件← 正确答案
- C.n_results 返回数← 正确答案
- D.filter 关键字
答案:ABC。where 用于元数据过滤,where_document 用于文档内容过滤,n_results 指定返回条数。filter 不是 Chroma query 的参数名,属于混淆项。
Q6. 修改 Collection 的 embedding_function 后,集合中已有向量的行为是?
- A.将立即用新函数重算
- B.立即抛出异常
- C.旧向量保留,新写入使用新函数← 正确答案
- D.查询时动态转换
答案:C。embedding_function 只在写入和查询时调用,已有向量不会自动重算。此时新旧向量语义空间不一致,需重建集合或重新写入数据。
Q7. 以下哪些是 Chroma 适合作为 RAG 检索组件的理由?
- A.支持高精度精确检索
- B.支持元数据过滤与文档过滤← 正确答案
- C.可独立部署并支持并发查询← 正确答案
- D.同进程内零配置开发← 正确答案
答案:BCD。Chroma 默认使用 HNSW 近似最近邻检索,不是精确检索,A 错误。B 是它的核心过滤能力;C 对应 HttpClient 服务模式;D 对应嵌入式 PersistentClient 模式。
Q8. Chroma 服务端默认监听的端口是?
- A.8000← 正确答案
- B.8080
- C.6379
- D.5000
答案:A。Docker 启动 chromadb/chroma 时默认暴露 8000 端口,HttpClient 不传 port 时也默认连接 8000。6379 是 Redis 默认端口。
Q9. 关于 Chroma 数据持久化,正确的说法是?
- A.PersistentClient 将数据保存到 SQLite← 正确答案
- B.默认 Client 不会落盘← 正确答案
- C.需要外部数据库维护索引
- D.服务模式下数据由服务端管理← 正确答案
答案:ABD。PersistentClient 指定 path 后使用 SQLite 落盘;默认 Client() 是内存模式;服务端模式下数据在服务进程目录中。C 错误,Chroma 自带存储引擎,不需要外部数据库。
Q10. Chroma 的 query() 返回结果中会包含哪些字段?
- A.ids 字段← 正确答案
- B.documents 字段← 正确答案
- C.distances 字段← 正确答案
- D.scores 字段
答案:ABC。查询结果包含 ids、documents、metadatas、distances、embeddings 等字段。返回的是距离值而非覆盖率分数,因此 scores 不是标准返回字段。