Docs Menu
Docs Home
/

Dimensiones flexibles y cuantificación

Los modelos de incrustación de Voyage AI admiten dimensiones y cuantificación flexibles para ayudarle a optimizar los costos de almacenamiento y búsqueda de sus aplicaciones vectoriales. Esta página explica cómo usar estas funciones para reducir costos y mantener una alta calidad de recuperación.

Aprenda sobre dimensiones flexibles y cuantificación a través de un tutorial interactivo en Google Colab.

Cuando se trabaja con aplicaciones de búsqueda vectorial a gran escala, como recuperación de código en repositorios masivos, los costos de almacenamiento y computacionales pueden ser significativos. Estos costos se escalan linealmente con los siguientes factores:

  • Dimensionalidad de incrustación: el número de dimensiones en cada vector

  • Precisión: La cantidad de bits utilizados para codificar cada número en el vector.

Al reducir uno o ambos de estos factores, se pueden reducir drásticamente los costos sin afectar significativamente la calidad de la recuperación. Los modelos de IA de viajes admiten dos técnicas complementarias para lograrlo:

  • Incrustaciones de Matryoshka: le permite usar versiones más pequeñas de sus incrustaciones truncando a menos dimensiones

  • Cuantización: reduce la precisión de cada número en sus incrustaciones de flotantes de 32bits a formatos de menor precisión

Estas técnicas son posibles gracias al aprendizaje Matryoshka y al entrenamiento consciente de la cuantificación, que entrenan a los modelos para mantener la calidad incluso con dimensiones reducidas o valores cuantificados.

Las incrustaciones Matryoshka son un tipo especial de incrustación vectorial que contiene múltiples incrustaciones válidas de diferentes tamaños anidadas en un solo vector. Esto le brinda la flexibilidad de elegir la dimensionalidad que mejor se adapte a sus requisitos de rendimiento y costo.

Los últimos modelos de incrustación de Voyage generan incrustaciones de Matryoshka y admiten múltiples dimensiones de salida directamente a través de output_dimension parámetro. Para obtener más información, consulte Descripción general de los modelos.

Con el aprendizaje Matryoshka, una sola incrustación contiene una familia anidada de incrustaciones de diferentes longitudes. Por ejemplo, una incrustación de Voyage de 2048-dimensional contiene incrustaciones válidas de múltiples longitudes más cortas:

  • Las primeras 256 dimensiones forman una incrustación válida de 256dimensiones

  • Las primeras 512 dimensiones forman una incrustación válida de 512dimensiones

  • Las primeras 1024 dimensiones forman una incrustación válida de 1024dimensiones

  • Todas las dimensiones 2048 forman la incrustación de fidelidad completa

Cada versión más corta proporciona una calidad de recuperación ligeramente inferior a la incrustación completa, pero requiere menos recursos de almacenamiento y computacionales.

Truncar las incrustaciones de Matryoshka conservando el subconjunto principal de dimensiones. El siguiente ejemplo muestra cómo truncar vectores de 1024dimensiones a 256 dimensiones:

import voyageai
import numpy as np
def embd_normalize(v: np.ndarray) -> np.ndarray:
# Normalize rows of a 2D array to unit vectors
row_norms = np.linalg.norm(v, axis=1, keepdims=True)
if np.any(row_norms == 0):
raise ValueError("Cannot normalize rows with a norm of zero.")
return v / row_norms
vo = voyageai.Client()
# Generate 1024-dimensional embeddings
embd = vo.embed(['Sample text 1', 'Sample text 2'], model='voyage-4-large').embeddings
# Truncate to 256 dimensions and normalize
short_dim = 256
resized_embd = embd_normalize(np.array(embd)[:, :short_dim]).tolist()

La cuantificación reduce la precisión de las incrustaciones al convertir números de punto flotante de alta precisión a formatos de menor precisión. Este proceso puede reducir drásticamente los costos de almacenamiento y computación, manteniendo al mismo tiempo una alta calidad de recuperación.

Los modelos de incrustación de Voyage más recientes se entrenan con un entrenamiento que tiene en cuenta la cuantización, lo que significa que mantienen una alta calidad de recuperación incluso al ser cuantizados. Para obtener más información, consulte la Descripción general de los modelos.

Nota

Muchas bases de datos que admiten el almacenamiento y la recuperación de vectores también admiten incrustaciones cuantificadas, como MongoDB. Para obtener más información sobre la cuantificación en MongoDB Vector Search, consulte Cuantización vectorial.

La cuantificación reduce la precisión de las incrustaciones al representar cada dimensión con menos bits que el formato estándar de coma flotante de 32bits. En lugar de usar 4 bytes por dimensión, las incrustaciones cuantificadas utilizan:

  • Enteros de8bits (1 byte por dimensión): Reduce el almacenamiento por 4veces

  • Binario (1 bit por dimensión): reduce el almacenamiento en 32x

A pesar de esta drástica reducción de tamaño, los modelos entrenados con capacidad de cuantificación, como los de Voyage, mantienen una alta calidad de recuperación. Los modelos de Voyage compatibles permiten la cuantificación especificando el tipo de datos de salida con el parámetro output_dtype:

Tipo de dato
Descripción

float

Cada incrustación devuelta es una lista de 324números de punto flotante de precisión simple de bits ( bytes). Esta es la opción predeterminada y proporciona la máxima precisión y exactitud de recuperación.

int8 y uint8

Cada embedding devuelto es una lista de enteros de 8bits (1bytes) con un rango de -128 a 127 y de 0 a 255, respectivamente.

binary y ubinary

Cada incrustación devuelta es una lista de enteros de 8bits que representan valores de incrustación de un solo bit cuantificados y empaquetados: int8 para binary y uint8 ubinarypara. La longitud de la lista de enteros devuelta es 1/8 de la dimensión real de la incrustación. El binary tipo utiliza el método binario de desplazamiento, que se explica a continuación.

Ejemplo

Comprensión de la cuantificación binaria

  1. Considere los siguientes valores de incrustación:

    -0.0396, 0.0062, -0.0745, -0.0390, 0.0046, 0.0003, -0.0850, 0.0399
  2. La cuantificación binaria convierte cada valor en un solo bit, utilizando las siguientes reglas:

    • Los valores menores a 0 se convierten a 0

    • Los valores mayores o iguales a 0 se convierten a 1

    0, 1, 0, 0, 1, 1, 0, 1
  3. Los ocho bits se agrupan en un entero de 8bits: 01001101. Este entero se convierte a 77 en decimal.

  4. Para convertir al tipo de salida final, aplique las siguientes conversiones:

    Tipo de salida
    Método de conversión
    Resultado

    ubinary

    uint8: Utiliza el valor directamente como entero sin signo.

    77

    binary

    int8: Aplicar el método offset binary restando 128.

    -51 (que es igual a 77 - 128)

Elbinario de desplazamiento es un método para representar enteros con signo en formato binario. Voyage AI utiliza este método para el binary tipo de salida para codificar incrustaciones binarias empaquetadas en bits como enteros con signoint8 ().

El método binario de desplazamiento funciona sumando o restando un valor de desplazamiento:

  • Al convertir a binario: agregue 128 al entero con signo antes de codificar

  • Al convertir de binario: reste 128 del entero después de la decodificación

Para números enteros con signo de 8bits (rango -128 a 127), el desplazamiento siempre es 128.

Ejemplo

Entero con signo a binario

Para representar -32 como un número binario de 8bit:

  1. Agregue el desplazamiento (128) a -32, lo que da como resultado 96.

  2. Convertir 96 a binario: 01100000.

Ejemplo

Binario a entero con signo

Para determinar el entero con signo a partir del número binario de 8bits 01010101:

  1. Conviértalo directamente en un entero: 85.

  2. Reste el desplazamiento (128) de 85, lo que da como resultado -43.

Puede convertir manualmente las incrustaciones de coma flotante a formato binario o descomprimirlas en bits individuales. Los siguientes ejemplos muestran ambas operaciones:

import numpy as np
import voyageai
vo = voyageai.Client()
# Generate float embeddings
embd_float = vo.embed('Sample text 1', model='voyage-4-large', output_dimension=2048).embeddings[0]
# Compute 512-dimensional bit-packed binary and ubinary embeddings from 2048-dimensional float embeddings
embd_binary_calc = (np.packbits(np.array(embd_float) > 0, axis=0) - 128).astype(np.int8).tolist() # Quantize, binary offset
embd_binary_512_calc = embd_binary_calc[0:64] # Truncate. Binary is 1/8 length of embedding dimension.
embd_ubinary_calc = (np.packbits(np.array(embd_float) > 0, axis=0)).astype(np.uint8).tolist() # Quantize, binary offset
embd_ubinary_512_calc = embd_ubinary_calc[0:64] # Truncate. Binary is 1/8 length of embedding dimension.
import numpy as np
import voyageai
vo = voyageai.Client()
# Generate binary embeddings
embd_binary = vo.embed('Sample text 1', model='voyage-4-large', output_dtype='binary', output_dimension=2048).embeddings[0]
embd_ubinary = vo.embed('Sample text 1', model='voyage-4-large', output_dtype='ubinary', output_dimension=2048).embeddings[0]
# Unpack bits
embd_binary_bits = [format(x, f'08b') for x in np.array(embd_binary) + 128] # List of (bits) strings
embd_binary_unpacked = [bit == '1' for bit in ''.join(embd_binary_bits)] # List of booleans
embd_ubinary_bits = [format(x, f'08b') for x in np.array(embd_ubinary)] # List of (bits) strings
embd_ubinary_unpacked = [bit == '1' for bit in ''.join(embd_ubinary_bits)] # List of booleans

Volver

Tokenización

En esta página