Sentence Transformers(SBERT)是一个基于 transformers 的 Python 框架,用于生成句子和文本嵌入向量。
用途
适用于以下场景:需要为 RAG 提供高质量嵌入;语义相似度与搜索;文本聚类与分类;多语言嵌入(100+ 语言);在本地运行嵌入(无需 API);作为 OpenAI 嵌入的成本效益替代方案。
官方给出的指标:5000+ 预训练模型,支持 100+ 语言,基于 PyTorch/Transformers。
官方建议在以下情况改用替代方案:需要基于 API 且追求最高质量时用 OpenAI Embeddings;需要任务特定指令时用 Instructor;需要托管服务时用 Cohere Embed。
主要能力
- 加载预训练模型并生成嵌入向量
- 计算余弦相似度、点积、成对余弦相似度
- 批量编码
- 语义搜索
- 微调模型
- 与 LangChain、LlamaIndex 集成
使用方式
安装:
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 时使用 GPU(编码快 10 倍);使用批量编码更高效;缓存嵌入(重新计算代价高);针对领域微调以提升质量;测试不同模型(质量因任务而异);监控内存(大模型需要更多 RAM)。
性能:
- MiniLM:约 2000 句/秒,120MB,384 维
- MPNet:约 600 句/秒,420MB,768 维
- RoBERTa:约 300 句/秒,1.3GB,1024 维
适用场景
RAG 嵌入、语义相似度与搜索、文本聚类与分类、多语言嵌入、本地嵌入运行、作为 OpenAI 嵌入的成本效益替代方案。
限制与注意事项
官方建议在需要基于 API 且追求最高质量时改用 OpenAI Embeddings,需要任务特定指令时用 Instructor,需要托管服务时用 Cohere Embed。
代理操作流程(来自资料):检查环境,确认语料、嵌入模型和向量存储版本以及索引存放位置;确定输入,确认格式、标识符和参数,对会改变结果的取值应询问而非猜测;先运行小规模版本,索引小子集并在已知问答对上测试检索;按上述说明和参考执行完整任务;验证结果,在标注集上测量 recall@k,答案仅引用检索到的段落;报告运行内容(版本、命令、参数)、已检查内容和仍不确定的内容。
故障处理:检索返回不相关片段时,重新审视分块、添加 BM25/混合搜索或在更改生成器前重排序;若说明中的函数、标志或端点在已安装版本中缺失,查阅已安装版本自身的文档(help()、--help、官方文档)并告知用户,切勿臆造 API;若必需输入、标识符或参数不明确,询问用户或在运行前明确说明假设。
完整性规则:绝不捏造结果、参数、标识符、引用或统计数据;无法运行或验证时应如实说明;答案必须来自检索文本,语料不含答案时应说明;将此处版本相关细节视为可能过时,应针对已安装版本的官方文档进行确认;在涉及花钱、消耗共享 GPU 或云配额、触及个人或患者数据、或不可撤销的操作前应先询问。
资源
GitHub:https://github.com/UKPLab/sentence-transformers (⭐ 15,700+) 模型:https://huggingface.co/sentence-transformers 文档:https://www.sbert.net 许可证:Apache 2.0
相关技能:chroma(面向 AI 应用的开源嵌入数据库);pinecone(通过 Python 客户端及 LangChain、LlamaIndex 集成使用托管无服务器向量数据库 Pinecone);qdrant-vector-search(用于 RAG 和语义搜索的高性能向量相似度搜索引擎)。