在前面章节我们已经学习和使用了 EphemeralClient(内存)和PersistentClient(本地磁盘)客户端,前者将数据保存到内存,程序退出数据就丢失。后者是将数据写入到磁盘文件,程序退出数据不会丢失。如果仅仅用于测试 Chroma 的某些特性使用前面两个客户端完全足够了。
除了它们,Chroma 还提供了 HttpClient 和 CloudClient 客户端。前者是将 Chroma 部署成一个单独的服务,通过“主机+端口”网络访问调用,二后者连接 Chroma 官方托管云(trychroma.com 的云服务),内置云鉴权、tenant/database 体系,走官方云端接口,不是连你自己搭的 chroma 服务
简单用法如下:
import chromadb
# 内存
client = chromadb.EphemeralClient()
# 本地磁盘
client = chromadb.PersistentClient(path="./chroma_data")
# 远程服务
client = chromadb.HttpClient(host="localhost", port=8000)
# 托管
client = chromadb.CloudClient(tenant="...", database="...", api_key="...")先安装 Chroma 服务,这里使用 Docker 进行安装:
# 拉取镜像
docker pull chromadb/chroma
# 启动容器
docker run -v ./chroma-data:/data -p 8000:8000 chromadb/chroma
# 查看容器启动情况,根据容器名称过滤
root@localhost:~# docker ps -f "name=reverent_lamport"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b777707ec23 chromadb/chroma "dumb-init -- chroma…" 6 weeks ago Up 4 minutes 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp reverent_lamport编写一段简易脚本使用 HttpClient 客户端连接 Chroma 服务,如下:
import chromadb
client = chromadb.HttpClient(host="localhost", port=8000) # 远程服务
col = client.get_or_create_collection("client_demo", embedding_function=None)
col.add(
ids=["q1", "q2", "q3", "q4"],
documents=[
"订单付款后多久发货?一般 48 小时内出库",
"如何申请退款?在订单详情页点击申请退款",
"发票怎么开?在个人中心-发票管理里申请电子发票",
"快递丢了怎么办?联系客服补发或全额退款",
])
print(col.get(ids=["q1","q2"])["documents"])运行代码,输出如下:
['订单付款后多久发货?一般 48 小时内出库', '如何申请退款?在订单详情页点击申请退款']CloudClient 仅能调用 Chroma 官方托管的云服务,我们需要到官网去注册一个账号(官网地址 https://www.trychroma.com/):

很遗憾,编写该章节时注册功能没有开放,限制新用户注册,不能进行演示了,你可以尝试一下。
下面表格展示了各个客户端的区别,帮助你选择合适的客户端:
| Ephemeral | Persistent | HttpClient | CloudClient | |
| 数据落在哪 | 进程内存 | 本地目录 | 远程服务器 | Chroma Cloud |
| 进程退出后 | 数据全没 | 数据还在 | 数据还在 | 数据还在 |
| 多进程共享 | 不行 | 不行(有锁) | 可以 | 可以 |
| 适合 | 调试、测试、notebook | 单机应用、原型 | 生产 | 不想运维 |
前面介绍的客户端都是同步版本客户端,发出调用请求后,代码会卡住,必须等接口处理完、拿到返回结果,才会继续往下执行后续代码,期间无法做别的事情。
Chroma 还提供了异步版本,发出调用请求后,异步客户端不会卡住,可以先去干别的任务,等结果回来再处理。
使用方式如下:
import asyncio
import chromadb
async def main():
# 异步客户端,连接本地Docker启动的Chroma服务(HttpClient对应服务端模式)
# 注意:AsyncHttpClient 是异步版本,和同步的 HttpClient 不能混用
client = await chromadb.AsyncHttpClient(host="localhost", port=8000)
# 创建向量集合
col = await client.get_or_create_collection(name="my_collection", embedding_function=None)
# 异步添加数据:文档文本、唯一id;不传embeddings时,会自动对documents做向量化
await col.add(ids=["id1"], documents=["hello"])
# 异步向量检索:传入查询文本,自动向量化后做相似度召回,只返回1条结果
res = await col.query(query_texts=["hi"], n_results=1)
# 打印召回结果的文档id列表
print(res["ids"])
# 启动异步事件循环,执行main协程
asyncio.run(main())注意,异步版本的方法签名跟同步版一模一样,只是都变成了协程。在 FastAPI 这种异步框架里用它,能避免阻塞事件循环。