Skip to content

面试题 ​

以下 14 道面试题覆盖向量数据库与 Embedding 基础设施的核心知识点,每题附参考答题要点。

Q1:为什么高维空间不能用 kd-tree 做最近邻?ANN 的召回率怎么定义? ​

kd-tree 在低维靠空间划分剪枝,但维数灾难使高维空间中距离集中:任意两点距离的相对差异趋近 0,"最近"与"较远"难以区分,基于超平面的剪枝剪不掉分支,退化为全扫描甚至更慢(缓存不友好)。因此高维+大规模只能用 ANN。

Recall@k = |ANN 返回的 top-k ∩ 真实 top-k| / k,是相对于暴力搜索 ground truth 的集合重合度,必须在真实查询分布的评测集上统计。

Q2:cosine、L2、IP 三种度量什么关系?工程上怎么统一实现? ​

向量 L2 归一化后,||q - x||² = 2 - 2·cos(q, x),即 cosine 距离与 L2 距离单调等价;IP 最大化等价于归一化后的 L2 最小化。工程上:入库前归一化 + 索引用单一 L2 实现即可同时支持 cosine/IP 语义,省掉三套距离内核。

Q3:讲清 HNSW 的查询过程。ef、M、ef_construction 各控制什么? ​

查询从最高层入口点逐层贪心下降到局部最优,第 0 层做 beam search:维护容量 ef 的候选最小堆与结果最大堆,每步取候选中最近节点、扩展其邻居、优于结果堆最差则入堆,直到候选堆顶差于结果堆最差(早停)。返回结果堆中最近的 k 个。

  • M:每节点邻居上限,控图密度——内存、建图成本、连通性;
  • ef_construction:建图 beam 宽度,控图质量上限;
  • ef:查询 beam 宽度,查询时 recall-延迟的主旋钮,可在请求级覆盖。

Q4:IVF-PQ 为什么快?ADC 是什么? ​

IVF 用 k-means 粗聚类把搜索从全库剪到 nprobe 个簇;PQ 把向量切 m 段、每段量化到 k 个质心之一,向量变 m 字节,距离计算变查表加法。ADC(非对称距离计算):查询向量保持 float32,预计算"查询子向量到每段各质心"的距离表(m×k),对任一数据库向量只需 m 次查表累加——避免对查询也量化带来的二次误差,是 PQ 召回损失的补偿关键。

Q5:DiskANN 为什么能把索引放 SSD?Vamana 的 α-RNG 是什么? ​

Vamana 是离线构图算法,α-RNG 剪枝:候选邻居 c 若被已选邻居 u "近似可达"(α·d(c,u) ≤ d(v,c),α>1)则跳过。效果是保留长边、压小图直径——贪心遍历跳数少,每次查询只需少量 SSD 读(按页批量读邻居列表),延迟可控在毫秒级。配合量化向量压缩读放大,内存需求降一个数量级。

Q6:Milvus 2.6 的 Streaming Node 解决了什么问题? ​

实时写入与查询执行争抢资源:老架构中 QueryNode 既查 sealed 段又要处理 growing 段的实时写入与暴力查询,写入高峰直接拖垮查询 P99。2.6 将实时职责独立为 Streaming Node:基于自研 Woodpecker WAL(吞吐约为 Kafka 的 5.8 倍)吸收写入、维护 growing 段及其增量索引,sealed 段交给 QueryNode/DataNode——流批分离后读写资源互不干扰,且去掉了 Kafka/Pulsar 依赖。

Q7:RaBitQ / BQ / SQ / PQ 怎么选?refine 起什么作用? ​

  • SQ8:每维 1 字节,召回损失最小,默认压缩档;
  • PQ:压缩比高(8~32×),裸召回掉得多,适合配合 refine;
  • BQ/RaBitQ:每维 1 bit,32× 压缩;RaBitQ 先随机旋转再符号量化,信息损失更小(Milvus 2.6 实测 refine 后 recall 约 94.9%、内存降 72%)。

refine = 粗量化码负责大范围召回 top-αk,候选再用原始向量或高精度码精排。粗码省内存、精排保召回,是量化体系的生产标配。

Q8:什么是 post-filter 陷阱?生产上有哪些解法? ​

先 ANN top-k 再用谓词过滤,低选择率(如租户过滤 1%)时 top-k 中合格向量远少于 k,返回结果残缺、召回静默崩塌。解法三条路:① pre-filter/谓词下推(暴力扫描合格子集,选择率极低时反而快);② 图感知索引——ACORN(搜索时扩展邻居的邻居,Qdrant 已集成)、Filtered-DiskANN(构图纳入标签);③ 按过滤维度物理分区(租户做 partition key)。

Q9:GPU 向量检索什么时候值得上?CAGRA 是什么? ​

cuVS 是 NVIDIA 的 GPU 向量检索库,CAGRA 是其图算法:先 brute-force knn-graph 再迭代精化,全程 GPU 并行,建图比 CPU HNSW 快 12~30 倍;构图结果可被 CPU 当 HNSW 搜索(GPU-build/CPU-serve)。值得上的场景:亿级索引构建太慢(GPU 建图池)、热集小+QPS 极高(GPU 服务亚毫秒);十亿级中等 QPS 通常 DiskANN 更划算。数据高频更新的段不适合 GPU 常驻(重建成本高)。

Q10:Embedding 模型升级为什么要重建索引?怎么做才安全? ​

不同模型的向量维度与分布不同,旧索引对新向量无意义(距离空间变了),必须全量重建。安全流程:新模型写新 collection → 建索引 → 网关侧灰度切流(5%→50%→100%,可用影子对比召回差异)→ 保留旧索引一个回滚窗口 → 回收。配套纪律:模型版本注册、维度与归一化策略固定、评测集上先复测新模型(公开榜单分数不等于你的数据上更好)。

Q11:Qdrant 与 Milvus 的架构差异本质是什么?怎么选? ​

Milvus:专职组件分布式(Proxy/Streaming Node/DataNode/QueryNode/MixCoord + 对象存储),流批分离,吃单集群极限规模与写入吞吐,运维面大。Qdrant:单进程 Rust 内核,collection/shard/segment 切分 + mmap,吃部署简单与复杂过滤(payload + ACORN),大规模靠云托管分片。选型:亿级以上高写入自托管选 Milvus;亿级以内、过滤复杂、运维人手少选 Qdrant;深度 PG 生态百万级选 pgvector。

Q12:十亿级向量库的成本优化手段有哪些?各牺牲什么? ​

① 量化压本体(RaBitQ/PQ/INT8):牺牲少量召回(refine 可挽回大部分);② 冷热分层:冷数据在对象存储按需加载,牺牲冷查询延迟;③ DiskANN 上 SSD:牺牲延迟换介质成本;④ GPU 建图/服务:用 GPU 预算换构建时间或查询 QPS;⑤ 分片副本数与压缩算法降低存储与流量账单。核心是先算内存账(向量本体+图+元数据),再按延迟 SLO 决定哪部分可以"降级"。

Q13:向量库的删除为什么是 tombstone?长期运行有什么问题? ​

图索引(HNSW/Vamana)物理删点会破坏图连通性,因此删除普遍是逻辑标记 + 查询过滤;空间由后台 compaction 回收。长期问题:① tombstone 积累导致段空洞、磁盘膨胀;② 被删节点的断边使图直径变长、召回缓慢退化。对策:监控召回回归并周期性重建索引、能 TTL/分区的删除尽量物理化、给 compaction 配足资源配额。

Q14:设计一个 RAG 的向量检索质量保障体系。 ​

四层:① 离线评测——固定 500~1000 条带标注查询集(与语料隔离防污染),每次索引参数/量化/模型变更过 Recall@10/100 + P99 门禁;② 影子对比——新旧索引并行双跑,线上差异超阈值自动回滚;③ 在线指标——分环节延迟埋点(embedding/ANN/fetch/rerank)、QPS、成本,P99 与召回回归告警;④ 反馈闭环——用户点赞/差评、答案忠实度评估回流,定期扩充评测集。要点:召回回归比系统指标更早暴露问题,是头号健康指标。

小结 ​

面试考察的主线有四条:ANN 算法的取舍直觉(Q1-Q5)、系统架构的演进逻辑(Q6/Q11)、量化与过滤的工程坑(Q7/Q8/Q13)、以及生产化的流程纪律(Q10/Q12/Q14)。答出"参数—权衡—监控—回滚"的完整闭环,比背出单个数字更有说服力。

Released under CC-BY-SA-4.0 License.