huggingface/sentence-transformers
GitHub: huggingface/sentence-transformers
一个用于计算高质量文本 Embedding、执行语义检索与结果重排序的 PyTorch 框架,支持海量预训练模型的调用与自定义微调。
Stars: 18910 | Forks: 2826
[](https://huggingface.co/models?library=sentence-transformers)
[][#github-license]
[][#pypi-package]
[][#pypi-package]
[][#docs-package]
# Sentence Transformers:Embeddings、检索和重排序
该框架提供了一种简单的方法来计算 embeddings,以便访问、使用和训练最先进的 embedding 和 reranker 模型。它可以用于使用 Sentence Transformer 模型计算 embeddings([快速入门](https://sbert.net/docs/quickstart.html#sentence-transformer)),使用 Cross-Encoder(又名 reranker)模型计算相似度得分([快速入门](https://sbert.net/docs/quickstart.html#cross-encoder))或使用 Sparse Encoder 模型生成稀疏 embeddings([快速入门](https://sbert.net/docs/quickstart.html#sparse-encoder))。这解锁了广泛的应用场景,包括[语义搜索](https://sbert.net/examples/applications/semantic-search/README.html)、[语义文本相似度](https://sbert.net/docs/sentence_transformer/usage/semantic_textual_similarity.html)和[释义挖掘](https://sbert.net/examples/applications/paraphrase-mining/README.html)。
🤗 Hugging Face 上提供了超过 [15,000 个预训练的 Sentence Transformers 模型](https://huggingface.co/models?library=sentence-transformers)供您直接使用,其中包括许多来自 [Massive Text Embeddings Benchmark (MTEB) 排行榜](https://huggingface.co/spaces/mteb/leaderboard)的最先进模型。此外,使用 Sentence Transformers 可以轻松训练或微调您自己的 [embedding 模型](https://sbert.net/docs/sentence_transformer/training_overview.html)、[reranker 模型](https://sbert.net/docs/cross_encoder/training_overview.html)或[稀疏编码器模型](https://sbert.net/docs/sparse_encoder/training_overview.html),使您能够为特定的使用场景创建自定义模型。
有关**完整文档**,请参阅 **[www.SBERT.net](https://www.sbert.net)**。
## 安装说明
我们推荐使用 **Python 3.10+**、**[PyTorch 1.11.0+](https://pytorch.org/get-started/locally/)** 和 **[transformers v4.41.0+](https://github.com/huggingface/transformers)**。
```
pip install -U sentence-transformers
```
有关 uv、conda、源码和可编辑安装、CUDA 设置以及扩展依赖(`[image]`、`[audio]`、`[video]`、`[train]`、`[onnx]`、`[openvino]`、`[dev]`),请参阅文档中的[安装说明](https://www.sbert.net/docs/installation.html)。
## 快速入门
请参阅我们文档中的[快速入门](https://www.sbert.net/docs/quickstart.html)。
### Embedding 模型
首先下载一个预训练的 embedding 模型,即 Sentence Transformer 模型。
```
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/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)
```
这样就完成了。我们现在有了包含 embeddings 的 numpy 数组,每个文本对应一个。我们可以使用它们来计算相似度。
```
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]])
```
### Reranker 模型
首先下载一个预训练的 reranker 模型,即 Cross-Encoder 模型。
```
from sentence_transformers import CrossEncoder
# 1. 加载预训练的 CrossEncoder 模型
model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")
```
然后向模型提供一些文本。
```
# 需要预测相似度分数的文本
query = "How many people live in Berlin?"
passages = [
"Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.",
"Berlin has a yearly total of about 135 million day visitors, making it one of the most-visited cities in the European Union.",
"In 2013 around 600,000 Berliners were registered in one of the more than 2,300 sport and fitness clubs.",
]
# 2a. 预测文本对的分数
scores = model.predict([(query, passage) for passage in passages])
print(scores)
# => [8.607139 5.506266 6.352977]
```
我们准备就绪了。您也可以使用 [`model.rank`](https://sbert.net/docs/package_reference/cross_encoder/cross_encoder.html#sentence_transformers.cross_encoder.model.CrossEncoder.rank) 来避免手动执行重排序:
```
# 2b. 为一个 query 对 passages 列表进行排序
ranks = model.rank(query, passages, return_documents=True)
print("Query:", query)
for rank in ranks:
print(f"- #{rank['corpus_id']} ({rank['score']:.2f}): {rank['text']}")
"""
Query: How many people live in Berlin?
- #0 (8.61): Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.
- #2 (6.35): In 2013 around 600,000 Berliners were registered in one of the more than 2,300 sport and fitness clubs.
- #1 (5.51): Berlin has a yearly total of about 135 million day visitors, making it one of the most-visited cities in the European Union.
"""
```
### Sparse Encoder 模型
首先下载一个预训练的稀疏 embedding 模型,即 Sparse Encoder 模型。
```
from sentence_transformers import SparseEncoder
# 1. 加载预训练的 SparseEncoder 模型
model = SparseEncoder("naver/splade-cocondenser-ensembledistil")
# 需要编码的句子
sentences = [
"The weather is lovely today.",
"It's so sunny outside!",
"He drove to the stadium.",
]
# 2. 通过调用 model.encode() 计算稀疏 embeddings
embeddings = model.encode(sentences)
print(embeddings.shape)
# [3, 30522] - 具有 vocabulary size 维度的稀疏表示
# 3. 计算 embedding 相似度
similarities = model.similarity(embeddings, embeddings)
print(similarities)
# tensor([[ 35.629, 9.154, 0.098],
# [ 9.154, 27.478, 0.019],
# [ 0.098, 0.019, 29.553]])
# 4. 检查 sparsity 统计信息
stats = SparseEncoder.sparsity(embeddings)
print(f"Sparsity: {stats['sparsity_ratio']:.2%}")
# Sparsity: 99.84%
```
## 预训练模型
我们提供了涵盖 100 多种语言的大型预训练模型列表。一些模型是通用模型,而另一些模型则针对特定使用场景生成 embeddings。
- [预训练的 Sentence Transformer (Embedding) 模型](https://sbert.net/docs/sentence_transformer/pretrained_models.html)
- [预训练的 Cross Encoder (Reranker) 模型](https://sbert.net/docs/cross_encoder/pretrained_models.html)
- [预训练的 Sparse Encoder (稀疏 Embeddings) 模型](https://sbert.net/docs/sparse_encoder/pretrained_models.html)
## 训练
该框架允许您微调自己的句子 embedding 方法,从而获得针对特定任务的句子 embeddings。为了针对您的特定任务获得完美的句子 embeddings,您可以选择多种选项。
- Embedding 模型
- [Sentence Transformer > 训练概述](https://www.sbert.net/docs/sentence_transformer/training_overview.html)
- [Sentence Transformer > 训练示例](https://www.sbert.net/docs/sentence_transformer/training/examples.html) 或 [GitHub 上的训练示例](https://github.com/huggingface/sentence-transformers/tree/main/examples/sentence_transformer/training)。
- Reranker 模型
- [Cross Encoder > 训练概述](https://www.sbert.net/docs/cross_encoder/training_overview.html)
- [Cross Encoder > 训练示例](https://www.sbert.net/docs/cross_encoder/training/examples.html) 或 [GitHub 上的训练示例](https://github.com/huggingface/sentence-transformers/tree/main/examples/cross_encoder/training)。
- 稀疏 Embedding 模型
- [Sparse Encoder > 训练概述](https://www.sbert.net/docs/sparse_encoder/training_overview.html)
- [Sparse Encoder > 训练示例](https://www.sbert.net/docs/sparse_encoder/training/examples.html) 或 [GitHub 上的训练示例](https://github.com/huggingface/sentence-transformers/tree/main/examples/sparse_encoder/training))。
不同类型训练中的一些亮点包括:
## 配套博客文章
以下 Hugging Face 博客文章以叙述性讲解和完整的训练示例对本文档进行了补充:
**训练指南:**
- [训练和微调 Embedding 模型](https://huggingface.co/blog/train-sentence-transformers):双编码器 embedding 模型的端到端训练。
- [训练和微调 Reranker 模型](https://huggingface.co/blog/train-reranker):为检索和重排序 pipeline 的第二阶段训练 Cross Encoder 模型。
- [训练和微调稀疏 Embedding 模型](https://huggingface.co/blog/train-sparse-encoder):训练 SPLADE 和其他稀疏编码器。
**多模态:**
- [多模态 Embedding 和 Reranker 模型](https://huggingface.co/blog/multimodal-sentence-transformers):通过单一 API 使用文本、图像、音频和视频模型。
- [训练和微调多模态 Embedding 和 Reranker 模型](https://huggingface.co/blog/train-multimodal-sentence-transformers):训练多模态模型,并包含视觉文档检索的实战讲解。
**效率技术:**
- [Matryoshka Embedding 模型简介](https://huggingface.co/blog/matryoshka):可变大小的 embeddings,在质量几乎无损的情况下可被截断。
- [训练速度提升 400 倍的静态 Embedding 模型](https://huggingface.co/blog/static-embeddings):没有 attention 机制且对 CPU 友好的 embedding 模型。
- [二值和标量 Embedding 量化:实现更快、更省成本的检索](https://huggingface.co/blog/embedding-quantization):对 embedding 向量进行训练后压缩。
## 应用示例
您可以将此框架用于:
- **计算句子 Embeddings**
- [稠密 Embeddings](https://www.sbert.net/examples/sentence_transformer/applications/computing-embeddings/README.html)
- [稀疏 Embeddings](https://www.sbert.net/examples/sparse_encoder/applications/computing_embeddings/README.html)
- **语义文本相似度**
- [稠密 STS](https://www.sbert.net/docs/sentence_transformer/usage/semantic_textual_similarity.html)
- [稀疏 STS](https://www.sbert.net/examples/sparse_encoder/applications/semantic_textual_similarity/README.html)
- **语义搜索**
- [稠密搜索](https://www.sbert.net/examples/sentence_transformer/applications/semantic-search/README.html)
- [稀疏搜索](https://www.sbert.net/examples/sparse_encoder/applications/semantic_search/README.html)
- **检索和重排序**
- [仅稠密检索](https://www.sbert.net/examples/sentence_transformer/applications/retrieve_rerank/README.html)
- [稀疏/稠密/混合检索](https://www.sbert.net/examples/sentence_transformer/applications/retrieve_rerank/README.html)
- [聚类](https://www.sbert.net/examples/sentence_transformer/applications/clustering/README.html)
- [释义挖掘](https://www.sbert.net/examples/sentence_transformer/applications/paraphrase-mining/README.html)
- [翻译句子挖掘](https://www.sbert.net/examples/sentence_transformer/applications/parallel-sentence-mining/README.html)
- [多语言图像搜索、聚类和重复检测](https://www.sbert.net/examples/sentence_transformer/applications/image-search/README.html)
以及更多应用场景。
有关所有示例,请参阅 [examples/sentence_transformer/applications](https://github.com/huggingface/sentence-transformers/tree/main/examples/sentence_transformer/applications)。
## 开发环境配置
将代码库(或 fork)克隆到您的机器上后,在虚拟环境中运行:
```
python -m pip install -e ".[dev]"
pre-commit install
```
要测试您的更改,请运行:
```
pytest
```
## 引用与作者
如果您觉得此代码库对您有帮助,欢迎引用我们的出版物 [Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks](https://huggingface.co/papers/1908.10084):
```
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084",
}
```
如果您使用了其中一个多语言模型,欢迎引用我们的出版物 [Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation](https://huggingface.co/papers/2004.09813):
```
@inproceedings{reimers-2020-multilingual-sentence-bert,
title = "Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2020",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/2004.09813",
}
```
有关集成到 SentenceTransformers 中的不同出版物,请查阅[出版物](https://www.sbert.net/docs/publications.html)。
### 维护者
维护者:[Tom Aarsen](https://github.com/tomaarsen),🤗 Hugging Face
如果出现故障(且本不应发生)或您有进一步的问题,请随时提出 issue。
该项目最初由 TU Darmstadt 的 [Ubiquitous Knowledge Processing (UKP) 实验室](https://www.ukp.tu-darmstadt.de/)开发。我们对他们的基础性工作以及对该领域的持续贡献表示感激。
标签:Apex, CNCF毕业项目, Python, 凭据扫描, 文本嵌入, 无后门, 机器学习, 语义搜索, 逆向工具, 重排序