Os modelos de incorporação do Voyage AI oferecem suporte a dimensões flexíveis e quantização para ajudá-lo a otimizar os custos de armazenamento e pesquisa para seus aplicativos baseados em vetores. Esta página explica como usar esses recursos para reduzir os custos e, ao mesmo tempo, manter a alta qualidade da recuperação.
Saiba mais sobre dimensões flexíveis e quantização por meio de um tutorial interativo no Google CoLab.
Visão geral
Ao trabalhar com aplicativos de pesquisa vetorial em grande escala, como recuperação de código em repositórios enormes, os custos de armazenamento e computação podem ser significativos. Esses custos são dimensionados linearmente com os seguintes fatores:
Dimensionalidade incorporada: o número de dimensões em cada vetor
Precisão: o número de bits utilizados para codificar cada número no vetor
Ao reduzir um ou ambos os fatores, você pode reduzir drasticamente os custos sem afetar significativamente a qualidade da recuperação. Os modelos de IA de viagem oferecem suporte a duas técnicas complementares para isso:
Incorporações Matryoshka: permite que você use versões menores de suas incorporações truncando para menos dimensões
Quantização: reduz a precisão de cada número em suas incorporações de 32bits flutuantes para formatos de menor precisão
Essas técnicas são habilitadas por meio do aprendizado de Matryoshka e do treinamento com reconhecimento de quantização, que ensinam os modelos a manter a qualidade mesmo com dimensões reduzidas ou valores quantizados.
Incorporações Matryoshka
As incorporações Matryoshka são um tipo especial de incorporação de vetor que contém várias incorporações válidas de diferentes tamanhos aninhadas em um único vetor. Isso lhe dá a flexibilidade de escolher a dimensionalidade que melhor equilibra seus requisitos de desempenho e custo.
Os mais recentes modelos de incorporação do Voyage geram incorporações do Matryoshka e são compatíveis com várias dimensões de saída diretamente por meio do output_dimension parâmetro. Para saber mais, consulte Visão geral dos modelos.
Como funcionam as incorporações doMatryoshka
Com o aprendizado Matryoshka, uma única incorporação contém uma família aninhada de incorporações de vários comprimentos. Por exemplo, uma incorporação do Voyage 2048contém incorporações válidas em vários comprimentos mais curtos:
As primeiras 256 dimensões formam uma incorporação válida 256dimensional
As primeiras 512 dimensões formam uma incorporação válida 512dimensional
As primeiras 1024 dimensões formam uma incorporação válida 1024dimensional
Todas as 2048 dimensões da incorporação de fidelidade total
Cada versão mais curta fornece uma qualidade de recuperação um pouco inferior à da incorporação completa, mas exige menos armazenamento e recursos computacionais.
Como truncar incorporações Matryoshka
Truncar incorporações Matryoshka mantendo o subconjunto principal de dimensões. O exemplo seguinte demonstra como truncar vetores dimensionais 1024para dimensões 256:
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()
Quantização
A quantização reduz a precisão das incorporações convertendo números de ponto flutuante de alta precisão em formatos de menor precisão. Esse processo pode reduzir drasticamente os custos de armazenamento e computacionais, mantendo a forte qualidade da recuperação.
Os modelos de incorporação do Voyage mais recentes são treinamentos com reconhecimento de quantização, o que significa que eles mantêm alta qualidade de recuperação mesmo quando quantizados. Para saber mais, consulte Visão geral de modelos.
Observação
Muitos bancos de dados que oferecem suporte ao armazenamento e à recuperação de vetores também oferecem suporte a incorporações quantizadas, incluindo o MongoDB . Para saber mais sobre quantização na Vector Search do MongoDB , consulte Quantização vetorial.
Como funciona a Quantização
A quantização reduz a precisão das incorporações representando cada dimensão com menos bits do que o formato padrão de ponto flutuante de 32bits. Em vez de usar 4 bytes por dimensão, as incorporações quantizadas usam:
8-bit inteiros (1 byte por dimensão): reduz o armazenamento em 4x
Binário (1 bit por dimensão): reduz o armazenamento em 32x
Apesar dessa redução drástica no tamanho, modelos treinamento com reconhecimento de quantização, como o do Voyage, mantêm alta qualidade de recuperação. Os modelos Voyage suportados habilitam a quantização especificando o tipo de dados de saída com o parâmetro output_dtype:
Tipo de Dados | Descrição |
|---|---|
| Cada incorporação retornada é uma lista de 324números de ponto flutuante de precisão única de bits ( bytes). Esse é o padrão e fornece a mais alta precisão e exatidão de recuperação. |
| Cada incorporação retornada é uma lista de números inteiros de 8bits (1bytes) que variam de -128 a 127 e 0 a 255, respectivamente. |
| Cada incorporação retornada é uma lista de 8inteiros de bits que representam valores de incorporação de bit único quantizados e compactados: |
Exemplo
Noções básicas sobre quantização binária
Considere os seguintes valores de incorporação:
-0.0396, 0.0062, -0.0745, -0.0390, 0.0046, 0.0003, -0.0850, 0.0399 A quantização binária converte cada valor para um único bit, usando as seguintes regras:
Valores inferiores a
0são convertidos em0Valores maiores ou iguais a
0são convertidos em1
0, 1, 0, 0, 1, 1, 0, 1 Os oito bits empacotam em um número inteiro de 8bits:
01001101. Este número inteiro converte para77em decimal.Para converter para o tipo de saída final, aplique as seguintes conversões:
Tipo de saídaMétodo de conversãoResultadoubinaryuint8: use o valor diretamente como número inteiro sem sinal.77binaryint8: aplique o método binário de compensação128subtraindo.-51(que é igual a77 - 128)
Binário de compensação
Binário de deslocamento é um método para representar inteiros assinados em formato binário. A Voyage AI usa esse método para o binary tipo de saída para codificar incorporações binárias compactadas como inteiros assinadosint8 ().
O método binário de deslocamento funciona adicionando ou subtraindo um valor de deslocamento:
Ao converter para binário: Adicione
128ao número inteiro assinado antes de codificarAo converter de binário: subtraia
128do número inteiro após a decodificação
Para números inteiros com sinal de 8bits (faixa de -128 a 127), o deslocamento é sempre 128.
Exemplo
Inteiro assinado para binário
Para representar -32 como um número binário de 8bits:
Adicione o deslocamento (
128) a-32, resultando em96.Converta
96para binário:01100000.
Exemplo
Binário para número inteiro assinado
Para determinar o número inteiro assinado a partir do número binário de 8bits 01010101:
Converta diretamente para um número inteiro:
85.Subtraia o deslocamento (
128) de85, resultando em-43.
Como usar a Quantização com a Voyage AI
Você pode converter incorporações flutuantes para formato binário manualmente ou descompactar incorporações binárias de volta para bits individuais. Os exemplos a seguir demonstram ambas as operações:
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