Annoy vs Voyager: Escolhendo a ferramenta certa de busca vetorial para GenAI
À medida que as aplicações impulsionadas por IA continuam a crescer, a necessidade de ferramentas de busca vetorial rápidas e escaláveis tornou-se essencial. A busca vetorial é um elemento fundamental em sistemas de recomendação, recuperação de imagens, processamento de linguagem natural (NLP) e outros campos em que encontrar similaridades entre dados de alta dimensionalidade é crítico. Entre as muitas ferramentas disponíveis para busca vetorial, Annoy e Voyager são duas opções amplamente utilizadas, cada uma oferecendo vantagens distintas.
Neste artigo, vamos comparar Annoy e Voyager, com foco em seus recursos, metodologias de busca, escalabilidade e casos de uso para ajudar você a decidir qual delas é mais adequada às suas necessidades.
O que é Busca Vetorial?
Antes de mergulhar nos detalhes do Annoy e do Voyager, é essencial entender a busca vetorial. Em termos simples, a busca vetorial, ou busca por similaridade vetorial, encontra os vetores (pontos de dados) mais próximos em um espaço de alta dimensionalidade em relação a um determinado vetor de consulta. Esses vetores são frequentemente gerados por modelos de machine learning para capturar a essência dos dados não estruturados (por exemplo, o significado de uma frase ou as características de uma imagem).
Diferentemente dos bancos de dados tradicionais, em que as buscas são baseadas em correspondências exatas ou filtragem, a busca vetorial concentra-se na similaridade. O objetivo é encontrar vetores que estejam "próximos" uns dos outros com base em uma métrica de distância (como distância euclidiana ou similaridade de cosseno). Por exemplo, vetores podem representar palavras ou frases em processamento de linguagem natural (NLP), e a busca vetorial ajuda a encontrar as palavras ou textos mais semanticamente similares. Em sistemas de recomendação, a busca vetorial identifica itens mais próximos das preferências de um usuário. As buscas vetoriais também desempenham um papel crucial na geração aumentada por recuperação (RAG), uma técnica que aumenta a saída de grandes modelos de linguagem (LLMs) fornecendo a eles informações contextuais extras.
Há muitas soluções disponíveis no mercado para realizar buscas vetoriais, incluindo:
- Bibliotecas de busca vetorial como Annoy e Voyager.
- Bancos de dados vetoriais criados para esse fim como Milvus, Zilliz Cloud (Milvus totalmente gerenciado)
- Bancos de dados vetoriais leves como Chroma e Milvus Lite.
- Bancos de dados tradicionais com complementos de busca vetorial
O que é Annoy? Uma visão geral
Annoy (Approximate Nearest Neighbors Oh Yeah) é uma biblioteca open-source desenvolvida pelo Spotify, projetada para busca eficiente de vizinhos mais próximos aproximados (ANN) em espaços de alta dimensionalidade. Sua função principal é encontrar rapidamente itens semelhantes a um determinado item de consulta, com base em embeddings vetoriais. Annoy é particularmente útil ao trabalhar com grandes conjuntos de dados em que correspondências exatas não são tão importantes quanto encontrar rapidamente resultados "suficientemente próximos". Com base nas preferências dos usuários, ele é frequentemente usado para criar mecanismos de recomendação que sugerem itens semelhantes (como músicas, produtos ou vídeos).
Principais recursos e pontos fortes do Annoy
- Busca Aproximada de Vizinhos Mais Próximos: Annoy é conhecido por sua velocidade ao realizar buscas aproximadas de vizinhos mais próximos (ANN), que fornecem resultados “bons o suficiente” sem exigir correspondências exatas. Isso é particularmente útil para aplicações que lidam com conjuntos de dados massivos, nas quais uma busca exata pode ser lenta demais ou consumir muitos recursos.
- Indexação Baseada em Árvores: Annoy usa árvores de projeção aleatória para indexar dados, o que acelera as consultas de busca ao organizar os dados em subconjuntos mais gerenciáveis.
- Armazenamento em Disco: Um dos recursos mais valiosos do Annoy é que ele armazena seus índices em disco. Isso significa que grandes conjuntos de dados que não cabem na memória ainda podem ser indexados e pesquisados de forma eficiente. O armazenamento em disco do Annoy também permite compartilhar índices entre diferentes processos, ajudando a reduzir o uso de memória.
- Eficiência de Memória: Annoy é otimizado para trabalhar de forma eficiente com memória. Ele permite que você construa o índice na memória e o armazene em disco, tornando possível lidar com grandes conjuntos de dados mesmo que você não tenha RAM suficiente. Esse recurso é particularmente útil se a memória do seu sistema for uma limitação.
- Índices Imutáveis: Depois que um índice é construído no Annoy, ele não pode ser modificado. Se o conjunto de dados mudar, você precisará reconstruir todo o índice. Isso o torna uma boa escolha para conjuntos de dados estáticos, nos quais os dados não mudam com frequência.
- Consultas em Lote: Você pode executar várias consultas em paralelo, o que ajuda a otimizar ainda mais o processo de busca, especialmente para aplicações de alto rendimento.
- Suporte a Linguagens: Annoy é usado principalmente em Python, mas é escrito em C++ por motivos de desempenho.
A força do Annoy está em sua simplicidade e capacidade de lidar com buscas de vetores de alta dimensionalidade com velocidade e eficiência. No entanto, ele sacrifica algum nível de precisão para alcançar esses ganhos de desempenho.
O que é Voyager? Uma Visão Geral
Voyager é a mais nova biblioteca de busca vetorial do Spotify, projetada para substituir o Annoy. Construída sobre o hnswlib, Voyager é otimizada para casos de uso modernos de busca de vizinhos mais próximos que exigem maior velocidade e precisão, melhor eficiência de memória e maior flexibilidade. Ela também oferece recursos robustos prontos para produção que a tornam mais adequada para implantações em nível empresarial.
Principais Recursos e Pontos Fortes do Voyager
- Velocidade e Precisão: Voyager oferece mais de 10 vezes a velocidade do Annoy mantendo a mesma taxa de recall. Ele também entrega até 50% mais precisão para o mesmo nível de velocidade, fornecendo resultados mais precisos sem comprometer o desempenho.
- Eficiência de Memória: Voyager é altamente eficiente em termos de memória, usando até 4 vezes menos memória do que Annoy, graças ao uso da representação de ponto flutuante de 8 bits E4M3. Isso o torna ideal para ambientes com restrição de memória.
- Multithreading e Escalabilidade: Voyager oferece suporte à criação e consulta de índices multithread, tornando-o altamente escalável. Seja construindo um pequeno aplicativo ou uma grande solução empresarial, Voyager pode lidar com a carga de trabalho de forma eficiente.
- Suporte a Linguagens: Diferentemente de muitas ferramentas de busca de vizinhos mais próximos que oferecem suporte apenas a Python, Voyager fornece interfaces idênticas para Python e Java, tornando-o mais versátil para diferentes ambientes de desenvolvimento.
- Tolerante a Falhas e Pronto para Produção: Voyager inclui arquivos de índice tolerantes a falhas com detecção de corrupção, garantindo que o sistema possa lidar com implantações em larga escala sem o risco de corrupção de dados.
- Integração com Google Cloud: Voyager oferece suporte integrado para E/S baseada em streams a partir dos Google Cloud Services, permitindo que você transmita índices diretamente da nuvem, o que pode simplificar o gerenciamento de grandes conjuntos de dados.
Voyager foi projetado com uso em produção em mente, oferecendo velocidade, precisão e eficiência de memória, ao mesmo tempo em que fornece forte suporte a linguagens e compatibilidade com infraestrutura baseada em nuvem.
Principais Diferenças Entre Annoy e Voyager
Metodologia de Busca
Annoy usa árvores de projeção aleatória para sua busca aproximada de vizinhos mais próximos, priorizando a velocidade em detrimento de alguma precisão. Esse método funciona bem quando o conjunto de dados de busca é grande e você não precisa de resultados perfeitos. Em contraste, Voyager é baseado em hnswlib, que emprega o algoritmo Hierarchical Navigable Small World (HNSW). Esse método oferece melhor precisão e velocidade, superando o Annoy na maioria dos casos de uso, especialmente quando a precisão é importante.
Tratamento de Dados
Annoy é otimizado para dados não estruturados e buscas de vetores de alta dimensionalidade. Sua abordagem baseada em árvores lida com grandes volumes de dados de forma eficiente, mas não é muito flexível quando se trata de dados estruturados ou semiestruturados. Voyager, por outro lado, é mais flexível. Embora ambos lidem com dados vetoriais, o design do Voyager, particularmente seu multithreading e integração com o Google Cloud, o torna mais adequado para ambientes de dados mais complexos e de larga escala, nos quais vários tipos de dados estão envolvidos.
Escalabilidade e Desempenho
Ambas as ferramentas escalam bem, mas Voyager oferece mais opções de escalabilidade com seu suporte à criação e consulta de índices multithread. Os arquivos de índice tolerantes a falhas do Voyager e sua compatibilidade com a nuvem também facilitam a escalabilidade em sistemas distribuídos ou ambientes de nuvem. Annoy é mais simples de implantar e consegue lidar com grandes conjuntos de dados de forma eficiente, mas não é tão robusto em termos de escalabilidade em nível empresarial ou arquiteturas nativas da nuvem.
Flexibilidade e Personalização
Annoy oferece personalização básica, mas seu foco principal está na busca aproximada de vizinhos mais próximos, limitando sua flexibilidade para se adaptar a diferentes tipos de dados ou metodologias de busca. Voyager, em contraste, é desenvolvido com personalização em mente. Os usuários podem ajustar o desempenho com base em suas necessidades específicas, equilibrando velocidade, precisão, latência e custo. Isso torna o Voyager uma opção melhor para aplicações que exigem soluções mais personalizadas.
Integração e Ecossistema
Annoy é uma biblioteca independente, com suporte limitado para integração em ecossistemas maiores. Funciona bem com projetos baseados em Python, mas carece das capacidades de integração mais amplas necessárias para ambientes empresariais. Voyager se destaca aqui, oferecendo integração perfeita com serviços baseados em nuvem como o Google Cloud e suporte completo a Java e Python. Isso facilita a incorporação do Voyager em pipelines de dados maiores, fluxos de trabalho de machine learning e sistemas empresariais.
Facilidade de Uso
A simplicidade do Annoy é uma de suas maiores forças. É fácil de configurar e usar, especialmente se você estiver trabalhando em um ambiente Python. No entanto, seu escopo é relativamente limitado. Voyager, por outro lado, oferece mais recursos e flexibilidade, mas vem com uma curva de aprendizado ligeiramente maior devido às suas capacidades adicionais e opções de personalização. O fato de o Voyager estar pronto para produção e incluir documentação extensa tanto para Python quanto para Java ajuda a facilitar o processo de integrá-lo a sistemas mais complexos.
Considerações de Custo
Annoy é completamente open-source e não acarreta nenhum custo de licenciamento. No entanto, os usuários ainda precisam levar em conta os custos de infraestrutura e escalabilidade ao implantá-lo em ambientes de larga escala. Voyager, por ser mais novo e mais avançado, pode gerar custos adicionais, especialmente se você usar serviços gerenciados como o Google Cloud para hospedar seus índices. Dito isso, a eficiência de memória do Voyager e sua capacidade de lidar com grandes conjuntos de dados em escala podem resultar em economia de custos ao longo do tempo, especialmente para aplicações em nível empresarial.
Recursos de Segurança
Annoy não vem com recursos de segurança integrados. Os usuários precisariam implementar criptografia, autenticação e controle de acesso separadamente, se necessário. O Voyager, por ser projetado para ambientes de produção, inclui melhor suporte para arquivos de índice tolerantes a falhas e detecção de corrupção, mas recursos de segurança como criptografia e controle de acesso ainda precisariam ser implementados fora da própria ferramenta.
Quando escolher o Annoy
Annoy é uma excelente escolha se:
- Você está trabalhando em um projeto de menor escala em que a busca aproximada de vizinhos mais próximos é suficiente.
- Sua aplicação não precisa lidar com dados estruturados ou semiestruturados.
- Você prioriza velocidade em vez de precisão, e a precisão dos resultados da busca é menos crítica.
- Você tem restrições de recursos de memória, mas precisa lidar com grandes conjuntos de dados de forma eficiente.
- Sua equipe prefere uma ferramenta leve e fácil de usar com configuração mínima.
Quando escolher o Voyager
Voyager é a melhor escolha se:
- Você exige um alto nível de precisão e precisa de resultados precisos para suas buscas de vizinhos mais próximos.
- Sua aplicação lida com dados estruturados, semiestruturados e não estruturados, e você precisa de mais flexibilidade.
- Você está trabalhando em um ambiente de grande escala baseado em nuvem e requer integração com serviços em nuvem sem interrupções, como o Google Cloud.
- Seu projeto precisa equilibrar velocidade, precisão e custo, com a opção de personalizar os algoritmos de busca e o manuseio de dados.
- Você precisa de uma solução pronta para produção com forte suporte tanto para Python quanto Java e recursos robustos de tolerância a falhas.
Comparando bibliotecas de busca vetorial e bancos de dados vetoriais criados para esse fim
Tanto bibliotecas de busca vetorial como Annoy e Voyager quanto bancos de dados vetoriais criados para esse fim, como Milvus, têm como objetivo resolver o problema de busca por similaridade para dados vetoriais de alta dimensionalidade, mas desempenham papéis diferentes.
Bibliotecas de busca vetorial concentram-se exclusivamente na tarefa de busca eficiente de vizinhos mais próximos. Elas oferecem soluções leves e rápidas para encontrar vetores semelhantes a um vetor de consulta. São frequentemente usadas em ambientes menores, de nó único, ou para aplicações com conjuntos de dados estáticos ou de tamanho moderado. No entanto, geralmente não possuem recursos para gerenciar dados dinâmicos, fornecer persistência ou escalar em sistemas distribuídos. Desenvolvedores que usam essas bibliotecas normalmente precisam lidar manualmente com o gerenciamento de dados, atualizações e escalabilidade.
Por outro lado, bancos de dados vetoriais criados para esse fim como Milvus e Zilliz Cloud (o Milvus gerenciado) são sistemas abrangentes projetados para o gerenciamento de dados vetoriais em larga escala. Esses bancos de dados vão além da simples busca vetorial, oferecendo recursos como armazenamento persistente, atualizações em tempo real, arquitetura distribuída e recursos avançados de consulta. Eles oferecem suporte a conjuntos de dados dinâmicos e podem lidar facilmente com aplicações em tempo real nas quais os dados são atualizados com frequência. Além disso, bancos de dados vetoriais muitas vezes incluem suporte integrado para combinar buscas vetoriais com filtragem tradicional e consultas de metadados, tornando-os ideais para ambientes de produção que exigem escalabilidade, alta disponibilidade e funcionalidades de busca mais complexas.
- Confira os mais recentes novos recursos e melhorias do Zilliz Cloud: Zilliz Cloud Update: Migration Services, Fivetran Connectors, Multi-replicas, and More
Quando escolher cada solução de busca vetorial
Escolha bibliotecas de busca vetorial se:
- Você tem um conjunto de dados de pequeno a médio porte e relativamente estático.
- Você prefere controle total sobre os algoritmos de indexação e busca.
- Você está incorporando a busca em um sistema existente e consegue gerenciar a infraestrutura.
Escolha bancos de dados vetoriais criados para esse fim se:
- Você precisa escalar para bilhões de vetores em sistemas distribuídos.
- Seu conjunto de dados muda frequentemente, exigindo atualizações em tempo real.
- Você prefere soluções gerenciadas que cuidem de armazenamento, escalonamento e otimizações de consulta para você.
Em resumo, as bibliotecas de busca vetorial são mais adequadas para casos de uso mais simples e de menor escala, nos quais velocidade e eficiência de memória são prioridades, mas a complexidade operacional é mínima. Bancos de dados vetoriais especializados, por outro lado, são projetados para sistemas em larga escala e de nível de produção que exigem manipulação dinâmica de dados, escalabilidade e facilidade de uso, muitas vezes proporcionando benefícios operacionais significativos para desenvolvedores que gerenciam aplicações complexas.
Avaliando e Comparando Quaisquer Soluções de Busca Vetorial
OK, agora aprendemos a diferença entre diferentes soluções de busca vetorial. As seguintes perguntas são: como você garante que seu algoritmo de busca retorne resultados precisos e faça isso em velocidade relâmpago? Como você avalia a eficácia de diferentes algoritmos ANN, especialmente em escala?
Para responder a essas perguntas, precisamos de uma ferramenta de benchmarking. Muitas ferramentas desse tipo estão disponíveis, e duas se destacam como as mais eficientes: ANN benchmarks e VectorDBBench.
ANN benchmarks
ANN Benchmarks (Benchmarks de Vizinhos Mais Próximos Aproximados) é um projeto de código aberto projetado para avaliar e comparar o desempenho de vários algoritmos de vizinhos mais próximos aproximados (ANN). Ele fornece uma estrutura padronizada para benchmarking de diferentes algoritmos em tarefas como busca vetorial de alta dimensionalidade, permitindo que desenvolvedores e pesquisadores meçam métricas como velocidade de busca, precisão e uso de memória em vários conjuntos de dados. Ao usar ANN-Benchmarks, você pode avaliar os trade-offs entre velocidade e precisão para algoritmos como aqueles encontrados em bibliotecas como Faiss, Annoy, HNSWlib e outras, tornando-o uma ferramenta valiosa para entender quais algoritmos apresentam melhor desempenho para aplicações específicas.
Repositório GitHub do ANN Benchmarks: https://github.com/erikbern/ann-benchmarks
Site do ANN Benchmarks: https://ann-benchmarks.com/
VectorDBBench: uma ferramenta de benchmarking de código aberto
VectorDBBench é uma ferramenta de benchmarking de código aberto projetada para usuários que exigem sistemas de armazenamento e recuperação de dados de alto desempenho, particularmente bancos de dados vetoriais. Esta ferramenta permite que os usuários testem e comparem o desempenho de diferentes sistemas de bancos de dados vetoriais, como Milvus e Zilliz Cloud (o Milvus gerenciado), usando seus próprios conjuntos de dados, e determinem o mais adequado para seus casos de uso. VectorDBBench é escrito em Python e licenciado sob a licença de código aberto MIT, o que significa que qualquer pessoa pode usá-lo, modificá-lo e distribuí-lo livremente.
Repositório GitHub do VectorDBBench: https://github.com/zilliztech/VectorDBBench
Dê uma olhada rápida no desempenho dos principais bancos de dados vetoriais no Leaderboard do VectorDBBench.
Técnicas & Insights sobre Avaliação de VectorDB:
Recursos Adicionais sobre VectorDB, GenAI e ML
Continue lendo

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.
The Definitive Guide to Choosing a Vector Database
Overwhelmed by all the options? Learn key features to look for & how to evaluate with your own data. Choose with confidence.


