- A busca vetorial exata calcula a distância entre o ponto fornecido e todos os pontos do espaço vetorial. Isso garante a melhor precisão possível, ou seja, os pontos retornados são, de fato, os vizinhos mais próximos. Como o espaço vetorial é percorrido exaustivamente, a busca vetorial exata pode ser lenta demais para uso em cenários reais.
- A busca vetorial aproximada se refere a um conjunto de técnicas (por exemplo, estruturas de dados especiais, como grafos e florestas aleatórias) que calculam resultados muito mais rapidamente do que a busca vetorial exata. A precisão do resultado normalmente é “boa o suficiente” para uso prático. Muitas técnicas aproximadas oferecem parâmetros para ajustar o equilíbrio entre a precisão do resultado e o tempo de busca.
vectors do tipo array, por exemplo, Array(Float64), Array(Float32) ou Array(BFloat16).
O vetor de referência é um array constante e é definido como uma expressão de tabela comum.
<DistanceFunction> calcula a distância entre o ponto de referência e todos os pontos armazenados.
Qualquer uma das funções de distância disponíveis pode ser usada para isso.
<N> especifica quantos vizinhos devem ser retornados.
Busca vetorial exata
Exemplo
Busca vetorial aproximada
Índices de similaridade vetorial
Os índices de similaridade vetorial estão disponíveis no ClickHouse versão 25.8 ou superior.
Se você encontrar problemas, abra uma issue no repositório do ClickHouse.
Como criar um índice de similaridade vetorial
ALTER TABLE acima faz com que o índice seja criado apenas para dados inseridos futuramente na tabela.
Para criar o índice também para os dados existentes, você precisa materializá-lo:
<distance_function> deve ser
L2Distance, a distância euclidiana, que representa o comprimento do segmento de reta entre dois pontos no espaço euclidiano,cosineDistance, a distância de cosseno, que representa o ângulo entre dois vetores não nulos, oudotProduct, o produto escalar (produto interno), que representa a soma dos produtos elemento a elemento de dois vetores. Equivalente acosineDistanceem dados normalizados.
L2Distance geralmente é a melhor escolha; caso contrário, recomenda-se cosineDistance para compensar a escala.
Para as funções de distância
L2Distance e cosineDistance, um valor menor significa maior similaridade, enquanto para dotProduct, um valor maior significa maior similaridade.
Como resultado, índices vetoriais com L2Distance e cosineDistance só podem ser usados por consultas SELECT [...] ORDER BY [...] ASC (ASC é o padrão de ORDER BY), enquanto índices vetoriais criados para dotProduct só podem ser usados por consultas SELECT [...] ORDER BY [...] DESC.<dimensions> especifica a cardinalidade do array (número de elementos) na coluna subjacente.
Se o ClickHouse encontrar um array com cardinalidade diferente durante a criação do índice, o índice será descartado e um erro será retornado.
O parâmetro opcional GRANULARITY <N> refere-se ao tamanho dos grânulos de índice (veja aqui).
Ao contrário dos skip indexes comuns, que usam uma granularidade de índice padrão de 1, os índices de similaridade vetorial usam 100 milhões como granularidade de índice padrão.
Esse valor garante que apenas poucos índices sejam criados internamente, mesmo para partes grandes.
Recomendamos alterar a granularidade do índice apenas para usuários avançados que entendam as implicações do que estão fazendo (veja abaixo).
Os índices de similaridade vetorial são genéricos no sentido de que podem acomodar diferentes métodos de busca aproximada.
O método efetivamente usado é especificado pelo parâmetro <type>.
No momento, o único método disponível é HNSW (artigo acadêmico), uma técnica popular e de última geração para busca vetorial aproximada baseada em grafos hierárquicos de proximidade.
Se HNSW for usado como tipo, os usuários poderão especificar opcionalmente outros parâmetros específicos do HNSW:
<quantization>controla a quantização dos vetores no grafo de proximidade. Os valores possíveis sãof64,f32,f16,bf16,i8oub1. O valor padrão ébf16. Observe que esse parâmetro não afeta a representação dos vetores na coluna subjacente.<hnsw_max_connections_per_layer>controla o número de vizinhos por nó do grafo, também conhecido como o hiperparâmetro HNSWM. O valor padrão é32. O valor0significa usar o valor padrão.<hnsw_candidate_list_size_for_construction>controla o tamanho da lista dinâmica de candidatos durante a construção do grafo HNSW, também conhecido como o hiperparâmetro HNSWef_construction. O valor padrão é128. O valor0significa usar o valor padrão.
- Índices de similaridade vetorial só podem ser criados em colunas do tipo Array(Float32), Array(Float64) ou Array(BFloat16). Arrays de tipos de ponto flutuante anuláveis e de baixa cardinalidade, como
Array(Nullable(Float32))eArray(LowCardinality(Float32)), não são permitidos. - Índices de similaridade vetorial devem ser criados em uma única coluna.
- Índices de similaridade vetorial podem ser criados em expressões calculadas (por exemplo,
INDEX index_name arraySort(vectors) TYPE vector_similarity([...])), mas esses índices não podem ser usados posteriormente para busca aproximada de vizinhos. - Índices de similaridade vetorial exigem que todos os arrays na coluna subjacente tenham
<dimension>elementos — isso é verificado durante a criação do índice. Para detectar violações desse requisito o mais cedo possível, os usuários podem adicionar uma restrição à coluna vetorial, por exemplo,CONSTRAINT same_length CHECK length(vectors) = 256. - Da mesma forma, os valores de array na coluna subjacente não podem estar vazios (
[]) nem ter o valor padrão (também[]).
Usando um índice de similaridade vetorial
Para usar índices de similaridade vetorial, a configuração compatibility deve estar definida como
'' (o valor padrão), ou '25.1' ou posterior.SELECT [...] SETTINGS hnsw_candidate_list_size_for_search = <value>).
O valor padrão da configuração, 256, funciona bem na maioria dos casos de uso.
Valores mais altos resultam em maior precisão, porém com desempenho mais lento.
Se a consulta puder usar um índice de similaridade vetorial, o ClickHouse verifica se o LIMIT <N> fornecido nas consultas SELECT está dentro de limites razoáveis.
Mais especificamente, um erro é retornado se <N> for maior que o valor da configuração max_limit_for_vector_search_queries, cujo valor padrão é 100.
Valores de LIMIT muito grandes podem tornar as buscas mais lentas e geralmente indicam um erro de uso.
Para verificar se uma consulta SELECT utiliza um índice de similaridade vetorial, você pode adicionar o prefixo EXPLAIN indexes = 1 à consulta.
Como exemplo, consulte
Skip e o nome e tipo do índice vetorial (no exemplo, idx e vector_similarity).
Nesse caso, o índice de similaridade vetorial descartou dois dos quatro grânulos, ou seja, 50% dos dados.
Quanto mais grânulos puderem ser descartados, mais eficaz será o uso do índice.
Pós-filtragem e Pré-filtragem
Os usuários podem, opcionalmente, especificar uma cláusula WHERE com condições de filtro adicionais para a consulta SELECT.
O ClickHouse avaliará essas condições de filtro usando a estratégia de pós-filtragem ou de pré-filtragem.
Em resumo, ambas as estratégias determinam a ordem em que os filtros são avaliados:
- Pós-filtragem significa que o índice de similaridade vetorial é avaliado primeiro; depois, ClickHouse avalia o(s) filtro(s) adicional(is) especificado(s) na cláusula
WHERE. - Pré-filtragem significa que a ordem de avaliação do filtro é inversa.
- A pós-filtragem tem o problema geral de poder retornar menos linhas do que o número solicitado na cláusula
LIMIT <N>. Essa situação ocorre quando uma ou mais linhas de resultado retornadas pelo índice de similaridade vetorial não atendem aos filtros adicionais. - A pré-filtragem geralmente ainda é um problema sem solução. Alguns bancos de dados vetoriais especializados oferecem algoritmos de pré-filtragem, mas a maioria dos bancos de dados relacionais (incluindo o ClickHouse) recorre à busca exata de vizinhos, isto é, a uma varredura por força bruta sem índice.
year e a seguinte consulta é executada:
- se a condição de filtro eliminar pelo menos uma linha dentro de uma parte, o ClickHouse recorrerá à pré-filtragem para os intervalos “remanescentes” dentro da parte,
- se a condição de filtro não eliminar nenhuma linha dentro de uma parte, o ClickHouse aplicará pós-filtragem à parte.
auto, que implementa as heurísticas acima) pode ser definida como prefilter.
Isso é útil para forçar a pré-filtragem nos casos em que as condições de filtro adicionais são altamente seletivas.
Como exemplo, a consulta a seguir pode se beneficiar da pré-filtragem:
SETTINGS vector_search_filter_strategy = 'prefilter' à consulta), o ClickHouse primeiro encontra todos os livros com preço inferior a 2 dólares e, em seguida, executa uma busca vetorial por força bruta nesses livros.
Como abordagem alternativa para resolver o problema acima, vector_search_index_fetch_multiplier (padrão: 1.0, máximo: 1000.0) pode ser configurado com um valor > 1.0 (por exemplo, 2.0).
O número de vizinhos mais próximos buscados no índice vetorial é multiplicado pelo valor dessa configuração, e então o filtro adicional é aplicado a essas linhas para retornar a quantidade de linhas definida por LIMIT.
Como exemplo, podemos executar a consulta novamente, mas com o multiplicador 3.0:
vector_search_index_fetch_multiplier pode mitigar o problema, mas, em casos extremos (condição WHERE muito seletiva), ainda é possível que sejam retornadas menos de N linhas solicitadas.
Rescoring
Os skip indexes no ClickHouse geralmente filtram no nível de grânulo, ou seja, uma busca em um skip index (internamente) retorna uma lista de grânulos com possível correspondência, o que reduz a quantidade de dados lidos na varredura subsequente.
Isso funciona bem para skip indexes em geral, mas, no caso dos índices de similaridade vetorial, cria um “descompasso de granularidade”.
Em mais detalhes, o índice de similaridade vetorial determina os números das linhas dos N vetores mais semelhantes para um determinado vetor de referência.
Com a configuração vector_search_with_rescoring = 1, o ClickHouse lê os vetores originais com precisão total das linhas candidatas e calcula a distância final no pipeline SQL normal.
Quando o plano de consulta permite, o ClickHouse filtra a varredura para as linhas candidatas retornadas pelo índice vetorial antes do cálculo final da distância.
Essa etapa é chamada de rescoring e pode melhorar a precisão, especialmente com índices vetoriais quantizados, porque o ranking final usa os vetores armazenados em vez das distâncias do índice.
Se filtros adicionais removerem candidatos demais ou se for necessário maior recall, aumente a configuração vector_search_index_fetch_multiplier para que o índice vetorial retorne mais linhas candidatas para rescoring.
Por isso, o ClickHouse fornece uma otimização que desativa o rescoring e retorna diretamente do índice os vetores mais semelhantes e suas distâncias.
Essa otimização vem habilitada por padrão; consulte a configuração vector_search_with_rescoring.
Em alto nível, ela funciona assim: o ClickHouse disponibiliza os vetores mais semelhantes e suas distâncias como uma coluna virtual _distance.
Para ver isso, execute uma consulta de busca vetorial com EXPLAIN header = 1:
Uma consulta executada sem rescoring (
vector_search_with_rescoring = 0) e com réplicas paralelas ativadas pode voltar a usar rescoring.Ajuste de desempenho
CODEC(NONE) para a coluna de vetores assim:
system.text_log) indicam que o índice de similaridade vetorial está sendo carregado.
Se essas mensagens aparecerem repetidamente em diferentes consultas de busca vetorial, isso indica que o tamanho do cache está baixo demais.
O cache do índice de similaridade vetorial armazena grânulos do índice vetorial.
Se os grânulos individuais do índice vetorial forem maiores que o tamanho do cache, eles não serão armazenados em cache.
Portanto, calcule o tamanho do índice vetorial (com base na fórmula em “Estimando o consumo de armazenamento e memória” ou em system.data_skipping_indices) e dimensione o cache de acordo.
A quantização reduz a precisão das buscas vetoriais em comparação com a busca nos valores originais de ponto flutuante em precisão total (
f32).
No entanto, na maioria dos datasets, a quantização brain float de meia precisão (bf16) resulta em perda de precisão desprezível; por isso, os índices de similaridade vetorial usam essa técnica de quantização por padrão.
A quantização em quarto de precisão (i8) e a quantização binária (b1) causam perda de precisão perceptível em buscas vetoriais.
Recomendamos essas duas quantizações apenas se o tamanho do índice de similaridade vetorial for significativamente maior que a DRAM disponível.
Nesse caso, também sugerimos habilitar o rescoring (vector_search_index_fetch_multiplier, vector_search_with_rescoring) para melhorar a precisão.
A quantização binária é recomendada apenas para 1) embeddings normalizados (ou seja, comprimento do vetor = 1; os modelos da OpenAI geralmente são normalizados) e 2) quando a distância de cosseno é usada como função de distância.
Internamente, a quantização binária usa a distância de Hamming para construir e pesquisar o grafo de proximidade.
A etapa de rescoring usa os vetores originais em precisão total armazenados na tabela para identificar os vizinhos mais próximos por meio da distância de cosseno.
Ajustando a transferência de dados
O vetor de referência em uma consulta de busca vetorial é fornecido pelo usuário e, em geral, obtido por meio de uma chamada a um Large Language Model (LLM).
Um código Python típico que executa uma busca vetorial no ClickHouse pode ser assim
search_v no trecho acima) podem ter uma dimensionalidade muito alta.
Por exemplo, a OpenAI fornece modelos que geram vetores de embedding com 1536 ou até 3072 dimensões.
No código acima, o driver Python do ClickHouse substitui o vetor de embedding por uma string legível e, em seguida, envia a consulta SELECT inteiramente como uma string.
Supondo que o vetor de embedding seja composto por 1536 valores de ponto flutuante de precisão simples, a string enviada chega a 20 kB de comprimento.
Isso gera alto consumo de CPU para tokenização, parsing e milhares de conversões de string para float.
Além disso, é necessário um espaço considerável no arquivo de log do servidor ClickHouse, o que também causa crescimento excessivo em system.query_log.
Observe que a maioria dos modelos de LLM retorna um vetor de embedding como uma lista ou um array do NumPy de floats nativos.
Portanto, recomendamos que aplicações Python vinculem o parâmetro do vetor de referência em formato binário usando o seguinte estilo:
system.query_log.
Administração e monitoramento
Diferenças em relação aos índices de skipping regulares
GRANULARITY = [N] grânulos ([N] = 1 por padrão para índices de skipping normais).
Por exemplo, se a granularidade do índice primário da tabela for 8192 (configuração index_granularity = 8192) e GRANULARITY = 2, então cada bloco indexado conterá 16384 linhas.
No entanto, as estruturas de dados e os algoritmos para busca aproximada de vizinhos são inerentemente orientados a linhas.
Eles armazenam uma representação compacta de um conjunto de linhas e também retornam linhas para consultas de busca vetorial.
Isso gera algumas diferenças um tanto contraintuitivas na forma como os índices de similaridade vetorial se comportam em comparação com os índices de skipping normais.
Quando um usuário define um índice de similaridade vetorial em uma coluna, o ClickHouse cria internamente um “subíndice” de similaridade vetorial para cada bloco de índice.
O subíndice é “local”, no sentido de que conhece apenas as linhas do bloco de índice ao qual pertence.
No exemplo anterior, supondo que uma coluna tenha 65536 linhas, obtemos quatro blocos de índice (abrangendo oito grânulos) e um subíndice de similaridade vetorial para cada bloco de índice.
Em teoria, um subíndice consegue retornar diretamente as linhas com os N pontos mais próximos dentro do seu bloco de índice.
Para consultas com vector_search_with_rescoring = 1, o ClickHouse pode usar essas posições de linhas para filtrar linhas antes de calcular a distância final a partir dos vetores armazenados, quando o plano de consulta permite essa otimização.
Sem rescoring, o ClickHouse usa diretamente as distâncias do índice vetorial por meio da coluna virtual _distance.
Ambos os modos ainda usam os intervalos de grânulos subjacentes para agendar leituras, o que difere dos índices de skipping regulares, que ignoram dados na granularidade dos blocos de índice.
O parâmetro GRANULARITY determina quantos subíndices de similaridade vetorial são criados.
Valores maiores de GRANULARITY significam menos subíndices de similaridade vetorial, porém maiores, até o ponto em que uma coluna (ou a parte de dados de uma coluna) tenha apenas um único subíndice.
Nesse caso, o subíndice tem uma visão “global” de todas as linhas da coluna e pode retornar diretamente todos os grânulos da coluna (parte) com linhas relevantes (há no máximo LIMIT [N] desses grânulos).
Com vector_search_with_rescoring = 1, o ClickHouse pode então ler as posições de linhas correspondentes e calcular a distância exata para essas linhas.
Com um valor pequeno de GRANULARITY, cada subíndice pode retornar até LIMIT N linhas candidatas.
Como resultado, mais linhas candidatas talvez precisem ser lidas e pós-filtradas.
Observe que a precisão da busca é igualmente boa nos dois casos; apenas o desempenho do processamento difere.
Em geral, recomenda-se usar um GRANULARITY alto para índices de similaridade vetorial e recorrer a valores menores de GRANULARITY apenas em caso de problemas, como consumo excessivo de memória pelas estruturas de similaridade vetorial.
Se nenhum GRANULARITY tiver sido especificado para índices de similaridade vetorial, o valor padrão será 100 milhões.
Exemplo
Query
Response
Busca vetorial com codecs quantizados
O codec
Quantized é experimental. Ative-o com SET allow_experimental_codecs = 1.
Se encontrar problemas, abra uma issue no repositório do ClickHouse.Introdução
- Escala. O tempo para construir o grafo e a memória necessária para armazená-lo — além dos próprios vetores — passam a ser o custo predominante.
- Filtragem. Com um filtro
WHEREseletivo, o percurso de grafo se torna ineficaz, porque ou não consegue alcançar o pequeno conjunto de linhas que satisfaz o predicado, ou precisa inspecionar um número desproporcional de candidatos para encontrá-las.
Float32 é dominada pela E/S de armazenamento, porque toda a coluna de vetores precisa ser lida do disco (ou do armazenamento de objetos) — no caso de uma coluna de embedding denso, essa é a maior coluna da tabela e tem baixa taxa de compressão.
O codec de coluna Quantized resolve essa desvantagem.
Cada vetor é armazenado duas vezes: os valores originais em precisão total, inalterados, junto com um código quantizado compacto em um fluxo complementar.
Uma consulta de busca vetorial primeiro varre os códigos usando uma função de distância de baixo custo, compatível com SIMD, para montar uma lista curta dos candidatos mais promissores e, em seguida, reclassifica essa lista com base nos vetores em precisão total.
Como um código ocupa apenas uma fração do tamanho do vetor bruto, a varredura dessa lista curta lê muito menos bytes do armazenamento — e acessa a coluna em precisão total apenas para o pequeno conjunto de candidatos selecionados — enquanto o ranking final permanece preciso.
Declarando o codec
Quantized(...) a uma coluna Array(Float32) (ou Array(Float64) / Array(BFloat16)).
Como o codec é experimental, primeiro ative allow_experimental_codecs:
ALTER TABLE.
Métodos de quantização
dimensions é o comprimento do vetor.
Quantized('rabitq', dimensions)— um bit de sinal por coordenada, mais um fator de correção de cosseno sem viés (dimensions/8 + 4bytes). Uma opção padrão forte, pequena e com baixo custo depopcount. ApenascosineDistance.Quantized('turboquant', dimensions)— dois bits por coordenada (um código MSE de 1 bit e um código residual de 1 bit) para candidatos de maior fidelidade (dimensions/4 + 4bytes). ApenascosineDistance.Quantized('int8', dimensions)— um códigoInt8por coordenada, mais a norma do vetor (dimensions + 4bytes); é o maior, mas também o código flat mais fiel. SuportaL2DistanceecosineDistance.Quantized('prefix', dimensions, leading_dimensions, 'int8'|'bf16')— Matryoshka: mantém apenas asleading_dimensionscoordenadas iniciais, comoInt8(com uma escala por vetor) ouBFloat16. Códigos muito pequenos para embeddings treinados com Matryoshka Representation Learning. SuportaL2DistanceecosineDistance.Quantized('product', dimensions, nbits, m)— Quantização de Produto: um codebook por partição treinado com k-means; cada vetor se tornamcódigos denbitsbits (portanto,dimensionsdeve ser múltiplo dem). É a opção mais compacta e com maior recall por byte, ao custo de uma etapa de treinamento durante o insert. SuportaL2DistanceecosineDistance.
rabitq e turboquant exigem que dimensions seja múltiplo de 8.
Pesquisa transparente
k que você usaria na busca exata:
vector_search_use_quantized_codes = 1, o otimizador reescreve automaticamente a consulta em um plano de dois estágios: ele varre os códigos quantizados para montar uma lista curta e, em seguida, recalcula a pontuação dessa lista em relação ao vec com precisão total.
A configuração vem desativada por padrão, portanto, sem ela, a mesma consulta é executada como uma varredura exata simples — o codec nunca altera os resultados; ele apenas oferece um caminho mais rápido quando você opta por usá-lo.
Use uma função de distância compatível com o método escolhido: cosineDistance para todos os métodos e L2Distance, adicionalmente, para int8, prefix e product.
Configurações
allow_experimental_codecs— deve ser habilitado para declarar um codecQuantized(padrão:0).vector_search_use_quantized_codes— habilita a reescrita em dois estágios de lista curta e rescoring (padrão:0). Quando desativada, as consultas fazem uma varredura exata dos vetores em precisão total.vector_search_index_fetch_multiplier— quantos candidatos entram na lista curta em relação aoLIMITda consulta: a varredura mantém osLIMIT × multipliermelhores códigos antes do rescoring. Valores maiores melhoram o recall, à custa de mais rescoring. O padrão é1(sem oversampling), portanto geralmente é necessário aumentá-lo — por exemplo, para10ou mais — para obter bom recall.
Projetado para escalar
- Vetorizado. Os kernels de varredura são escritos para SIMD, com encaminhamento em tempo de execução para as instruções mais largas compatíveis com a CPU:
popcountem hardware para os métodos de código de sinal (rabitq,turboquant) e fused multiply-add largo para os demais. - Em paralelo entre núcleos e partes. Uma varredura plana é trivialmente paralela, e o ClickHouse a trata assim: as distâncias são calculadas em todas as threads disponíveis e em todas as partes de uma tabela ao mesmo tempo, com apenas a mesclagem final do top-
ksendo serializada. - Distribuído. Em um cluster com shards, o trabalho é distribuído entre as máquinas — cada shard varre sua própria fatia em paralelo, e o coordenador mescla as listas curtas.
- Colunar e compatível com filtros. Os códigos quantizados ocupam sua própria coluna, comprimidos e lidos pelo mesmo caminho de E/S que todas as outras colunas, de modo que um
WHEREseletivo simplesmente deixa menos códigos para varrer. - Sem etapa de compilação separada. Os códigos são produzidos à medida que os vetores são gravados e mesclados por concatenação — não há índice para construir, ajustar ou reconstruir, então uma tabela está pronta para busca assim que seus dados chegam.
Quantized Bit (QBit)
Array(BFloat16) em vez de Array(Float32), o tamanho dos dados será reduzido pela metade, e espera-se que o tempo de execução das consultas diminua proporcionalmente.
Esse método é conhecido como quantização. Embora acelere o processamento, ele pode reduzir a exatidão dos resultados, apesar de realizar uma varredura exaustiva de todos os vetores.
Com a quantização tradicional, perdemos precisão tanto durante a busca quanto no armazenamento dos dados. No exemplo acima, armazenaríamos BFloat16 em vez de Float32, o que significa que nunca poderemos realizar uma busca mais exata depois, mesmo que isso seja desejado. Uma alternativa é armazenar duas cópias dos dados: uma quantizada e outra com precisão total. Embora isso funcione, exige armazenamento redundante. Considere um cenário em que temos Float64 como dado original e queremos executar buscas com diferentes níveis de precisão (16 bits, 32 bits ou 64 bits completos). Precisaríamos armazenar três cópias separadas dos dados.
O ClickHouse oferece o tipo de dado Quantized Bit (QBit), que resolve essas limitações ao:
- Armazenar os dados originais com precisão total.
- Permitir que a precisão da quantização seja especificada em tempo de consulta.
QBit, use a seguinte sintaxe:
element_type– o tipo de cada elemento do vetor. Os tipos aceitos sãoInt8,BFloat16,Float32eFloat64dimension– o número de elementos em cada vetorstride– opcional. Um divisor dedimensionque particiona as dimensões emdimension / stridegrupos contíguos armazenados em streams separados, de modo que uma busca apenas nas dimensões iniciais leia menos streams (útil para embeddings Matryoshka). O padrão édimension, caso em que o tipo é idêntico em bytes a umQBitsemstride. Consulte a página do tipo de dadoQBitpara mais detalhes.
Criando uma tabela QBit e adicionando dados
Busca vetorial com QBit
QBit aqui.
Busca com precisão total (64 bits):
Considerações de desempenho
QBit vem da redução das operações de E/S, já que menos dados precisam ser lidos do armazenamento ao usar uma precisão menor. Além disso, quando o QBit contém dados Float32, se o parâmetro de precisão for 16 ou menos, há ganhos adicionais com a redução do processamento. O parâmetro de precisão controla diretamente o equilíbrio entre exatidão e velocidade:
- Maior precisão (mais próxima da largura original dos dados): Resultados mais exatos, consultas mais lentas
- Menor precisão: Consultas mais rápidas com resultados aproximados e menor uso de memória