sentence-transformers について
Transformer モデルで文やテキストの埋め込みを生成する Python フレームワークです。セマンティック検索、RAG、クラスタリング、分類のワークフローを構築する開発者向けに、ローカルでのエンコード、多言語モデル、バッチ処理、ファインチューニングを提供します。
主な機能
- 01文やテキストの埋め込み生成
- 02多言語埋め込みモデルへの対応
- 03セマンティック類似度の計算
- 04テキストのバッチエンコード
- 05モデルのファインチューニング
活用シーン
- 01RAG 用の埋め込み生成
- 02セマンティック検索の構築
- 03テキストのクラスタリングや分類
- 04多言語テキストのローカルエンコード
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill sentence-transformersインストール後、Claude Code で/sentence-transformersを入力して読み込まれたか確認します。
同梱ファイルreferences/models.md
詳細
Sentence Transformers - 最先端の埋め込み
Transformers を使用した、文やテキストの埋め込み向け Python フレームワークです。
Sentence Transformers を使う場面
次の用途に適しています:
- RAG 向けに高品質な埋め込みが必要な場合
- 意味的類似性と検索
- テキストのクラスタリングと分類
- 多言語埋め込み(100 以上の言語)
- 埋め込みをローカルで実行する場合(API 不要)
- OpenAI の埋め込みに代わる、コスト効率の高い選択肢
指標:
- 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)
モデル選択ガイド
| モデル | 次元数 | 速度 | 品質 | 用途 |
|---|---|---|---|---|
| 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
エージェントの運用手順
- 環境を確認します。 コーパス、埋め込みモデル、ベクトルストアのバージョンと、インデックスの保存場所を確認します。
- 入力を特定します。 データまたはユーザーに、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
- まず小規模に実行します。 小さなサブセットにインデックスを作成し、既知の質問と該当箇所のペアで検索をテストします。
- 上記の手順と参考情報に従って、タスク全体を実行します。
- 結果を検証します。 ラベル付きデータセットで recall@k を測定し、回答が検索された該当箇所のみを引用していることを確認します。
- 報告します。 実行内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の事項を明記します。
| 次のことが起きた場合 | 対応方法 |
|---|---|
| 検索で無関係なチャンクが返される | チャンク分割を見直す、BM25/ハイブリッド検索を追加する、または生成器を変更する前に再ランキングします。 |
| これらの手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンにない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して対応し、ユーザーに伝えます。APIを捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧である | ユーザーに確認するか、実行前に前提を明示します。 |
整合性に関するルール
- 結果、パラメーター、識別子、引用、統計情報を捏造してはいけません。実行または検証できない場合は、その旨を明確に伝えます。
- 回答は検索されたテキストに基づいて作成します。コーパスに回答が含まれていない場合は、その旨を伝えます。
- ここに記載されたバージョン固有の詳細は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する操作、共有GPUやクラウドのクォータを消費する操作、個人データや患者データに触れる操作、または取り消せない操作を行う前に、ユーザーに確認します。
関連スキル
chroma:AIアプリケーション向けのオープンソース埋め込みデータベースです。pinecone:PythonクライアントとLangChainおよびLlamaIndexの統合機能を通じて、マネージド型のサーバーレスベクトルデータベースであるPineconeを使用する方法を説明します。qdrant-vector-search:RAGとセマンティック検索向けの高性能なベクトル類似性検索エンジンです。
コメント
Markdown 対応