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.
Overview
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.
Incrustaciones de matrioskas
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.
Cómo funcionan las incrustaciones de matrioskas
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.
Cómo truncar las incrustaciones de matrioskas
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()
cuantización
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.
Cómo funciona la cuantificación
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 |
|---|---|
| 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. |
| Cada embedding devuelto es una lista de enteros de 8bits (1bytes) con un rango de -128 a 127 y de 0 a 255, respectivamente. |
| Cada incrustación devuelta es una lista de enteros de 8bits que representan valores de incrustación de un solo bit cuantificados y empaquetados: |
Ejemplo
Comprensión de la cuantificación binaria
Considere los siguientes valores de incrustación:
-0.0396, 0.0062, -0.0745, -0.0390, 0.0046, 0.0003, -0.0850, 0.0399 La cuantificación binaria convierte cada valor en un solo bit, utilizando las siguientes reglas:
Los valores menores a
0se convierten a0Los valores mayores o iguales a
0se convierten a1
0, 1, 0, 0, 1, 1, 0, 1 Los ocho bits se agrupan en un entero de 8bits:
01001101. Este entero se convierte a77en decimal.Para convertir al tipo de salida final, aplique las siguientes conversiones:
Tipo de salidaMétodo de conversiónResultadoubinaryuint8: Utiliza el valor directamente como entero sin signo.77binaryint8: Aplicar el método offset binary restando128.-51(que es igual a77 - 128)
Desplazamiento binario
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
128al entero con signo antes de codificarAl convertir de binario: reste
128del 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:
Agregue el desplazamiento (
128) a-32, lo que da como resultado96.Convertir
96a binario:01100000.
Ejemplo
Binario a entero con signo
Para determinar el entero con signo a partir del número binario de 8bits 01010101:
Conviértalo directamente en un entero:
85.Reste el desplazamiento (
128) de85, lo que da como resultado-43.
Cómo utilizar la cuantificación con Voyage AI
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