【免费下载链接】context-hub
本篇技术指南以 Context Hub 仓库中维护的 ChromaDB Python 包文档 为主体,系统讲解chromadbPython 包在本地嵌入、自托管服务器与 Chroma Cloud 三种场景下的客户端选型,以及 Collection 的创建、写入、查询、过滤与 Embedding 函数配置全流程。读完本文,你将能根据自己的部署形态(单机、测试、HTTP 服务或云端)选择正确的客户端类,并写出可投入生产、语义检索与 RAG 场景可复用的向量数据库代码。
黄金法则:先选对客户端,再谈其他
在 Chroma 的 Python 生态中,同一个chromadb包提供了多种客户端构造入口,选择依据只有一个——数据库实例存在于哪里:
| 场景 | 客户端类 | 说明 |
|---|---|---|
| 本地嵌入式存储 | PersistentClient | 数据落盘到本地路径,适用于嵌入式应用、Notebook、本地开发与单机部署 |
| 测试与短生命周期原型 | EphemeralClient/Client() | 纯内存,进程结束数据即失,适合测试与一次性原型 |
| 自托管服务器 | HttpClient/AsyncHttpClient | 连接chroma run启动的本地或远程服务器,走 HTTP |
| Chroma Cloud | CloudClient | 面向云托管,需要 API Key 与 tenant/database 选择 |
文档同时强调两点:当默认值不明显时,要显式声明 tenant、database 与 embedding 策略;在当前的 Chroma 文档体系下,query与get仍是 OSS 与自托管场景的核心 Collection API(见 文档正文)。这也提醒开发者:不要因为 Cloud 出现了新的搜索示例,就替换掉既有 Python 代码库中基于collection.query()/collection.get()的检索逻辑。
安装:精确锁定版本号
Chroma 官方文档的建议是按项目期望锁定精确版本,而不是依赖某个模糊的1.5.x:
python -m pip install "chromadb==1.5.5"同样常用的包管理器写法:
uv add "chromadb==1.5.5" poetry add "chromadb==1.5.5"安装时需要注意三点:
chromadb包同时包含 Python 客户端与随附的chromaCLI(服务器启动命令chroma run就来自它);- 如果只需要一个更小的纯远程客户端,上游还发布了
chromadb-client,但本指南覆盖的是完整的chromadb包; - PyPI 上
1.5.3被标记为 yanked,因此应当优先固定一个已知的良好版本(如1.5.5),而不要默认任意1.5.x构建可互换。
按部署形态选择正确的客户端
本地持久化存储(PersistentClient)
适用于嵌入式应用、Notebook、本地开发与单节点部署。数据写入path指定的目录,目录不存在时会自动创建:
import chromadb client = chromadb.PersistentClient(path="./chroma-data")内存型开发客户端(EphemeralClient / Client)
测试与一次性原型使用,进程结束后数据即消失:
import chromadb client = chromadb.EphemeralClient()而chromadb.Client()是“环境配置驱动”的变体——客户端构造会跟随Settings、.env或其他环境驱动的配置,适合需要统一配置入口的场景:
import chromadb client = chromadb.Client()自托管服务器客户端(HttpClient / AsyncHttpClient)
先用随包 CLI 启动一个本地或远程 Chroma 服务器:
chroma run --path ./chroma-data然后通过 HTTP 连接,显式传入 host、port、ssl、headers、Settings 以及 tenant/database:
import chromadb from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT, Settings client = chromadb.HttpClient( host="localhost", port=8000, ssl=False, headers=None, settings=Settings(), tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE, )如果你的应用本身是异步的,可以直接使用异步 HTTP 客户端:
import asyncio import chromadb async def main() -> None: client = await chromadb.AsyncHttpClient(host="localhost", port=8000, ssl=False) print(client) asyncio.run(main())Chroma Cloud 客户端(CloudClient)
云端使用 API Key 加 tenant/database 选择。既可以通过环境变量注入:
export CHROMA_API_KEY="ck-..." export CHROMA_TENANT="your-tenant-id" export CHROMA_DATABASE="your-database-name"import chromadb client = chromadb.CloudClient()也可以显式传参:
import chromadb client = chromadb.CloudClient( api_key="ck-...", tenant="your-tenant-id", database="your-database-name", )核心 Collection 工作流:创建 + 写入
创建或复用 Collection,然后写入(upsert)记录:
import chromadb client = chromadb.PersistentClient(path="./chroma-data") collection = client.get_or_create_collection( name="support_articles", configuration={"hnsw": {"space": "cosine"}}, ) collection.upsert( ids=["doc-1", "doc-2"], documents=[ "Reset your password from the account settings page.", "Contact billing@example.com for invoice issues.", ], metadatas=[ {"source": "kb", "tags": ["auth", "account"]}, {"source": "kb", "tags": ["billing", "account"]}, ], )这里有几个影响后续行为的要点:
- 只传
documents:Chroma 会用 Collection 挂载的 embedding 函数自动计算向量; - 同时传
documents与显式embeddings:Chroma 两者都存储,不再对文档重新嵌入; - metadata 取值类型:支持字符串、整数、浮点数、布尔值,以及这些标量类型的同质数组(homogeneous arrays)。
关于 Collection 命名,文档给出了明确限制:长度 3~512 个字符、两端必须是小写字母或数字、内部允许点/短横线/下划线、不允许连续点,且不能是一个合法的 IP 地址(详见 常见陷阱章节)。
Query、Get 与过滤:两种检索入口
相似度搜索用.query(),不需要排序的直接按条件取回用.get():
result = collection.query( query_texts=["How do I change my password?"], n_results=3, where={"tags": {"$contains": "auth"}}, include=["documents", "metadatas", "distances"], ) for doc_id, document, metadata, distance in zip( result["ids"][0], result["documents"][0], result["metadatas"][0], result["distances"][0], ): print(doc_id, distance, metadata, document)records = collection.get( ids=["doc-1"], include=["documents", "metadatas"], ) for doc_id, document, metadata in zip( records["ids"], records["documents"], records["metadatas"], ): print(doc_id, metadata, document)过滤算子速查
where={...}:metadata 谓词,支持相等、范围比较、$and、$or、$in,以及针对数组成员的$contains/$not_contains;where_document={...}:文档全文过滤,支持$contains与$regex。
文档过滤示例:
matches = collection.get( where_document={"$regex": "billing@example\\.com"}, include=["documents"], )结果形状提醒(Agent 高频踩坑点)
.query()按输入查询分组返回结果,Python 侧是嵌套列表(result["documents"][0]对应第一条查询的命中文档);.get()返回扁平数组,对应元素按下标对齐;include=[...]控制载荷大小,而ids始终返回。
若需更完整的算子组合示例($gt/$gte/$lt/$lte/$ne/$eq、$and/$or/$not、$in/$nin以及where与where_document组合使用),可参考同仓库维护的 ChromaDB Python SDK 文档。
Embedding 函数:默认本地模型与云端模型
如果不显式指定 embedding 函数,Chroma 使用DefaultEmbeddingFunction,它在本地运行all-MiniLM-L6-v2模型,首次调用可能会自动下载模型文件:
collection = client.create_collection(name="notes")使用云端 embedding 服务(以 OpenAI 为例):
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction collection = client.create_collection( name="openai-notes", embedding_function=OpenAIEmbeddingFunction( model_name="text-embedding-3-small", ), )一个必须记住的约束:如果 Collection 没有挂载任何 embedding 函数,查询时必须提供query_embeddings而不是query_texts(因为系统没有可用的函数把文本转成向量)。
认证、租户与 Collection 配置
自托管 token 认证(1.0.x+)
对于 Chroma1.0.x+,文档明确建议通过代理或外部认证层来做 token 认证,而不是沿用旧版内置认证示例(cookbook 中展示了基于 Envoy 的 token 认证,支持Authorization或X-Chroma-Token两种头)。Python 客户端示例:
import os import chromadb from chromadb.config import Settings client = chromadb.HttpClient( host="chroma.internal.example", port=443, ssl=True, settings=Settings( chroma_client_auth_provider="chromadb.auth.token_authn.TokenAuthClientProvider", chroma_client_auth_credentials=os.environ["CHROMA_TOKEN"], chroma_auth_token_transport_header="Authorization", ), )租户与数据库(Tenant / Database)
当前所有客户端构造函数都接受或解析 tenant 与 database。默认值通常是default_tenant与default_database,但生产代码在共享或云端环境中不应默认如此——应显式指定或通过配置注入。
Collection 配置(HNSW 参数)
创建 Collection 时可以调优 HNSW 索引参数:
| 参数 | 可选值 / 说明 |
|---|---|
space | l2、cosine或ip |
ef_construction | 建图阶段控制近邻候选数量,越大质量越高、构建越慢 |
ef_search | 检索阶段候选规模,越大召回越高、延迟越高 |
max_neighbors | 每个节点的最大邻居数 |
对于文本 embedding,cosine往往是正确的第一选择。
常见陷阱清单
以下是文档总结的实战易错点,值得逐条对照排查:
collection.add()会忽略已存在 ID 的行;打算覆盖写入时请用update()或upsert();update()在传入documents而没有对应embeddings时,会重新计算 embedding;- 手工 embedding 与查询 embedding 必须匹配 Collection 的向量维度;
- Collection 名称限制见前述「核心 Collection 工作流」小节;
where_document的全文与正则匹配是大小写敏感的;- 查询结果按输入查询嵌套,Agent 常把
result["documents"]当成扁平列表、导致 zip 层级错位; - 积极使用
include:每次查询都返回 embeddings、documents、metadatas、distances 会浪费带宽与 token; PersistentClient、HttpClient、AsyncHttpClient都接受位置参数,但签名密集易错位,建议一律使用关键字参数。
1.5.5 版本敏感说明
- PyPI 将
chromadb 1.5.5列为最新发布版(2026-03-10),要求 Python>=3.9; - 数组型 metadata 已纳入当前文档模型:可以存储同质数组,并用
$contains与$not_contains过滤; - v1.0.0 迁移说明指出 Chroma不再提供内置认证实现,应优先采用 cookbook 中的代理或 token 模式,而不是 pre-1.0 的认证示例;
- 当前文档仍将 OSS 与自托管检索聚焦在
collection.query()与collection.get()上,不要假设 Cloud 专属搜索示例可以替代现有 Python 代码库中的这两个方法。
如何在 Context Hub 中获取本文对应的原始文档
本文所述内容来自 Context Hub 仓库中维护的 ChromaDB Python 包文档。Context Hub 是一套面向 AI Agent 的「精选 + 版本化」文档集,配套的chubCLI 让 Agent 无需依赖训练数据中的过时记忆即可获取最新 API 文档:
chub search "chromadb" --json # 检索匹配的文档 id chub get chromadb/package --lang py # 获取 Python 侧文档其检索与解析逻辑可见于 registry.js(resolveDocPath根据语言/版本解析出DOC.md路径)与 get-api-docs Skill;CLI 的安装与使用方式见 cli/README.md。如果你同时需要 ChromaDB 的 JS/TS 侧用法,仓库中还维护了 JavaScript SDK 指南,两篇文档的客户端选型、Collection 操作与过滤算子可对照阅读。
小结:本文从客户端选型、精确安装、Collection 创建与写入,到 Query/Get 检索、Embedding 配置、认证与 HNSW 调参,再到版本敏感注意事项,完整覆盖了chromadb==1.5.5的 Python 使用路径。记住黄金法则——按数据库所在位置选择客户端,显式声明 tenant/database 与 embedding 策略,查询/写入用query、get、upsert三件套并善用include控制载荷——即可稳定支撑本地、服务器与云端的向量检索与 RAG 应用。
【免费下载链接】context-hub
相关推荐
Gel(EdgeDB)Python AI 客户端 `gel.ai` 完整指南:RAG、向量检索与流式输出
Gel(EdgeDB)Python AI 客户端 gel.ai 完整指南:RAG、向量检索与流式输出 gel.ai 是 Gel(EdgeDB)AI 扩展在 Py
数据库图数据库关系型数据库ChromaDB Python SDK v1.2.1 实战指南:安装、向量检索、过滤与 RAG 完整上手
ChromaDB Python SDK v1.2.1 实战指南:安装、向量检索、过滤与 RAG 完整上手 导读 本指南以 ChromaDB Python SDK
PocketFlow 向量数据库实战指南:7 大主流向量检索方案选型对比与 Python 接入代码
PocketFlow 向量数据库实战指南:7 大主流向量检索方案选型对比与 Python 接入代码 导读 在 LLM 应用中,向量检索是 RAG(检索增强生成)
人工智能大模型AI Agent工作流自动化RAG
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考