不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • 前置知识

  • PyTorch

  • Langchain

    • 01.Langchain基础
    • 02.数据检索增强RAG
    • 03.文档向量化原理
      • 01.文本如何转化为向量
        • 1. 文本如何转化为向量
        • 1)分块
        • 2)嵌入
        • 3)存储
        • 4)检索
        • 5)生成
        • 2、单词向量转换原理
        • 1)模型如何处理输入文本?
        • 2)如何从Token生成向量?
        • 3)向量中的数值代表什么?
        • 4)相似文本的向量距离近?
      • 02.向量如何高效存储
        • 1、向量存储核心
        • 1)向量压缩技术
        • 2)向量索引结构
        • 2、分布式向量存储架构
    • Agent智能体
    • 05.快递Agent智能体
    • 100.Agent智能体核心梳理
    • 105.Agent智能体梳理
    • 200.AI Agent核心概念
  • 大模型
  • Langchain
xiaonaiqiang
2024-06-02
目录

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)
    • 单词 "天气影响" 的贡献

      • 可能在向量中激活“不确定性”(第5维 -0.78)

# 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 vs 0.20)
    • 句子B的“涡轮机”可能激活“机械”相关维度(未展示)
  • 例:计算块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
  • 基于哈希的索引

    • LSH(Locality-Sensitive Hashing):
      • 使用一组哈希函数将相似向量映射到相同桶中
      • 包括随机投影LSH、超平面LSH等变体
  • 基于倒排的索引

    • IVF(Inverted File Index):
      • 先对向量空间聚类,建立倒排列表
      • 搜索时只在最近几个簇中进行
      • 通常与PQ结合形成IVFPQ索引
  • 混合索引结构(实际系统中常组合多种索引方法)

    • IVF+HNSW:先用IVF粗筛,再用HNSW精搜

    • PQ+HNSW:压缩存储用PQ,近邻搜索用HNSW

# 2、分布式向量存储架构

一、数据分片策略

  • 水平分片:

    • 按向量ID范围分片(如MurmurHash取模)

    • 按聚类结果分片(每个分片存储若干簇的向量)

  • 垂直分片:

    • 将高维向量按维度范围分片(较少使用)

二、典型分布式架构

[客户端] 
  ↓ 
[协调节点] → [元数据服务]
  ↓ 
[查询路由器] 
  ↓ 
[多个分片节点] 
  ├─ [分片1: 向量数据+索引] 
  ├─ [分片2: 向量数据+索引]
  └─ [分片N: 向量数据+索引]
1
2
3
4
5
6
7
8
9
10

三、一致性保证

  • 最终一致性:适合大多数搜索场景
  • Quorum读写:如W=3,R=2保证基本一致性
  • 向量特定协议:如针对索引更新的Delta一致性

四、存储优化技术

  • 内存映射(MMap)技术

    • 将磁盘索引文件映射到虚拟内存空间

    • 操作系统自动管理页面缓存

    • 典型实现:Faiss的mmap支持

  • 分层存储

    • [热数据] → 全内存存储(原始或压缩格式)

    • [温数据] → 内存缓存+SSD存储

    • [冷数据] → HDD/对象存储

  • 向量编码优化

    • Delta编码:存储向量间的差值而非完整向量

    • 字典编码:对频繁出现的向量值建立字典

    • 位打包:将多个低精度值打包到一个机器字中

02.数据检索增强RAG
Agent智能体

← 02.数据检索增强RAG Agent智能体→

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式