集合名不是随便起的,1.x 里服务端会做严格校验:
长度 3 ~ 512 个字符
只能用 a-zA-Z0-9._-
首尾必须是字母或数字
不能有两个连续的点
不能是合法的 IP 地址
同一个数据库里不能重名
我第一次写 create_collection("t1") 就翻车了:
client.create_collection("t1")直接报错,详细错误如下:
chromadb.errors.InvalidArgumentError: Validation error: name: Expected a name
containing 3-512 characters from [a-zA-Z0-9._-], starting and ending with a
character in [a-zA-Z0-9]. Got: t1合法的:notes、my_collection、kb-2024、docs.v2、a1
非法的:t1(太短)、_tmp(下划线开头)、my collection(有空格)、中文名(非 ASCII)、a..b(双点)
下面通过实例来演示:
import chromadb
# 内存模式
client = chromadb.EphemeralClient()
def validate_name(collection_name:str) -> None:
"""校验给定的集合名称是否可以使用"""
try:
# 尝创建或获取集合
client.get_or_create_collection(collection_name)
print(f"合法 {collection_name}")
except Exception as e:
print("名字不符合 Chroma 的命名规则:", type(e).__name__, e)
# t1(太短)
validate_name("t1")
# _tmp(下划线开头)
validate_name("_tmp")
# my collection(有空格)
validate_name("my collection")
# 中文名(非 ASCII)
validate_name("中文名")
# a..b(双点)
validate_name("a..b")运行示例,输出日志如下:
名字不符合 Chroma 的命名规则: InvalidArgumentError Validation error: name: Expected a name containing 3-512 characters from [a-zA-Z0-9._-], starting and ending with a character in [a-zA-Z0-9]. Got: t1
名字不符合 Chroma 的命名规则: InvalidArgumentError Validation error: name: Expected a name containing 3-512 characters from [a-zA-Z0-9._-], starting and ending with a character in [a-zA-Z0-9]. Got: _tmp
名字不符合 Chroma 的命名规则: InvalidArgumentError Validation error: name: Expected a name containing 3-512 characters from [a-zA-Z0-9._-], starting and ending with a character in [a-zA-Z0-9]. Got: my collection
名字不符合 Chroma 的命名规则: InvalidArgumentError Validation error: name: Expected a name containing 3-512 characters from [a-zA-Z0-9._-], starting and ending with a character in [a-zA-Z0-9]. Got: 中文名
名字不符合 Chroma 的命名规则: InvalidArgumentError Validation error: name: Expected a name that does not contains two consecutive periods (..). Got a..b踩坑:中文集合名在 1.x 下不行。想做中文展示,把中文放到 metadata 里,名字用英文/拼音/UUID。例如:
import chromadb
# 内存模式
client = chromadb.EphemeralClient()
col = client.get_or_create_collection("my_collection", metadata={
"display_name": "我的集合",
"desc": "一个用于测试的集合"
})
# 获取全部集合
collections = client.list_collections()
for col_info in collections:
# col_info 包含 name、metadata
item = {
"collection_name": col_info.name,
"collection_metadata": col_info.metadata,
"display_name": col_info.metadata.get("display_name", "") if col_info.metadata else ""
}
print(item)
# 输出:
# {'collection_name': 'my_collection', 'collection_metadata': {'desc': '一个用于测试的集合',
# 'display_name': '我的集合'}, 'display_name': '我的集合'}