技术面试题

Embedding和向量检索:大规模ANN到底怎么工作

"向量检索是怎么工作的?为什么能在大规模下还快?"

为什么面试官会问这道题

向量检索是每个RAG系统、语义搜索、推荐管道的底层。面试官用这题看你懂ANN算法——很多候选人说完"余弦相似度"就停,那不是架构。

如何回答

  1. 1

    先讲embedding:文本(或图像、音频)被模型映射到固定维度向量,典型384到3072维。相似内容向量相近,用余弦相似度或点积衡量。

  2. 2

    朴素检索是O(N×D):查询向量和所有存储向量算相似度。百万级以上交互式查询太慢。

  3. 3

    ANN(近似最近邻)是scale的答案——牺牲一丢丢召回换几个数量级的加速。不追求严格top-k,返回"几乎肯定对"的top-k。

  4. 4

    HNSW(分层可导航小世界):建多层图,每个节点连接邻居。查询从顶部稀疏层开始贪心走向query,逐层下降到更密层。准对数查询时间,内存大。现代向量库默认算法。

  5. 5

    IVF(倒排文件):k-means把向量聚成K个cell,查询只探nprobe个最近cell。内存低召回略低,FAISS大索引常用。常配PQ(乘积量化)把向量压缩8-32倍支持十亿级。

参考回答示例

向量检索是语义检索突破几千条规模的关键。embedding模型把文本(或图像、音频)映射到固定维度向量——MiniLM 384维、bge-large 1024维、OpenAI text-embedding-3-large 3072维。相似输入产生空间上相近的向量,"相近"通常用余弦相似度(角距离)或点积。朴素检索是查询向量和每个存储向量算相似度,O(N×D)。百万级768维向量就是每次查询10亿次乘法,交互式RAG太慢。ANN(近似最近邻)算法是实战答案——牺牲一点召回(99% vs 精确100%)换几个数量级加速。两个主流算法。HNSW建分层图:每个节点连接最近邻居,上层更稀疏。查询从顶层入口点开始贪心走向query,到下层继续。查询准对数时间、召回高,代价是每个节点存多条边导致内存占用大。Qdrant、Milvus、Weaviate、pgvector 0.5+都默认HNSW。IVF用k-means把数据集聚类成K个分区,查询时先算nprobe个最近cell只在其内搜索。IVF比HNSW省内存但召回低(除非probe更多cell,那又变慢)。FAISS超大索引的默认选择。IVF常配Product Quantization——把向量切成子向量,每个子向量替换成学习得到的codebook里最近的质心,768维float32向量从3KB压到约96字节,召回还能保持约95%。这是十亿级索引能放进RAM的关键。实战选择:几千万以内向量HNSW通常是速度-召回-内存的最佳点;几亿到十亿级要IVF+PQ。所有真实向量库都暴露调参——HNSW的ef_construction/ef_search/M、IVF的nlist/nprobe——调好这些是普通检索和生产级检索的分界线。

实用技巧

  • 能点名"HNSW"和"IVF"是实战经验的最快信号。

  • 提到PQ(乘积量化)是懂企业级规模取舍的信号。

  • 要知道自己用的向量库默认算法——Qdrant/Milvus/pgvector都默认HNSW。

  • 临场忘了算法名,即答侠可以立即提示HNSW、IVF、PQ。

常见问题

余弦相似度、点积、欧氏距离怎么选?

归一化后的embedding(单位长度)余弦和点积等价。大多数embedding模型输出接近单位向量,所以点积最快最常用。欧氏距离在文本embedding里很少用。

HNSW的缺点?

内存——每个向量存多条边,RAM占用是原始向量大小的4-8倍。超大语料用IVF+PQ更省内存。

向量能原地更新吗?

HNSW插入效率高但频繁删除会累积tombstone导致召回劣化。周期性rebuild是常见做法。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠