Snowflake Arctic-embed-xs

Snowflake
Similitud de oraciones

Snowflake Arctic-embed-xs es un modelo de incrustación de texto que forma parte de la familia de modelos de Snowflake Arctic. Este modelo se basa en el modelo all-MiniLM-L6-v2 con solo 22 millones de parámetros y 384 dimensiones, lo que le permite cumplir con los presupuestos de latencia y costo total de propiedad más estrictos. A pesar de su tamaño, su precisión de recuperación se acerca a la de modelos con 100 millones de parámetros. Los modelos de incrustación de texto de Snowflake Arctic están diseñados para mejorar la calidad de recuperación en diferentes tamaños y se entrenan utilizando una gran cantidad de pares de consultas y documentos, seguidos de una optimización adicional en un conjunto de datos más pequeño.

Como usar

Usando Sentence Transformers

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Snowflake/snowflake-arctic-embed-xs")

queries = ['¿Qué es Snowflake?', '¿Dónde puedo conseguir los mejores tacos?']
documents = ['¡La nube de datos!', '¡Por supuesto, en Ciudad de México!']

query_embeddings = model.encode(queries, prompt_name="query")
document_embeddings = model.encode(documents)

scores = query_embeddings @ document_embeddings.T
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)
    # Output passages & scores
    print("Query:", query)
    for document, score in doc_score_pairs:
        print(score, document)

Query: ¿Qué es Snowflake?
0.57515126 ¡La nube de datos!
0.45798576 ¡Por supuesto, en Ciudad de México!
Query: ¿Dónde puedo conseguir los mejores tacos?
0.5636022 ¡Por supuesto, en Ciudad de México!
0.5044898 ¡La nube de datos!

Usando Huggingface transformers

import torch
from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('Snowflake/snowflake-arctic-embed-xs')
model = AutoModel.from_pretrained('Snowflake/snowflake-arctic-embed-xs', add_pooling_layer=False)
model.eval()

query_prefix = 'Representa esta oración para buscar pasajes relevantes: '
queries  = ['¿Qué es Snowflake?', '¿Dónde puedo conseguir los mejores tacos?']
queries_with_prefix = ["{}{}".format(query_prefix, i) for i in queries]
query_tokens = tokenizer(queries_with_prefix, padding=True, truncation=True, return_tensors='pt', max_length=512)

documents = ['¡La nube de datos!', '¡Por supuesto, en Ciudad de México!']
document_tokens =  tokenizer(documents, padding=True, truncation=True, return_tensors='pt', max_length=512)

# Compute token embeddings
with torch.no_grad():
    query_embeddings = model(**query_tokens)[0][:, 0]
    document_embeddings = model(**document_tokens)[0][:, 0]

# normalize embeddings
query_embeddings = torch.nn.functional.normalize(query_embeddings, p=2, dim=1)
document_embeddings = torch.nn.functional.normalize(document_embeddings, p=2, dim=1)

scores = torch.mm(query_embeddings, document_embeddings.transpose(0, 1))
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)
    # Output passages & scores
    print("Query:", query)
    for document, score in doc_score_pairs:
        print(score, document)

Usando Transformers.js

import { pipeline, dot } from '@xenova/transformers';

// Crear pipeline de extracción de características
const extractor = await pipeline('feature-extraction', 'Snowflake/snowflake-arctic-embed-xs', {
    quantized: false, // Comente esta línea para usar la versión cuanticada
});

// Generar incrustaciones de oraciones
const sentences = [
    'Representa esta oración para buscar pasajes relevantes: ¿Dónde puedo conseguir los mejores tacos?',
    '¡La nube de datos!',
    '¡Por supuesto, en Ciudad de México!',
];
const output = await extractor(sentences, { normalize: true, pooling: 'cls' });

// Calcular puntuaciones de similitud
const [source_embeddings, ...document_embeddings ] = output.tolist();
const similarities = document_embeddings.map(x => dot(source_embeddings, x));
console.log(similarities); // [0.5044895661144148, 0.5636021124426508]

Funcionalidades

Precisión de recuperación sobresaliente
Optimizado para rendimiento
Basado en el modelo all-MiniLM-L6-v2
22 millones de parámetros
Dimensión de incrustación de 384
Modelo ligero y rápido
Ideal para presupuestos de latencia y costo total de propiedad estrictos

Casos de uso

Mejorar la calidad de recuperación de textos
Optimización de consultas y documentos para motores de búsqueda
Análisis y agrupación de datos
Preentrenamiento contrastivo mejorado