all-MiniLM-L6-v2 是一个基于sentence-transformers库的预训练句子嵌入模型,由Nils Reimers团队开发。该模型将句子和短段落映射到384维的密集向量空间,专门用于语义搜索、文本聚类、句子相似度计算等自然语言处理任务。
模型在超过10亿句子对的数据集上进行微调,包括:
根据MTEB(Massive Text Embedding Benchmark)评估,all-MiniLM-L6-v2在多个任务上表现优异:
注:由于技术限制,无法获取MTEB官方排行榜的具体得分数据,但根据现有资料显示,该模型在轻量级模型中表现优异。
pip install -U sentence-transformers
from sentence_transformers import SentenceTransformer
# 加载模型
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# 编码句子
sentences = ["这是一个示例句子", "这是另一个示例句子"]
embeddings = model.encode(sentences)
# 计算相似度
from sentence_transformers import util
cosine_scores = util.cos_sim(embeddings[0], embeddings[1])
print(cosine_scores)
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')
model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')
# 定义池化函数
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0]
input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1).float(), min=1e-9)
# 编码文本
sentences = ["这是一个示例句子", "这是另一个示例句子"]
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# 生成嵌入
with torch.no_grad():
model_output = model(**encoded_input)
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)
print(sentence_embeddings.shape) # 输出:[2, 384]
| 模型 | 参数量 | 向量维度 | 推理速度 | 准确率 |
|---|---|---|---|---|
| all-MiniLM-L6-v2 | 22M | 384 | 快 | 高 |
| BERT-base | 110M | 768 | 慢 | 很高 |
| MPNet-base | 110M | 768 | 中等 | 很高 |
注:以上对比数据仅供参考,实际性能取决于具体任务和数据集。
all-MiniLM-L6-v2是一个优秀的轻量级句子嵌入模型,在效率、性能和易用性之间取得了很好的平衡。它特别适合资源受限的环境和对推理速度有要求的应用场景。虽然存在一些局限性,但在其目标应用领域内表现优异,是目前最受欢迎的嵌入模型之一。
还没有人回复