「学习笔记」大模型嵌入模型(Embedding Models)
文章目录
一、什么是嵌入模型
嵌入模型(Embedding Model) 是一种将非结构化数据(文本、图像、音频等)转换为高维向量的机器学习模型。这些向量能够捕捉数据的语义信息,使得相似的内容在向量空间中距离更近。
1.1 核心概念
| 概念 | 说明 |
|---|---|
| 嵌入(Embedding) | 将离散符号(如单词、图像)映射到连续向量空间的过程 |
| 向量空间(Vector Space) | 嵌入向量所在的高维空间,维度通常为 768、1024、1536 等 |
| 语义相似性(Semantic Similarity) | 通过向量距离衡量数据语义相近程度 |
| 上下文理解(Context Understanding) | 模型理解词语在不同语境下的含义 |
1.2 嵌入模型的作用
文本 "猫很可爱" ──→ [0.12, 0.34, -0.56, ...] ──→ 向量
文本 "猫咪很萌" ──→ [0.11, 0.35, -0.54, ...] ──→ 向量(与上者距离很近)
嵌入模型是以下应用的基础:
- 语义搜索:根据语义相似度检索文档
- 推荐系统:找到相似的商品或内容
- RAG(检索增强生成):为LLM提供外部知识
- 聚类分析:自动分组相似的数据
二、主流嵌入模型
2.1 模型分类
| 类型 | 代表模型 | 特点 |
|---|---|---|
| 通用文本嵌入 | BERT、Sentence-BERT、OpenAI Embedding | 适用于大多数文本任务 |
| 多语言嵌入 | XLM-RoBERTa、mBERT | 支持多种语言 |
| 长文本嵌入 | Longformer、LED | 处理超长文本(10K+ tokens) |
| 多模态嵌入 | CLIP、ALBEF | 同时处理文本和图像 |
2.2 常用模型对比
| 模型 | 维度 | 适用场景 | 特点 |
|---|---|---|---|
| text-embedding-3-small | 1536 | 通用场景,平衡性能与速度 | OpenAI最新模型 |
| text-embedding-3-large | 3072 | 需要高精度的场景 | 更高维度,更好性能 |
| all-MiniLM-L6-v2 | 384 | 轻量级,快速推理 | Sentence-BERT系列 |
| all-mpnet-base-v2 | 768 | 平衡效果与效率 | 常用开源选择 |
| bge-large-en | 1024 | 中文优化,效果优异 | 中文场景首选 |
三、嵌入模型工作原理
3.1 从词嵌入到句嵌入
词嵌入(Word Embedding):
- 将单个词语转换为向量
- 经典模型:Word2Vec、GloVe
- 局限:无法处理多义词和上下文
句嵌入(Sentence Embedding):
- 将整个句子/段落转换为向量
- 方法1:取BERT [CLS] token的输出
- 方法2:对所有token向量进行池化(mean/max)
3.2 Sentence-BERT的创新
传统BERT用于句子嵌入的问题:
- BERT是为分类任务设计的
- 直接使用[CLS] token效果不佳
Sentence-BERT的解决方案:
# 训练目标:对比学习
# 输入:anchor句、positive句(相似)、negative句(不相似)
# 目标:让anchor与positive距离近,与negative距离远
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
model = SentenceTransformer('all-MiniLM-L6-v2')
# 构建训练数据
train_examples = [
InputExample(texts=["猫很可爱", "猫咪很萌"], label=1.0), # 相似
InputExample(texts=["猫很可爱", "狗很忠诚"], label=0.0), # 不相似
]
# 使用对比损失训练
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=8)
train_loss = losses.CosineSimilarityLoss(model)
# 微调模型
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=1,
warmup_steps=100
)
3.3 向量相似度计算
常用的相似度度量方法:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| 余弦相似度 | \( \cos(\theta) = \frac{A \cdot B}{\|A\| \|B\|} \) | 文本语义匹配 |
| 欧氏距离 | \( d = \sqrt{\sum (a_i - b_i)^2} \) | 图像检索 |
| 内积相似度 | \( A \cdot B = \sum a_i b_i \) | 推荐系统 |
选择建议:
- 文本语义匹配:优先使用 余弦相似度
- 需要考虑向量长度:使用 内积相似度(需归一化)
- 高维数据:余弦相似度更稳定
四、实战:使用嵌入模型
4.1 使用 OpenAI Embedding
from openai import OpenAI
client = OpenAI(api_key="your-api-key")
# 获取文本嵌入
response = client.embeddings.create(
input="猫很可爱",
model="text-embedding-3-small"
)
embedding = response.data[0].embedding
print(f"嵌入向量维度: {len(embedding)}") # 输出: 1536
4.2 使用开源模型(Sentence-BERT)
from sentence_transformers import SentenceTransformer
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 生成嵌入
sentences = ["猫很可爱", "猫咪很萌", "狗很忠诚"]
embeddings = model.encode(sentences)
print(f"句子数量: {len(embeddings)}")
print(f"向量维度: {len(embeddings[0])}") # 输出: 384
4.3 计算相似度
from sentence_transformers import util
# 计算余弦相似度
similarity = util.cos_sim(embeddings[0], embeddings[1])
print(f"相似度: {similarity.item():.4f}") # 输出: ~0.9
4.4 中文嵌入模型
# 使用BGE中文模型
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
sentences = ["人工智能很强大", "机器学习改变世界"]
embeddings = model.encode(sentences)
# 计算相似度
similarity = util.cos_sim(embeddings[0], embeddings[1])
print(f"相似度: {similarity.item():.4f}")
五、嵌入模型在RAG中的应用
5.1 RAG中的嵌入流程
1. 文档加载 → 2. 文档分割 → 3. 生成嵌入 → 4. 存储向量
↓
用户提问 → 生成查询嵌入 → 向量检索 → 生成回答
5.2 代码示例:构建简单RAG
from sentence_transformers import SentenceTransformer, util
import numpy as np
# 1. 准备知识库
documents = [
"Milvus是一个开源向量数据库",
"向量数据库用于存储和检索高维向量",
"RAG是检索增强生成技术"
]
# 2. 加载嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 3. 生成文档嵌入
doc_embeddings = model.encode(documents)
# 4. 用户提问
query = "什么是向量数据库?"
query_embedding = model.encode(query)
# 5. 检索相似文档
similarities = util.cos_sim(query_embedding, doc_embeddings)[0]
top_k = 2
top_indices = np.argsort(-similarities.numpy())[:top_k]
# 6. 输出结果
print(f"查询: {query}")
print("最相关的文档:")
for idx in top_indices:
print(f"- {documents[idx]} (相似度: {similarities[idx]:.4f})")
5.3 输出示例
查询: 什么是向量数据库?
最相关的文档:
- Milvus是一个开源向量数据库 (相似度: 0.7890)
- 向量数据库用于存储和检索高维向量 (相似度: 0.7562)
六、最佳实践与注意事项
6.1 模型选择指南
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 快速原型 | all-MiniLM-L6-v2 | 轻量快速,效果不错 |
| 中文场景 | bge-large-zh-v1.5 | 专为中文优化 |
| 生产环境 | text-embedding-3-small | 平衡性能与效果 |
| 高精度需求 | text-embedding-3-large | 最佳效果 |
6.2 性能优化技巧
-
选择合适的维度:
- 低维度(384):速度快,内存占用小
- 高维度(1536+):效果更好,但资源消耗大
-
批量处理:
# 批量处理提高效率 sentences = ["句子1", "句子2", "句子3", ...] embeddings = model.encode(sentences, batch_size=32) -
缓存嵌入结果:
- 将生成的嵌入向量持久化存储
- 避免重复计算
6.3 常见问题
Q1:嵌入模型会产生幻觉吗?
- 嵌入模型本身不会产生幻觉
- 但基于嵌入检索的RAG系统可能因为检索错误导致幻觉
Q2:如何选择嵌入维度?
- 小规模数据集:512维足够
- 大规模知识库:1024-1536维效果更好
Q3:是否需要微调嵌入模型?
- 通用场景:预训练模型足够
- 特定领域(如法律、医疗):建议使用领域数据微调
七、总结
嵌入模型是连接非结构化数据与向量数据库的桥梁,是构建RAG系统、语义搜索、推荐系统的核心技术。选择合适的嵌入模型需要权衡效果、速度和资源消耗,在实际应用中应根据具体场景进行选择和优化。
关键要点:
- 嵌入模型将文本转换为语义向量
- Sentence-BERT是最常用的开源句嵌入模型
- 余弦相似度是文本匹配的首选度量方法
- 嵌入质量直接影响RAG系统的检索效果
END .
相关系列文章
- 「工程实践」LangChain RAG + Agent 搭建多工具 AI 知识库问答助手系统
- 「工程实践」LangChain RAG 深度解析与实战
- 「工程实践」LangChain Agent 深度解析与实战
- 「工程实践」LangChain 入门与实战
- 「学习笔记」大模型NLP(自然语言处理)
- 「学习笔记」大模型GraphRAG(知识图谱增强检索)
- 「学习笔记」大模型 RAG(检索增强生成)
- 「学习笔记」开源向量数据库 Milvus 入门
- 「学习笔记」向量数据库(Vector Database)原理
- 「学习笔记」大模型嵌入模型(Embedding Models)
- 「学习笔记」大模型提示工程(Prompt Engineering)
- 「学习笔记」大语言模型(LLM)原理
- 「学习笔记」AI大模型基础
- 「工程实践」用 AI 编辑器(TRAE SOLO) 快速构建 3D 地球旅行足迹记录