Menu Docs
Página inicial do Docs
/

Dimensões flexíveis e quantização

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.

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.

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.

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.

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()

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.

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

float

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.

int8 e a uint8

Cada incorporação retornada é uma lista de números inteiros de 8bits (1bytes) que variam de -128 a 127 e 0 a 255, respectivamente.

binary e a ubinary

Cada incorporação retornada é uma lista de 8inteiros de bits que representam valores de incorporação de bit único quantizados e compactados: int8 para binary e uint8 ubinarypara. O comprimento da lista de inteiros retornada é 1/8 da dimensão real da incorporação. O binary tipo utiliza o método binário offset, explicado abaixo.

Exemplo

Noções básicas sobre quantização binária

  1. Considere os seguintes valores de incorporação:

    -0.0396, 0.0062, -0.0745, -0.0390, 0.0046, 0.0003, -0.0850, 0.0399
  2. A quantização binária converte cada valor para um único bit, usando as seguintes regras:

    • Valores inferiores a 0 são convertidos em 0

    • Valores maiores ou iguais a 0 são convertidos em 1

    0, 1, 0, 0, 1, 1, 0, 1
  3. Os oito bits empacotam em um número inteiro de 8bits: 01001101. Este número inteiro converte para 77 em decimal.

  4. Para converter para o tipo de saída final, aplique as seguintes conversões:

    Tipo de saída
    Método de conversão
    Resultado

    ubinary

    uint8: use o valor diretamente como número inteiro sem sinal.

    77

    binary

    int8: aplique o método binário de compensação 128 subtraindo.

    -51 (que é igual a 77 - 128)

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 128 ao número inteiro assinado antes de codificar

  • Ao converter de binário: subtraia 128 do 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:

  1. Adicione o deslocamento (128) a -32, resultando em 96.

  2. Converta 96 para 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:

  1. Converta diretamente para um número inteiro: 85.

  2. Subtraia o deslocamento (128) de 85, resultando em -43.

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

Voltar

Tokenização

Nesta página