sentence-transformers
是一个非常流行的 Python 库,专门用于将文本(句子、段落、文档)转换为高质量的语义向量(嵌入)。它基于 Transformer 架构(如 BERT、RoBERTa、DistilBERT 等) 的预训练模型,并在大量语义相似性数据上进行了微调,能够捕捉句子之间的深层语义关系。
📦 什么是 sentence-transformers
?
- 项目地址:https://www.sbert.net/
- 作者:Nils Reimers 和 Iryna Gurevych(德国达姆施塔特工业大学)
- 主要功能:
- 将文本转化为稠密向量(sentence embeddings)
- 支持多种语言
- 支持多任务学习和跨语言检索
- 底层依赖:基于 PyTorch 和 HuggingFace Transformers
🧠 主要用途
场景 | 描述 |
---|---|
文本相似度计算 | 判断两个句子是否语义相似(例如问答系统中的答案匹配) |
聚类 | 对大量文本进行自动聚类(如新闻分类、评论分组) |
信息检索 | 基于语义的搜索,而非关键词匹配 |
语义搜索 / 向量数据库 | 结合 FAISS、Annoy 等库构建高效的语义搜索引擎 |
无监督/弱监督学习 | 在没有标签的情况下提取语义特征进行下游任务 |
🚀 安装方式
pip install sentence-transformers
⚠️ 注意:安装前确保你已经安装了 PyTorch,否则可以使用
torch
extra:
pip install sentence-transformers[torch]
🧪 使用示例
示例1:加载模型并编码句子
from sentence_transformers import SentenceTransformer# 加载预训练模型(首次运行会自动下载)
model = SentenceTransformer('all-MiniLM-L6-v2')# 待编码的句子
sentences = ["这是一个示例句子。","另一个句子用来测试。","这两句话看起来不太一样。"
]# 编码成向量(每个句子变成一个固定维度的向量,如 384 维)
embeddings = model.encode(sentences)print(embeddings.shape) # (3, 384)
示例2:计算两个句子之间的余弦相似度
from sklearn.metrics.pairwise import cosine_similarity# 计算相似度矩阵
similarity_matrix = cosine_similarity(embeddings)print(similarity_matrix)
输出是一个 3x3 的矩阵,显示每对句子之间的语义相似度(值范围在 [0, 1] 之间)。
示例3:使用 GPU 加速推理
import torchdevice = 'cuda' if torch.cuda.is_available() else 'cpu'
model.to(device)embeddings = model.encode(sentences, device=device)
🌐 支持的模型(推荐)
你可以从 HuggingFace Model Hub 上选择不同类型的模型,以下是几个常用的:
模型名称 | 特点 |
---|---|
all-MiniLM-L6-v2 | 轻量级,速度快,适合大多数通用任务 |
paraphrase-MiniLM-L3-v2 | 更小,适合资源受限环境 |
all-mpnet-base-v2 | 高性能版本,效果更好但稍慢 |
multi-qa-mpnet-base-dot-v1 | 适用于问答、检索任务 |
distiluse-base-multilingual-cased-v1 | 支持 50+ 种语言,适合多语言场景 |
LaBSE | 支持 109 种语言,适合跨语言检索 |
🛠️ 自定义训练模型(进阶)
如果你有自己的语义匹配任务(如问答、对话理解),可以使用 sentence-transformers
提供的训练框架进行 fine-tune:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader# 构建训练样本
train_examples = [InputExample(texts=["春天来了", "天气变暖了"], label=0.8),InputExample(texts=["我爱中国", "我是中国人"], label=0.9),...
]# 创建数据加载器
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)# 加载模型
model = SentenceTransformer('bert-base-chinese')# 使用余弦相似度损失函数
train_loss = losses.CosineSimilarityLoss(model)# 开始训练
model.fit(train_objectives=[(train_dataloader, train_loss)],epochs=3,output_path='./my_model/'
)
🔍 常见结合使用的库
库名 | 作用 |
---|---|
faiss | 快速构建高维向量索引,用于语义搜索 |
annoy | 近似最近邻搜索,适合内存有限的设备 |
pandas | 处理大规模文本数据 |
transformers | 获取原始 Transformer 模型 |
scikit-learn | 聚类、降维等后处理 |
✅ 总结
功能 | 描述 |
---|---|
中文支持 | ✔️(需使用中文预训练模型) |
多语言支持 | ✔️(部分模型支持 50~109 种语言) |
易用性 | ✔️(API 简洁清晰) |
可扩展性 | ✔️(可自定义训练、结合其他库) |
推荐应用场景 | 语义搜索、文本聚类、相似度判断、信息检索 |
如果你正在做以下工作,建议使用 sentence-transformers
:
- 想要做语义级别的文本匹配
- 不想手动写特征工程
- 想快速部署一个语义搜索引擎
- 想要在无标签情况下做文本聚类分析