Python sentence_transformers 庫的作用(生成句子、段落或圖像的高質(zhì)量嵌入(embeddings))
sentence_transformers 是一個用于生成句子、段落或圖像的高質(zhì)量嵌入(embeddings)的 Python 庫,基于 Hugging Face 的 transformers 庫。它通過預(yù)訓(xùn)練的 Transformer 模型(如 BERT、RoBERTa、DistilBERT 等)生成固定長度的密集向量表示,廣泛應(yīng)用于自然語言處理(NLP)任務(wù),如語義搜索、文本相似性比較、聚類、釋義挖掘等。以下是對 sentence_transformers 庫的詳細(xì)說明。
1.sentence_transformers 庫的作用
- 生成嵌入:將文本(句子、段落)或圖像編碼為固定長度的向量(嵌入),表示語義信息。
- 高效任務(wù)支持:支持語義文本相似性(STS)、語義搜索、聚類、問答檢索、圖像搜索等任務(wù)。
- 多語言支持:提供超過 100 種語言的預(yù)訓(xùn)練模型,適合多語言應(yīng)用。
- 易于微調(diào):允許用戶基于特定任務(wù)微調(diào)模型,生成任務(wù)特定的嵌入。
- 跨模態(tài)支持:支持文本和圖像嵌入到同一向量空間(如 CLIP 模型)。
2.安裝與環(huán)境要求
根據(jù)官方文檔,推薦以下環(huán)境:
- Python 版本:3.9 或更高。
- 依賴庫:
- PyTorch 1.11.0+(支持 GPU 需安裝對應(yīng) CUDA 版本)。
transformers4.34.0+。
- 安裝命令:
pip install sentence-transformers
- 可選擴展:
- ONNX/OpenVINO:用于推理優(yōu)化和量化。
- 訓(xùn)練支持:
pip install sentence-transformers[train] - GPU 支持:確保安裝與 CUDA 版本匹配的 PyTorch。
注意:若需 GPU 加速,需根據(jù)系統(tǒng) CUDA 版本安裝 PyTorch,參考 PyTorch 官方指南。
3.核心功能與用法
sentence_transformers 提供兩種主要模型類型:SentenceTransformer(用于生成嵌入)和 CrossEncoder(用于重新排序或相似性評分)。
3.1SentenceTransformer:生成嵌入
SentenceTransformer 將文本編碼為固定長度的向量,適合語義搜索、相似性比較等任務(wù)。
基本用法:
from sentence_transformers import SentenceTransformer
# 加載預(yù)訓(xùn)練模型
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是一個輕量高效的預(yù)訓(xùn)練模型,生成 384 維嵌入。 model.encode()將文本轉(zhuǎn)換為嵌入(numpy 數(shù)組或 tensor)。model.similarity()計算嵌入之間的余弦相似度(或其他相似性度量)。
帶提示(Prompt)的高級用法:
某些模型支持在推理時添加提示以優(yōu)化性能,例如查詢嵌入:
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.2CrossEncoder:重新排序
CrossEncoder 用于對句子對進行直接評分,適合需要高精度的任務(wù)(如檢索重排序)。
用法:
from sentence_transformers import CrossEncoder
# 加載預(yù)訓(xùn)練 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](示例分?jǐn)?shù))說明:
CrossEncoder直接處理句子對,輸出相似性分?jǐn)?shù)(通常 0 到 1)。- 適合需要高精度的場景,但計算成本高于
SentenceTransformer。
4.預(yù)訓(xùn)練模型
sentence_transformers 提供超過 10,000 個預(yù)訓(xùn)練模型,托管在 Hugging Face Hub,覆蓋以下類型:
- 通用嵌入模型:如
all-MiniLM-L6-v2(輕量)、all-mpnet-base-v2(高性能)。 - 多語言模型:如
distiluse-base-multilingual-cased-v2,支持 100+ 語言。 - 領(lǐng)域特定模型:如
multi-qa-MiniLM-L6-cos-v1(問答)、paraphrase-MiniLM-L6-v2(釋義)。 - 跨模態(tài)模型:如 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.微調(diào)與訓(xùn)練
sentence_transformers 支持微調(diào)模型以適應(yīng)特定任務(wù),提供多種損失函數(shù)和訓(xùn)練方式。
5.1訓(xùn)練示例
以下是一個微調(diào)模型的示例,用于語義文本相似性任務(wù):
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
# 加載模型
model = SentenceTransformer("all-MiniLM-L6-v2")
# 準(zhǔn)備訓(xùn)練數(shù)據(jù)
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)
# 定義損失函數(shù)
train_loss = losses.CosineSimilarityLoss(model)
# 訓(xùn)練模型
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=1,
warmup_steps=100
)
# 保存模型
model.save("finetuned_model")說明:
InputExample定義訓(xùn)練樣本,包含句子對和標(biāo)簽(如相似性分?jǐn)?shù))。CosineSimilarityLoss優(yōu)化嵌入之間的余弦相似度。model.fit執(zhí)行訓(xùn)練,支持多任務(wù)學(xué)習(xí)。
5.2支持的損失函數(shù)
sentence_transformers.losses 提供多種損失函數(shù),包括:
- CosineSimilarityLoss:優(yōu)化句子對的余弦相似度。
- TripletLoss:基于三元組(錨點、正例、負(fù)例)優(yōu)化。
- SoftmaxLoss:用于分類任務(wù)(如 NLI)。
- MultipleNegativesRankingLoss:適合無監(jiān)督或弱監(jiān)督訓(xùn)練。
5.3訓(xùn)練提示
- 數(shù)據(jù)集:可使用 Hugging Face 數(shù)據(jù)集(如 STS-B、SNLI)或自定義數(shù)據(jù)。
- 提示(Prompt):支持在訓(xùn)練和推理時添加提示以提升性能。
- PEFT 支持:自 v3.3.0 起支持參數(shù)高效微調(diào)(Parameter-Efficient Fine-Tuning)。
- NanoBEIR 評估:用于快速評估信息檢索性能。
6.性能優(yōu)化
- ONNX/OpenVINO:使用 ONNX 或 OpenVINO 后端進行推理優(yōu)化和量化。
pip install sentence-transformers[onnx]
- CPU 加速:v3.3.0 引入 OpenVINO int8 量化,CPU 推理速度提升 4.5 倍。
- GPU 加速:確保 PyTorch 支持 CUDA。
- 批量處理:
model.encode(sentences, batch_size=32)優(yōu)化內(nèi)存和速度。 - 緩存嵌入:預(yù)計算并存儲常用文本的嵌入,減少重復(fù)計算。
7.實際應(yīng)用場景
- 語義搜索:
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查找語料庫中的釋義。 - 跨模態(tài)搜索:使用 CLIP 模型實現(xiàn)文本-圖像搜索。
- 問答系統(tǒng):結(jié)合 CrossEncoder 進行檢索和重排序。
8.與 LangChain 集成
sentence_transformers 常與 LangChain 結(jié)合,用于構(gòu)建基于語義的應(yīng)用程序(如聊天機器人、文檔檢索):
from sentence_transformers import SentenceTransformer from langchain.vectorstores import FAISS from langchain.embeddings import HuggingFaceEmbeddings # 初始化嵌入模型 embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") # 創(chuàng)建向量存儲 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 下載,需確保網(wǎng)絡(luò)連接或預(yù)先下載模型。
- 離線使用:保存模型到本地路徑以支持無網(wǎng)絡(luò)環(huán)境。
- 版本兼容性:定期檢查
sentence-transformers的版本更新(如 v3.3.0 引入了多項優(yōu)化)。 - 多語言模型:選擇多語言模型時,需引用相關(guān)論文以確保學(xué)術(shù)規(guī)范。
10.綜合示例
以下是一個綜合示例,結(jié)合嵌入生成、相似性計算和 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)
# 獲取初步檢索結(jié)果
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)
# 輸出結(jié)果
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.資源與文檔
- 官方文檔:https://www.sbert.net/
- GitHub 倉庫:https://github.com/UKPLab/sentence-transformers
- Hugging Face 模型:https://huggingface.co/models?library=sentence-transformers
- 論文引用:
- SBERT: Reimers, N., & Gurevych, I. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks.
- 多語言模型: Reimers, N., & Gurevych, I. (2020). Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation.
到此這篇關(guān)于Python sentence_transformers 庫的作用(生成句子、段落或圖像的高質(zhì)量嵌入(embeddings))的文章就介紹到這了,更多相關(guān)Python sentence_transformers 庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Flask 請求數(shù)據(jù)獲取響應(yīng)詳解
這篇文章主要介紹了Python Flask請求數(shù)據(jù)獲取響應(yīng)的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-10-10
Python+Scipy實現(xiàn)自定義任意的概率分布
Scipy自帶了多種常見的分布,如正態(tài)分布、均勻分布、二項分布、多項分布、伽馬分布等等,還可以自定義任意的概率分布。本文將為大家介紹如何利用Scipy自定義任意的概率分布,感興趣的可以了解下2022-08-08
python?AutoViz庫一行代碼實現(xiàn)可視化數(shù)據(jù)集
這篇文章主要介紹了python?AutoViz庫一行代碼實現(xiàn)可視化數(shù)據(jù)集實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
python實現(xiàn)程序重啟和系統(tǒng)重啟方式
這篇文章主要介紹了python實現(xiàn)程序重啟和系統(tǒng)重啟方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python使用pandas將表格數(shù)據(jù)進行處理
這篇文章主要介紹了Python使用pandas將表格數(shù)據(jù)進行處理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-08-08

