005.RAG与向量数据库

向量是什么 ​

向量是具有大小和方向的量,在数据科学中表现为有序的数字列表,列表中每一个数字都是向量的一 个”分量”或者是”维度”。[1,2,5] 表示三维空间中的一个点或方向。​

如何理解多维向量 ​

在现代人工智能和机器学习领域,多维度向量是核心中的核心。 这里的“维度”不再仅仅是物理空间中的 X、Y、Z 轴,而是抽象的“特征”或“属性”的表示。​

举两个案例​

文本的向量(词嵌入或句子嵌入): 假设我们有一个词“苹果”。​

图片的向量(图像嵌入): 一张图片,例如一张猫的照片。​

多维度向量有什么好处 ​

总结 ​

在 AI 时代,向量是神经网络的基本数据结构,也是大模型理解和表示世界数据的核心格式。

如何将文本转为向量

Pasted image 20260402173312.png

用户 Query 转化为与数据库中向量相同维度的单一向量的流程:​

  1. 用户 Query 原始文本: "机器学习分词技术"​
  2. 分词器 (Tokenizer) 处理 Query:​
    1. 使用与生成数据库中文档 Embedding 相同的 BERT 模型的分词器(这是关键!)。​
    2. 分词器会为 Query 添加特殊的 Token:[CLS] 和 [SEP]。​
    3. Tokens: [CLS], "机器", "学习", "分词", "技术", [SEP] (假设 BERT 分词器这样分)​
  3. Tokens 转化为 Token ID 序列:​
    1. [CLS] → 101 (BERT 模型的 [CLS] ID)​
    2. "机器" → XXXX (某个 ID)​
    3. "学习" → YYYY​
    4. "分词" → ZZZZ​
    5. "技术" → AAAA​
    6. [SEP] → 102 (BERT 模型的 [SEP] ID)​
    7. Token ID 序列: [101, XXXX, YYYY, ZZZZ, AAAA, 102]​
  4. Token ID 序列送入预训练模型(如 BERT)获取 Embedding:​
    1. 模型会处理这个序列,并通过其内部的 Embedding 层和多层 Transformer 编码器。​
    2. 输出: 模型会为序列中的每个 Token ID 输出一个上下文相关的 Embedding 向量。 ​
      1. Vector_[CLS]​
      2. Vector_机器​
      3. Vector_学习​
      4. Vector_分词​
      5. Vector_技术​
      6. Vector_[SEP]​
    3. 所有这些输出向量的维度都与 BERT 模型的输出维度相同(例如 768 维)。​
  5. 聚合为单一的 Query Embedding 向量:​
    1. 由于向量数据库中的文档 Embedding 是通过提取 [CLS] Token 的输出向量得到的。​
    2. 因此,对于用户 Query,我们也需要采用相同的聚合策略:提取 [CLS] Token 对应的最终输出向量 (Vector_[CLS])。​

Final_Embedding_vec_[CLS] (Output Embedding):​

BERT 模型在处理完一个完整的输入序列后,在最后一层输出的、专门用于捕获整个序列全局语义信息的那个高维数值向量。它不是简单的初始映射,而是经过多层复杂神经网络运算,融合了所有上下文信息,并被预训练任务赋予了代表序列语义功能的“精华”向量。

向量数据库与传统数据库的区别​

维度 传统数据库 向量数据库
存储的数据 结构化数据(如字符串、整数、时间等) 高维向量(如128维、768维float数组)
查询的目标 精确匹配、范围匹配 近似匹配(查找“最相似”的向量)
常见的数据来源 用户、订单、商品等业务实体的数据 文本、图片、音频、视频的embedding向量
索引技术 B+树、Hash索引、全文索引(Inverted Index) ANN索引(HNSW、IVF、PQ、Flat等)

对于 MySQL 来说

SELECT * FROM users WHERE username = 'forrest';

对于 Vector DB 来说

vector := embedding("请推荐和我兴趣相似的文章")​
results := vectorDB.SearchTopK(vector, topK=10)

向量中的相似度是如何计算的 ​

余弦相似度

Pasted image 20260402174006.png

余弦相似度衡量的是两个向量在多维空间中的方向一致性。它不关心向量的长度(即“大小”或“强度”),只关心它们所指的方向是否相同或相似。​

值范围: 余弦相似度结果在 −1 到 1 之间。​

主要的向量索引技术 ​

在高维数据应用(如推荐系统、图像检索、自然语言处理)中,快速查找与给定查询最相似的数据点(即向量)是核心挑战。传统上,暴力搜索(Brute Force Search)通过遍历所有数据点来保证精确度,但在面对海量数据时效率极低。​

不同的向量索引技术在召回率、查询速度、索引构建时间、内存占用和可扩展性等方面有不同的优势和劣势。选择哪种技术通常取决于具体的应用场景需求。​



乘积量化 (Product Quantization, PQ)​


倒排文件索引 (Inverted File Index, IVF)​

局部敏感哈希 (Locality-Sensitive Hashing, LSH)

Pasted image 20260402174631.png


分层可导航小世界图 (Hierarchical Navigable Small World, HNSW)

Pasted image 20260402174813.png
Pasted image 20260402174846.png


五种算法对比总结 ​

特性 暴力搜索 (Brute Force) 乘积量化 (PQ) 倒排文件索引 (IVF) 局部敏感哈希 (LSH) 分层可导航小世界图 (HNSW)
精确度/召回率 100% (精确) 低 (近似) 中 (近似,取决于 nprobe) 中 (近似,取决于哈希表数量) 高 (近似,通常接近精确)
查询速度 最慢 (线性扫描) 中等偏快 最快 (通常)
内存占用 高 (需存储所有向量) 极低 (高压缩比) 中等 极高 (多哈希表) 中等偏高 (存储图结构)
索引构建时间 无需构建 中等 (码本训练) 中等 (聚类训练) 快 (哈希函数生成) 慢 (复杂图构建)
更新难度 极易 中等 中等
高维适用性 适用,但速度慢 适用 中等 效果差,内存占用高 非常适用,性能优秀
主要应用 小数据集,需要绝对精确 内存受限,大规模数据集 中大规模数据集,需要速度 小规模验证性实验,概念验证 大规模数据集,对速度和召回率要求高

向量数据库常用的评价指标 ​

  1. 准确率:检索相关的向量/检索出的向量总数​
  2. 召回率:检索相关的向量/向量数据库中相关的向量总数​
  3. 每秒平均吞吐:每秒向量数据库能够处理的查询请求次数​
  4. 平均响应延迟:每个查询的平均请求时间​

RAG 是什么​

RAG (检索增强生成,Retrieval Augmented Generation)是一种结合信息检索(Retrival)和文本生成(Generation)的技术,旨在提升大模型的准确性和实用性。​

为什么需要 RAG​

RAG 的构建流程

Pasted image 20260402175214.png

  1. 用户输入一个查询​
  2. 检索模块从知识库种找出与查询相关度最高的文档片段​
  3. 将检索片段结果连同查询一起当作 prompt 传递给模型​
  4. 模型基于上下文生成内容​

数据收集与预处理 ​

  1. 收集来自各种数据源的各种类型的数据,例如文档(PDF、Word、MarkDown、HTML)、数据库数据、知识库等​
  2. 清理不相关或者是重复的内容,处理缺失值,标准化格式​
  3. 从非结构化数据中提取可读文本​

文档分块 ​

将大型的文档分割为更小、更易于管理和理解的“块”,这是因为大模型的上下文有限,小块更利于精确检索。​

有多种分块的策略,块的大小需要权衡,太小可能丢失上下文,太大可能超出 LLM 的上下文窗口,或者是引入不相关的信息,导致检索效果变差。​

向量化 ​

向量化就是将文本转化为数值向量(embendings),以便进行语义相似性搜索。这时需要选择一个合适的 embeding 模型,将每个文本转化为一个高维的向量。

Pasted image 20260402175341.png

向量数据存储 ​

向量生成后,需要进行存储,以便于后续的持久化,以支持高效的相似性搜索。​

查询处理与检索 ​

当用户提出问题时,需要从向量数据库检索出最相关的文本块。​

  1. 将用户的问题(Query)也使用与文档分块时相同的 Embedding 模型进行向量化。​
  2. 在向量数据库中执行向量的相似性搜索(余弦相似性、内积),找到与用户问题最接近的 K 个(top-k)文档块​
  3. 按照一些元数据(文档类型、日期)进行过滤,重排序,确保返回的信息是最相关的​

响应生成 ​

  1. 将检索到的相关文档块(作为上下文)与用户的原始问题一起,构造一个包含指令和上下文的完整 Prompt​
  2. 将构建好的 Prompt 发送给预训练的 LLM(如 GPT 系列、Claude、Llama 等)​
  3. LLM 根据其自身的知识以及提供的上下文信息,生成自然语言的回答​

RAG 的分类​

https://milvus.io/docs/how_to_enhance_your_rag.md