M7-032M7: Retrieval, Ranking & RecSysApproximate Nearest Neighbors (HNSW / IVF)Hard
Mastery:
Approximate Nearest Neighbors (HNSW / IVF): 解释过滤检索(filtered search)的挑战与做法。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: 带元数据过滤的向量检索:先过滤后检索(召回低)或先检索后过滤(结果不足);用支持过滤的索引或分区。
📌 Key Takeaways
- •朴素做法:先过滤再检索(过滤后候选太少)或先检索再过滤(过滤后结果不足)
- •问题:过滤率高时'先检索'会返回不足 k 个结果
- •对策:支持过滤的索引(HNSW+filter)、元数据分区、混合策略
📐 Mathematical Derivations
数学机理:<strong>过滤检索(filtered search / hybrid search)</strong> 的设定——查询既有<strong>向量相似度</strong>要求,又有<strong>元数据过滤</strong>条件(如'只看 2024 年的文档'、'价格 < 100')。<strong>两种朴素做法的问题</strong>——(1) <strong>先过滤后检索(pre-filter)</strong>——先用元数据筛选出符合条件的子集,再在子集内做 ANN;<strong>问题</strong>——(a) 过滤率高(如只剩 1%)时,子集太小 → ANN 索引'退化'(HNSW 的图在小子集上不连通/质量差);(b) 需为每个过滤组合建索引(不可行)。(2) <strong>先检索后过滤(post-filter)</strong>——先做 ANN 取 top-K(如 1000),再过滤;<strong>问题</strong>——(a) 若过滤率高(如只剩 1%),则 1000 个候选里只有 10 个符合条件 → <strong>结果不足 k</strong>(用户要 10 个但只给 5 个);(b) 需大幅增大 K(成本高)。(3) <strong>为什么难</strong>——因为'向量检索'与'元数据过滤'是<strong>两种不同的索引结构</strong>(ANN 图 vs 倒排/B 树);如何高效结合是核心问题。<strong>对策</strong>——(1) <strong>支持过滤的 ANN 索引</strong>——(a) <strong>HNSW + filter</strong>——在图的遍历中<strong>跳过不满足过滤条件的节点</strong>(但图的连通性受影响 → 需更大的 efSearch);(b) <strong>带过滤的 IVF</strong>——只在满足条件的簇/向量中搜索;(c) 一些系统(如 Milvus、Qdrant)实现了'过滤感知'的索引。(2) <strong>元数据分区(partitioning)</strong>——按元数据<strong>分区</strong>(如按年份分),每区一个索引;查询时只搜相关分区;<strong>优点</strong>——高效(只搜小索引);<strong>缺点</strong>——分区数多则索引多(内存/维护成本);适合'过滤维度基数低'(如年份、类别)。(3) <strong>混合策略(自适应)</strong>——按<strong>过滤率</strong>选择:(a) 过滤率高(>10%)→ 先过滤后检索(子集够大);(b) 过滤率低(<1%)→ 先检索后过滤(但要增大 K);(c) 中间 → 两者结合。(4) <strong>增大 K + 重排</strong>——先检索更大的 K(如 10×k),过滤后取 k;<strong>简单有效</strong>(但要权衡延迟)。(5) <strong>'标签/属性作为向量的一部分'</strong>——把元数据编码进向量(如拼接 one-hot);<strong>缺点</strong>——不精确(过滤不严格)。(6) <strong>专用系统</strong>——Weaviate(原生支持过滤)、Qdrant(过滤感知的 HNSW)、pgvector(结合 SQL 过滤)。<strong>评估</strong>——(a) <strong>召回率</strong>(过滤后是否仍有高召回);(b) <strong>延迟</strong>(过滤的额外成本);(c) <strong>过滤率高/低时的表现</strong>(不同过滤率的曲线)。<strong>实践建议</strong>——(a) <strong>评估过滤率分布</strong>(真实查询的过滤率);(b) <strong>按过滤率自适应</strong>(混合策略);(c) <strong>用支持过滤的索引</strong>(Qdrant/Weaviate);(d) <strong>元数据分区</strong>(低基数的过滤维度);(e) <strong>测不同过滤率下的召回与延迟</strong>。<strong>度量</strong>——(a) 过滤后的召回率(vs 精确过滤检索);(b) 延迟(不同过滤率);(c) 结果充足率(是否返回了 k 个)。
🏭 Production Trade-offs
深度剖析与工程权衡:① <strong>'两种朴素做法都有问题'是过滤检索的核心难点</strong>——面试中能分别说明'先过滤'与'先检索'的问题(且给出过滤率条件)是深度理解的标志。② <strong>'过滤率决定策略'</strong>——高过滤率用 pre-filter、低过滤率用 post-filter + 增大 K;这是实践中的关键判断。③ <strong>'过滤感知的索引'是系统层面的解法</strong>——Qdrant/Weaviate 实现了它;故选型时要注意'是否原生支持过滤'。④ <strong>'元数据分区'适合低基数维度</strong>——如年份/类别(分区数可控);高基数(如用户 id)不适合。⑤ <strong>'结果充足率'是必须监控的指标</strong>——'返回了 k 个'比'返回了高分的 3 个'更重要(用户要 10 个结果)。⑥ <strong>面试要点</strong>——被问'过滤检索怎么做',应给出'<strong>两种朴素做法的问题 + 过滤率决定策略 + 过滤感知索引 + 元数据分区 + 增大 K</strong>'与'<strong>结果充足率</strong>';能给出'过滤率 <1% 时先检索会结果不足'的具体分析是深度理解的标志。
⚠️ Common Interview Pitfalls
- ✕过滤率高时用'先检索后过滤'(结果不足)
- ✕不监控'结果充足率'
🎯 Interviewer Follow-ups
- ?为什么'先检索后过滤'会结果不足?
- ?HNSW 如何支持过滤?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.