跳到主要内容
约 9 分钟4 张卡

Embedding 与向量检索

Embedding 将文本映射成固定维度的向量,也就是一组用于表示文本的数值。向量检索再找出与查询向量最相近的若干个文档块,为 RAG 提供候选证据。

本文从文本怎样进入向量空间讲起,再介绍相似度度量和近似最近邻索引。随后说明 HNSW 的搜索过程,以及向量数据库选型和过滤检索的取舍。

1. 面试核心​

先记住这几条,再读正文
  • 向量空间。 向量检索将查询与文档编码到兼容的空间,再按相似度选出排名前 K 的文档块。卡 · Embedding
  • 相似度度量。 查询和文档向量都归一化为单位长度时,余弦相似度、内积和欧氏距离给出的排序相同。卡 · Embedding
  • HNSW 搜索。 HNSW 用上层稀疏图接近目标区域,再到底层扩展候选,以召回损失换取检索速度。卡 · 近似最近邻与 HNSW
  • HNSW 参数。 HNSW 的 M 控制连接规模,efConstruction 控制建图搜索范围,efSearch 控制查询搜索范围。卡 · 近似最近邻与 HNSW
  • 过滤与召回。 ANN 候选被过滤掉过多时,剩余结果会少于 K 条,扩大搜索范围能增加找到合格候选的机会。卡 · 过滤检索与候选不足

2. Embedding​

Embedding 模型把长短不同的文本转成固定维度的向量,检索器才能比较它们。用于文本检索的模型常以 Transformer 编码器为基础,输出几百到几千维的向量。训练会让相关文本的向量接近,让无关文本的向量远离。相关文本对可以是问题与答案,也可以是两个同义句。

查询与文档要遵循同一检索模型定义的配对规则。两个编码器可以共享权重,也可以分别训练。非对称检索指查询与文档的形式或用途不同,比如短问题匹配长文档。这类模型可以要求查询和文档使用不同前缀,让模型区分两者的用途。

选型与入库时,需要检查语言、输入长度与版本兼容性:

  • 语言与领域:中文问题要在中文文档上评测,专业场景要覆盖领域术语。测试集应包含缩写、罕见实体和相近概念。领域表示不足时,可用领域数据微调,再比较检索收益。
  • 输入长度:每个模型都有输入上限,超限时接口会报错或按配置截断。入库前就应处理过长的块,避免后半段未参与向量计算。
  • 模型与预处理版本:索引元数据应记录模型版本和文本处理规则。更换模型或不兼容的维度配置时,需要重新生成文档向量。新旧向量即使维度相同,也未必属于同一空间。

向量相似度反映的是模型学到的关系。比如,同属一种故障的文档会很相近,但其中只有一篇适用于当前产品。因此,模型选型仍要用实际业务问题评测。

向量检索对精确编号和罕见专有名词的匹配容易出错,关键词检索可以补充这类候选。具体方法见混合检索与重排序。

3. 相似度度量​

向量生成后,还需要用一个数值表示两者有多接近。余弦相似度关注方向,内积同时受方向和长度影响,欧氏距离则衡量两点之间的直线距离。

度量定义排序方向
余弦相似度a·b / (‖a‖‖b‖)越大越相近。
内积a·b越大越相近。
欧氏距离‖a − b‖越小越相近。

表中的 a·b 是对应维度相乘再求和,‖a‖ 表示向量 a 的长度。余弦相似度除去了长度影响,所以只比较方向。

归一化是把非零向量除以自身长度,使它的长度变成 1。查询与文档都归一化后,有 ‖a − b‖² = 2 − 2(a·b),而余弦相似度也等于内积。因此,内积越大,欧氏距离越小,三者得到相同排序。这时可以先在写入时归一化文档向量,查询向量也归一化后再用内积比较,省去重复计算长度。

选择度量时,应与模型的训练目标和索引配置匹配。若模型依赖向量长度表达相关性,归一化会改变检索行为。此外,服务会将原始距离转换成对外分数,应用要核对返回值的定义和排序方向。

4. 近似最近邻与 HNSW​

精确搜索要把查询与全部 N 个 d 维向量比较,工作量为 O(Nd)。向量数量增加后,每次扫描的计算量也随之增长。近似最近邻(ANN)通过索引减少比较次数,代价是漏掉部分真正最近的向量。

百万级以上数据可以评估 ANN,但是否采用还取决于并发和延迟要求。精确搜索适合作为基线,用它得到的最近邻结果衡量 ANN 的召回损失。

HNSW 的全称是 Hierarchical Navigable Small World,中文称为分层可导航小世界图。每个向量是一个节点,节点与若干相近节点相连。节点按概率进入更高层,底层包含全部节点,越往上节点越少,连接覆盖的距离也更大。

查询通过以下三步搜索逐渐缩小范围:

  1. 从最高层的入口节点开始,比较邻居与查询的距离,移动到更近的邻居。
  2. 当前层找不到更近的邻居时,下降一层,从刚才的位置继续搜索。
  3. 到达底层后,维护候选列表并继续扩展邻居,最后返回候选中最相近的 K 个结果,也就是 Top-K。

上层帮助查询快速接近目标区域,底层再进行更细的搜索。候选列表越大,越有机会找到被较短路径遗漏的近邻,但也需要更多距离计算。

参数作用增大的主要代价
M控制图的连接规模更多内存与构建工作。
efConstruction控制建图时搜索候选数量构建耗时增加。
efSearch控制查询搜索范围查询计算增加。

M 增大后,节点有更多连接,搜索可以选择更多路径。efConstruction 增大后,建图会比较更多候选,帮助选出更合适的邻居。efSearch 则在查询时控制搜索范围,可以按召回和延迟要求调整。参数增大后的收益会受数据分布影响,到一定程度还会趋于饱和,因此要实测。

HNSW 的查询时间没有普适的对数级保证。图如何存储、删除节点后怎样维护连接,也取决于数据库实现。

标记删除与空间回收的区别见检索增强生成(RAG)。

另外两种常见方法是 IVF 和 PQ。IVF 是倒排文件索引,它先把向量划分成簇,查询时只搜索较近的几个簇。PQ 是乘积量化,它用压缩表示减少向量占用的空间,代价是引入量化误差。两者可以组合,在大规模数据中同时减少搜索量和存储量。

5. 向量数据库​

向量检索还需要保存原文、处理更新,并按业务条件过滤结果。选型时,既要看索引搜索能力,也要看这些需求如何与现有系统配合。

方案示例重点检查
专用向量数据库Milvus、Qdrant、Weaviate分布式、过滤和索引维护。
关系数据库扩展PostgreSQL + pgvector事务、业务条件与执行计划。
搜索引擎Elasticsearch、OpenSearch全文与向量的联合检索。
向量搜索库FAISS单机索引与应用自行管理数据。

可以从现有需求出发,比较这四类方案:

  • 需要分布式管理大规模向量时,可评估专用向量数据库及其索引和过滤能力。
  • 需要向量与业务表一起查询、更新或参与事务时,可评估 PostgreSQL + pgvector。
  • 已有全文搜索,又需要关键词与向量混合检索时,可评估 Elasticsearch 或 OpenSearch。
  • 单机原型或离线批处理可使用 FAISS,但原文存储、权限和数据服务需要由应用补齐。

这些需求只能帮助缩小范围,最终还要用真实数据和并发压测。比较时关注召回率、P95 等尾延迟、更新成本和资源占用。P95 延迟表示 95% 的请求能在该时间内完成。团队已有的技术栈与运维能力,也会影响实施成本。

5.1 过滤检索与候选不足​

权限、租户或版本过滤会改变真正可用的候选范围。过滤可以在搜索前、搜索中或候选返回后执行,具体方式由检索引擎决定。

如果 ANN 先产生有限候选,再过滤掉其中过多记录,剩余结果就会少于 K 条。数据库里即使还有合格文档,也需要继续搜索才能找到。过滤前置时也要关注图的遍历方式:直接排除节点会影响可走的路径,所以不同引擎的过滤效果要分别测试。

pgvector 从 0.8.0 起支持迭代索引扫描,也就是候选不足时继续扫描。设置 hnsw.iterative_scan = strict_order 后,扫描会持续到结果足够或达到扫描限制。hnsw.ef_search 则可以扩大初始搜索范围。这样能增加候选,但查询计算也会增加。

过滤后只剩很少记录时,可以先通过业务索引定位它们,再做精确相似度排序。也可以按租户分区,或为固定条件建立部分索引。选择时,应结合执行计划比较召回和延迟。

授权过滤要在文档片段交给生成模型之前生效。扩大搜索范围只是增加待选记录,仍须保留原有授权条件。

6 · 面试题卡片​

本页题目与参考回答

考察重点:解释文本如何进入兼容的向量空间,并说明三种度量的关系和近似搜索的取舍。

相关内容:Embedding、相似度度量。

参考回答

向量检索将查询和文档映射到兼容的向量空间,再按相似度取排名前 K 的文档块。

模型训练让相关文本对的向量接近,让无关文本的向量远离。查询和文档遵循各自的编码规则,例如使用模型要求的不同前缀。编码器可以共享权重,也可以配对训练,关键是输出空间兼容。

常用度量包括余弦相似度、内积和欧氏距离。余弦只比较方向,内积还受向量长度影响,欧氏距离越小表示越接近。双方归一化为单位向量后,三者排序一致,但度量仍要匹配模型训练目标。大规模检索可以用 HNSW、IVF 等 ANN 索引减少比较次数,再用精确搜索衡量召回损失。

6.2 HNSW 索引的原理是什么?关键参数如何影响效果?​

考察重点:解释 HNSW 如何逐层接近目标,以及三个参数怎样影响召回、内存和计算量。

相关内容:近似最近邻与 HNSW。

参考回答

HNSW 用分层近邻图逐步接近查询目标,三个参数分别控制连接规模、建图搜索和查询搜索。

每个节点与相近节点相连,并按概率进入更高层。底层包含全部节点,上层更稀疏。查询从高层入口开始,移动到更近的邻居,找到当前层局部最近的位置后下降一层。到底层再维护候选列表,扩展搜索并选出 Top-K。

M 越大,图中连接越多,内存和构建成本也越高。efConstruction 越大,建图时比较的候选越多,有助于改善图质量。efSearch 越大,查询覆盖的范围越广,同时也更慢。具体收益需要在目标数据上验证,存储与删除策略则由数据库实现决定。

6.3 常见的向量数据库有哪些?如何选型?​

考察重点:根据数据规模、业务过滤和混合检索需求比较方案,并说明需要怎样验证性能与运维成本。

相关内容:向量数据库。

参考回答

常见方案有专用向量数据库、关系库扩展、搜索引擎和向量搜索库,选择要结合业务查询与运维需求。

Milvus、Qdrant、Weaviate 可用于评估分布式向量管理。PostgreSQL + pgvector 便于结合业务表过滤和事务。Elasticsearch、OpenSearch 适合评估全文与向量的联合检索。FAISS 可用于单机原型或离线计算,应用还要补齐数据服务。

最终要用真实数据、并发以及权限和版本条件压测。除了召回和 P95 延迟,还要比较更新成本、资源占用与团队维护这些系统的成本。

6.4 向量库有足够数据,过滤后为何不足 K 条?​

考察重点:解释有限候选为何在过滤后不足 K 条,并比较迭代扫描、扩大搜索范围和先过滤后精确排序。

相关内容:过滤检索与候选不足。

参考回答

ANN 只搜索了有限候选,过滤又淘汰其中一部分,所以有足够数据也会返回不足 K 条。

以 pgvector 为例,从 0.8.0 起可设置 hnsw.iterative_scan = strict_order 继续扫描候选。扫描仍受上限约束,也可调大 hnsw.ef_search 扩大初始范围。若过滤后只剩少量记录,可先按业务条件定位,再精确排序;按租户分区也是可比较的方案。

调整后要同时观察召回与延迟,并保留权限过滤,确保增加的候选也在用户授权范围内。

7. 参考资料​