向量相似性搜索详解:Flat Index、IVF 与 HNSW

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 向量搜索解决非结构化数据(如文本、音频)的语义检索难题。关系型数据库擅长精确匹配结构化数据,而向量数据库通过Embedding将语义转化为向量,并利用余弦相似度、Flat Index、IVF、HNSW等算法实现高效近邻搜索,兼顾精度与速度。

要理解向量搜索先要弄清楚为什么需要向量数据库,关系型数据库处理结构化数据得心应手。所谓结构化数据就是那些具有固定列的表格数据,比如说:姓名、年龄、薪资、日期。这类数据精确匹配查询很简单:"Age > 25"或"Name = Subham"就能拿到想要的结果。

但现实中大量数据是非结构化的:电子邮件、短信、社交媒体帖子、音频录音、手写笔记、会议记录。SQL 数据库虽然能存储这些文本和音频却无法理解其中的语义。搜索"car"时,关键词匹配会漏掉写着"automobile"的内容。

Embeddings

机器学习模型可以将非结构化内容转换为 embedding:一组数字构成的向量,用来表征文本的语义。

存储和检索这些向量就是向量数据库的职责,它主要做两件事:高效存储向量,以及快速执行最近邻搜索(语义搜索)。

简单概括:关系型数据库擅长精确的结构化查询;向量数据库擅长对非结构化数据做相似性检索。

向量相似性搜索

向量相似性搜索算法有多种,本文介绍以下四种:余弦相似度搜索、Flat Index、倒排文件索引(IVF)、HNSW(层次化可导航小世界)。

余弦相似度衡量的是两个向量在方向上的接近程度。

取值范围在 -1 到 +1 之间。夹角越小,余弦值越大,相似度越高。方向相同的两个向量夹角为 0,余弦相似度等于 1;互相垂直时夹角为 90 度,余弦相似度为 0;方向完全相反则夹角 180 度,余弦相似度为 -1。

用一个数值例子来说明。取两个句子:

  • S1:"I like backend."
  • S2:"I like frontend"

这里用 one-hot 编码做简化演示。实际场景中,Word2Vec 或 BERT 等模型生成的向量更稠密,语义捕捉能力也更强。

唯一词汇 = [I, like, backend, frontend]

对 S1 和 S2 编码:

  • S1 → [1, 1, 1, 0]
  • S2 → [1, 1, 0, 1]

点积计算:

(1×1)+(1×1)+(1×0)+(0×1)=2

模长计算:

相似度得分:

结果是中等相似度,既不算高也不算低。

Flat Index(暴力搜索)

Flat Index 是最直接的一种向量搜索方式:拿查询向量逐一比对数据集中的每个向量,计算余弦相似度,排序后返回前 K 个结果。没有任何近似或优化手段,因而召回率达到 100%。

具体流程:

  • 取查询向量
  • 初始化空的结果列表
  • 遍历数据集中每一个向量
  • 对每个向量计算与查询向量的余弦相似度
  • (vector, similarity score) 存入结果
  • 按相似度从高到低排序
  • 返回前 K 个最相似的向量

精度最高,但是代价也最高。假如数据集中有 100 万个向量,每次查询都要计算 100 万次距离,速度根本不可接受,所以就出现了倒排文件索引。

倒排文件索引(IVF)

IVF 的核心思路是把整个向量空间切分成若干簇,查询时只在最相关的几个簇里搜索,而不是扫描全部数据。

算法分四个阶段:

第一步,聚类。假设有 100 万个向量,用 k-means 将它们划分为 100 个簇,每个簇对应一个质心向量。

第二步,构建倒排列表。每个簇维护一份属于该簇的向量列表:

C1 → [v1, v2, v3, …]C2 → [v200, v201, …]

第三步,定位最近的簇。给定查询向量 Q,计算 Q 到全部 100 个质心的距离,选出距离最近的若干个簇。选几个簇由 nprobe 参数控制,假设取 5。

Q vs C1Q vs C2…Q vs C100

第四步,在选定簇内搜索。每个簇包含约 1 万个向量,5 个簇加起来只需检索 5 万个向量,相比原来的 100 万缩减了 20 倍。

这就是 IVF 的权衡:用少量的召回率损失换取数量级的速度提升。

层次化可导航小世界(HNSW)

理解 HNSW 之前,需要先掌握两个基础概念:跳表和可导航小世界。

跳表(Skip List)

跳表是一种概率性数据结构,搜索、插入、删除的时间复杂度均为 O(log n)。

它的原理并不复杂:在普通有序链表之上叠加多层快捷指针。搜索时从最高层出发以大步幅向右跳跃;当下一个节点的值超过目标时下降一层继续搜索,每下降一层搜索范围就缩小一截。

以在有序链表中查找 71 为例,规则如下:若 71 等于当前 key,搜索完成;若 71 小于右侧下一个 key,下降一层;若 71 大于或等于右侧下一个 key,向右移动。

普通链表要逐个遍历节点才能定位目标。跳表借助高层索引跨越大量节点,访问路径上的节点数量大幅减少。

可导航小世界(NSW)

NSW 是一种基于图的搜索方法:从某个节点出发,每一步都移动到距离查询点更近的邻居,利用图中的局部捷径快速逼近目标。

过程:随机选择一个入口点。

计算入口点所有邻居到查询节点的距离,移动到距离最近的那个邻居。

重复以上操作,直到当前节点就是距离查询节点最近的位置。

但是NSW 有一个固有缺陷,提前停止问题。搜索可能陷入局部最优:当前节点的所有邻居都不比它离目标更近,搜索于是终止,但全局范围内明明存在更优的节点。这种情况下返回的是次优结果。

图中 2 是次优解,实际上存在更接近目标的节点

层次化可导航小世界(HNSW)


HNSW 把跳表的层次结构和 NSW 的贪心搜索结合在一起。顶层节点稀疏,底层节点稠密——跳表的分层思想;每一层内部通过邻居间的贪心遍历逐步逼近目标——NSW 的搜索策略。

HNSW 算法

  1. 从顶层的入口点开始
  2. 查看当前节点的所有邻居
  3. 移动到距离查询最近的邻居
  4. 重复直到没有更近的邻居(局部最小值)
  5. 下降一层,以当前位置作为新的起点
  6. 重复直到第 0 层
  7. 在第 0 层,使用 ef(搜索宽度)扩展搜索以收集候选项
  8. 从候选项中返回 top-k 结果

整个过程先在高层用少量节点做粗粒度定位,逐层细化搜索范围,到最底层展开精细搜索。高层的大跨度跳转避免了 NSW 中的局部最优陷阱,底层的密集连接保证了最终结果的质量。

总结

三种索引结构各有适用场景。Flat Index 不做任何近似,逐一比对全部向量,精度无损但速度随数据量线性增长,只适合小规模数据集或对召回率有极端要求的场景。IVF 通过 k-means 聚类将向量空间划分为多个分区,查询时仅扫描少数几个簇,用可控的精度损失换来了检索速度的数量级提升;HNSW 则走了一条完全不同的路线——构建多层图结构,高层稀疏连接用于快速定位大致区域,底层密集连接用于精细搜索,兼顾了检索速度和召回质量。

实际工程中,数据规模在几万以下可以直接用 Flat Index;百万级别的数据 IVF 是一个性价比很高的选择;对延迟和召回率都有严格要求的在线服务,HNSW 通常是首选方案。多数向量数据库(Milvus、Qdrant、Weaviate 等)都同时支持这几种索引类型,根据业务需求切换即可。

https://avoid.overfit.cn/post/29081de08b3c4636be3632b0b5f24bbb

by Subham Nayak

目录
相关文章
|
3月前
|
人工智能 弹性计算 安全
OpenClaw是什么?OpenClaw能做什么?OpenClaw详细介绍及保姆级部署教程
2026年爆火的开源AI智能体OpenClaw(昵称“小龙虾”),是首个本地化、跨平台的“数字员工”,能自主执行邮件处理、代码编写、智能家居控制等任务。60天GitHub星标破34万,获黄仁勋、Karpathy盛赞。本文提供阿里云一键部署教程,零代码快速上手!
1590 11
|
监控 NoSQL MongoDB
MongoDB的用户管理总结
这篇文章总结了MongoDB的用户管理,包括用户创建、角色分配、用户认证、账号密码配置以及用户删除等操作。
1795 1
|
5月前
|
人工智能 应用服务中间件 网络安全
2026年阿里云部署OpenClaw(Clawdbot)流程,OpenClaw无缝接入个人微信攻略
在AI智能助手深度融入日常沟通的2026年,OpenClaw(曾用名Clawdbot、Moltbot)作为功能强大的开源AI框架,支持邮件管理、代码生成、信息查询等多元化任务。将其接入个人微信,能实现“随时随地发指令、AI助手秒响应”的便捷体验——无需打开专用客户端,通过微信即可调用OpenClaw的全部功能,无论是查询资讯、生成文档还是执行自动化任务,都能高效完成。
8063 1
|
3月前
|
存储 设计模式 缓存
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
LLM Agent需持久化记忆以支撑连续对话、用户画像、知识沉淀与崩溃恢复。但满上下文方案成本高、延迟大、易出错。本文提出五阶段流水线(抽取→整合→存储→检索→遗忘)与四种记忆类型(工作/情景/语义/过程记忆),结合结构化状态+向量搜索等设计模式,实现高效、可控、可审计的生产级记忆系统。
924 9
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
|
3月前
|
编译器 C++
Markdown 里写公式,别只知道 LaTeX!试试 HTML 标签,简单到飞起
1. **零学习成本**:只要你懂一点点 HTML,立刻上手。 2. **跨平台兼容**:几乎所有支持 Markdown 的编辑器(Typora、VS Code、Obsidian、Notion)都完美支持内嵌 HTML 标签。 3. **代码可读性高**:相比 LaTeX 的花括号,标签语义更清晰。 4. **适合轻量场景**:当你不需要复杂的矩阵、积分时,用标签快得多。
274 4
Markdown 里写公式,别只知道 LaTeX!试试 HTML 标签,简单到飞起
|
3月前
|
存储 算法 数据挖掘
【数据库】向量数据库:核心原理、主流产品(Milvus、Pinecone)、索引类型(IVF、HNSW)、RAG中的应用
本文系统构建向量数据库完整知识体系:从基础定义、核心原理(ANN检索、存算分离架构)、主流索引(IVF/HNSW深度对比)、主流产品(Milvus/Pinecone等选型指南),到RAG落地实践与前沿趋势,兼顾理论深度与工程实战,助力高效构建企业级语义检索系统。
|
3月前
|
人工智能 API Apache
31B 干掉 405B:Google Gemma 4,正在终结参数军备竞赛
一个 31B 参数的模型,在全球开源大模型排行榜上排名第三。它身前倒下的,是 Qwen 3.5 的 397B,是 Llama 的 405B。
685 2
|
4月前
|
存储 人工智能 API
“AI聊了半天突然失忆?”OpenClaw(Clawdbot)阿里云/本地部署集成memU skill,AI助手永不失忆!
“聊了半天突然失忆”“跨会话忘记偏好”“只会被动响应不会主动预判”——这是很多OpenClaw(前身为Clawdbot、Moltbot)用户的共同痛点。作为GitHub星标超20万的开源AI Agent框架,OpenClaw在执行自动化任务、多渠道交互等方面表现出色,但原生记忆层仅能简单存储对话记录,缺乏结构化分类与主动调用能力,导致长对话token成本飙升、用户体验割裂。
1283 4