命名规则(很容易踩)

🎉摘要:ChromaDB对集合名称有严格限制,要求长度3~512字符,只允许[a-zA-Z0-9._-],且首尾必须是字母或数字,不能包含两个连续的点或空格。本文详解规则,并提供通过metadata存储中文显示名称的解决方案及代码示例。

集合名不是随便起的,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': '我的集合'}


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