基础知识:向量、嵌入(Embedding)、向量空间模型、余弦相似度、欧氏距离等核心概念

在构建RAG(检索增强生成)知识库问答系统时,我们面临的核心问题是如何让计算机理解“语义”。传统的关键词匹配(如SQL的LIKE查询或Elasticsearch的BM25算法)只能处理字面匹配,无法应对同义词、 paraphrase(改写)或上下文语义差异。例如,用户查询“如何退换货”,而知识库文档中写的是“退货流程与换货政策”,两者字面重合度低,但语义高度相关。为了解决这一问题,RAG系统引入了向量检索技术:将文本、图片等非结构化数据转换为高维空间中的数值向量,通过计算向量之间的距离或夹角来度量语义相似度。本章将系统讲解向量与嵌入(Embedding)的基本概念、向量空间模型的数学意义,以及余弦相似度与欧氏距离的适用场景与选择策略。

向量检索核心概念关系图 原始文本/图像 “如何退换货” Embedding模型 text-embedding-3 高维向量 [0.12, -0.34, ...] 向量空间模型(高维空间) 文档A:退货流程 文档B:换货政策 查询:如何退换货 余弦相似度 cos(θ) = (A·B) / (|A||B|) 关注方向,忽略长度 范围[-1, 1],越大越相似 欧氏距离 d = √(Σ(ai - bi)²) 关注距离,受长度影响 值越小越相似

上图展示了RAG系统中向量检索的核心链路:原始文本通过嵌入模型转换为高维向量,这些向量在向量空间模型中形成语义坐标,最后通过余弦相似度或欧氏距离进行相似度计算。下面我们将逐一深入剖析每个概念。

2.1 向量与嵌入(Embedding)的本质

2.1.1 核心原理:从离散符号到连续数值

在自然语言处理中,文本是由离散的词汇符号组成的。计算机无法直接处理“苹果”这个汉字,必须将其转换为数值形式。早期的One-Hot编码将每个词表示为一个长度为词表大小的向量,其中只有当前词位置为1,其余为0。这种表示存在两个致命缺陷:维度灾难(词表通常有数万甚至数十万)和语义鸿沟(任意两个词的向量内积为0,无法体现“苹果”和“水果”的关联)。

嵌入(Embedding)技术解决了这一问题。其核心思想是:将每个词或文本映射到一个低维稠密向量空间(如128维、768维或1536维),使得语义相近的实体在空间中距离更近。这种映射不是手工设计的,而是通过神经网络在大规模语料上自监督学习得到的。例如,的text-embedding-3-small模型输出1536维向量,而BGE-M3模型支持8192维。

嵌入的关键特性包括:

  • 语义连续性:语义相近的文本在向量空间中距离较近,如“苹果”与“水果”的余弦相似度高于“苹果”与“汽车”。
  • 维度压缩:将高维稀疏表示压缩为低维稠密表示,便于计算和存储。
  • 上下文感知:现代嵌入模型(如BERT、Sentence-BERT)能够根据上下文动态生成向量,解决一词多义问题。

示例:假设我们有一个3维嵌入空间(实际远高于此),词向量可能为:

苹果 = [0.8, 0.2, 0.1]
水果 = [0.7, 0.3, 0.2]
汽车 = [0.1, 0.9, 0.8]

可以看到“苹果”与“水果”的向量更接近,而与“汽车”距离较远。

2.1.2 嵌入模型的选型与操作流程

在实际RAG系统中,选择嵌入模型需要综合考虑以下因素:

模型名称向量维度最大输入长度适用场景备注
text-embedding-3-small15368191 tokens通用英文/中文,性价比高
text-embedding-3-large30728191 tokens高精度场景,成本较高
BGE-M310248192 tokens多语言、长文档开源,支持稀疏+稠密混合
m3e-base768512 tokens中文场景开源,轻量级
Cohere-embed-multilingual768512 tokens多语言商业API

操作流程通常包括:

  1. 文本预处理:清洗、分句、截断(超过最大长度需切片)。
  2. 调用嵌入API或本地模型:将文本批量转换为向量。
  3. 向量归一化(可选):将向量长度归一化为1,便于后续计算。
  4. 存储到向量数据库:如FAISS、Milvus、pgvector等。

2.1.3 案例拆解:文档切片与嵌入生成

假设我们有一个企业知识库,包含一份《员工手册》PDF,共50页。直接对整个文档生成一个向量会丢失细节信息,因此需要先进行切片(Chunking)。我们按段落切分,每段约200-500字,得到约300个文本块。然后调用嵌入模型为每个文本块生成向量,存储到向量数据库中。当用户提问“年假有几天”时,系统将问题转换为向量,在数据库中检索最相似的Top-5文本块,再交给LLM生成回答。

关键参数设置:

  • 切片大小:200-500字(中文),过小丢失上下文,过大引入噪声。
  • 重叠率:10%-20%,避免切断关键信息。
  • 批处理大小:32-64条/批次,兼顾速度与API限流。

2.1.4 常见误区与总结

误区1:认为嵌入模型是万能的,任何文本都能得到完美向量。实际上,嵌入模型对领域术语、专业缩写(如“RAG”、“LLM”)可能理解不足,需要微调或使用领域专用模型。

误区2:忽略向量维度对存储和检索性能的影响。1536维向量在百万级数据下需要约6GB内存(float32),需考虑量化(如int8)或降维。

误区3:直接使用原始文本长度作为切片依据,而不考虑语义完整性。例如,将表格拆成两半会导致语义断裂。

总结:嵌入是RAG系统的基石,其质量直接决定检索效果。选择模型时需平衡精度、成本、延迟和语言支持,切片策略需结合文档结构灵活调整。

2.2 向量空间模型与相似度度量

2.2.1 核心原理:高维空间中的几何意义

向量空间模型(Vector Space Model, VSM)将文本表示为向量空间中的点。在这个空间中,每个维度代表一个潜在语义特征(并非可解释的具体词),向量的每个分量表示文本在该特征上的强度。两个文本的语义相似度可以通过它们向量的几何关系来度量。

常用的度量方式有两种:

  • 余弦相似度(Cosine Similarity):计算两个向量之间的夹角余弦值,公式为 cos(θ) = (A·B) / (|A|·|B|)。它只关注方向,忽略向量的长度(模长)。取值范围为[-1, 1],1表示完全相同,0表示正交(无关),-1表示完全相反。
  • 欧氏距离(Euclidean Distance):计算两个向量在空间中的直线距离,公式为 d = √(Σ(ai - bi)²)。它同时考虑方向和长度,值越小表示越相似,理论上无上界。

两者的核心区别在于:余弦相似度对向量的缩放不敏感。例如,向量A=[1,2]和B=[2,4]方向相同,余弦相似度为1,但欧氏距离为√5≈2.236。在文本场景中,文档长度差异会导致向量模长不同,余弦相似度能更好地捕捉语义方向的一致性。

2.2.2 判断方法:如何选择相似度度量

选择哪种度量方式取决于应用场景和数据特性:

场景推荐度量原因
短文本匹配(如FAQ问答)余弦相似度文本长度差异小,方向更能反映语义
长文档检索(如RAG)余弦相似度(默认)文档长度差异大,需消除模长影响
向量已归一化欧氏距离(等价于余弦)归一化后两者排序结果一致
异常检测(如离群点)欧氏距离对距离敏感,能发现远离簇的点
聚类算法(如K-Means)欧氏距离算法基于质心距离计算

实际操作中,大多数向量数据库(如FAISS、Milvus)默认支持余弦相似度,且推荐在嵌入后对向量进行L2归一化,这样余弦相似度与内积等价,计算效率更高。

2.2.3 案例拆解:RAG检索中的相似度计算

假设我们有一个知识库,包含以下三个文档片段(已转换为3维向量用于演示):

文档A(退货流程):[0.9, 0.1, 0.2]
文档B(换货政策):[0.8, 0.2, 0.1]
文档C(产品介绍):[0.1, 0.9, 0.8]
用户查询(如何退换货):[0.85, 0.15, 0.15]

计算余弦相似度:

cos(查询, 文档A) = (0.85*0.9 + 0.15*0.1 + 0.15*0.2) / (|查询|*|文档A|)
= (0.765 + 0.015 + 0.03) / (√(0.7225+0.0225+0.0225) * √(0.81+0.01+0.04))
= 0.81 / (0.876 * 0.927) ≈ 0.997

cos(查询, 文档B) = (0.85*0.8 + 0.15*0.2 + 0.15*0.1) / (|查询|*|文档B|)
= (0.68 + 0.03 + 0.015) / (0.876 * √(0.64+0.04+0.01))
= 0.725 / (0.876 * 0.831) ≈ 0.997

cos(查询, 文档C) = (0.85*0.1 + 0.15*0.9 + 0.15*0.8) / (0.876 * √(0.01+0.81+0.64))
= (0.085 + 0.135 + 0.12) / (0.876 * 1.208)
= 0.34 / 1.058 ≈ 0.321

结果显示文档A和B与查询高度相似(0.997),文档C相似度低(0.321)。系统将返回文档A和B作为检索结果。若使用欧氏距离:

d(查询, 文档A) = √((0.85-0.9)² + (0.15-0.1)² + (0.15-0.2)²) = √(0.0025+0.0025+0.0025) ≈ 0.0866
d(查询, 文档B) = √((0.85-0.8)² + (0.15-0.2)² + (0.15-0.1)²) = √(0.0025+0.0025+0.0025) ≈ 0.0866
d(查询, 文档C) = √((0.85-0.1)² + (0.15-0.9)² + (0.15-0.8)²) = √(0.5625+0.5625+0.4225) ≈ 1.244

排序结果一致,但数值含义不同。在实际系统中,我们通常设置一个相似度阈值(如0.7),低于阈值的文档将被过滤。

2.2.4 常见误区与调优建议

经验提醒:在RAG系统中,不要只依赖单一相似度指标。建议结合混合检索(BM25关键词+向量语义),尤其对于包含专有名词、型号代码的查询,关键词匹配能弥补向量检索的不足。

误区1:认为余弦相似度越高越好。实际上,当阈值设置过高(如0.95),可能漏掉相关文档;设置过低(如0.5),会引入大量噪声。需要通过验证集调优。

误区2:忽略向量归一化。如果使用欧氏距离但未归一化,长文档的向量模长较大,会主导距离计算,导致短文档被误判为不相似。

误区3:混淆“相似度”与“相关性”。余弦相似度衡量的是语义方向的一致性,但用户查询可能包含多个意图,需要结合重排序(Rerank)模型进一步精排。

总结:向量空间模型为文本语义比较提供了数学基础。余弦相似度是RAG系统的默认选择,但在特定场景下(如向量已归一化、需要距离)欧氏距离同样适用。关键在于理解两者的几何含义,并根据数据特性做出选择。

2.3 向量检索的工程实践与性能优化

2.3.1 核心原理:近似最近邻(ANN)检索

当知识库包含数百万甚至数十亿条文本时,暴力计算所有向量与查询向量的相似度(即精确最近邻搜索)在计算上不可行。因此,工程上普遍采用近似最近邻(Approximate Nearest Neighbor, ANN)算法,在牺牲少量精度的情况下大幅提升检索速度。常见的ANN算法包括:

  • HNSW(Hierarchical Navigable Small World):基于图结构,构建多层连接,检索时从顶层快速下探。适合高维数据,召回率高,但内存占用较大。
  • IVF(Inverted File Index):先对向量聚类(如K-Means),检索时只搜索最近的几个聚类簇。内存效率高,但召回率略低。
  • PQ(Product Quantization):将向量分段量化压缩,大幅减少存储空间,但精度损失较大。

实际系统中常组合使用,如IVF+HNSW或IVF+PQ,以平衡速度、内存和精度。

2.3.2 操作流程:构建向量索引

以FAISS为例,构建索引的典型流程:

import faiss
import numpy as np

# 假设已有100万条768维向量
vectors = np.random.random((1000000, 768)).astype('float32')

# 构建HNSW索引
index = faiss.IndexHNSWFlat(768, 32)  # 768维,32个邻居
index.add(vectors)

# 检索Top-10
query = np.random.random((1, 768)).astype('float32')
distances, indices = index.search(query, k=10)
print("最近邻索引:", indices)
print("距离:", distances)

关键参数调优:

  • efConstruction(HNSW构建参数):越大索引质量越高,但构建时间越长。
  • efSearch(检索参数):越大召回率越高,但延迟增加。
  • nprobe(IVF参数):检索时搜索的聚类簇数量,越大召回率越高。

2.3.3 案例拆解:百万级知识库的检索优化

某电商平台构建了包含200万条商品FAQ的RAG系统。初始使用暴力检索,单次查询延迟约800ms,无法满足线上要求。优化过程:

  1. 第一步:向量量化。将1536维向量用PQ压缩为96字节(压缩比16:1),内存占用从11.5GB降至1.8GB。
  2. 第二步:IVF索引。设置聚类数nlist=4096,检索时nprobe=32,召回率从95%降至92%,但延迟降至35ms。
  3. 第三步:混合检索。对包含型号的查询(如“iPhone 15 Pro 退换”),先通过BM25过滤出候选集(约500条),再对候选集做精确向量检索,召回率提升至97%,延迟稳定在50ms。

最终系统在保持高召回率的同时,将P99延迟控制在80ms以内,支撑了日均百万级查询。

2.3.4 常见误区与复盘

误区1:盲目追求高召回率而忽略延迟。在RAG系统中,检索延迟直接影响用户体验,通常要求P99 < 200ms。

误区2:忽略索引的更新策略。知识库内容会频繁更新,需要设计增量索引或定期重建机制,避免索引与数据不一致。

误区3:未考虑向量维度与硬件匹配。例如,AVX512指令集对256位向量有优化,选择维度为64的倍数(如768、1024)可提升计算效率。

总结:向量检索的工程优化是一个多目标权衡过程。需要根据数据规模、查询模式、硬件资源,选择合适的ANN算法和参数组合。建议先建立基准测试,再逐步调优。

2.4 本章总结与核心要点

本章围绕RAG知识库问答的数学基础,系统讲解了以下核心概念:

概念定义在RAG中的作用关键注意事项
向量数值数组,表示文本的语义特征文本的数学表示维度选择影响存储与计算
嵌入将文本映射为向量的技术生成可计算的语义向量模型选择需考虑领域适配
向量空间模型用向量空间表示文本语义提供相似度计算的几何框架高维空间存在“维度灾难”
余弦相似度向量夹角的余弦值衡量语义方向一致性对向量长度不敏感
欧氏距离向量间的直线距离衡量差异受向量模长影响

在实际构建RAG系统时,建议遵循以下原则:

  • 嵌入模型选型:优先选择支持中文、维度适中(768-1536)、有API或开源实现的模型。
  • 相似度度量:默认使用余弦相似度,并在嵌入后做L2归一化。
  • 索引策略:数据量超过10万条时,必须使用ANN索引(如HNSW)。
  • 混合检索:结合关键词与向量检索,提升对专有名词的召回。
  • 持续评估:建立标注测试集,定期评估检索质量(Recall@K、MRR等指标)。

核心公式速查:

余弦相似度: cos(θ) = Σ(ai * bi) / (√Σ(ai²) * √Σ(bi²))
欧氏距离: d = √(Σ(ai - bi)²)
归一化: v_norm = v / |v|