ONNX 模型库
返回模型

说明文档

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"]

# 加载模型
model = SentenceTransformer('sentence-transformers/multi-qa-mpnet-base-dot-v1')

# 编码查询和文档
query_emb = model.encode(query)
doc_emb = model.encode(docs)

# 计算查询与所有文档嵌入之间的点积分数
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()

# 组合文档和分数
doc_score_pairs = list(zip(docs, scores))

# 按分数降序排序
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# 输出文档和分数
for doc, score in doc_score_pairs:
    print(score, doc)

使用方法 (HuggingFace Transformers)

如果没有安装 sentence-transformers,您可以像这样使用该模型:首先,将输入通过 transformer 模型,然后需要在上下文词嵌入之上应用正确的池化操作。

from transformers import AutoTokenizer, AutoModel
import torch

# CLS 池化 - 取第一个标记的输出
def cls_pooling(model_output):
    return model_output.last_hidden_state[:,0]

# 编码文本
def encode(texts):
    # 对句子进行分词
    encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')

    # 计算标记嵌入
    with torch.no_grad():
        model_output = model(**encoded_input, return_dict=True)

    # 执行池化
    embeddings = cls_pooling(model_output)

    return embeddings


# 我们需要句子嵌入的句子
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]

# 从 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")

# 编码查询和文档
query_emb = encode(query)
doc_emb = encode(docs)

# 计算查询与所有文档嵌入之间的点积分数
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()

# 组合文档和分数
doc_score_pairs = list(zip(docs, scores))

# 按分数降序排序
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# 输出文档和分数
for doc, score in doc_score_pairs:
    print(score, doc)

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

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

  • 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 生成嵌入:

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
生成归一化嵌入
池化方法 CLS 池化
适用的评分函数 点积(例如 util.dot_score

背景

该项目旨在使用大规模自监督对比学习目标,在非常大的句子级数据集上训练句子嵌入模型。我们使用对比学习目标:给定一对句子中的某个句子,模型应该能够从随机采样的其他句子集合中预测出哪个句子在该数据集中实际与它配对。

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

预期用途

我们的模型旨在用于语义搜索:它将查询/问题编码到稠密向量空间中,并找到相关文档。需要注意的是,存在 512 个词片的限制:超过该长度的文本将被截断。此外请注意,该模型仅在最多 250 个词片的输入文本上进行了训练。对于更长的文本,效果可能不佳。

训练过程

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

预训练

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

训练

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

该模型使用 MultipleNegativesRankingLoss 进行训练,使用 CLS 池化、点积作为相似度函数,scale 设置为 1。

数据集 训练样本数量
WikiAnswers 来自 WikiAnswers 的重复问题对 77,427,422
PAQ 为维基百科每个段落自动生成的(问题,段落)对 64,371,441
Stack Exchange 所有 Stack Exchange 的(标题,正文)对 25,316,456
Stack Exchange 所有 Stack Exchange 的(标题,回答)对 21,396,559
MS MARCO 来自必应搜索引擎的 50 万个查询的三元组(查询,回答,硬负例) 17,579,773
GOOAQ: 多样化回答类型的开放问答 300 万个 Google 查询及其 Google 特色摘要的(查询,回答)对 3,012,496
Amazon-QA 来自亚马逊产品页面的(问题,回答)对 2,448,839
Yahoo Answers 来自 Yahoo Answers 的(标题,回答)对 1,198,260
Yahoo Answers 来自 Yahoo Answers 的(问题,回答)对 681,164
Yahoo Answers 来自 Yahoo Answers 的(标题,问题)对 659,896
SearchQA 14 万个问题的(问题,回答)对,每个问题有 5 个 Google 相关片段 582,261
ELI5 来自 Reddit ELI5(像我五岁一样解释)的(问题,回答)对 325,475
Stack Exchange 重复问题对(标题) 304,525
Quora 问题三元组 Quora 问题对数据集中的(问题,重复问题,硬负例)三元组 103,663
自然问题 (NQ) 10 万个真实 Google 查询及其相关维基百科段落的(问题,段落)对 100,231
SQuAD2.0 来自 SQuAD2.0 数据集的(问题,段落)对 87,599
TriviaQA (问题,证据)对 73,346
总计 214,988,242

sentence-transformers/multi-qa-mpnet-base-dot-v1

作者 sentence-transformers

sentence-similarity sentence-transformers
↓ 4.2M ♥ 191

创建时间: 2022-03-02 23:29:05+00:00

更新时间: 2025-08-19 10:21:26+00:00

在 Hugging Face 上查看

文件 (28)

.gitattributes
1_Pooling/config.json
README.md
config.json
config_sentence_transformers.json
data_config.json
model.safetensors
modules.json
onnx/model.onnx ONNX
onnx/model_O1.onnx ONNX
onnx/model_O2.onnx ONNX
onnx/model_O3.onnx ONNX
onnx/model_O4.onnx ONNX
onnx/model_qint8_arm64.onnx ONNX
onnx/model_qint8_avx512.onnx ONNX
onnx/model_qint8_avx512_vnni.onnx ONNX
onnx/model_quint8_avx2.onnx ONNX
openvino/openvino_model.bin
openvino/openvino_model.xml
openvino/openvino_model_qint8_quantized.bin
openvino/openvino_model_qint8_quantized.xml
pytorch_model.bin
sentence_bert_config.json
special_tokens_map.json
tokenizer.json
tokenizer_config.json
train_script.py
vocab.txt