前面介绍了 Chroma 支持内存模式运行、本地磁盘文件持久化运行和作为独立的服务器运行。
下面通过一个示例介绍这三种模式的使用方式,代码几乎一样,改一行初始化就行(创建 client 不同):
import chromadb
from chromadb import ClientAPI
# 业务逻辑,用于创建集合,保存几条数据,然后进行查询
def business(client:ClientAPI) -> None:
# 创建一个集合
col = client.get_or_create_collection("faq")
# 添加几条数据
col.add(
ids=["q1", "q2", "q3", "q4"],
documents=[
"订单付款后多久发货?一般 48 小时内出库",
"如何申请退款?在订单详情页点击申请退款",
"发票怎么开?在个人中心-发票管理里申请电子发票",
"快递丢了怎么办?联系客服补发或全额退款",
],
metadatas=[
{"category": "物流"},
{"category": "售后"},
{"category": "财务"},
{"category": "售后"},
],
)
# 查询数据
res = col.query(query_texts=["怎么申请退款"], n_results=2)
for id_, doc, dist in zip(res["ids"][0], res["documents"][0], res["distances"][0]):
print(id_, round(dist, 4), doc)
# 内存模式,啥都不存,适合调试和跑测试
def ephemeral_client() -> None:
print("=" * 30, "内存模式", "=" * 30)
client = chromadb.EphemeralClient()
business(client)
# 本地持久化,数据写到磁盘上的目录
def persistent_client() -> None:
print("=" * 30, "本地持久化", "=" * 30)
client = chromadb.PersistentClient(path="./chroma_data")
business(client)
# 连一个独立跑着的 Chroma 服务
def standard_client() -> None:
print("="*30, "服务器模式", "="*30)
client = chromadb.HttpClient(host="localhost", port=8000)
business(client)
if __name__ == "__main__":
ephemeral_client() # 内存模式
persistent_client() # 本地持久化
standard_client() # 服务器模式如果你要使用服务器模式,可以参考第一章安装部分,推荐使用 Docker 快速安装 Chroma。
还有个 chromadb.Client(),这是老写法,等价于内存客户端,现在官方文档里已经不推荐了,新代码用 EphemeralClient() 更清楚。例如,老写法
import chromadb
# 旧API,不推荐:Client(),内存临时实例,进程销毁数据丢失
client = chromadb.Client()
col = client.get_or_create_collection("demo")
print(col.name)选择建议:
| 场景 | 用哪个 |
| 写脚本、跑 notebook、写单元测试 | EphemeralClient |
| 单机应用、本地工具、原型 | PersistentClient |
| 多进程/多机共享、生产环境 | HttpClient + 独立服务 |
| 不想自己运维、要弹性伸缩 | CloudClient(Chroma Cloud 托管) |
第 8 章会把这几种客户端的参数、坑和备份方式讲清楚。