向量索引是怎么把检索变快的
示例文章,用于演示分页与列表排版,请替换成你自己的内容。
向量检索的暴力做法是:把查询向量与库里每一条都算一次相似度。一千万条、每条 768 维,一次查询就是几十亿次浮点运算,扛不住。
索引的作用就是少算一些,代价是可能漏掉真正最近的那几条。
两类思路
聚簇:先把向量空间划分成若干区域,查询时只搜最接近的几个区域。倒排文件(IVF)属于这一类。省算力的关键是 nprobe——搜几个簇。调大更准也更慢。
图:每个向量连上若干近邻,查询时从入口点在图上贪心走近,直到走不动。HNSW 属于这一类。它的召回率普遍更好,代价是内存占用高,而且建索引慢。
召回率与延迟的取舍
近似索引不保证返回真正的前 K 个,只保证「大概率」。衡量它的指标是召回率:
实践中要做的是:在目标延迟下把召回率调到可接受。通常先定延迟上限,再往上调索引参数直到召回率达标,而不是反过来。
别忽略过滤
真实场景几乎都带过滤条件(租户、时间范围、权限)。「先按条件筛出候选再算相似度」和「先检索再过滤」结果差别很大——后者在高选择性过滤下会返回不足 K 条,因为符合条件的向量早被近似检索漏掉了。
带过滤的索引(比如把过滤条件编码进图结构)是这一块的主要工程难点。