【Python】sentence_transformers 库:生成句子、段落或图像的高质量嵌入(embeddings)

sentence_transformers 是一个用于生成句子、段落或图像的高质量嵌入(embeddings)的 Python 库,基于 Hugging Face 的 transformers 库。它通过预训练的 Transformer 模型(如 BERT、RoBERTa、DistilBERT 等)生成固定长度的密集向量表示,广泛应用于自然语言处理(NLP)任务,如语义搜索、文本相似性比较、聚类、释义挖掘等。以下是对 sentence_transformers 库的详细说明。


1. sentence_transformers 库的作用

  • 生成嵌入:将文本(句子、段落)或图像编码为固定长度的向量(嵌入),表示语义信息。
  • 高效任务支持:支持语义文本相似性(STS)、语义搜索、聚类、问答检索、图像搜索等任务。
  • 多语言支持:提供超过 100 种语言的预训练模型,适合多语言应用。
  • 易于微调:允许用户基于特定任务微调模型,生成任务特定的嵌入。
  • 跨模态支持:支持文本和图像嵌入到同一向量空间(如 CLIP 模型)。

2. 安装与环境要求

根据官方文档,推荐以下环境:

  • Python 版本:3.9 或更高。
  • 依赖库
    • PyTorch 1.11.0+(支持 GPU 需安装对应 CUDA 版本)。
    • transformers 4.34.0+。
  • 安装命令
    pip install sentence-transformers
    
  • 可选扩展
    • ONNX/OpenVINO:用于推理优化和量化。
    • 训练支持:pip install sentence-transformers[train]
    • GPU 支持:确保安装与 CUDA 版本匹配的 PyTorch。

注意:若需 GPU 加速,需根据系统 CUDA 版本安装 PyTorch,参考 PyTorch 官方指南


3. 核心功能与用法

sentence_transformers 提供两种主要模型类型:SentenceTransformer(用于生成嵌入)和 CrossEncoder(用于重新排序或相似性评分)。

3.1 SentenceTransformer:生成嵌入

SentenceTransformer 将文本编码为固定长度的向量,适合语义搜索、相似性比较等任务。

基本用法

from sentence_transformers import SentenceTransformer

# 加载预训练模型
model = SentenceTransformer("all-MiniLM-L6-v2")

# 待编码的句子
sentences = [
    "The weather is lovely today.",
    "It's so sunny outside!",
    "He drove to the stadium."
]

# 生成嵌入
embeddings = model.encode(sentences)
print(embeddings.shape)  # 输出: (3, 384)  # 3 个句子,每个嵌入 384 维

# 计算相似性
similarities = model.similarity(embeddings, embeddings)
print(similarities)
# 输出: tensor([[1.0000, 0.6660, 0.1046],
#                [0.6660, 1.0000, 0.1411],
#                [0.1046, 0.1411, 1.0000]])

说明

  • 模型 all-MiniLM-L6-v2 是一个轻量高效的预训练模型,生成 384 维嵌入。
  • model.encode() 将文本转换为嵌入(numpy 数组或 tensor)。
  • model.similarity() 计算嵌入之间的余弦相似度(或其他相似性度量)。

带提示(Prompt)的高级用法
某些模型支持在推理时添加提示以优化性能,例如查询嵌入:

model = SentenceTransformer("mixedbread-ai/mxbai-embed-large-v1")
query_embedding = model.encode("What are Pandas?", prompt_name="query")
document_embeddings = model.encode([
    "Pandas is a software library written for the Python programming language for data manipulation and analysis.",
    "Pandas are a species of bear native to South Central China."
])
similarity = model.similarity(query_embedding, document_embeddings)
print(similarity)  # 输出: tensor([[0.7594, 0.7560]])
3.2 CrossEncoder:重新排序

CrossEncoder 用于对句子对进行直接评分,适合需要高精度的任务(如检索重排序)。

用法

from sentence_transformers import CrossEncoder

# 加载预训练 CrossEncoder 模型
model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")

# 查询与文档
query = "Which planet is known as the Red Planet?"
passages = [
    "Venus is often called Earth's twin because of its similar size and proximity.",
    "Mars, known for its reddish appearance, is often referred to as the Red Planet.",
    "Jupiter, the largest planet in our solar system, has a prominent red spot."
]

# 计算评分
scores = model.predict([(query, passage) for passage in passages])
print(scores)  # 输出: [0.0123, 0.9987, 0.3456](示例分数)

说明

  • CrossEncoder 直接处理句子对,输出相似性分数(通常 0 到 1)。
  • 适合需要高精度的场景,但计算成本高于 SentenceTransformer

4. 预训练模型

sentence_transformers 提供超过 10,000 个预训练模型,托管在 Hugging Face Hub,覆盖以下类型:

  • 通用嵌入模型:如 all-MiniLM-L6-v2(轻量)、all-mpnet-base-v2(高性能)。
  • 多语言模型:如 distiluse-base-multilingual-cased-v2,支持 100+ 语言。
  • 领域特定模型:如 multi-qa-MiniLM-L6-cos-v1(问答)、paraphrase-MiniLM-L6-v2(释义)。
  • 跨模态模型:如 CLIP 模型(clip-ViT-B-32),支持文本和图像嵌入。

加载模型

model = SentenceTransformer("all-MiniLM-L6-v2")  # 从 Hugging Face 下载

本地加载
若需离线使用,可先下载模型并保存:

model = SentenceTransformer("all-MiniLM-L6-v2")
model.save("local_model_path")
# 加载本地模型
model = SentenceTransformer("local_model_path")

5. 微调与训练

sentence_transformers 支持微调模型以适应特定任务,提供多种损失函数和训练方式。

5.1 训练示例

以下是一个微调模型的示例,用于语义文本相似性任务:

from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader

# 加载模型
model = SentenceTransformer("all-MiniLM-L6-v2")

# 准备训练数据
train_examples = [
    InputExample(texts=["The weather is nice today.", "It's pleasant outside."], label=0.9),
    InputExample(texts=["The weather is nice today.", "He went to the park."], label=0.2)
]
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)

# 定义损失函数
train_loss = losses.CosineSimilarityLoss(model)

# 训练模型
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=1,
    warmup_steps=100
)

# 保存模型
model.save("finetuned_model")

说明

  • InputExample 定义训练样本,包含句子对和标签(如相似性分数)。
  • CosineSimilarityLoss 优化嵌入之间的余弦相似度。
  • model.fit 执行训练,支持多任务学习。
5.2 支持的损失函数

sentence_transformers.losses 提供多种损失函数,包括:

  • CosineSimilarityLoss:优化句子对的余弦相似度。
  • TripletLoss:基于三元组(锚点、正例、负例)优化。
  • SoftmaxLoss:用于分类任务(如 NLI)。
  • MultipleNegativesRankingLoss:适合无监督或弱监督训练。
5.3 训练提示
  • 数据集:可使用 Hugging Face 数据集(如 STS-B、SNLI)或自定义数据。
  • 提示(Prompt):支持在训练和推理时添加提示以提升性能。
  • PEFT 支持:自 v3.3.0 起支持参数高效微调(Parameter-Efficient Fine-Tuning)。
  • NanoBEIR 评估:用于快速评估信息检索性能。

6. 性能优化

  • ONNX/OpenVINO:使用 ONNX 或 OpenVINO 后端进行推理优化和量化。
    pip install sentence-transformers[onnx]
    
  • CPU 加速:v3.3.0 引入 OpenVINO int8 量化,CPU 推理速度提升 4.5 倍。
  • GPU 加速:确保 PyTorch 支持 CUDA。
  • 批量处理model.encode(sentences, batch_size=32) 优化内存和速度。
  • 缓存嵌入:预计算并存储常用文本的嵌入,减少重复计算。

7. 实际应用场景

  • 语义搜索
    from sentence_transformers import SentenceTransformer, util
    
    model = SentenceTransformer("multi-qa-MiniLM-L6-cos-v1")
    query = "How big is London?"
    passages = ["London has 9,787,426 inhabitants at the 2011 census."]
    query_embedding = model.encode(query)
    passage_embedding = model.encode(passages)
    similarity = util.dot_score(query_embedding, passage_embedding)
    print(similarity)  # 输出相似度
    
  • 聚类:使用嵌入进行 K-Means 或其他聚类算法。
  • 释义挖掘:使用 util.paraphrase_mining 查找语料库中的释义。
  • 跨模态搜索:使用 CLIP 模型实现文本-图像搜索。
  • 问答系统:结合 CrossEncoder 进行检索和重排序。

8. 与 LangChain 集成

sentence_transformers 常与 LangChain 结合,用于构建基于语义的应用程序(如聊天机器人、文档检索):

from sentence_transformers import SentenceTransformer
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings

# 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

# 创建向量存储
texts = ["The weather is nice today.", "It's sunny outside."]
vector_store = FAISS.from_texts(texts, embeddings)

# 搜索
query = "How's the weather?"
results = vector_store.similarity_search(query, k=2)
print(results)

9. 注意事项

  • 依赖体积sentence_transformers 依赖 PyTorch 和 transformers,安装可能占用较大空间(约 5-7GB,含模型)。可使用 --no-cache-dir 减小 Docker 镜像体积。
  • 模型下载:首次加载模型会自动从 Hugging Face 下载,需确保网络连接或预先下载模型。
  • 离线使用:保存模型到本地路径以支持无网络环境。
  • 版本兼容性:定期检查 sentence-transformers 的版本更新(如 v3.3.0 引入了多项优化)。
  • 多语言模型:选择多语言模型时,需引用相关论文以确保学术规范。

10. 综合示例

以下是一个综合示例,结合嵌入生成、相似性计算和 CrossEncoder 重排序:

from sentence_transformers import SentenceTransformer, CrossEncoder, util

# 加载模型
encoder = SentenceTransformer("all-MiniLM-L6-v2")
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")

# 语料库和查询
query = "What is pandas?"
corpus = [
    "Pandas is a Python library for data analysis.",
    "Pandas are animals native to China.",
    "NumPy is a Python library for numerical computing."
]

# 生成嵌入并计算相似度
query_embedding = encoder.encode(query)
corpus_embeddings = encoder.encode(corpus)
similarities = util.cos_sim(query_embedding, corpus_embeddings)

# 获取初步检索结果
top_k = 3
hits = [{"corpus_id": i, "score": similarities[0][i]} for i in range(len(corpus))]
hits = sorted(hits, key=lambda x: x["score"], reverse=True)[:top_k]

# 使用 CrossEncoder 重排序
pairs = [(query, corpus[hit["corpus_id"]]) for hit in hits]
scores = reranker.predict(pairs)

# 输出结果
for hit, score in zip(hits, scores):
    print(f"Score: {score:.4f}, Text: {corpus[hit['corpus_id']]}")

输出示例

Score: 0.9987, Text: Pandas is a Python library for data analysis.
Score: 0.3456, Text: Pandas are animals native to China.
Score: 0.0123, Text: NumPy is a Python library for numerical computing.

11. 资源与文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值