Milvus nlist
1. nlist 是什么?
# 定义索引参数配置
index_params = {
"metric_type": "L2", # 距离度量方式:L2、IP、COSINE
"index_type": "IVF_FLAT", # 索引类型
"params": {"nlist": 128}, # nlist 越大召回率越高,速度越慢
}
collection.create_index("embedding", index_params)
nlist 是 Milvus 中 IVF 系列索引(如 IVF_FLAT、IVF_PQ、IVF_SQ8)的一个重要参数,表示将所有向量分成多少个"桶"(簇、cell、list)。
生活类比: nlist 就像把图书馆的书分成多少个书架。书架越多,每个书架的书越少,查找更精细,但整理和查找所有书架会更慢。
2. nlist 的原理与影响
- nlist 决定了向量空间被分成多少个"簇",每个簇存一部分向量。
- 所有的向量都会被分配到某个簇,每个向量只属于一个簇。
- 建索引时,Milvus会用聚类算法(如k-means)把所有向量划分到这些簇中。
- 检索时,先找到最相关的几个簇,再在这些簇里做精细查找。
- nlist 越大,簇越多,召回率(查全率)越高,但速度越慢。
- nlist 越小,簇越少,速度快但可能漏掉部分结果。
补充说明:每个向量只属于一个簇,不会有遗漏,也不会重复归属。
nprobe 是什么?
nprobe 是 IVF 索引检索时的另一个重要参数,表示每次检索时要遍历多少个簇。nprobe 决定了"查得有多广"。
生活类比: nprobe 就像你在图书馆找书时,决定要查几个书架。查得多,找到目标的概率高,但花的时间也多。
- nprobe 越大,检索时遍历的簇越多,召回率越高,但速度越慢。
- nprobe 越小,只查少数几个簇,速度快但可能漏掉部分结果。
- nprobe 的最佳取值需结合 nlist、数据量和业务需求调整。
nlist
nprobe
4. 适用场景
- 大规模向量数据检索
- 对召回率要求高的推荐、搜索、去重等场景
- 需要在速度和查全率之间权衡的业务
5. 小结
- nlist 是 IVF 索引的核心参数,影响检索速度和召回率。
- nlist 不是越大越好,需结合数据量和业务需求合理设置。
- 常用经验:nlist 一般设置为数据量的 1%~4%,如 10万数据可设为 1024。