huggingface/sentence-transformers

GitHub: huggingface/sentence-transformers

一个用于计算高质量文本 Embedding、执行语义检索与结果重排序的 PyTorch 框架,支持海量预训练模型的调用与自定义微调。

Stars: 18910 | Forks: 2826

[![HF 模型](https://img.shields.io/badge/%F0%9F%A4%97-models-yellow)](https://huggingface.co/models?library=sentence-transformers) [![GitHub - 许可证](https://img.shields.io/github/license/huggingface/sentence-transformers?logo=github&style=flat&color=green)][#github-license] [![PyPI - Python 版本](https://img.shields.io/pypi/pyversions/sentence-transformers?logo=pypi&style=flat&color=blue)][#pypi-package] [![PyPI - 包版本](https://img.shields.io/pypi/v/sentence-transformers?logo=pypi&style=flat&color=orange)][#pypi-package] [![文档 - GitHub.io](https://img.shields.io/static/v1?logo=github&style=flat&color=pink&label=docs&message=sentence-transformers)][#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, 凭据扫描, 文本嵌入, 无后门, 机器学习, 语义搜索, 逆向工具, 重排序