Intermediário 11 minStack

FAISS : a biblioteca por trás da pesquisa vectorielle

Resposta direta

FAISS (Facebook AI Similarity Search) é uma biblioteca open source sob licença MIT, desenvolvida pelo grupo de pesquisa em IA da Meta, que busca os vetores mais próximos de um vetor dado. Não é um banco de dados: sem servidor, sem filtragem por metadados, sem persistência integrada. Contava com mais de 41.000 estrelas no GitHub no final de setembro de 2026 e atua como motor interno em vários bancos de dados vetoriais.

FAISS é uma biblioteca de busca por similaridade em vetores densos, desenvolvida principalmente pelo grupo de pesquisa em IA fundamental da Meta e utilizada internamente por muitas ferramentas que nunca a mencionam. Não é um banco de dados: não tem servidor, filtragem por metadados, controle de acesso nem persistência. Para uma cadeia local de processamento de documentos em um único processo, é a opção mais leve que funciona — e deixa de ser a ferramenta adequada assim que surgem requisitos de permissões de acesso ou vários processos gravando dados.

Por Mohamed Meguedmi·Atualização 2026-09-28·Testado no Windows, macOS e Linux

#Uma biblioteca, não uma base de dados

Costuma-se comparar o FAISS aos bancos de dados vetoriais como se fossem alternativas. São categorias diferentes. Um banco de dados vetorial é um serviço com API, armazenamento, filtragem e permissões. O FAISS é um componente: escrito em C++ com interfaces completas para Python e NumPy, ele recebe os vetores que você fornece, constrói um índice na memória e responde à pergunta “quais são os mais próximos deste?”. Vários bancos de dados vetoriais o utilizam, ou utilizam algo semelhante, internamente. O projeto é publicado sob a licença MIT, contava com mais de 41.000 estrelas no GitHub no fim de setembro de 2026, e seus autores indicam que alguns de seus métodos podem operar na escala de bilhões de vetores na memória principal de um único servidor.

A consequência prática é que escolher FAISS significa assumir todo o resto: salvar o índice no disco, recarregá-lo, manter o índice coerente com seus documentos, estabelecer a ligação entre a posição de um vetor e o texto de onde ele provém, e decidir o que acontece quando dois processos querem escrever ao mesmo tempo. Nada disso é fornecido por padrão; é uma escolha de arquitetura assumida, não um esquecimento do projeto.

#Os índices que importam

O kit RAG Local

Seus documentos, sua IA: um RAG local confiável para seus PDFs, notas e e-mails — sem enviar nada para a nuvem.

  • Espaço online vitalício
  • PDF + arquivos
  • Atualizações vitalícias
Quatro famílias, três concessões
IndexComo ele procuraQuando usar
Exato (Flat)Compara com todos os vetoresAté algumas dezenas de milhares: resultados exatos, nenhum ajuste, realmente rápido o suficiente
IVF (partições invertidas)Divide o espaço em clusters, explora apenas algumas partiçõesA partir de centenas de milhares; exige uma fase de aprendizado com dados representativos
HNSW (grafo de vizinhos)Navega em um grafo de linksMuita RAM disponível ou corpus modesto: rápido e preciso, mas sem eliminação de vetores
PQ / OPQ (quantização de produto)Armazena vetores comprimidos em códigos de M octetosQuando o índice não cabe mais na memória: a precisão diminui, mas o consumo de memória diminui muito mais
RaBitQ (compressão máxima)Comprime para 1 bit por dimensão, com um pequeno custo adicionalÚltimo recurso para economizar memória, com uma etapa de rotação aleatória para manter uma boa precisão

O conselho que economiza mais tempo: começar pela busca exata. Os índices aproximados existem para resolver um problema de escala; adotá-los antes de ter esse problema equivale a adquirir parâmetros para ajustar e uma métrica de recall para medir, em troca de milissegundos que ninguém percebeu. Na escala de um corpus local, a recuperação quase nunca é a etapa lenta — é a geração pelo modelo de linguagem que domina o tempo de resposta percebido pelo usuário final.

#O mínimo para começar em Python

  1. 01
    Instalar a biblioteca
    pip install faiss-cpu instala o pacote oficial do PyPI (versão 1.15.1 no fim de setembro de 2026). Para a variante GPU, o projeto documenta uma instalação via conda: conda install -c pytorch -c nvidia -c conda-forge faiss-gpu=1.15.1.
  2. 02
    Construir um índice exato
    index = faiss.IndexFlatL2(dimension) cria um índice de busca exata para vetores da dimensão do seu modelo de embedding.
  3. 03
    Adicionar vetores
    index.add(vecteurs), onde vecteurs é um array NumPy de forma (n, dimension), com valores de ponto flutuante de 32 bits.
  4. 04
    Consultar
    distances, indices = index.search(requete, k) retorna os k vizinhos mais próximos e suas distâncias; cabe a você associar indices aos trechos de texto originais.
  5. 05
    Salvar e recarregar
    faiss.write_index(index, chemin) seguido de faiss.read_index(chemin) mantém o índice salvo em disco entre duas execuções, pois o FAISS não faz isso por conta própria.

#Escolher um índice com base no tamanho do corpus

O wiki oficial do projeto fornece referências precisas, expressas como strings para serem passadas à sua fábrica de índice (index_factory). Com menos de um milhão de vetores, IVF_K é suficiente, com K escolhido entre 4×√N e 16×√N de acordo com o número de vetores N, e um conjunto de treinamento composto por 30×K a 256×K vetores. Entre 1 e 10 milhões, a combinação recomendada é IVF65536_HNSW32, que utiliza HNSW para acelerar a atribuição aos clusters. Entre 10 e 100 milhões, IVF262144_HNSW32; acima disso, até um bilhão, IVF1048576_HNSW32 — nesse estágio, o treinamento torna-se consideravelmente mais lento e é geralmente executado em GPU enquanto o restante roda em CPU.

Referências oficiais por tamanho do corpus
Tamanho do corpusConfiguração recomendada
Menos de 1 milhãoIVF_K (K entre 4×√N e 16×√N)
1 a 10 milhõesIVF65536_HNSW32
10 a 100 milhõesIVF262144_HNSW32
100 milhões a 1 bilhãoIVF1048576_HNSW32

Para um corpus documental local — de alguns milhares a várias centenas de milhares de trechos de texto — esses indicadores confirmam principalmente que estamos longe do limiar em que um índice aproximado se torna necessário: um índice exato ou, no pior dos casos, um simples IVF_K cobrem quase todos os casos reais, e configurações com várias centenas de milhares de entradas de treinamento permanecem fora do alcance do uso documental comum.

#A memória em números

Um vetor de 1.024 dimensões em ponto flutuante de 32 bits ocupa aproximadamente 4 KB. Um milhão de vetores, então, é cerca de 4 GB, antes mesmo da estrutura de índice. Para um índice HNSW, especificamente, o wiki oficial fornece a fórmula (d×4 + M×2×4) em bytes por vetor, onde d é a dimensão e M o número de ligações por vetor (entre 4 e 64: mais ligações, mais precisão, mais memória). Essa aritmética define a maioria das arquiteturas: é por isso que a compressão existe e é por isso que uma máquina que hospeda também um modelo de linguagem tem menos margem do que se imagina.

Quanto à compressão, a quantização de produto (PQ) codifica cada vetor em M bytes, normalmente no máximo 64 — acima disso, a quantização escalar (SQ) costuma ser tão precisa quanto a PQ e mais rápida. Quando a qualidade da compressão realmente importa, o guia oficial recomenda adicionar uma transformação OPQ antes da quantização: ela primeiro reduz a dimensão do vetor por meio de uma transformação linear que o torna mais fácil de comprimir e depois aplica a quantização de produto ao resultado. É uma etapa adicional de cálculo durante a indexação, mas reduz a perda de precisão em comparação com a quantização de produto direta, mantendo o mesmo tamanho de código. RaBitQ, a opção de compressão máxima, chega a cerca de (d/8 + 8) bytes por vetor, mantendo apenas um bit por dimensão, ao custo de uma etapa de rotação aleatória necessária para manter uma precisão adequada; existem variantes com vários bits por dimensão para recuperar um pouco de precisão em troca de um pouco mais de armazenamento.

i
Índice em RAM, modelo em VRAM
Os índices FAISS ficam, por padrão, na memória do sistema. Existe uma opção de execução em GPU para volumes muito grandes — a documentação oficial esclarece que ela aceita dados tanto da memória da CPU quanto da GPU —, mas disputar a placa com seu modelo de linguagem raramente compensa em uma instalação local. Observe também que um índice HNSW aceita apenas adições sequenciais (sem identificadores personalizados, a menos que o índice seja encapsulado em IDMap) e não permite excluir vetores individualmente, ao contrário do IVF.

#A função ausente que decide tudo

As perguntas reais têm condições: apenas os documentos desse cliente, apenas após essa data, apenas o que essa pessoa tem direito de ler. O FAISS não possui nenhuma noção de metadados. A solução alternativa habitual — recuperar mais resultados do que o necessário e depois filtrar em Python — falha de uma maneira específica: se os cinquenta melhores resultados pertencerem todos a outro departamento, a filtragem não deixa nenhum resultado, e seu assistente afirma não ter encontrado nenhuma informação, em vez de dizer que não encontrou nenhuma que você possa ver.

A filtragem por permissões, em especial, não deve ser implementada após a recuperação. Esse é o argumento prático mais forte a favor de um sistema que filtra durante a busca: um banco de dados vetorial, ou vetores no PostgreSQL, em que a filtragem é feita com uma cláusula WHERE.

#Quando FAISS é a escolha certa

Uma aplicação de um único processo
Que carrega um índice ao iniciar e o consulta: uma ferramenta de desktop, um processamento em lote, um caderno de anotações.
Corpus fixo
Reconstruído conforme um cronograma, em vez de ser atualizado continuamente.
Nenhum filtro por usuário
Ou uma filtragem tão pouco granular que um índice por categoria ainda seja razoável.
Uma latência crítica
Quando o custo de uma ida e volta pela rede até um banco de dados é exatamente o que você deseja eliminar, por exemplo, em uma ferramenta embarcada sem conexão garantida.

Fora desses casos, o serviço que evitamos instalar geralmente custa menos, ao longo do tempo, do que o código de persistência, filtragem e concorrência que acabamos tendo que reescrever por conta própria à medida que o projeto cresce.

Um último ponto útil antes de decidir: vários bancos de dados vetoriais que você encontrará em outros contextos não substituem o FAISS por mágica; eles o encapsulam ou se inspiram nas mesmas famílias de índices (IVF, HNSW, quantização de produto), oferecendo uma API de rede, um sistema de persistência gerenciado e um mecanismo de filtragem. Entender o FAISS equivale, portanto, a entender boa parte do funcionamento interno dos próprios bancos de dados vetoriais — um desvio útil mesmo que o projeto final use Qdrant ou Milvus em vez de usar o FAISS diretamente, porque os mesmos compromissos entre memória e precisão aparecem com outros nomes de parâmetros.

#FAQ

O FAISS é uma base de dados vetorial?+
Não, é uma biblioteca de busca por similaridade, escrita em C++ com wrappers para Python e NumPy. Não inclui servidor, filtragem por metadados, controle de acesso nem durabilidade integrada — é precisamente isso que um banco de dados vetorial como Qdrant ou Milvus acrescenta sobre um motor comparável, muitas vezes inspirado nos mesmos princípios de indexação.
O FAISS é gratuito e open source?+
Sim. O projeto é publicado sob a licença MIT, uma licença permissiva que permite o uso comercial sem pagamento de royalties, e é desenvolvido principalmente pelo grupo de pesquisa em IA fundamental da Meta. Não há custo de licença a considerar, apenas o tempo de integração, operação e atualização da biblioteca em sua stack.
Quantos vetores ele pode gerenciar?+
Milhões, ou até bilhões segundo os autores do projeto, com o índice adequado e memória RAM suficiente. A limitação é a RAM: cerca de 4 KB por vetor de 1.024 dimensões em precisão total, sem contar a estrutura do índice, ou bem menos com quantização de produto ou RaBitQ para volumes muito grandes.
É possível filtrar os resultados por metadados?+
Não durante a busca. A filtragem é feita depois, no seu próprio código, o que pode não deixar nenhum resultado quando todos os melhores resultados são rejeitados pelo filtro. Para filtrar por permissões de acesso, é necessário um sistema que faça a filtragem durante a própria recuperação, como o pgvector ou um banco de dados vetorial dedicado.
FAISS ou uma base vetorial?+
FAISS para um único processo, um corpus fixo e nenhuma filtragem. Um banco de dados assim que houver vários clientes, atualizações contínuas, persistência ou permissões de acesso que precisem ser aplicadas durante a própria busca, em vez de depois, no código da sua aplicação.
Por qual índice começar?+
O índice exato (IndexFlatL2 ou IndexFlatIP, conforme a distância). Nenhum ajuste, nenhuma fase de aprendizado, nenhum recall a medir, e ele é suficientemente rápido mesmo para volumes muito maiores que os da maioria dos corpus locais — o wiki oficial só recomenda um índice aproximado quando há mais de um milhão de vetores.
O HNSW pode substituir o IVF em todos os casos?+
Não. HNSW é adequado quando há abundância de RAM ou quando o corpus é modesto, mas aceita apenas adições sequenciais e não suporta a exclusão de vetores. IVF, embora mais lento em consultas puras, é mais flexível para um corpus que evolui e pode ser combinado com HNSW acima de um milhão de vetores. A execução na GPU substitui diretamente o índice equivalente na CPU (por exemplo, GpuIndexFlatL2 para IndexFlatL2), mas raramente é útil na escala de um corpus local.
Este guia ajudou você?

Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.