关于 sentence-transformers
使用 Transformer 模型生成句子和文本嵌入的 Python 框架,面向构建语义搜索、RAG、聚类或分类流程的开发者。支持本地编码、多语言模型、批量处理和微调。
主要功能
- 01生成句子和文本嵌入
- 02支持多语言嵌入模型
- 03计算语义相似度
- 04批量编码文本
- 05支持模型微调
适用场景
- 01为 RAG 构建嵌入
- 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,请使用 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
Agent 操作流程
- 检查环境。 确认语料库、嵌入模型和向量存储的版本,以及索引的存放位置。
- 明确输入。 根据数据或用户确认格式、标识符和参数。对于任何会影响结果的值,不要猜测,应先询问。
- 先运行小规模测试。 为一小部分数据建立索引,并使用已知的问题与段落对测试检索效果。
- 按照上述说明和参考资料执行完整任务。
- 验证结果。 在带标签的数据集上测量 recall@k;答案只能引用检索到的段落。
- 报告结果。 说明运行了哪些内容(版本、命令、参数)、检查了什么,以及还有哪些不确定之处。
| 如果出现以下情况 | 请执行以下操作 |
|---|---|
| 检索返回了无关片段 | 重新审视分块方式,添加 BM25/混合搜索,或在更改生成器之前进行重排序。 |
| 这些说明中的函数、标志或端点在已安装的版本中不存在 | 查阅该已安装版本自己的文档(help()、--help、官方文档),进行调整,并告知用户。切勿编造 API。 |
| 必需的输入、标识符或参数含义不明确 | 询问用户,或在运行前明确说明所作假设。 |
诚信准则
- 切勿编造结果、参数、标识符、引文或统计数据。如果无法运行或验证某项内容,请如实说明。
- 答案必须来自检索到的文本;如果语料库中没有答案,请说明。
- 请将此处与版本相关的细节视为可能已经过时,并根据已安装版本的官方文档进行确认。
- 对于需要付费、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,必须事先征得同意。
相关技能
chroma:面向 AI 应用的开源嵌入数据库。pinecone:通过 Python 客户端以及 LangChain 和 LlamaIndex 集成,介绍如何使用 Pinecone 托管式无服务器向量数据库。qdrant-vector-search:用于 RAG 和语义搜索的高性能向量相似度搜索引擎。
评论
支持 Markdown