sentence-transformers について
Transformerモデルで文やテキストの埋め込みを生成する、Python開発者向けフレームワークです。セマンティック検索、類似度計算、ファインチューニング、多言語埋め込みに対応します。
主な機能
- 01文やテキストの埋め込み生成
- 02セマンティック類似度の計算
- 03テキストのバッチエンコード
- 04埋め込みモデルのファインチューニング
- 05多言語モデルの利用
活用シーン
- 01RAG向け埋め込みの生成
- 02セマンティック検索の構築
- 03テキストのクラスタリングや分類
- 04埋め込みモデルのローカル実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --skill sentence-transformersインストール後、Claude Code で/sentence-transformersを入力して読み込まれたか確認します。
同梱ファイルreferences/models.md
詳細
Sentence Transformers - 最先端の埋め込み
トランスフォーマーを使用した文およびテキストの埋め込みのための Python フレームワークです。
Sentence Transformers を使用するタイミング
以下の場合に使用します:
- RAG 向けの高品質な埋め込みが必要な場合
- 意味的類似性と検索
- テキストのクラスタリングと分類
- 多言語埋め込み(100 以上の言語)
- 埋め込みをローカルで実行する場合(API 不要)
- OpenAI の埋め込みに対するコスト効率の良い代替手段が必要な場合
Metrics:
- 15,700+ GitHub stars
- 5000+ 事前学習済みモデル
- 100+ 言語 に対応
- PyTorch/Transformers ベース
代わりに以下の代替手段を使用してください:
- OpenAI Embeddings: API ベースで、最高品質が必要な場合
- Instructor: タスク固有の指示が必要な場合
- Cohere Embed: マネージドサービス
クイックスタート
インストール
pip install sentence-transformers
基本的な使い方
from sentence_transformers import SentenceTransformer
# Load model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Generate embeddings
sentences = [
"This is an example sentence",
"Each sentence is converted to a vector"
]
embeddings = model.encode(sentences)
print(embeddings.shape) # (2, 384)
# Cosine similarity
from sentence_transformers.util import cos_sim
similarity = cos_sim(embeddings[0], embeddings[1])
print(f"Similarity: {similarity.item():.4f}")
人気のモデル
汎用
# Fast, good quality (384 dim)
model = SentenceTransformer('all-MiniLM-L6-v2')
# Better quality (768 dim)
model = SentenceTransformer('all-mpnet-base-v2')
# Best quality (1024 dim, slower)
model = SentenceTransformer('all-roberta-large-v1')
多言語
# 50+ languages
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 100+ languages
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
ドメイン特化
# Legal domain
model = SentenceTransformer('nlpaueb/legal-bert-base-uncased')
# Scientific papers
model = SentenceTransformer('allenai/specter')
# Code
model = SentenceTransformer('microsoft/codebert-base')
意味的検索
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('all-MiniLM-L6-v2')
# Corpus
corpus = [
"Python is a programming language",
"Machine learning uses algorithms",
"Neural networks are powerful"
]
# Encode corpus
corpus_embeddings = model.encode(corpus, convert_to_tensor=True)
# Query
query = "What is Python?"
query_embedding = model.encode(query, convert_to_tensor=True)
# Find most similar
hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=3)
print(hits)
類似度の計算
# Cosine similarity
similarity = util.cos_sim(embedding1, embedding2)
# Dot product
similarity = util.dot_score(embedding1, embedding2)
# Pairwise cosine similarity
similarities = util.cos_sim(embeddings, embeddings)
バッチエンコーディング
# Efficient batch processing
sentences = ["sentence 1", "sentence 2", ...] * 1000
embeddings = model.encode(
sentences,
batch_size=32,
show_progress_bar=True,
convert_to_tensor=False # or True for PyTorch tensors
)
ファインチューニング
from sentence_transformers import InputExample, losses
from torch.utils.data import DataLoader
# Training data
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)
# Loss function
train_loss = losses.CosineSimilarityLoss(model)
# Train
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=10,
warmup_steps=100
)
# Save
model.save('my-finetuned-model')
LangChain 統合
from langchain_community.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2"
)
# Use with vector stores
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
# Use in index
index = VectorStoreIndex.from_documents(documents)
モデル選択ガイド
| Model | Dimensions | Speed | Quality | Use Case |
|---|---|---|---|---|
| all-MiniLM-L6-v2 | 384 | Fast | Good | General, prototyping |
| all-mpnet-base-v2 | 768 | Medium | Better | Production RAG |
| all-roberta-large-v1 | 1024 | Slow | Best | High accuracy needed |
| paraphrase-multilingual | 768 | Medium | Good | Multilingual |
ベストプラクティス
- all-MiniLM-L6-v2 から始める - 良好なベースライン
- 埋め込みを正規化する - コサイン類似度に適している
- 利用可能であれば GPU を使用する - エンコーディングが 10 倍高速
- バッチエンコーディングを使用する - より効率的
- 埋め込みをキャッシュする - 再計算のコストが高い
- ドメイン向けにファインチューニングする - 品質が向上
- 異なるモデルを試す - 品質はタスクによって異なる
- メモリを監視する - 大規模なモデルはより多くの RAM が必要
パフォーマンス
| Model | Speed (sentences/sec) | Memory | Dimension |
|---|---|---|---|
| MiniLM | ~2000 | 120MB | 384 |
| MPNet | ~600 | 420MB | 768 |
| RoBERTa | ~300 | 1.3GB | 1024 |
リソース
- GitHub: https://github.com/UKPLab/sentence-transformers ⭐ 15,700+
- Models: https://huggingface.co/sentence-transformers
- Docs: https://www.sbert.net
- License: Apache 2.0
コメント
Markdown 対応