Snowflake Arctic-embed-m-v1.5

Snowflake
Similitud de oraciones

Este modelo es una versión actualizada del snowflake-arctic-embed-m diseñado para mejorar la capacidad de compresión de los vectores de incrustación. Este modelo logra un rendimiento ligeramente superior en general sin compresión, y además es capaz de retener la mayor parte de su calidad de recuperación incluso hasta los vectores de incrustación de 128 bytes a través de una combinación de Aprendizaje de Representación Matryoshka (MRL) y cuantización escalar uniforme. Este modelo también se ha diseñado para emparejar bien con un esquema de cuantización escalar independiente del corpus para lograr un gran rendimiento incluso en tan solo 128 bytes por vector (compresión de 24x en comparación con vectores de 768 dimensiones almacenados en float32).

Como usar

import torch
from sentence_transformers import SentenceTransformer
from torch.nn.functional import normalize
# Model constant.
MODEL_ID = "Snowflake/snowflake-arctic-embed-m-v1.5"
# Your queries and docs.
queries = ['what is snowflake?', '¿Dónde puedo conseguir los mejores tacos?']
documents = ['The Data Cloud!', '¡Ciudad de México, por supuesto!']
# Load the model.
model = SentenceTransformer(
MODEL_ID, model_kwargs=dict(add_pooling_layer=False),
)
# Generate text embeddings.
query_embeddings = model.encode(queries, prompt_name="query")
document_embeddings = model.encode(documents)
# Scores via dotproduct.
scores = query_embeddings @ document_embeddings.T
# Pretty-print the results.
for query, query_scores in zip(queries, scores):
doc_score_pairs = list(zip(documents, query_scores))
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
print(f'Query: "{query}"')
for document, score in doc_score_pairs:
print(f'Score: {score:.4f} | Document: "{document}"')
print()
import torch
from torch.nn.functional import normalize
from transformers import AutoModel, AutoTokenizer
# Model constants.
MODEL_ID = "Snowflake/snowflake-arctic-embed-m-v1.5"
QUERY_PREFIX = 'Representa esta oración para buscar pasajes relevantes: '
# Your queries and docs.
queries  = ['what is snowflake?', '¿Dónde puedo conseguir los mejores tacos?']
documents = ['The Data Cloud!', '¡Ciudad de México, por supuesto!']
# Load the model and tokenizer.
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModel.from_pretrained(MODEL_ID, add_pooling_layer=False)
model.eval()
# Add query prefix and tokenize queries and docs.
queries_with_prefix = [f"{QUERY_PREFIX}{q}" for q in queries]
query_tokens = tokenizer(queries_with_prefix, padding=True, truncation=True, return_tensors='pt', max_length=512)
document_tokens =  tokenizer(documents, padding=True, truncation=True, return_tensors='pt', max_length=512)
# Use the model to generate text embeddings.
with torch.inference_mode():
query_embeddings = model(**query_tokens)[0][:, 0]
document_embeddings = model(**document_tokens)[0][:, 0]
# Remember to normalize embeddings.
query_embeddings = normalize(query_embeddings)
document_embeddings = normalize(document_embeddings)
# Scores via dotproduct.
scores = query_embeddings @ document_embeddings.T
# Pretty-print the results.
for query, query_scores in zip(queries, scores):
doc_score_pairs = list(zip(documents, query_scores))
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)
print(f'Query: "{query}"')
for document, score in doc_score_pairs:
print(f'Score: {score:.4f} | Document: "{document}"')
print()

Funcionalidades

Mejora de la capacidad de compresión de los vectores de incrustación.
Retención de la calidad de recuperación incluso en vectores de 128 bytes.
Uso del Aprendizaje de Representación Matryoshka (MRL).
Cuantización escalar uniforme.
Compatible con esquemas de cuantización escalar independiente del corpus.

Casos de uso

Mejora del preentrenamiento contrastivo a través de la incrustación y el clúster de datos.
Generación de vectores de incrustación altamente comprimibles que preservan la calidad.
Mejora de la calidad de recuperación en benchmarks de recuperación como MTEB.