前面已经了解了 hnsw 参数是对集合进行配置,下面介绍 HNSW 支持那些参数,那些参数是不能被修改的,哪些能被修改。
注意,下面完整列表是从 chromadb.api.collection_configuration 的源码里翻出来的,如下图:

每个参数的意思如下:
| 参数 | 默认值 | 可调 | 说明 |
| space | "l2" | 仅建库时 | 距离度量:l2 / cosine / ip |
| ef_construction | 100 | 仅建库时 | 建索引时的候选集大小 |
| max_neighbors | 16 | 仅建库时 | 每个节点最多连多少边(常说的 M) |
| ef_search | 100 | 可随时改 | 查询时的候选集大小,最重要的调优旋钮 |
| num_threads | CPU 核数 | 可随时改 | 建索引的并发线程数 |
| batch_size | 100 | 可随时改 | 索引同步时的批处理大小 |
| sync_threshold | 1000 | 可随时改 | WAL 攒到多少条刷一次索引 |
| resize_factor | 1.2 | 可随时改 | 索引扩容时的一次性放大倍数 |
注意哦,【可调】列是重点:space、ef_construction、max_neighbors 这三个决定索引结构的参数,建完之后改不了。改了对已有的索引不生效,想改只能重建集合。
其余的随时能改,例如:
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(f"修改前:{col.configuration["hnsw"]["ef_search"]}") # 修改前:100
# 修改 ef_search 参数
col.modify(configuration={
"hnsw": {
"ef_search": 200
}
})
print(f"修改后:{col.configuration["hnsw"]["ef_search"]}") # 修改后:200