Sentence-Transformers 是一个用于生成句子和文本段落嵌入(embedding)的 Python 库,它能够将文本转换为高维向量,使计算机能够理解和比较文本的语义。
核心概念 #
1. 什么是句子嵌入? #
句子嵌入是将整个句子或文本段落转换为固定长度的向量(一组数字),这个向量能够捕捉句子的语义信息。相似的句子会有相似的向量表示。
安装方法 #
pip install sentence-transformers
# 如果需要GPU加速
pip install sentence-transformers[gpu]基本使用 #
1. 加载预训练模型 #
from sentence_transformers import SentenceTransformer
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')2. 生成句子嵌入 #
sentences = ["这是一个示例句子", "这是另一个相似的句子"]
# 生成嵌入向量
embeddings = model.encode(sentences)
print(embeddings.shape) # 输出: (2, 384) - 2个句子,每个384维向量常用预训练模型 #
| 模型名称 | 维度 | 特点 |
|---|---|---|
all-MiniLM-L6-v2 |
384 | 小型高效模型 |
paraphrase-multilingual-MiniLM-L12-v2 |
384 | 支持多种语言 |
all-mpnet-base-v2 |
768 | 高质量英文模型 |
实际应用场景 #
1. 语义相似度计算 #
from sentence_transformers import util
# 计算两个句子的相似度
sent1 = "猫咪坐在垫子上"
sent2 = "一只猫在毯子上休息"
emb1 = model.encode(sent1)
emb2 = model.encode(sent2)
cosine_sim = util.cos_sim(emb1, emb2)
print(f"相似度得分: {cosine_sim.item():.4f}")2. 语义搜索 #
corpus = ["狗是人类最好的朋友",
"巴黎是法国的首都",
"Python是一种编程语言"]
corpus_embeddings = model.encode(corpus)
query = "计算机使用的语言"
query_embedding = model.encode(query)
# 找到最相似的句子
hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=1)
print(f"最相关的结果: {corpus[hits[0][0]['corpus_id']}")高级功能 #
1. 自定义训练 #
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
# 定义训练数据
train_examples = [
InputExample(texts=['这是正样本1', '这是正样本2'], label=1.0),
InputExample(texts=['这是负样本1', '不相关的句子'], label=0.0)
]
# 创建数据加载器
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
# 定义损失函数
train_loss = losses.CosineSimilarityLoss(model)
# 微调模型
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=5)2. 多语言支持 #
# 加载多语言模型
multi_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 支持多种语言的句子
sentences = ["Hello world", "Bonjour le monde", "你好世界"]
embeddings = multi_model.encode(sentences)性能优化技巧 #
批量处理:一次处理多个句子效率更高
embeddings = model.encode(sentences, batch_size=32)量化:减少模型大小,提高速度
model = SentenceTransformer('all-MiniLM-L6-v2', device='cpu') model.quantize() # 量化模型GPU加速:
model = SentenceTransformer('all-MiniLM-L6-v2', device='cuda')