Embedding 向量嵌入

将现实世界的数据映射为机器可理解的向量表示

基础概念 AI核心 必备知识

📖 定义

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数,长文档需分段处理