Neste guia, você vai:
- Ter uma breve introdução à busca vetorial
- Aprender sobre Vizinhos Mais Próximos Aproximados (ANN) e Hierarchical Navigable Small World (HNSW)
- Conhecer o Quantised Bit (QBit)
- Usar o QBit para realizar busca vetorial com o dataset DBPedia
Noções básicas sobre busca vetorial
Entendendo embeddings
Vizinhos mais próximos aproximados (ANN)
Quantização
- Manter a cópia quantizada junto da coluna original - Isso dobra o armazenamento, mas é seguro, pois sempre podemos voltar à precisão total
- Substituir totalmente os valores originais (convertendo para tipos menores na inserção) - Isso economiza espaço e E/S, mas não tem volta
Hierarchical Navigable Small World (HNSW)
Comparação das abordagens
Análise detalhada do QBit
Quantised Bit (QBit)
BFloat16, Float32 e Float64 aproveitando a forma como números de ponto flutuante são representados — em bits.
Em vez de armazenar cada número inteiro, o QBit divide os valores em planos de bits: o primeiro bit de cada valor, o segundo, o terceiro e assim por diante.
Essa abordagem resolve a principal limitação da quantização tradicional. Não é necessário armazenar dados duplicados nem correr o risco de fazer com que os valores percam o significado. Ela também evita os gargalos de RAM do HNSW, já que o QBit trabalha diretamente com os dados armazenados, em vez de manter um índice em memória.
LimitaçãoEmbora o QBit acelere a busca vetorial, sua complexidade computacional continua sendo O(n). Em outras palavras: se seu dataset for pequeno o suficiente para que um índice HNSW caiba confortavelmente na RAM, essa ainda será a opção mais rápida.
O tipo de dado
FixedString(N) separada: strings de comprimento fixo de N bytes, armazenadas consecutivamente na memória, sem separadores entre elas. Todos esses grupos são então reunidos em uma única Tuple, que forma a estrutura subjacente do QBit.
Exemplo: Se começarmos com um vetor de 8 elementos Float64, cada grupo conterá 8 bits. Como um Float64 tem 64 bits, acabamos com 64 grupos (um para cada bit). Portanto, o layout interno de QBit(Float64, 8) se parece com uma Tuple de 64 colunas FixedString(1).
O cálculo da distância
L2DistanceTransposed com um parâmetro de precisão:
Otimização de I/O
Otimização do cálculo
Otimização de BFloat16
Complexidade do Float64
Exemplo com DBpedia
Configuração
Consulta de busca
Compare o desempenho com a busca exaustiva
Compare o desempenho com a busca exaustiva
Insight principal
Conclusão
Adaptado do post no blog de Raufs Dunamalijevs, publicado em 28 de outubro de 2025