Chroma 教程

配置长什么样

🎉摘要:本文详细介绍了Chroma中创建集合时通过configuration参数配置HNSW向量索引的方法,包括space、ef_construction、ef_search、max_neighbors等关键参数的含义与调优建议,并演示了如何读取配置以及hnsw与spann不能同时提供的注意事项。

在前面的很多示例中,我们创建集合使用的是 get_or_create_collection() 方法,并且仅传递 name(集合名)、embedding_function(嵌套函数),没有传递更多参数。

实际上,创建集合时,我们可以通过传递 configuration 参数来配置集合,例如:

col = client.create_collection(
    name="kb",
    embedding_function=None,
    configuration={
        "hnsw": {
            "space": "cosine",
            "ef_construction": 200,
            "ef_search": 100,
            "max_neighbors": 32,
        }
    },
)

上面代码将在 Chroma 中创建一个名为 "kb" 的集合(Collection),并且明确指定了底层的 HNSW 向量索引算法及一系列调优参数。

其中的 HNSW 中的参数含义如下:

  • "space": "cosine": 指定使用余弦相似度来衡量向量之间的距离。这在处理文本嵌入(Text Embeddings)时是最常用的度量方式,它关注的是向量的“方向”而不是“长度”。(其他选项还有 l2 欧氏距离、ip 内积等)。
  • "ef_construction": 200:建库参数。它决定了在构建索引图时,每个节点寻找新邻居的候选池大小。值越大,索引图的质量越高(搜索时不容易漏掉数据),但建库(插入数据)的速度会变慢,消耗的内存也会增加。
  • "ef_search": 100:查询参数。它决定了在检索时,算法从入口点向下游走的候选池大小。值越大,检索的召回率(查到相关结果的概率)越高,但查询的延迟(耗时)也会增加。
  • "max_neighbors": 32:图连接数(对应 HNSW 理论中的 M 参数)。它决定了每个节点在索引图中最多可以保留多少个相邻节点。值越大,图的连通性越好,高维数据的检索效果更好,但内存占用会显著上升。通常推荐值在 16 到 64 之间。32 是一个比较平衡的推荐值。

当集合创建完成后,可以使用如下代码进行读取配置:

import chromadb

client = chromadb.EphemeralClient()
col = client.create_collection(
    name="kb_demo",
    embedding_function=None,
    configuration={
        "hnsw": {
            "space": "cosine",
            "ef_construction": 200,
            "ef_search": 100,
            "max_neighbors": 32,
        }
    },
)
print(col.configuration)

我本机的实际输出:

{'hnsw': {'space': 'cosine', 'ef_construction': 200, 'ef_search': 100, 
  'max_neighbors': 32, 'resize_factor': 1.2, 'sync_threshold': 1000}, 
  'spann': None, 'embedding_function': None}

顶层有三个 key:

key含义
hnswHNSW 索引(单机版默认,全内存)
spannSPANN 索引(磁盘友好,主要给 Cloud 用)
embedding_function嵌入函数配置

hnsw 和 spann 只能选一个,同时传会报,例如:

import chromadb

client = chromadb.EphemeralClient()
col = client.create_collection(
    name="kb_demo",
    embedding_function=None,
    configuration={
        "spann": {
            "space": "cosine",
            "search_nprobe": 64
        },
        "hnsw": {
            "space": "cosine",
            "ef_construction": 200,
            "ef_search": 100,
            "max_neighbors": 32,
        }
    },
)

运行将抛出如下错误信息:

ValueError: hnsw and spann cannot both be provided

  

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