SuperAPI AI 工具集

sentence-transformers

智能体与模型

查看项目

更新于 10-21 16:22

技能介绍

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 和语义搜索的高性能向量相似度搜索引擎)。