模型库 / sentence-transformers/multi-qa-mpnet-base-dot-v1

multi-qa-mpnet-base-dot-v1

sentence-transformers sentence-similarity sentence-transformers en
sentence-transformers/multi-qa-mpnet-base-dot-v1
2,686,343
下载量
192
收藏数
13
浏览量
-
许可

简介

multi-qa-mpnet-base-dot-v1 这是一个句子变换器模型:它将句子和段落映射到768维的稠密向量空间,专为**语义搜索**设计。该模型基于来自不同来源的2.15亿个(问题,答案)对进行训练。如需了解语义搜索的入门介绍,请参阅

模型卡片

语言
en
框架 sentence-transformers
任务 sentence-similarity
数据集
stackexchange_xml ms_marco gooaq yahoo_answers_topics search_qa eli5 natural_questions trivia_qa QQP PAQ_pairs +2 更多
sentence-transformers feature-extraction sentence-similarity transformers text-embeddings-inference

模型配置

模型类型 mpnet
架构 MPNetForMaskedLM

模型详情

已翻译

multi-qa-mpnet-base-dot-v1

这是一个 sentence-transformers 模型:它将句子和段落映射到 768 维的密集向量空间,专为语义搜索设计。该模型在来自不同来源的 2.15 亿个(问题,答案)对上进行了训练。关于语义搜索的介绍,请参阅:SBERT.net - 语义搜索

使用方法(Sentence-Transformers)

安装 sentence-transformers 后,使用此模型变得非常简单:

pip install -U sentence-transformers

然后您可以像这样使用模型:

from sentence_transformers import SentenceTransformer, util

query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]

# Load the model
model = SentenceTransformer('sentence-transformers/multi-qa-mpnet-base-dot-v1')

# Encode query and documents
query_emb = model.encode(query)
doc_emb = model.encode(docs)

# Compute dot score between query and all document embeddings
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()

# Combine docs & scores
doc_score_pairs = list(zip(docs, scores))

# Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# Output passages & scores
for doc, score in doc_score_pairs:
    print(score, doc)

使用方法(HuggingFace Transformers)

如果没有 sentence-transformers,您可以像这样使用模型:首先,将输入传递给 transformer 模型,然后需要在上下文相关的 word embeddings 之上应用正确的池化操作。

from transformers import AutoTokenizer, AutoModel
import torch

# CLS Pooling - Take output from first token
def cls_pooling(model_output):
    return model_output.last_hidden_state[:,0]

# Encode text
def encode(texts):
    # Tokenize sentences
    encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')

    # Compute token embeddings
    with torch.no_grad():
        model_output = model(**encoded_input, return_dict=True)

    # Perform pooling
    embeddings = cls_pooling(model_output)

    return embeddings

# Sentences we want sentence embeddings for
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-mpnet-base-dot-v1")

# Encode query and docs
query_emb = encode(query)
doc_emb = encode(docs)

# Compute dot score between query and all document embeddings
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()

# Combine docs & scores
doc_score_pairs = list(zip(docs, scores))

# Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# Output passages & scores
for doc, score in doc_score_pairs:
    print(score, doc)

使用方法(Text Embeddings Inference (TEI))

Text Embeddings Inference (TEI) 是一个用于文本 embedding 模型的极速推理解决方案。

  • CPU:
docker run -p 8080:80 -v hf_cache:/data --pull always ghcr.io/huggingface/text-embeddings-inference:cpu-latest \
  --model-id sentence-transformers/multi-qa-mpnet-base-dot-v1 \
  --pooling cls \
  --dtype float16
  • NVIDIA GPU:
docker run --gpus all -p 8080:80 -v hf_cache:/data --pull always ghcr.io/huggingface/text-embeddings-inference:cuda-latest \
  --model-id sentence-transformers/multi-qa-mpnet-base-dot-v1 \
  --pooling cls \
  --dtype float16

发送请求到 /v1/embeddings,通过 OpenAI Embeddings API 生成 embeddings:

curl http://localhost:8080/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{
    "model": "sentence-transformers/multi-qa-mpnet-base-dot-v1",
    "input": "How many people live in London?"
  }'

或者查看 Text Embeddings Inference API 规范


技术细节

以下是使用此模型时必须了解的一些技术细节:

设置项
维度 768
是否生成归一化 embeddings
池化方法 CLS 池化
适用的评分函数 点积(例如 util.dot_score

背景

该项目旨在使用自监督对比学习目标,在非常大的句子级数据集上训练句子 embedding 模型。我们使用对比学习目标:给定一对句子中的其中一个,模型需要从一组随机采样的其他句子中,预测出哪个句子在数据集中实际与之配对。

我们是在 Hugging Face 组织的 使用 JAX/Flax 进行 NLP 和 CV 的社区周 期间开发此模型的。我们作为 用 10 亿训练对训练史上最佳句子 embedding 模型 项目的一部分开发了此模型。我们受益于高效的硬件基础设施来运行该项目:7 个 TPU v3-8,以及 Google Flax、JAX 和 Cloud 团队成员在高效深度学习框架方面的支持。

预期用途

我们的模型旨在用于语义搜索:它将查询/问题和文本段落编码到密集向量空间中。它为给定的段落找到相关文档。

请注意,存在 512 个 word piece 的限制:超过此长度的文本将被截断。此外,该模型仅在最多 250 个 word piece 的输入文本上进行了训练。对于较长的文本,其效果可能不佳。

训练过程

完整的训练脚本可在当前仓库中找到:train_script.py

预训练

我们使用预训练的 mpnet-base 模型。有关预训练过程的更多详细信息,请参考模型卡片。

训练

我们使用多个数据集的拼接来微调模型。总共有大约 2.15 亿个(问题,答案)对。我们根据加权概率对每个数据集进行采样,其配置在 data_config.json 文件中详细说明。

该模型使用 MultipleNegativesRankingLoss 进行训练,采用 CLS 池化、点积作为相似度函数,缩放因子为 1。

数据集 训练元组数量
WikiAnswers 来自 WikiAnswers 的重复问题对 77,427,422
PAQ 为 Wikipedia 中每个段落自动生成的(问题,段落)对 64,371,441
Stack Exchange 所有 StackExchanges 的(标题,正文)对 25,316,456
Stack Exchange 所有 StackExchanges 的(标题,答案)对 21,396,559
MS MARCO 来自 Bing 搜索引擎的 50 万查询的三元组(查询,答案,hard_negative) 17,579,773
[GOOAQ:具有多样答案类型的开放问答](https://github.c

标签

onnx openvino mpnet fill-mask feature-extraction text-embeddings-inference en dataset:flax-sentence-embeddings/stackexchange_xml

操作


详细信息

厂商
sentence-transformers
任务
sentence-similarity
框架
sentence-transformers
模型类型
mpnet
语言
en