跳到正文

向量检索基本原理是什么?

向量化、索引构建与相似度计算三大步骤详解

原题:请解释向量检索(向量召回)的基本原理,包括向量化、索引构建和相似度计算等关键步骤

向量检索 · 百度真题

回答与解析

核心原理

向量检索把文档和查询编码到同一表示空间,再按照与模型训练方式匹配的距离或相似度寻找近邻。效果不仅取决于索引,还取决于语料、分块、embedding 版本和距离度量是否一致。

1. 向量化

  • 文档块与查询通常使用同一 embedding 模型及同一预处理版本编码。
  • 领域、语言和查询长度会影响表示质量,应在目标查询集上验证,而不是用“语义接近”作主观判断。
  • 模型升级时要记录向量版本;不同模型产生的向量通常不能直接放在同一索引中比较。

2. 索引构建

  • Flat 做精确搜索,可作为小规模服务方案或评测近似索引召回的基线;是否可用取决于数据量、维度、硬件、过滤和延迟目标,不存在统一的“百万以内”界线。
  • HNSW 通过多层近邻图加速搜索,常见特点是较高召回和较大内存开销。
  • IVF、PQ 及其组合先缩小候选范围并可压缩向量,适合在容量、速度和召回之间取舍,但具体存储形态由引擎决定。

3. 相似度计算

  • 余弦相似度比较方向;向量归一化后,余弦排序与点积排序等价。
  • 未归一化点积同时受方向和模长影响,只有模型训练目标支持时才应使用。
  • 欧氏距离适用于按该几何关系训练或验证过的表示,不能只凭经验替换。

4. 在线链路与评测

查询编码后进入 ANN 搜索,得到候选,再结合元数据过滤、重排或业务规则返回 Top-K。用精确搜索作为基线评估 ANN Recall@K,并同时看最终证据召回、延迟、内存、构建时间和更新成本。

结论:向量检索是 embedding、度量、索引和重排共同组成的链路,索引参数不能弥补表示或分块错误。

口语版讲法(约4分钟)

  • 向量检索本质是语义匹配,用向量代替关键词
  • 向量化:用Embedding模型把文本转成向量
  • 索引构建:用ANN索引加速,重点讲HNSW
  • 相似度计算:余弦与点积,归一化后等价
  • 完整链路与精度-速度权衡,给出可延伸点

我理解向量检索的核心,是把文本之间的“语义接近”变成向量空间里的“距离接近”。传统关键词检索看的是词有没有命中,比如用户问“怎么退款”,文档里写的是“退费流程”,关键词可能匹配不上;向量检索会先把两段文本编码成向量,只要语义相近,距离就会比较近,所以更适合问答、推荐、RAG 这类场景。

整个链路我一般按三段看:先向量化,再建索引,最后算相似度并排序。

向量化就是用 Embedding 模型把 query 和文档块都转成固定维度的稠密向量。这里最关键的不是“转成多少维”,而是这个向量空间是否真的学到了业务里的语义关系。比如“退款”“退费”“售后申请”在客服场景里应该靠得很近,但“苹果”在水果场景和手机场景里可能对应完全不同的语义,所以 Embedding 模型的领域适配很重要。

有了向量以后,如果数据量很小,可以直接暴力算距离;但线上通常是百万、千万甚至更大规模,不可能每次查询都扫全库,所以要建近似最近邻索引,也就是 ANN。常见的 HNSW 是图结构,查询时先从高层快速靠近目标区域,再逐层下沉到更细的位置,优点是召回高、延迟稳,缺点是比较吃内存。IVF-PQ 更偏大规模压缩检索,能把存储和计算成本降下来,但会牺牲一部分精度。工程上选哪种,不是看哪个算法更高级,而是看数据规模、延迟要求、更新频率和硬件成本。

相似度计算通常用余弦、点积或者欧氏距离。文本 Embedding 里最常见的是余弦相似度,如果向量已经做了归一化,余弦和点积基本等价,线上常用点积是因为算得更快。这里我会特别注意一点:训练或评估 Embedding 时用的相似度口径,最好和线上检索保持一致,不然离线效果和线上排序会有偏差。

所以完整流程就是:文档先切块,跑 Embedding,写入向量索引;用户问题进来后也转成向量,到索引里找 TopK 候选,再结合相似度、元数据过滤或者 reranker 做最后排序。

真正落地时,核心权衡是召回、延迟和成本。比如 HNSW 召回好但内存贵,IVF-PQ 成本低但精度有损;TopK 取大一点召回会好,但后面的重排和生成成本也会变高。

我还会补一句:很多人一开始会疯狂调索引参数,但实际排查下来,问题往往出在 Embedding 模型和文档切块上。向量空间本身没把语义学好,再好的索引也只是更快地找错东西。这个点在 RAG 项目里特别常见。

关键一句:向量检索效果差时,不要只调 HNSW 参数,要先检查 Embedding 质量和 chunk 质量。

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你做一个电商搜索,用户搜“红色连衣裙”,你打算怎么从几百万商品里快速找到语义最匹配的那一批?能讲讲从文本到向量再到检索的完整思路吗?

  2. 问法 2 · 层层追问

    搜过关键词召回吧?那如果要从语义层面做召回……比如用户说“舒适的运动鞋”,你怎么把“柔软”“透气”的鞋子也找出来?……具体怎么把文本变成向量?那么多商品向量怎么建索引才能快?最后怎么算相似度?

  3. 问法 3 · 直球架构

    解释一下向量检索的基本原理,包括向量化、索引构建和相似度计算这三个关键步骤。比如,怎么从文本得到向量?大规模下用什么索引?相似度度量怎么选?

同模块相关题目