multi-qa-distilbert-cos-v1
sentence-transformers
Similitud de oraciones
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 la búsqueda semántica. Ha sido entrenado en 215M de pares (pregunta, respuesta) de diversas fuentes.
Como usar
Usar este modelo se vuelve fácil cuando tienes sentence-transformers instalado:
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"]
# Cargar el modelo
model = SentenceTransformer('sentence-transformers/multi-qa-distilbert-cos-v1')
# Codificar consulta y documentos
query_emb = model.encode(query)
doc_emb = model.encode(docs)
# Calcular puntaje de punto entre la consulta y todos los embeddings de documentos
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()
# Combinar documentos y puntajes
pairs = list(zip(docs, scores))
# Ordenar por puntaje decreciente
pairs = sorted(pairs, key=lambda x: x[1], reverse=True)
# Mostrar pasajes y puntajes
for doc, score in pairs:
print(score, doc)
Sin sentence-transformers, puedes usar el modelo así: Primero, pasas tu entrada a través del modelo transformador, luego tienes que aplicar la operación de pooling adecuada en la parte superior de los embeddings contextualizados.
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
# Pooling promedio: tomar el promedio de todos los tokens
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output.last_hidden_state
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), min=1e-9)
# Codificar texto
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 = mean_pooling(model_output, encoded_input['attention_mask'])
embeddings = F.normalize(embeddings, p=2, dim=1)
return embeddings
query = "How many people live in London?"
docs = ["Around 9 Million people live in London", "London is known for its financial district"]
# Cargar modelo desde HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/multi-qa-distilbert-cos-v1")
model = AutoModel.from_pretrained("sentence-transformers/multi-qa-distilbert-cos-v1")
query_emb = encode(query)
doc_emb = encode(docs)
# Calcular puntaje de punto entre la consulta y todos los embeddings de documentos
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()
# Combinar documentos y puntajes
pairs = list(zip(docs, scores))
# Ordenar por puntaje decreciente
pairs = sorted(pairs, key=lambda x: x[1], reverse=True)
# Mostrar pasajes y puntajes
for doc, score in pairs:
print(score, doc)
Funcionalidades
- Transformadores de PyTorch
- Safetensors
- Transformadores
- Extracción de características
- Embeddings de texto
- Puntos finales de inferencia
Casos de uso
- Búsqueda semántica: Este modelo codifica consultas/preguntas y párrafos de texto en un espacio vectorial denso, encontrando documentos relevantes para los pasajes dados.