Chroma 教程

HttpClient 客户端

🎉摘要:详细介绍Chroma HttpClient的参数配置,包括host、port、ssl、headers、tenant、database等,并讲解设置覆盖与ValueError异常、自定义请求头传递token、heartbeat心跳检测以及网络问题处理。

在前面“四种客户端”介绍了 HttpClient 的基本用法,我们本地使用 Docker 安装了一个 Chroma 服务。下面将对 HttpClient 的参数进行详细介绍。

下面代码片段创建了一个用于连接 Chroma 服务端的客户端:

client = chromadb.HttpClient(
    host="localhost",
    port=8000,
    ssl=False,
    headers=None,
    settings=None,
    tenant="default_tenant",
    database="default_database",
)

参数说明:

  • host:Chroma 服务端主机名,默认是 localhost

  • port:Chroma 服务的 HTTP 端口,默认是 8000

  • ssl:连接是否启用 SSL 加密

  • headers:可选,每次请求附带的 HTTP 请求头

  • settings:可选配置,用于覆盖默认设置

  • tenant:请求所使用的租户名称

  • database:请求所使用的数据库名称

返回:

  • ClientAPI:配置完成的客户端实例

异常:

  • ValueError:当 settings 里面配置了和入参不一致的 host / port 时抛出

下面是 HttpClient 类的实现代码:

def HttpClient(
    host: str = "localhost",
    port: int = 8000,
    ssl: bool = False,
    headers: Optional[Dict[str, str]] = None,
    settings: Optional[Settings] = None,
    tenant: str = DEFAULT_TENANT,
    database: str = DEFAULT_DATABASE,
) -> ClientAPI:
    # 如果外部没有传入settings配置对象,则实例化一份默认Settings
    if settings is None:
        settings = Settings()

    # 强制类型转换,防止用户传入非标准类型参数
    host = str(host)
    port = int(port)
    ssl = bool(ssl)
    tenant = str(tenant)
    database = str(database)

    # 指定底层API实现为FastAPI版本(http服务配套实现)
    settings.chroma_api_impl = "chromadb.api.fastapi.FastAPI"

    # 校验:settings内部如果已经存在host,并且和函数入参host不一致,抛出冲突异常
    if settings.chroma_server_host and settings.chroma_server_host != host:
        raise ValueError(
            f"Chroma server host provided in settings[{settings.chroma_server_host}] is different to the one provided in HttpClient: [{host}]"
        )
    # 将入参host写入settings配置
    settings.chroma_server_host = host

    # 校验:settings内部如果已经存在端口,并且和函数入参port不一致,抛出冲突异常
    if settings.chroma_server_http_port and settings.chroma_server_http_port != port:
        raise ValueError(
            f"Chroma server http port provided in settings[{settings.chroma_server_http_port}] is different to the one provided in HttpClient: [{port}]"
        )
    # 将入参port写入settings配置
    settings.chroma_server_http_port = port

    # 将ssl开关、自定义请求头写入settings
    settings.chroma_server_ssl_enabled = ssl
    settings.chroma_server_headers = headers

    # 返回客户端创建器实例,后续由它生成真正的客户端
    return ClientCreator(tenant=tenant, database=database, settings=settings)

看见没有,即使你传递了自定义的 settings,chroma_server_host、chroma_server_http_port、chroma_server_ssl_enabled 和chroma_server_headers 四个参数也会被 HttpClient 函数指定的参数覆盖,但是在覆盖之前,如果你在自定义 settings 中指定了 chroma_server_host 或 chroma_server_http_port,必须和参数 host、port 保持一致,否则抛出 ValueError 错误。

加自定义请求头

如果你要传递自定义请求头,可以通过headers 参数,鉴权在反向代理层做的话(后续章节给方案),token 就是通过 headers 传,如下:

import chromadb
import os

headers = {}

# 获取 token 环境变量
token = os.getenv("CHROMA_TOKEN")
if token:
    headers["Authorization"] = f"Bearer {token}"

client = chromadb.HttpClient(
    host="localhost",
    port=8000,
    ssl=False,
    headers=headers,
)
print(client)

注意,不要使用 os.environ['CHROMA_TOKEN'],如果没有配置 CHROMA_TOKEN 环境变量会直接抛出错误  KeyError: 'CHROMA_TOKEN' 。

心跳和版本

import chromadb

client = chromadb.EphemeralClient()

# 当前时间的纳秒时间戳,用来探活,1793688846556641816
print(client.heartbeat())
# 1.5.9
print(client.get_version())

写健康检查的时候用 heartbeat() 就行,例如:

import chromadb

def healthy(client: chromadb.HttpClient) -> bool:
    """
    检测 chroma 服务是否健康可用
    :param client: Chroma HTTP客户端实例
    :return: True 服务正常;False 连接失败/异常
    """
    try:
        # heartbeat 返回服务时间戳,正常情况下大于0
        return client.heartbeat() > 0
    except Exception:
        # 网络、连接、服务未启动等所有异常统一返回不健康
        return False

if __name__ == "__main__":
    client = chromadb.HttpClient(
        host="localhost",
        port=8000
    )

    is_ok = healthy(client)
    if is_ok:
        print("✅ Chroma 服务健康")
    else:
        print("❌ Chroma 服务不可访问")

网络问题

HttpClient 模式下最常见的错误是连接超时和 payload 过大:

  • 服务端默认最大 payload 40 MiB(环境变量 CHROMA_MAX_PAYLOAD_SIZE_BYTES)

  • 一批写太多会超,报 413 之类

  • 把批次降到几百条通常就好了

官方 SDK 参考手册:https://docs.trychroma.com/reference/python/client

  

说说我的看法
全部评论()
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号