03.文档向量化原理
百万级PDF文档的向量化存储原理
要理解如何高效存储和检索百万级PDF文档,我们需要深入探讨以下几个核心问题
文本如何转化为向量?
(嵌入模型)向量如何高效存储?
(向量索引)如何快速查询相似向量?
(近似最近邻搜索)如何扩展到百万级数据?
(分布式存储与计算优化)
# 01.文本如何转化为向量
# 1. 文本如何转化为向量
文本如何转化为向量?
(嵌入模型)
文本嵌入(Text Embedding)的基本概念
文本嵌入是将文本(如单词、句子或段落)映射到一个
高维向量空间
的过程这个向量的几何特性(如距离或方向)能够反映文本的语义信息
例如:
相似含义的文本(如“猫”和“ feline”)在向量空间中距离较近。
不相关的文本(如“汽车”和“香蕉”)向量距离较远。
常用嵌入模型:OpenAI 的
text-embedding-ada-002
假设我们有一个文档库(如 PDF 或网页),需要将其内容转化为向量并存储,后续用于检索
在 LangChain 的 RAG 中,文本转化为向量的过程是:
分块 → 嵌入 → 存储 → 检索 → 生成
# 1)分块
分块的目标
将长文本拆分为语义独立的短文本块(如段落或句子),确保每个块包含完整信息且适合嵌入模型处理
分块大小:通常为 256~512 个token(或按段落分割)
实际分块示例:假设我们选择 按段落分块,得到以下文本块
块ID 文本内容 块1 “可再生能源是指自然界中可不断再生的能源,主要包括太阳能、风能和水能。” 块2 “太阳能:通过光伏板将阳光转化为电能,清洁无污染,但受天气影响较大。” 块3 “风能:利用风力涡轮机发电,适合风力资源丰富的地区,但可能对鸟类迁徙造成影响。” 块4 “水能:通过水坝蓄水发电,效率高,但可能破坏当地生态系统。” 块5 “未来,可再生能源的存储技术(如电池)是发展的关键。”
分块注意事项
重叠分块:为避免语义断裂,可在块间保留部分重叠(如块1末尾和块2开头重复“太阳能”)
结构化分块:如果文章有标题(如“## 太阳能”),可将标题与下文合并为一个块
# 2)嵌入
嵌入模型的作用
- 将文本块转换为高维向量(如 1536 维),向量间的距离反映语义相似性
以 块2 为例
输入文本
“太阳能:通过光伏板将阳光转化为电能,清洁无污染,但受天气影响较大。”
嵌入模型处理
- 模型将文本分词(如拆分为“太阳能”、“光伏板”、“电能”、“清洁”等)
- 根据词义和上下文关系,生成全局语义向量。
输出向量(简化版)
[0.12, -0.34, 0.56, 0.02, -0.78, ..., 0.45]
(实际为1536维)
向量语义的意义
块2(太阳能)的向量会接近另一个提到“光伏发电”的文本
块2的向量与块3(风能)的向量距离较远,但与块1(可再生能源概述)较近
# 3)存储
- 将分块后的文本和对应向量存入数据库(如FAISS),结构如下
块ID | 文本内容 | 向量 |
---|---|---|
1 | 可再生能源概述... | [0.10, -0.20, ...] |
2 | 太阳能... | [0.12, -0.34, ...] |
... | ... | ... |
# 4)检索
用户提问: “哪种可再生能源对生态环境有负面影响?”
问题嵌入: 将问题转化为向量
[0.15, -0.30, 0.60, ...]
。相似性搜索:
- 计算问题向量与所有块向量的余弦相似度
- 块3(风能):相似度 0.82
- 块4(水能):相似度 0.85
- 块2(太阳能):相似度 0.45
- 返回最相关的块3和块4
- 计算问题向量与所有块向量的余弦相似度
相似性搜索:
- 计算问题向量与所有文档块向量的余弦相似度,找到最匹配的块(如“北极冰川融化速度加快”)
什么是余弦?
- 余弦(Cosine)是三角函数之一,用于计算两个向量之间的夹角
- 在向量空间中,余弦相似度通过夹角的余弦值来衡量两个向量的方向相似性,忽略它们的长度(模)
- 取值范围
- 1:两向量方向完全相同(语义完全一致)
- 0:两向量正交(无相关性)
- -1:两向量方向完全相反(语义相反)
# 5)生成
- 将检索到的文本块(上下文)和用户问题一起输入大模型(如 GPT-4),生成答案
- “冰川融化导致海平面上升,威胁沿海生态系统...”
# 2、单词向量转换原理
关键点总结
- 分词与编码:文本被拆分为Token并转换为数值ID
- 上下文建模:Transformer网络动态调整每个Token的向量,捕捉上下文关系
- 向量聚合:所有Token的向量合并为句向量,保留全局语义
- 语义存储:向量的每个维度对应一种抽象特征,相似文本的向量几何距离近
# 1)模型如何处理输入文本?
步骤 1:分词(Tokenization)
- 模型首先将句子拆分为子词(Subword)或单词
- 输入句子:
“太阳能:通过光伏板将阳光转化为电能,清洁无污染,但受天气影响较大。”
- 分词结果(简化版):
["太阳能", ":", "通过", ... "。"]
步骤 2:转换为Token ID
- 每个分词被映射为模型词汇表中的唯一ID(数值化)
- 例如(假设的ID值)
"太阳能"
→ 1024"光伏板"
→ 2048"清洁"
→ 3567
# 2)如何从Token生成向量?
- 嵌入模型的核心是一个深度神经网络(如Transformer),其处理流程如下
步骤 1:词嵌入
- 每个Token ID 通过一个嵌入查找表 转换为一个初始向量(通常是 768 维或 1536 维)
- 例如:
"太阳能"
(ID 1024) → 初始向量[0.1, -0.2, 0.3, ...]
"光伏板"
(ID 2048) → 初始向量[0.4, 0.0, -0.1, ...]
步骤 2:上下文编码
- 模型通过
自注意力机制
分析Token之间的关系,调整每个Token的向量表示 - 例如:
"光伏板"
的向量会因上下文"太阳能...转化为电能"
被修正,加入“能源转换”的语义"清洁"
的向量会因"无污染"
被强化环保属性
步骤 3:生成句向量(Pooling)
- 模型将所有Token的向量合并为 全局句向量(如通过均值池化或CLS Token)
- 例如:对所有Token向量取平均值 → 最终句向量
[0.12, -0.34, 0.56, ...]
# 3)向量中的数值代表什么?
- 向量的每个维度(如
0.12
或-0.78
)是神经网络学习到的语义特征- 可能对应以下抽象属性(模型自动学习,无明确标签)
正数维度(如
0.56
):可能与“能源”、“环保”等正向语义相关负数维度(如
-0.78
):可能与“限制条件”(如“受天气影响”)相关接近零的维度(如
0.02
):表示该特征不明显具体例子分析
单词
"太阳能"
的贡献- 可能在向量中激活“可再生能源”(第1维
0.12
)和“环保技术”(第3维0.56
)
- 可能在向量中激活“可再生能源”(第1维
单词
"天气影响"
的贡献- 可能在向量中激活“不确定性”(第5维
-0.78
)
- 可能在向量中激活“不确定性”(第5维
# 4)相似文本的向量距离近?
- 语义相似的文本(如“太阳能发电”和“光伏板”)会在高维空间中靠近
- 因为它们激活的维度模式相似(如都高亮“清洁能源”相关维度)。
- 数学验证:
- 计算余弦相似度:
cos(θ) = (A·B) / (||A|| ||B||)
- 若两个向量方向接近,
cos(θ)
接近 1
- 计算余弦相似度:
假设有两个句子
句子A:
“太阳能发电依赖光伏板。”
- 向量:
[0.15, -0.30, 0.60, ...]
- 向量:
句子B:
“风力发电依赖涡轮机。”
- 向量:
[0.10, -0.35, 0.20, ...]
- 向量:
相似性分析:
- 句子A和B在“可再生能源”(第3维)上均有正值,但句子A的“光伏板”更突出(
0.60
vs0.20
) - 句子B的“涡轮机”可能激活“机械”相关维度(未展示)
- 句子A和B在“可再生能源”(第3维)上均有正值,但句子A的“光伏板”更突出(
例:计算块3(风能)的相似度
# 02.向量如何高效存储
当百万级PDF文档被向量化后,
生成的向量数据需要高效存储
以满足快速检索和相似度计算
的需求向量存储系统需要解决以下几个核心问题
高维向量的紧凑表示
快速相似性搜索能力
大规模数据的分布式存储
高效的索引构建和更新机制
# 1、向量存储核心
# 1)向量压缩技术
量化方法:
标量量化(SQ):将每个向量维度独立量化为较低位宽的表示(如32位浮点→8位整型)
乘积量化(PQ):将高维向量分割为多个子空间,对每个子空间独立量化
残差量化(RQ):多层级量化,逐步细化向量表示
典型压缩比:
原始向量:1024维×4字节=4096字节/向量
经过PQ压缩后:可降至256-512字节/向量
# 2)向量索引结构
基于树的索引
KD-Tree:适用于低维空间(≤20维)
Ball-Tree:对高维数据更鲁棒
Annoy(Approximate Nearest Neighbors Oh Yeah):基于随机投影树的库
基于图的索引
- HNSW(Hierarchical Navigable Small World):
- 多层图结构,上层为粗略导航,下层为精细搜索
- 构建复杂度O(n log n),搜索复杂度O(log n)
- 典型参数:efConstruction=200-400, M=16-64
- HNSW(Hierarchical Navigable Small World):
基于哈希的索引
- LSH(Locality-Sensitive Hashing):
- 使用一组哈希函数将相似向量映射到相同桶中
- 包括随机投影LSH、超平面LSH等变体
- LSH(Locality-Sensitive Hashing):
基于倒排的索引
- IVF(Inverted File Index):
- 先对向量空间聚类,建立倒排列表
- 搜索时只在最近几个簇中进行
- 通常与PQ结合形成IVFPQ索引
- IVF(Inverted File Index):
混合索引结构(实际系统中常组合多种索引方法)
IVF+HNSW:先用IVF粗筛,再用HNSW精搜
PQ+HNSW:压缩存储用PQ,近邻搜索用HNSW
# 2、分布式向量存储架构
一、数据分片策略
水平分片:
按向量ID范围分片(如MurmurHash取模)
按聚类结果分片(每个分片存储若干簇的向量)
垂直分片:
- 将高维向量按维度范围分片(较少使用)
二、典型分布式架构
[客户端]
↓
[协调节点] → [元数据服务]
↓
[查询路由器]
↓
[多个分片节点]
├─ [分片1: 向量数据+索引]
├─ [分片2: 向量数据+索引]
└─ [分片N: 向量数据+索引]
2
3
4
5
6
7
8
9
10
三、一致性保证
- 最终一致性:适合大多数搜索场景
- Quorum读写:如W=3,R=2保证基本一致性
- 向量特定协议:如针对索引更新的Delta一致性
四、存储优化技术
内存映射(MMap)技术
将磁盘索引文件映射到虚拟内存空间
操作系统自动管理页面缓存
典型实现:Faiss的mmap支持
分层存储
[热数据] → 全内存存储(原始或压缩格式)
[温数据] → 内存缓存+SSD存储
[冷数据] → HDD/对象存储
向量编码优化
Delta编码:存储向量间的差值而非完整向量
字典编码:对频繁出现的向量值建立字典
位打包:将多个低精度值打包到一个机器字中