
先把结论甩前面:数据量在百万级以内、内存不抠门、追召回精度,选 HNSW;数据量上千万、内存吃紧、能接受先训练再用,选 IVF(或 IVFPQ)。我自己踩过坑,下面是实测对比表加一点真实账。两种索引,各维度怎么打分我手头一个客服知识库,大概 80 万条切片,向量维度 768(BAAI 那个 bge 模型出来的)。同一份数据,我用 FAISS 把 HNSW 和 IVF 各建了一遍,topk10,拿 1000 条问句跑了召回。维度HNSWIVF(IVF1024,Flat)召回精度(recall10)0.97~0.99,基本不用调0.88~0.94,看 nprobe 给多少查询延迟单条 2~4ms,稳nprobe8 时 1ms 出头,但精度掉内存占用大,80万条约 6.8GB(图结构那些边很吃内存)小很多,2GB 出头;上 PQ 还能压到几百MB构建速度慢,80万条建了 11 分钟快,训练add 不到 3 分钟增量插入友好,直接 add要先 train,新数据分布漂了得重训调参心智几乎没有(efConstruction/efSearch 默认能用)nlist/nprobe 得自己摸,摸不好精度很难看几个我自己最有体感的点:HNSW 内存是真能吓你一跳。我第一次没估算,本地 16G 内存的 mac 直接 swap 到卡死,风扇起飞。后来才反应过来,图索引每个点要存一堆邻居边,内存大头在边不在向量本身。IVF 的 nprobe 是个精度旋钮。nprobe 调大召回上去了但延迟也上去,调小就快但漏召回。我一开始用默认 nprobe1,recall 才 0.7 多,吓我一跳以为模型不行,后来调到 16 才正常。这玩意儿不像 HNSW 那么省心。构建速度差距,数据一大就放大。80万还好,等我塞到 400 万,HNSW 那个构建时间直接奔着小时去了,IVF 还是分钟级。那到底怎么选给个我自己用的简单判断:数据 100 万,内存够,要省心 →HNSW,默认参数基本能打,别折腾。数据 1000 万,或者部署在内存小的机器上 →IVF PQ,用一点精度换内存和速度。数据天天在变、要频繁增量 → 偏 HNSW;IVF 重训练是个负担。实在拿不准,中间量级(几百万)→ 两个都建一遍,拿你真实的问句集跑 recall,别信 benchmark,信你自己的数据。一点题外的踩坑说实话,我研究这俩索引,起因不是做学术,是想给我们运营妹子搭个能查产品手册的 AI 小助手——她天天被问这功能怎么开,烦得很。我寻思与其写代码,不如找个零代码就能拖一拖配一配搭智能体的工具,把这套 RAG 知识库挂上去,发布成一个能问答的小助手给她用。结果第一版搭出来,召回稀烂。我对它问会员怎么退款,它扯到会员等级体系,牛头不对马嘴。查了半天,问题就出在索引和切片上——切片太长 IVF 的 nprobe 给太小,该召回的段落根本没进 topk。把切片缩到 300 字、索引换成 HNSW 之后,那小助手才算能用,运营妹子第二天就不来烦我了。这趟下来最大的感受是:索引选型不是越高级越好,是看你那点数据量和那台机器扛不扛得住。我之前一上来就想用最炫的 IVFPQ,结果数据才几十万,纯属给自己找罪受,HNSW 默认参数早就够了。你们的向量库现在用的哪种索引?数据量多大?评论区聊聊,我挺好奇大家 recall 都跑到多少。(模型和 embedding 的 API 我走的 讯飞星辰MaaS,现成调,没自己折腾部署算力,搭那个小助手省下不少功夫)