2.1 向量化技术详解 2.1.1 词向量、句子向量与文档向量的概念演进 向量化技术是现代RAG系统的核心技术基础,它将文本信息转换为数值向量,为机器理解和处理人类语言提供了可能。在本节中,我们将深入探讨不同层次向量的概念原理、技术特点和应用场景。 词向量的基本原理与发展历程 词向量(Word Embeddings)是将单词映射到高维向量空间的技术,它最早出现在Word2Vec(2013年)和GloVe(2014年)等模型中。词向量的核心思想是: 语义相似性 → 数值接近性 这意味着语义上相似的单词在向量空间中的距离也较近。这种基于分布假设的理论基础,使得词向量能够捕捉语言中丰富的语义关系。
向量化技术是现代RAG系统的核心技术基础,它将文本信息转换为数值向量,为机器理解和处理人类语言提供了可能。在本节中,我们将深入探讨不同层次向量的概念原理、技术特点和应用场景。
词向量(Word Embeddings)是将单词映射到高维向量空间的技术,它最早出现在Word2Vec(2013年)和GloVe(2014年)等模型中。词向量的核心思想是:
语义相似性 → 数值接近性
这意味着语义上相似的单词在向量空间中的距离也较近。这种基于分布假设的理论基础,使得词向量能够捕捉语言中丰富的语义关系。
词向量的技术演进:
第一代:基于统计的方法
第二代:基于上下文的方法
第三代:预训练语言模型
句子向量将整个句子编码为单个向量,它需要考虑句子的整体语义、语法结构和上下文信息。句子向量的主要技术特点包括:
1. 语义聚合能力
句子向量需要将多个词汇的信息聚合为一个整体表示,这个过程面临着语义保留和噪声控制的挑战。
2. 上下文敏感性
与词向量不同,句子向量天然具有上下文敏感性,能够处理时态、语态、语气等语言特征。
3. 长距离依赖捕获
现代句子向量模型(如BERT、SBERT)能够捕获句子内长距离的语义关系。
主流句子向量化技术:
# Sentence-BERT示例 from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') sentences = [ "The cat sits on the mat", "A feline is resting on the rug", "The dog plays in the garden" ] sentence_vectors = model.encode(sentences) print(f"句子向量维度: {sentence_vectors.shape[1]}") print(f"句子间相似度矩阵:")
文档向量需要处理更长文本的语义表示,它面临着更大的技术挑战。文档向量的核心问题包括:
1. 长文本信息的有效压缩
如何在保持重要信息的同时,压缩长文档的核心语义。
2. 层次化语义表示
文档通常包含多个段落和章节,需要构建层次化的语义结构。
3. 主题和概念的分布表示
一个文档通常涉及多个主题,需要能够表示这种主题分布。
文档向量化策略:
简单平均法
加权平均法
层次化方法
注意力机制
预训练语言模型是现代向量化技术的核心,理解不同模型的表示能力对于选择合适的向量化方法至关重要。
BERT系列模型
BERT的核心特点:
GPT系列模型
GPT的核心特点:
专用向量化模型
# 专用向量化模型示例 from sentence_transformers import SentenceTransformer # 中文专用模型 chinese_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') # 领域专用模型 domain_model = SentenceTransformer('all-distilroberta-v1') # 长文本模型 long_text_model = SentenceTransformer('msmarco-distilbert-base-dot-v5')
1. 任务类型匹配
2. 性能要求
3. 领域适应性
领域适应微调
from sentence_transformers import SentenceTransformer, InputExample, losses from torch.utils.data import DataLoader # 准备领域数据 train_examples = [ InputExample(texts=['查询文本', '相关文档1']), InputExample(texts=['技术文档', '相关代码示例']), # 更多训练样本... ] # 定义训练器 train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16) train_loss = losses.CosineSimilarityLoss(model) # 微调模型 model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=4, warmup_steps=100)
三元组损失微调
# 使用三元组损失优化语义相似度 triplet_loss = losses.TripletLoss(model) # 正样本对 anchor_positive_pairs = [ ('什么是机器学习?', '机器学习是AI的分支'), ('如何优化神经网络?', '神经网络优化技巧'), ] # 负样本 negative_examples = [ '什么是区块链?', '如何优化数据库查询?', ]
向量化技术的数学基础包括线性代数、概率论和优化理论。理解这些数学原理有助于我们更好地选择和优化向量化方法。
词空间的维度问题
词向量通常在高维空间中(300-3000维),高维空间中的向量具有特殊的数学性质:
余弦相似度 vs 欧氏距离
import numpy as np def cosine_similarity(vec1, vec2): """余弦相似度计算""" dot_product = np.dot(vec1, vec2) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) return dot_product / (norm1 * norm2) def euclidean_distance(vec1, vec2): """欧氏距离计算""" return np.linalg.norm(vec1 - vec2) # 使用示例 vec1 = np.array([0.1, 0.8, 0.2, 0.3]) vec2 = np.array([0.2, 0.7, 0.1, 0.4]) cos_sim = cosine_similarity(vec1, vec2) eucl_dist = euclidean_distance(vec1, vec2) print(f"余弦相似度: {cos_sim:.3f}") print(f"欧氏距离: {eucl_dist:.3f}")
相似度度量的选择策略:
PCA(主成分分析)
PCA是最常用的降维方法,它通过线性变换将数据投影到方差最大的方向。
from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 原始高维向量 high_dim_vectors = np.random.rand(1000, 768) # 1000个768维向量 # 标准化 scaler = StandardScaler() vectors_scaled = scaler.fit_transform(high_dim_vectors) # PCA降维 pca = PCA(n_components=128) # 降到128维 vectors_reduced = pca.fit_transform(vectors_scaled) print(f"解释方差比: {pca.explained_variance_ratio_.sum():.3f}")
t-SNE(t-分布随机邻域嵌入)
t-SNE是非线性降维方法,特别适合可视化高维数据的局部结构。
UMAP(均匀流形近似和投影)
UMAP是较新的降维技术,相比t-SNE有更好的计算效率和保持全局结构的能力。
词嵌入的概率解释
Word2Vec等模型可以解释为最大化词共现概率的产物:
# 简化的Word2Vec概率模型 def word2vec_probability(context_word, target_word, vectors): """计算context_word出现时target_word的概率""" context_vec = vectors[context_word] target_vec = vectors[target_word] # 通过点积计算相关性 similarity = np.dot(context_vec, target_vec) # Softmax转换为概率 prob = np.exp(similarity) / np.sum(np.exp(similarity)) return prob
信息熵与向量表示
信息熵可以用来评估向量表示的信息量:
def calculate_entropy(vector): """计算向量的信息熵""" # 将向量转换为概率分布 prob_dist = np.abs(vector) prob_dist = prob_dist / prob_dist.sum() # 计算信息熵 entropy = -np.sum(prob_dist * np.log2(prob_dist + 1e-10)) return entropy
主流向量数据库对比
向量数据库选择策略
规模考虑
查询性能
功能需求
1. 量化技术
# 8-bit量化 def quantize_vectors(vectors, bits=8): """将向量量化到指定位数""" min_val = vectors.min() max_val = vectors.max() # 计算量化参数 scale = (max_val - min_val) / (2**bits - 1) zero_point = min_val # 量化 quantized = np.round((vectors - zero_point) / scale).astype(np.uint8) return quantized, scale, zero_point # 量化后搜索 def search_quantized(query, quantized_vectors, scale, zero_point): """在量化向量上搜索""" # 反量化 full_precision = quantized_vectors * scale + zero_point # 计算相似度 similarities = np.dot(full_precision, query.T) return similarities
2. 分片技术
# 向量分片示例 def shard_vectors(vectors, n_shards=4): """将向量分片存储""" shard_size = len(vectors) // n_shards shards = [] for i in range(n_shards): start_idx = i * shard_size end_idx = (i + 1) * shard_size if i < n_shards - 1 else len(vectors) shard = vectors[start_idx:end_idx] shards.append(shard) return shards
3. 缓存策略
# LRU缓存实现 from functools import lru_cache @lru_cache(maxsize=1000) def get_vector_cache(document_id): """缓存文档向量""" # 模拟从数据库获取向量 vector = np.random.rand(768) return vector # 批处理优化 def batch_vectorize(texts, batch_size=32): """批量向量化处理""" vectors = [] for i in range(0, len(texts), batch_size): batch = texts[i:i + batch_size] batch_vectors = model.encode(batch) vectors.extend(batch_vectors) return np.array(vectors)
1. 内部评估指标
def evaluate_vectors(vectors, method='silhouette'): """评估向量质量""" if method == 'silhouette': from sklearn.metrics import silhouette_score return silhouette_score(vectors, range(len(vectors))) elif method == 'davies_bouldin': from sklearn.metrics import davies_bouldin_score return davies_bouldin_score(vectors, range(len(vectors))) else: raise ValueError("不支持的评估方法") # 计算聚类质量 clustering_score = evaluate_vectors(vectors, 'silhouette') print(f"聚类质量评分: {clustering_score:.3f}")
2. 外部评估指标
def retrieval_accuracy(retrieved_docs, relevant_docs): """计算检索准确率""" relevant_retrieved = len(set(retrieved_docs) & set(relevant_docs)) return relevant_retrieved / len(relevant_docs) def recall_at_k(retrieved_docs, relevant_docs, k=5): """计算Recall@K""" retrieved_k = retrieved_docs[:k] relevant_retrieved = len(set(retrieved_k) & set(relevant_docs)) return relevant_retrieved / len(relevant_docs) def precision_at_k(retrieved_docs, relevant_docs, k=5): """计算Precision@K""" retrieved_k = retrieved_docs[:k] relevant_retrieved = len(set(retrieved_k) & set(relevant_docs)) return relevant_retrieved / k
1. 数据质量优先
2. 模型选择策略
3. 向量处理优化
4. 评估监控体系
1. 维度过高陷阱
2. 冷启动问题
3. 概念漂移
4. 计算资源瓶颈
通过本节的学习,您应该掌握以下关键知识点:
向量化技术的核心概念
预训练模型的表示能力
数学原理与优化技术
实践应用与工程实现
避坑指南与最佳实践
向量化技术是RAG系统的基础,扎实的向量化能力是构建高性能RAG系统的前提。在后续章节中,我们将基于这些基础知识,深入探讨检索算法和评估体系的优化策略。