Sobre o projeto
turbovec é um índice vetorial implementado em Rust e exposto ao Python por meio de bindings. Ele é construído em torno do algoritmo TurboQuant do Google Research, uma abordagem de quantização data-oblivious que usa normalização, uma rotação aleatória fixa, quantização escalar Lloyd-Max baseada em distribuição, empacotamento de bits e pontuação de produto interno com comprimento renormalizado. O projeto visa busca vetorial local de baixa latência com restrição de memória e não requer um serviço gerenciado.
O TurboQuantIndex principal é criado com uma dimensão e largura de bits, com indexação de 2 e 4 bits documentada. Vetores são adicionados incrementalmente sem uma etapa separada de treinamento, fase de ajuste de parâmetros ou reconstrução do índice. As entradas Python usam arrays NumPy float32; outros dtypes são rejeitados em vez de convertidos silenciosamente. A API fornece operações add, search, write, load e sync. A busca retorna pontuações e índices para os k resultados mais próximos solicitados.
IdMapIndex adiciona IDs externos uint64 estáveis, add_with_ids e remoção O(1) por ID de acordo com a documentação. Ele suporta o mesmo fluxo de trabalho de escrita/carregamento de arquivo inteiro e persistência incremental por sync. O método sync é descrito como persistindo apenas as mudanças desde o sync anterior, usando um fsync por chamada e permitindo pequenas adições ou remoções sem reescrever o índice inteiro. write e load permanecem disponíveis para snapshots completos.
A recuperação filtrada ou híbrida é suportada por meio de uma allowlist de IDs ou bitmask de slots passada para a busca. A allowlist pode vir de um sistema externo como SQL, BM25, lógica de controle de acesso ou um filtro temporal. O README afirma que a filtragem é aplicada dentro do kernel de busca SIMD, blocos sem vetores permitidos são ignorados e a contagem de resultados é min(k, número de vetores permitidos distintos).
A busca usa kernels SIMD escritos à mão com seleção de recursos em tempo de execução. Os alvos documentados incluem ARM NEON SDOT/SMMLA, x86 AVX-512 VNNI e vpermb, além de AVX2 e fallbacks escalares. A compilação Rust usa uma linha de base x86-64-v2 enquanto habilita kernels mais novos em hardware compatível. O multithreading é fornecido por meio do Rayon na configuração de benchmark descrita.
Uma etapa opcional de calibração TQ+ pode ajustar valores de deslocamento e escala por coordenada a partir de uma amostra representativa antes da indexação. O README descreve isso como uma melhoria do recall em configurações de dimensão finita ou baixa quantidade de bits, particularmente embeddings no estilo GloVe, permanecendo reutilizável para adições subsequentes. Um índice não calibrado usa TurboQuant simples.
A instalação Python está disponível via pip, e o uso em Rust via cargo add turbovec. O projeto documenta integrações opcionais para LangChain, LlamaIndex, Haystack e Agno, posicionadas como substitutas diretas para seus armazenamentos vetoriais em memória ou de referência. Essas integrações são instaladas por meio de extras opcionais do pacote.
O repositório inclui benchmarks executados pelo projeto comparando o turbovec com as configurações FAISS IndexPQFastScan e IndexPQ. O README relata menor uso de memória, busca medida mais rápida nas configurações ARM e x86 testadas, medições de latência de inserção e remoção, gráficos de recall, resultados de compressão e tempos de salvamento/carregamento. Esses são resultados de benchmark fornecidos, e não medições independentes de terceiros. Scripts para baixar conjuntos de dados de embeddings GloVe e OpenAI, executar suítes de recall/velocidade/compressão, salvar resultados em JSON e regenerar gráficos estão incluídos no diretório benchmarks.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.