Chroma 里的 max_neighbors 就是标准 HNSW 论文里的 M,ef_construction = efConstruction。两个参数都是创建集合时一次性确定、后续不可修改,想改只能克隆重建集合。选择合适的值,可影响索引质量、构建速度和内存占用。
图中每个节点最多保留多少条邻居连接(每层最大边数)
默认值:16(Chroma 1.5.9 HNSW)
作用:控制 HNSW 图的稠密程度
插入新向量时,算法最终会为这个节点挑选最多 max_neighbors 个最近邻建立双向边;
值越大:图越密、搜索时可选路径更多、召回上限更高;代价是索引体积、内存占用上升、插入变慢;
值越小:图稀疏、省内存、插入快;但召回容易上不去,高召回场景容易掉点。
约束:正整数,经验区间一般 8 ~ 64,很少超过 64。
适用直觉:高维 embedding(1024/1536)、追求高召回 → 32;小规模、低维、内存紧张 → 8/16。
注意:它定义最终保留几条边,不负责寻找候选邻居,找候选是 ef_construction 的工作。
插入向量、构建索引时,用来筛选邻居的候选池大小。
默认值:100
作用:新增一个向量时,HNSW 先在图里搜索,收集 ef_construction 个候选近邻,再从这批候选里择优选出最多 max_neighbors 个作为正式邻居。
值越大:建图时搜索越充分,选出的邻居质量更好,索引底子更好;代价:插入 / 批量导入速度明显变慢、CPU 消耗更高;
值越小:建图搜索很浅,插入飞快,但选出的邻居质量差,最终索引召回上限低。
经验规则:ef_construction 建议 ≥ max_neighbors 的 2~3 倍;如果 ef_construction 比 max_neighbors 还小,候选池不够选,参数失去意义。
区间参考:50 ~ 400;超过 400 收益边际递减,插入速度暴跌。

f_construction = 建图时海选池多大;max_neighbors = 海选之后最终留几个朋友。
ef_construction 决定你挑邻居时看得够不够远;
max_neighbors 决定每个节点最多能有多少朋友;
召回上限由这两个一起决定,ef_search 只是查询阶段在现有图里多搜少搜,不能突破索引本身的质量上限。
如果 ef_construction = 100,max_neighbors = 32,ef_search 设置为多少合适?
推荐 ef_search 取值范围 128 ~ 200。如果保守均衡则设置为 128;追求更高召回则设置为 200;追求查询速度优先则设置为 64~96。
ef_search 是检索时的候选池,上限受索引本身质量约束(由 ef_construction + max_neighbors 决定)。你建图时海选池只有 100,意味着这张 HNSW 图本身的信息上限就在这里,ef_search 拉得特别大(比如 512、1000)收益极低,只会白白拖慢检索。