name: sentence-transformers description: 用于最先进的句子、文本和图像嵌入的框架。提供5000多个预训练模型,用于语义相似度、聚类和检索。支持多语言、领域特定和多模态模型。用于为RAG、语义搜索或相似度任务生成嵌入。最适合生产嵌入生成。 version: 1.0.0 author: Orchestra Research license: MIT tags: [Sentence Transformers, Embeddings, Semantic Similarity, RAG, Multilingual, Multimodal, Pre-Trained Models, Clustering, Semantic Search, Production] dependencies: [sentence-transformers, transformers, torch]
Sentence Transformers - 最先进的嵌入
用于句子和文本嵌入的Python框架,使用变换器。
何时使用 Sentence Transformers
使用时机:
- 需要高质量的嵌入用于RAG
- 语义相似度和搜索
- 文本聚类和分类
- 多语言嵌入(100多种语言)
- 本地运行嵌入(无API)
- 成本效益高的OpenAI嵌入替代方案
指标:
- 15,700+ GitHub星标
- 5000+ 预训练模型
- 支持100+ 语言
- 基于PyTorch/Transformers
使用替代方案:
- OpenAI Embeddings:需要基于API的最高质量
- Instructor:任务特定指令
- Cohere Embed:托管服务
快速开始
安装
pip install sentence-transformers
基本用法
from sentence_transformers import SentenceTransformer
# 加载模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 生成嵌入
sentences = [
"This is an example sentence",
"Each sentence is converted to a vector"
]
embeddings = model.encode(sentences)
print(embeddings.shape) # (2, 384)
# 余弦相似度
from sentence_transformers.util import cos_sim
similarity = cos_sim(embeddings[0], embeddings[1])
print(f"Similarity: {similarity.item():.4f}")
流行模型
通用目的
# 快速,质量好(384维度)
model = SentenceTransformer('all-MiniLM-L6-v2')
# 质量更好(768维度)
model = SentenceTransformer('all-mpnet-base-v2')
# 最佳质量(1024维度,较慢)
model = SentenceTransformer('all-roberta-large-v1')
多语言
# 50+ 语言
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 100+ 语言
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
领域特定
# 法律领域
model = SentenceTransformer('nlpaueb/legal-bert-base-uncased')
# 科学论文
model = SentenceTransformer('allenai/specter')
# 代码
model = SentenceTransformer('microsoft/codebert-base')
语义搜索
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('all-MiniLM-L6-v2')
# 语料库
corpus = [
"Python is a programming language",
"Machine learning uses algorithms",
"Neural networks are powerful"
]
# 编码语料库
corpus_embeddings = model.encode(corpus, convert_to_tensor=True)
# 查询
query = "What is Python?"
query_embedding = model.encode(query, convert_to_tensor=True)
# 查找最相似
hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=3)
print(hits)
相似度计算
# 余弦相似度
similarity = util.cos_sim(embedding1, embedding2)
# 点积
similarity = util.dot_score(embedding1, embedding2)
# 成对余弦相似度
similarities = util.cos_sim(embeddings, embeddings)
批量编码
# 高效的批量处理
sentences = ["sentence 1", "sentence 2", ...] * 1000
embeddings = model.encode(
sentences,
batch_size=32,
show_progress_bar=True,
convert_to_tensor=False # 或 True 用于PyTorch张量
)
微调
from sentence_transformers import InputExample, losses
from torch.utils.data import DataLoader
# 训练数据
train_examples = [
InputExample(texts=['sentence 1', 'sentence 2'], label=0.8),
InputExample(texts=['sentence 3', 'sentence 4'], label=0.3),
]
train_dataloader = DataLoader(train_examples, batch_size=16)
# 损失函数
train_loss = losses.CosineSimilarityLoss(model)
# 训练
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=10,
warmup_steps=100
)
# 保存
model.save('my-finetuned-model')
LangChain集成
from langchain_community.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2"
)
# 用于向量存储
from langchain_chroma import Chroma
vectorstore = Chroma.from_documents(
documents=docs,
embedding=embeddings
)
LlamaIndex集成
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(
model_name="sentence-transformers/all-mpnet-base-v2"
)
from llama_index.core import Settings
Settings.embed_model = embed_model
# 用于索引
index = VectorStoreIndex.from_documents(documents)
模型选择指南
| 模型 | 维度 | 速度 | 质量 | 使用场景 |
|---|---|---|---|---|
| all-MiniLM-L6-v2 | 384 | 快 | 好 | 通用,原型制作 |
| all-mpnet-base-v2 | 768 | 中 | 更好 | 生产RAG |
| all-roberta-large-v1 | 1024 | 慢 | 最佳 | 需要高精度 |
| paraphrase-multilingual | 768 | 中 | 好 | 多语言 |
最佳实践
- 从all-MiniLM-L6-v2开始 - 好的基线
- 归一化嵌入 - 更好的余弦相似度
- 使用GPU(如可用) - 编码快10倍
- 批量编码 - 更高效
- 缓存嵌入 - 重新计算昂贵
- 为领域微调 - 提高质量
- 测试不同模型 - 质量因任务而异
- 监控内存 - 大型模型需要更多RAM
性能
| 模型 | 速度(句子/秒) | 内存 | 维度 |
|---|---|---|---|
| MiniLM | ~2000 | 120MB | 384 |
| MPNet | ~600 | 420MB | 768 |
| RoBERTa | ~300 | 1.3GB | 1024 |
资源
- GitHub: https://github.com/UKPLab/sentence-transformers ⭐ 15,700+
- 模型: https://huggingface.co/sentence-transformers
- 文档: https://www.sbert.net
- 许可证: Apache 2.0