说明文档
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
创建时间: 2022-03-02 23:29:05+00:00
更新时间: 2025-08-19 10:21:26+00:00
在 Hugging Face 上查看