📖 定义
Embedding(向量嵌入/嵌入向量)是将离散数据(文本、图像、音频等)转换为连续的高维向量表示的过程。这些向量捕获了数据的语义信息,使得:
- 相似的内容在向量空间中距离更近
- 可以用数学方法计算相似度
- 机器学习模型可以直接处理这些数值
直观理解:把"猫"、"狗"、"汽车"三个词转换成向量后,"猫"和"狗"的向量距离会比"猫"和"汽车"更近,因为它们语义更相似。
📐 向量维度与语义空间
低维 (128-384)
速度快、存储小,适合快速检索场景
中维 (384-768)
平衡性能与语义精度,最常用
高维 (1024-4096)
语义表达更丰富,但计算成本高
例如:OpenAI的text-embedding-3-small是1536维,text-embedding-3-large是3072维
🔬 主流 Embedding 模型
| 模型 | 维度 | 特点 | 适用场景 |
|---|---|---|---|
| OpenAI text-embedding-3-small | 1536 | 性价比高、性能好 | 通用RAG应用 |
| OpenAI text-embedding-3-large | 3072 | 效果最佳 | 高质量检索 |
| BGE-large-zh | 1024 | 中文效果好、开源免费 | 中文RAG |
| M3E | 768 | 中文开源、效果好 | 中文应用 |
| Sentence-BERT | 768 | 经典开源模型 | 学术研究 |
| Cohere Embed | 1024 | 多语言支持好 | 多语言场景 |
💻 代码示例
使用 OpenAI Embedding API
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY")
# 生成文本嵌入
response = client.embeddings.create(
model="text-embedding-3-small",
input="这是一段需要向量化的文本"
)
embedding = response.data[0].embedding
print(f"向量维度: {len(embedding)}") # 1536
print(f"前5个值: {embedding[:5]}")
使用本地开源模型 (BGE)
from sentence_transformers import SentenceTransformer
import torch
# 加载模型 (中文推荐BGE)
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
# 单条文本嵌入
text = "深度学习是人工智能的核心技术"
embedding = model.encode(text)
print(f"向量维度: {len(embedding)}") # 1024
# 批量嵌入
texts = [
"机器学习是AI的基础",
"深度学习使用神经网络",
"自然语言处理处理文本"
]
embeddings = model.encode(texts)
print(f"批量向量形状: {embeddings.shape}") # (3, 1024)
# 计算相似度
similarities = model.similarity(embeddings[0], embeddings[1:])
print(f"相似度: {similarities}")
完整的RAG向量检索示例
from sentence_transformers import SentenceTransformer
import numpy as np
# 加载模型
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
# 知识库文档
documents = [
"RAG是检索增强生成技术",
"LLM是大语言模型的缩写",
"Embedding将文本转换为向量",
"向量数据库存储高维向量"
]
# 生成文档向量
doc_embeddings = model.encode(documents)
# 查询
query = "什么是RAG技术?"
query_embedding = model.encode(query)
# 计算余弦相似度
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
similarities = [
cosine_similarity(query_embedding, doc_emb)
for doc_emb in doc_embeddings
]
# 获取最相关的文档
best_idx = np.argmax(similarities)
print(f"查询: {query}")
print(f"最相关文档: {documents[best_idx]}")
print(f"相似度: {similarities[best_idx]:.4f}")
📊 Embedding 的关键特性
语义连续性
语义相似的内容在向量空间中距离近,不同内容距离远
降维映射
将复杂的高维数据压缩到固定维度,同时保留关键信息
可计算性
向量可以用数学运算(加减、距离计算)处理
跨模态能力
现代模型可以生成图像、音频等多模态的统一向量
🎨 多模态 Embedding
🖼️ 图像 Embedding
CLIP、ViT等模型将图像转换为向量,支持以图搜图、图文检索
🎵 音频 Embedding
Wav2Vec、Whisper等模型将音频转为向量,支持语音搜索
🎥 视频 Embedding
结合图像和音频嵌入,用于视频检索和推荐
⚠️ 选择 Embedding 模型的注意事项
- 语言支持:确保模型支持目标语言(中文选BGE/M3E)
- 领域适配:医疗、法律等专业领域可能需要专用模型
- 推理成本:开源模型免费但需本地GPU,API模型按量付费
- 维度权衡:维度越高表达越丰富,但存储和计算成本也越高
- 最大长度:注意模型支持的最大token数,长文档需分段处理