这道题问的是向量相似度检索,其实本质上就是问你怎么在高维空间里平衡精度和效率。精确最近邻复杂度是O(n),数据量一大根本跑不动,所以工业界几乎清一色用[[近似最近邻]],也就是ANN。下面我按四种主流范式展开,最后再结合业务场景给选型建议。
先说基于树结构的,核心思想是空间划分,代表有KD-Tree、Annoy。你可以把它想象成拿一把刀递归切空间,查询时走剪枝遍历。但这里有个硬伤:高维下维度灾难非常严重,超过20维效果就断崖式下跌。所以现在纯树结构基本不单独用了,顶多用在低维或者混合索引里打辅助。
再一个是基于哈希的方法,典型是LSH。思路是把相似向量高概率映射到同一个桶里,桶内再做精确比对。好处是内存友好,但召回率有限,适合对精度要求不高的场景,比如粗排阶段快速过滤。不过说实话,现在纯粹用LSH的也不多了。
第三种是量化,这是工业级的核心压缩手段。拿[[乘积量化]]举例子,把向量切分成m段,每段单独做聚类,用聚类中心的ID来编码。128维的float向量能压缩到十几个字节,内存节省非常夸张。而且它支持非对称距离计算,查询时不用解压完整向量,速度很快。[[Faiss]]里的[[IVF-PQ]]就是标配,十亿级检索基本都靠它。
最后是近邻图,这是当前单模态检索的SOTA。[[HNSW]]是代表,它构建多层图结构,上层稀疏快速定位,下层稠密精确搜索。复杂度是O(log n)的查询,精度和速度的权衡做得特别好。所以百万级以内、内存够用的话,我首选HNSW。
那落到真实业务场景,比如[[RAG]]系统里,用户问一个客服退款问题,我们得从百万级知识库里召回相关片段。这时候不会只用一种算法。典型做法是:先用[[IVF]]做粗筛,快速排除大部分不相关的向量,然后用PQ压缩节省内存,最后用HNSW精排。说白了,工业落地的核心不是选一个算法,而是混合方案。
这里有个前提:高维[[Embedding]]下,比如768维,纯HNSW的构建和查询延迟会明显上升,必须配合量化。如果数据量到了十亿级,单机内存放不下,就得走磁盘方案,比如DiskANN,或者用Faiss GPU索引加速。常见失败场景是只追求召回率,忽略了延迟和内存。上线前我特别关注两件事:一是用固定query回放,对比Recall@K和延迟,确保不崩;二是做冷热分层,热数据放内存,冷数据放磁盘。
另外,现在有个趋势是把图索引和量化结合得更紧,比如Milvus的做法,直接在HNSW的边上做PQ压缩,这样能进一步压缩内存。不过代价是构建时间变长,而且对数据分布敏感。
所以整体上,我更倾向把向量检索看成一套系统工程,而不是挑一个算法。没有银弹,关键是根据数据规模和精度要求做取舍。