返回技术文章

向量索引是怎么把检索变快的

  • 检索
  • 向量
  • RAG

示例文章,用于演示分页与列表排版,请替换成你自己的内容。

向量检索的暴力做法是:把查询向量与库里每一条都算一次相似度。一千万条、每条 768 维,一次查询就是几十亿次浮点运算,扛不住。

索引的作用就是少算一些,代价是可能漏掉真正最近的那几条。

两类思路

聚簇:先把向量空间划分成若干区域,查询时只搜最接近的几个区域。倒排文件(IVF)属于这一类。省算力的关键是 nprobe——搜几个簇。调大更准也更慢。

:每个向量连上若干近邻,查询时从入口点在图上贪心走近,直到走不动。HNSW 属于这一类。它的召回率普遍更好,代价是内存占用高,而且建索引慢。

召回率与延迟的取舍

近似索引不保证返回真正的前 K 个,只保证「大概率」。衡量它的指标是召回率:

Recall@k=返回的 k 个真正的 k 个k\mathrm{Recall@}k = \frac{\lvert \text{返回的 } k \text{ 个} \cap \text{真正的 } k \text{ 个} \rvert}{k}

实践中要做的是:在目标延迟下把召回率调到可接受。通常先定延迟上限,再往上调索引参数直到召回率达标,而不是反过来。

别忽略过滤

真实场景几乎都带过滤条件(租户、时间范围、权限)。「先按条件筛出候选再算相似度」和「先检索再过滤」结果差别很大——后者在高选择性过滤下会返回不足 K 条,因为符合条件的向量早被近似检索漏掉了。

带过滤的索引(比如把过滤条件编码进图结构)是这一块的主要工程难点。