距离、精确检索与 ANN 索引

本节目标

你将区分 similarity 与 distance、exact kNN 与 ANN;理解 HNSW、IVF 和量化的基本机制;会以 exact top-k 为近似误差基线,并把真实 filter、写入和硬件纳入实验。

先统一“越大越相似”还是“越小越近”

常见 metric:

Cosine similarity

越大越相似,零向量无定义。

Dot product

越大越相似;未归一化时模长会影响分数。

Euclidean distance

越小越近。API 有时返回 distance,有时返回负距离或 similarity score;应用必须读当前官方文档,不能只看字段名 score。

在单位向量上,cosine、dot 和 Euclidean distance 的排序等价;非单位向量不一定。Metric 与 normalization 必须和 [[Knowledge/AI Agent Engineer/docs-CN/Embedding/00-目录|Embedding]]空间契约一致。

Exact kNN

给定授权候选集合 ,逐一计算 query 与每个 vector 的分数,再取 top-k。它的优势:

  • 在给定 metric、filter 和 tie-breaking 下确定;
  • 没有 ANN 近似遗漏;
  • 容易作为小规模单元/离线质量基线;
  • 能验证量化、过滤和索引参数造成的差异。

它仍不保证业务相关:exact 最近的 vector 可能不是人工 gold。Exact 只消除了“索引近似”这一层误差。

当 、维度或 QPS 增大,逐项计算的 CPU/内存带宽代价可能超过 SLO,于是使用 ANN。

两种 Recall 不要混淆

ANN Recall@k

先冻结同一数据快照、空间、可信身份派生的 filter、query 与 tie-breaking。令 为过滤后可搜索集合,:

它问“近似索引找回多少 exact 邻居”。 时记录 empty_eligible/不适用,不要把安全空结果记成 0;ANN 本可返回 条却少返回时,缺口仍应算作低 recall 或独立服务失败。

Business Recall@k

令 是同一测试主体、时间和策略 revision 下本应可访问的 gold 相关项:

它问“找回多少人工/行为相关证据”。若 为空,应转入无答案/越权不得返回的安全断言,不能用 0 recall 惩罚正确过滤。

ANN Recall 1.0 但业务 Recall 很低,说明表示或 gold 不匹配;业务 Recall 足够而 ANN Recall 略低,可能是遗漏的 exact 邻居本来就不相关。两者都报告。

HNSW 直觉

Hierarchical Navigable Small World(HNSW)构建多层近邻图:

  1. 高层节点较稀疏,用于大步导航;
  2. 查询从入口点开始向更近邻居移动;
  3. 逐层下降到密集底层;
  4. 在候选搜索范围内返回近邻。

常见实现暴露类似:

  • 图连接度(常见名 M):更高通常增加内存/构建与连通机会;
  • 构建候选范围(常见 ef_construction);
  • 查询候选范围(常见 ef_search):更大通常提高 recall,也增加延迟。

“通常”不是单调保证;数据分布、过滤、删除、并发和实现会影响。参数名、合法范围、默认和是否可在线修改必须查锁定产品版本。

HNSW 常见优势是查询性能和无需先训练 coarse centroids;代价包括图内存、构建时间、动态更新/删除维护和冷启动。

IVF 直觉

Inverted File Index(IVF)先训练 coarse quantizer,把向量分配到多个 cell/list:

  1. 训练 centroids;
  2. 每个 document vector 进入最近列表;
  3. Query 先找相近 centroids;
  4. 只扫描若干列表的候选。

常见参数:

  • 列表数(Faiss 常见 nlist);
  • 查询探测列表数(nprobe)。

探测更多列表通常提高 ANN recall,同时增加工作。训练样本若不代表生产分布,cell 不平衡或召回可能变差;新增数据分布漂移也需监控。

pgvector 当前提供 HNSW 与 IVFFlat,并说明二者在构建、查询和内存/训练上的不同;具体 operator class、参数和版本能力以仓库文档为准。

Product Quantization 与压缩

Product Quantization(PQ)把向量分成子空间,用 codebook 近似每段,从而减少内存和距离计算带宽。其他系统还可能支持 scalar、binary 或 float16/half precision。

压缩引入单独误差层:

business relevance
  <- embedding representation
  <- dimension reduction
  <- dtype / quantization
  <- ANN traversal
  <- filtering / top-k

先保存 full-precision exact baseline,再逐层加入降维、量化和 ANN,才能定位退化。不要同时换模型、PQ、索引和 filter 参数后只报一个总分。

Filter 会改变 ANN 工作负载

如果先得到全局 ANN top-k 再 post-filter,授权结果可能不足;如果 filter 集成在 traversal 中,选择率和图连通会影响搜索;如果先构造过滤候选,极小集合可能直接 exact 更合适。

pgvector 当前文档说明 approximate index 查询中 filter 的执行与 PostgreSQL planner/scan 相关,并提供 iterative scan 能力;Qdrant 等专用系统有自己的 filter-aware 机制。产品策略不同,必须用同一 filter 在 exact 与 ANN 两侧建立可比较候选集合。

索引生命周期

索引不只有查询:

  • 建索引时 CPU、内存、磁盘和写入影响;
  • 新写入何时可搜索;
  • 批量导入先写后建还是边写边建;
  • 删除是否留下 tombstone,何时回收;
  • 更新是否造成图/列表碎片;
  • 崩溃恢复是否重建;
  • 扩容/迁移是否传输索引或在目标重建;
  • 参数修改是否在线生效。

Benchmark 只测 steady-state read QPS 会漏掉大部分生产代价。

可复现 ANN 实验

数据

  • 真实 document vectors 和 query vectors;
  • 固定 space contract 与 snapshot/hash;
  • query/gold 子组;
  • 高频与低选择率 filters;
  • 真实更新/删除比例。

随机高斯向量可做功能/压力 sanity check,不能替代生产几何。

Exact ground truth

对每个 query、每个 filter 先跑 exact top-k,保存 IDs、metric、tie 规则。若 corpus 太大,可用代表性子集或离线分片合并,但方法必须记录。

固定环境

  • 产品/库与配置版本;
  • CPU/GPU、RAM、磁盘、文件系统;
  • 单/多线程、并发和连接池;
  • 冷启动/预热方式;
  • index build 参数和 query 参数;
  • 数据量、维度、filter 分布;
  • 重复轮次和时间窗口。

报告

质量查询构建/写入资源
ANN Recall@k、业务 Recall/MRR/nDCGP50/P95/P99、QPS、timeoutbuild time、upsert/delete latency、searchable lagRAM、disk、CPU/GPU、网络
子组和过滤选择率cold/warm、并发曲线写入期间读退化、rebuild峰值而非只报均值

Latency 图应说明是否包含网络、序列化、filter 和 rerank;否则不同报告不能比较。

常见错误与排查

  • QPS 高但找错:先看 ANN/business recall 与 gold。
  • Exact 与 ANN filter 不同:ground truth 不可比。
  • 只记录 query 参数:索引构建参数和数据 snapshot 也决定结果。
  • 随机向量得出产品结论:换真实语料/查询/过滤分布。
  • 索引建完后写入变慢:加入 mixed read/write workload。
  • 删除后内存不降:查 tombstone/compaction/重建语义。
  • 照抄另一产品 ef/nprobe:回到当前实现文档。
  • 新模型继续用旧阈值:分数刻度与空间已变。

练习

  1. 用 100 个小向量手写 exact cosine top-5,并把它作为 ANN fixture。
  2. 设计 HNSW 三档 query candidate 范围实验,固定其余参数,画 Recall@10—P95 曲线。
  3. 为 IVF 写出训练集选择、list 数、probe 数和分布漂移检查。
  4. 构造 1%、10%、80% 三种 filter 选择率,分别比较 exact/ANN 返回数量与延迟。
  5. 设计 full float → reduced dimension → quantized → ANN 的分层实验。
  6. 解释“ANN Recall 下降但业务 nDCG 不变”可能意味着什么。

掌握检查

  • 我明确 score/distance 的方向和 metric 契约。
  • Exact top-k 只消除索引近似,不等于业务真值。
  • 我区分 ANN Recall 与 business Recall。
  • 我能解释 HNSW 图搜索、IVF coarse lists 与 PQ 压缩。
  • 参数名和默认值只引用锁定产品版本。
  • Filter、写入、删除、构建和恢复进入 benchmark。
  • 模型、维度、量化和 ANN 分层测试,结果可归因。

小结与下一步

ANN 解决“更快找近邻”,但只有在 tenant/ACL/business filter 正确时结果才可用。下一步:[[Knowledge/AI Agent Engineer/docs-CN/向量数据库/03-过滤与多租户|过滤与多租户]]。

参考资料

来源获取日期:2026-07-14。返回 [[Knowledge/AI Agent Engineer/docs-CN/向量数据库/00-目录|向量数据库目录]]。