「学习笔记」向量数据库(Vector Database)原理
文章目录
一、基础概念
1.1 传统数据库的局限性
传统关系型数据库(如 MySQL)或 NoSQL 数据库(如 MongoDB)擅长进行精确匹配和范围查询,但它们无法有效处理基于“相似性”的查询,例如:“找出所有与这张图片相似的图片”。
1.2 向量数据库(Vector Database)
一种专门为存储、索引和检索高维向量而设计的数据库。其核心能力是进行近似最近邻搜索,快速找到与查询向量最相似的向量集合。能够高效地处理非结构化数据(如文本、图像、音视频等)。
1.3 核心概念
| 概念 | 说明 |
|---|---|
| 向量(Vector) | 多维空间中某点的数学表示(如 {12, 13, 19, 8, 9} 表示 5 维空间坐标),通过几何方式表达数据的语义特征 |
| 嵌入(Embedding) | 机器学习生成的向量,将文本、图像等非结构化数据映射到向量空间,使语义相近的数据点在空间中距离更近 |
1.4 运作机制
- 存储:存储数据点(文档、图像、音视频等)的嵌入向量,并建立向量到原始数据的映射关系
- 检索:通过相似性搜索(如计算余弦相似度、欧氏距离)快速检索最接近的向量,支持语义级查询
二、工作流程
向量数据库的核心工作流程分为写入和查询两部分。
2.1 写入 (Ingestion) 流程

- 向量化 (Vectorization):使用嵌入模型将原始数据转换为向量
- 存储与索引 (Storage & Indexing):将向量和与之关联的元数据(如原始文本、图片 ID、创建时间等)一并存储,并为其创建专门的索引以加速后续查询
2.2 查询 (Query) 流程

- 向量化查询:将用户的查询输入(如一段文字)同样转换为向量(查询向量)
- 相似性搜索 (Similarity Search):在数据库中快速找到与查询向量最相似的 K 个向量
- 返回结果:返回这些相似向量对应的原始数据(或元数据),如最相关的文档段落
三、核心原理
3.1 向量嵌入(Vector Embedding)
简单来说,向量嵌入是一段信息(如文本、图片、用户)的数字表示,它被编码为一个高维空间中的点(即一个向量)。
核心特征:
- 数字表示:将非数值数据(如文字)或复杂关系转化为计算机能够理解和处理的数值形式
- 高维空间:这些向量通常有几十、几百甚至几千个维度,每个维度都代表了数据的某种潜在特征或属性
- 数学本质:本质是高维空间中的坐标点,使用嵌入模型(如 BERT、CLIP、ResNet)将非结构化数据(文本/图像等)映射到向量空间
- 语义关联:语义相似的数据在向量空间中距离更近(如“猫”与“猫咪”的向量距离小于“猫”与“汽车”)
- 降维表达:将复杂数据(如百万像素图像)压缩为低维向量(如 512 维),保留核心语义特征
3.1.1 向量嵌入的生成
嵌入不是人为设计的,而是神经网络模型在完成特定任务的过程中自动学习得到的副产品。
- 词的嵌入(Word2Vec):一个词的含义可以由它周围经常出现的词(上下文)来定义
- 图像嵌入:使用卷积神经网络(CNN,如 ResNet)处理图像,网络的最后一层隐藏层的输出就可以作为该图像的嵌入。相似的图片会得到相似的嵌入
- 图嵌入:将图中的节点(如社交网络中的用户)表示为向量,使得图中相连的、结构相似的节点在嵌入空间中也更接近
- 协同过滤嵌入:在推荐系统中,为用户和物品分别学习一个嵌入。如果用户喜欢某个物品,那么他们的嵌入在空间中就应该是接近的
3.1.2 向量嵌入的核心特性
- 相似性可度量:通过计算向量之间的距离(如余弦相似度、欧氏距离),可以量化两个实体的相似程度
- 关系可推理:语义关系可以通过向量运算来捕捉(如:国王 - 男人 + 女人 ≈ 王后)
- 作为通用接口:任何数据(文本、图像、音频)一旦被转化为向量嵌入,就可以使用统一的相似性搜索方法进行处理。这正是向量数据库工作的基础
3.2 相似性度量(Similarity Measurement)
通过距离函数计算向量间的相似度。比如,它要判断两个向量是“方向一致”(用余弦相似度),还是“在空间里挨得近”(用欧氏距离)。
3.2.1 常用相似性度量方法
余弦相似度(Cosine Similarity):只关注方向,不关注长度
- 向量夹角余弦值(
cos(θ))范围在[-1, 1]之间:1:完全相似,夹角为 0°,两个向量方向完全相同0:不相关,夹角为 90°,正交,两个向量垂直,表示无关-1:完全负相关(相反),夹角为 180°,两个向量方向完全相反
- 数学公式:\( \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \cdot \sqrt{\sum_{i=1}^{n} B_i^2}} \)
欧几里得距离(Euclidean Distance):计算空间中向量的绝对距离
- 空间直线距离,范围
[0, +∞),数值越小表示两点越相似 - 数学公式:\( d(A,B) = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} \)
点积相似度(Dot-Product Similarity):同时受向量方向和幅度(长度)影响
- 值越大表示越相似,范围
(−∞,+∞):点积值大:方向相同且幅度大点积值为 0:方向垂直点积值为负:方向相反
- 数学公式:\( A \cdot B = \sum_{i=1}^{n} (a_i b_i) \)
汉明距离(Hamming Distance):两个等长字符串在相同位置上不同字符的个数
- 数学公式:\( d_H(A,B) = \sum_{i=1}^{n} \mathbf{1}_{(a_i \neq b_i)} \),其中 \( \mathbf{1}_{(a_i \neq b_i)} \) 是指示函数,当 \(a_i \neq b_i\) 时为 1,否则为 0
3.2.2 对比与适用场景
| 度量方式 | 计算原理 | 适用场景 | 局限性 |
|---|---|---|---|
| 余弦相似度 | 向量夹角余弦值 | 文本语义匹配(如问答系统) | 忽略向量长度差异 |
| 欧氏距离 | 空间直线距离 | 图像特征匹配(如人脸识别) | 高维空间失效(维度灾难) |
| 点积相似度 | 向量投影强度 | 推荐系统排序(如广告点击率预测) | 需向量归一化 |
| 汉明距离 | 二进制位差异数量 | 指纹识别、编码纠错 | 仅适用于等长序列,高维下区分能力弱 |
3.2.3 选择建议
- 文本匹配:使用余弦相似度
- 地理位置:使用欧氏距离
- 高维数据(>100 维):欧氏距离失效,需降维(PCA)或改用余弦相似度或专用 ANN 算法
- 大规模数据(百亿级):需结合近似算法(如 HNSW、LSH)加速
- 跨模态检索(图文互搜):需对齐不同嵌入空间,常用对比学习(Contrastive Learning)优化
3.3 近似最近邻搜索(Approximate Nearest Neighbors, ANN)
在一个庞大的数据集中,快速找到与给定查询项最相似的几个项(Top-K)或所有在某个相似度范围内的项(范围查询)。
核心特点:
- 近似最近邻搜索(ANN):在高维向量世界里,用极小的精度损失换取巨大的性能提升
- 加速机制:
- 牺牲精度:允许返回次优解(如相似度 95% 的向量),换取 100~1000 倍速度提升
- 减少计算:通过索引结构(如图、哈希表)避免全量距离计算
- 技术价值:使亿级向量库的毫秒级检索成为可能,支撑实时推荐、语义搜索等场景
3.3.1 经典索引结构与算法
低维数据索引(维度 d<20):基于空间划分的树形结构非常有效
- KD-Tree:将多维空间递归地沿数据方差最大的维度划分为二叉树。在低维空间中非常高效,高维空间性能急剧下降(维度灾难)
- R-Tree:用最小边界矩形来概括和分组空间中的对象,形成一个平衡树。适合存储和查询空间对象(如多边形、线段),结构相对复杂
高维数据索引(文本嵌入、图像特征):高维空间中的数据分布非常稀疏,传统的树形结构效率低下
| 索引类型 | 算法 | 原理 | 特点 |
|---|---|---|---|
| 基于哈希 | LSH(局部敏感哈希) | 通过哈希函数将相似向量映射至同一个哈希桶 | 理论坚实,动态更新困难 |
| 基于图 | HNSW(分层可导航小世界图) | 构建分层图结构,通过贪心搜索逐层向下 | 精度和速度平衡好,支持动态插入,内存占用高 |
| 基于量化 | IVF-PQ(倒排文件-乘积量化) | IVF 聚类缩小范围,PQ 压缩加速计算 | 内存效率极高,索引构建成本高,有精度损失 |
| 基于森林 | ANNOY(近似最近邻) | 构建多棵二叉树分割空间 | 索引紧凑,内存友好,难以动态添加 |
3.3.2 算法性能对比
| 算法类型 | 比喻 | 查询速度 | 精度 | 内存占用 | 适用场景 |
|---|---|---|---|---|---|
| HNSW | 一个多层的、有高速通道的社交网络 | ⚡️⚡️⚡️⚡️ | 🎯🎯🎯🎯 | 高 | 高精度大规模检索(亿级) |
| ANNOY | 一个由许多“是/否”问题构成的决策森林 | ⚡️⚡️⚡️ | 🎯🎯🎯 | 中 | 中小规模实时系统(百万级) |
| LSH | 一个精心设计的“物以类聚”分拣系统 | ⚡️⚡️ | 🎯🎯 | 低 | 超大规模粗筛(十亿级) |
| IVF-PQ | “分地区管理”+“信息压缩存储”的超级图书馆 | ⚡️⚡️⚡️ | 🎯🎯🎯 | 极低 | 内存受限设备(移动端) |
3.3.3 选择建议
- 追求最佳精度和速度:首选 HNSW(数据量百万到数亿级别,内存充足)
- 内存极度紧张或需要进程共享:考虑 ANNOY
- 处理十亿级以上数据,且内存是首要瓶颈:IVF-PQ(通常在 GPU 上使用 FAISS 实现)
- 特定理论需求或场景:LSH(密码学、重复检测等特定领域)
四、主流产品
| 产品名 | 公司/社区 | 主要特点 | 适用场景 |
|---|---|---|---|
| Milvus | Zilliz | 开源/托管,功能丰富,集群能力强,支持多种索引(HNSW、IVF-PQ)和混合查询 | 超大规模、复杂的向量检索场景 |
| Pinecone | Pinecone | 全托管 SaaS 服务,易用性极高,性能稳定 | 追求快速上线、不想运维基础设施的团队 |
| Chroma | 开源社区 | 轻量级,专注于 AI 原生,开发体验好 | 原型开发、研究、中小项目 |
| Weaviate | Weaviate | 开源/托管,功能全面,支持 GraphQL,混合搜索强 | 需要复杂查询和过滤的生产级应用 |
| Qdrant | Qdrant | 开源/托管,Rust 编写,性能优异 | 对性能和资源控制有高要求的场景 |
| Redis | Redis | 作为模块支持向量搜索,生态成熟 | 已在使用 Redis,需要增加向量功能的场景 |
| PGVector | 开源 | PostgreSQL 的扩展,复用现有 PG 生态 | 技术栈已基于 PostgreSQL 的项目 |
END .
相关系列文章
- 「工程实践」LangChain RAG + Agent 搭建多工具 AI 知识库问答助手系统
- 「工程实践」LangChain RAG 深度解析与实战
- 「工程实践」LangChain Agent 深度解析与实战
- 「工程实践」LangChain 入门与实战
- 「学习笔记」大模型NLP(自然语言处理)
- 「学习笔记」大模型GraphRAG(知识图谱增强检索)
- 「学习笔记」大模型 RAG(检索增强生成)
- 「学习笔记」开源向量数据库 Milvus 入门
- 「学习笔记」向量数据库(Vector Database)原理
- 「学习笔记」大模型嵌入模型(Embedding Models)
- 「学习笔记」大模型提示工程(Prompt Engineering)
- 「学习笔记」大语言模型(LLM)原理
- 「学习笔记」AI大模型基础
- 「工程实践」用 AI 编辑器(TRAE SOLO) 快速构建 3D 地球旅行足迹记录