sentence-transformers/multi-qa-distilbert-dot-v1
Este es un modelo de sentence-transformers: mapea oraciones y párrafos a un espacio vectorial denso de 768 dimensiones y fue diseñado para búsqueda semántica. Ha sido entrenado en 215M (pregunta, respuesta) pares de diversas fuentes. El proyecto tiene como objetivo entrenar modelos de embeddings de oraciones en conjuntos de datos a nivel de oraciones muy grandes utilizando un objetivo de aprendizaje contrastivo auto-supervisado. El modelo fue desarrollado durante la semana de la comunidad usando JAX/Flax para NLP & CV, organizada por Hugging Face. Beneficiamos de una infraestructura de hardware eficiente para ejecutar el proyecto: 7 TPUs v3-8, así como la intervención de miembros del equipo de Google Flax, JAX y Cloud sobre marcos de aprendizaje profundo eficientes.
Como usar
Uso (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-distilbert-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)
Uso (HuggingFace Transformers)
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-distilbert-dot-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-distilbert-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)
Funcionalidades
- Mapea oraciones y párrafos a un espacio vectorial denso de 768 dimensiones
- Diseñado para búsqueda semántica
- Entrenado en 215M (pregunta, respuesta) pares de diversas fuentes
- Utiliza el método de pooling CLS
- Función de puntuación adecuada: producto punto (e.g. util.dot_score)
- Modelo basado en distilbert-base-uncased preentrenado
- Entrenado con MultipleNegativesRankingLoss utilizando CLS-pooling y producto punto como función de similitud
Casos de uso
- Buscar semánticamente documentos relevantes para consultas/preguntas dadas.
- Codificar consultas/preguntas y párrafos de texto en un espacio vectorial denso
- Identificar documentos relevantes en función de una consulta dada.