ARTICLE / 2 MIN READ

向量检索 HNSW 与 IVFFlat 怎么选

以 pgvector 为例,解释近似检索的召回率、索引构建、过滤条件和线上调参。

向量检索的工程目标是让召回率、延迟、内存和更新成本达到平衡。不要只比较一次查询速度,还要观察过滤后的有效结果数和索引维护成本。

HNSW 与 IVFFlat

HNSW 通常有更好的查询召回和低延迟,但构建与内存成本较高;IVFFlat 建立更快、占用更省,查询效果更依赖 lists 和 probes 的选择。

HNSW:多层图 -> 找近邻 -> 扩展候选
IVFFlat:聚类中心 -> 选 lists -> 扫描 probes

数据量较小或更新频繁时,可以先精确搜索建立基线;数据稳定后再创建近似索引。索引创建应在独立窗口执行,避免阻塞线上写入。

过滤条件会改变召回

近似索引通常先找候选,再应用租户、权限或类别过滤。过滤比例很高时,候选不足会导致结果少于 LIMIT。需要提高 ef_search、probes,启用迭代扫描,或对高频类别建立分区/部分索引。

混合检索

专有名词、订单号和版本号适合全文检索,语义相似适合向量检索。可以使用两路召回后用 Reciprocal Rank Fusion 合并,再用重排模型挑选最终结果。

线上监控

记录查询向量模型版本、维度、索引类型、过滤条件、候选数、返回数、P95、内存和召回抽样。定期用精确搜索对比 Recall@K,避免索引升级后效果悄悄下降。

迁移步骤

  1. 记录原始文本和模型版本。
  2. 影子写入新向量列和新索引。
  3. 对固定查询集比较召回和延迟。
  4. 按租户灰度切换。
  5. 稳定后再删除旧列。

向量库不是黑盒推荐系统,索引参数、过滤条件和模型版本都应该进入可回滚的配置。

参考资料:pgvector 官方 README

GITHUB DISCUSSION

评论与回复

评论保存在 GitHub Discussions,登录 GitHub 后即可参与,发布和回复都在本页完成。

评论区进入视口后自动加载。