Configurando com o Facebook AI Similarity Search (FAISS)
Olá, entusiastas da tecnologia! Hoje, estamos embarcando em uma jornada para explorar uma ferramenta que tem causado impacto na inteligência artificial: a AI Similarity Search (FAISS) do Facebook. Suponha que você já tenha se perguntado como o Spotify encontra músicas que soam assustadoramente semelhantes às suas favoritas ou como o Google Photos consegue agrupar fotos da mesma pessoa. Nesse caso, você está prestes a desvendar o mistério.
A busca por similaridade, ou busca pelo vizinho mais próximo, é um aspecto crucial de muitas aplicações de IA e aprendizado de máquina. Trata-se de encontrar os pontos de dados mais semelhantes a um determinado ponto de consulta. Por exemplo, quando você pesquisa uma música no Spotify, o sistema precisa encontrar as músicas que são mais “semelhantes” à sua consulta de pesquisa — daí, uma busca por similaridade.
Por mais impressionante que essa busca eficiente por similaridade pareça, há um porém. Os métodos tradicionais de busca por similaridade podem se tornar terrivelmente lentos com grandes quantidades de dados. É aí que o FAISS entra e resolve as limitações dos mecanismos tradicionais de busca por consulta. É uma biblioteca para similaridade eficiente desenvolvida pela Facebook AI que fornece soluções confiáveis para problemas de busca por similaridade, especialmente ao lidar com dados em grande escala.
Mas chega de conversa fiada! Esta publicação do blog guiará você pela configuração do FAISS, colocando-o em funcionamento e demonstrando seu poder por meio de um programa de exemplo de busca por similaridade. Então aperte o cinto, porque estamos prestes a mergulhar fundo no fascinante mundo da busca eficiente por similaridade com FAISS. Vai ser uma jornada divertida!
Entendendo o FAISS (Facebook AI Similarity Search)
Agora que abrimos o apetite com uma rápida introdução, vamos nos aprofundar no FAISS. FAISS, ou Facebook AI Similarity Search, é uma biblioteca de algoritmos para busca por similaridade vetorial e agrupamento de vetores densos. É uma criação da equipe de IA do Facebook, que a projetou para lidar com grandes bancos de dados de forma eficiente.
O FAISS funciona principalmente com base no conceito de “similaridade vetorial.” Em termos leigos, vetores são essencialmente uma lista de números, e similaridade diz respeito a quão parecidos dois vetores são. Imagine que você está tentando encontrar uma música que combine com o clima da sua favorita atual. Vetores podem representar ambas as músicas, com diferentes elementos de vetores semelhantes representando diferentes características das músicas. Você pode comparar a “similaridade” entre essas músicas comparando a distância de seus vetores em um espaço de alta dimensão. A distância euclidiana desempenha um papel crucial na medição dessa similaridade entre vetores.
É aqui que o FAISS mostra sua força. Ele fornece uma maneira de comparar rápida e precisamente milhões, ou até bilhões, de desses vetores. É como ter um mecanismo de busca turbinado que consegue vasculhar uma enorme biblioteca musical em um piscar de olhos, identificando as músicas mais semelhantes à sua favorita. Vetores indexados são essenciais nesse processo, pois permitem que o sistema busque eficientemente as correspondências mais próximas de um determinado vetor de consulta.
Mas a magia do FAISS não para nas recomendações de músicas. Muitas aplicações usam o FAISS, desde reconhecimento de imagens e recuperação de texto até agrupamento e análise de dados. Sempre que você tiver uma grande quantidade de dados e precisar encontrar itens semelhantes rapidamente, o FAISS pode ser sua ferramenta ideal.
Configurando o FAISS
Esta seção guiará você sobre como configurar o FAISS em um sistema Linux.
Instalando o Conda
Antes de instalar o FAISS, você precisa ter o Conda instalado em seu sistema. Conda é um sistema de código aberto de gerenciamento de pacotes e ambientes que roda no Windows, macOS e Linux.
Siga estas etapas para instalar o Conda em um sistema Linux:
Baixe o instalador do Miniconda para Linux no site oficial.
Verifique os hashes do seu instalador.
Abra uma janela de terminal e execute o seguinte comando para iniciar a instalação:
bash Miniconda3-latest-Linux-x86_64.sh
Quando o instalador iniciar, ele fará algumas perguntas. Se você não tiver certeza sobre algo, use as opções padrão. Você sempre pode alterar as coisas depois.
Depois de concluir a instalação, feche a janela do terminal e abra-a novamente. Isso garantirá que quaisquer alterações feitas sejam ativadas.
Agora, você vai querer verificar se tudo está instalado corretamente. Para fazer isso, digite conda list na janela do terminal ou no Anaconda Prompt e pressione enter. Se tudo funcionar corretamente, você verá uma lista de pacotes instalados.
Instalando o FAISS
Você pode instalar o FAISS via Conda. O pacote FAISS tem duas versões: uma versão somente para CPU (faiss-cpu) e uma versão que inclui índices para CPU e GPU (faiss-gpu). Dependendo das suas necessidades, você pode instalar qualquer uma dessas versões.
A forma recomendada de instalar o FAISS é por meio do canal Conda do PyTorch. Aqui estão os comandos para instalar a versão estável mais recente do FAISS.
Para a versão CPU:
conda install -c pytorch faiss-cpu
Para a versão GPU:
conda install -c pytorch faiss-gpu
Além disso, o FAISS é empacotado pelo conda-forge, que é um ecossistema de empacotamento para Conda impulsionado pela comunidade. Você pode instalar o FAISS a partir do conda-forge usando os seguintes comandos. Para a versão somente para CPU:
conda install -c conda-forge faiss-cpu
Para a versão GPU:
conda install -c conda-forge faiss-gpu
Passo a passo de código de exemplo usando SQuAD
Você pode verificar de qual canal seus pacotes Conda vêm usando o comando conda list.
Vamos usar o Stanford Question Answering Dataset (SQuAD) para esta demonstração. O SQuAD é um conjunto de dados popular para processamento de linguagem natural (NLP) e uma ótima forma de ilustrar como o FAISS funciona. Este conjunto de dados contém pares de perguntas e respostas, em que a resposta para cada pergunta é um segmento de texto, ou “span,” da passagem de leitura correspondente. No processo de busca, vetores de consulta são usados para encontrar as respostas mais relevantes comparando-os com o conjunto de dados.
Antes de mergulharmos no código, vamos primeiro baixar e preparar o conjunto de dados SQuAD:
Baixe o conjunto de dados SQuAD: Você pode baixar o conjunto de dados no site do SQuAD. Para simplificar, usaremos o SQuAD 1.1. Você pode baixar o conjunto de dados usando o seguinte link: SQuAD 1.1 Train. Baixe e salve o arquivo JSON (train-v1.1.json) no seu diretório de trabalho.
Leia o arquivo JSON: Agora você pode usar a biblioteca JSON do Python para carregar os dados:
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
Vetores numéricos são essenciais no índice FAISS, pois permitem medições de distância e consultas eficientes dentro do IndexFlatL2.
Importando as bibliotecas necessárias
O primeiro passo é importar todas as bibliotecas necessárias. Precisaremos de numpy para operações numéricas, Faiss para nossa busca de similaridade vetorial, JSON para carregar nosso conjunto de dados e nltk para tokenizar nosso texto.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Carregando e pré-processando dados
Vamos carregar o conjunto de dados SQuAD. É um arquivo JSON, então podemos usar a função load do módulo JSON.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Vamos assumir que o objeto JSON é um dicionário contendo uma chave data e uma lista de dicionários. Cada dicionário na lista representa um artigo contendo uma chave paragraph com uma lista de parágrafos.
Agora, vamos pré-processar os dados. Vamos tokenizar cada parágrafo usando a função word_tokenize do nltk, que divide uma frase em palavras individuais. Em seguida, representaremos cada palavra como um vetor codificado one-hot.
vocabulary = set(word for article in squad_data['data'] for paragraph in article['paragraphs'] for word in word_tokenize(paragraph['context']))
word_to_index = {word: index for index, word in enumerate(vocabulary)}
def convert_text_to_vector(text):
words = word_tokenize(text)
bow_vector = np.zeros(len(vocabulary))
for word in words:
word in word_to_index:
bow_vector[word_to_index[word]] = 1
return bow_vector
paragraph_vectors = [convert_text_to_vector(paragraph['context']) for article in squad_data['data'] for paragraph in article['paragraphs']]
Construindo o índice
Agora que temos nossos dados no formato certo, podemos construir nosso índice FAISS. Usaremos o tipo de índice IndexFlatL2, um índice básico de distância L2.
dimension = len(vocabulary)
index = faiss.IndexFlatL2(dimension)
# Convert our list of NumPy arrays to a single 2D array
paragraph_vectors = np.stack(paragraph_vectors).astype('float32')
index.add(paragraph_vectors)
O tipo IndexFlatL2 exige que especifiquemos a dimensão dos nossos dados. Como cada um dos nossos vetores é codificado em one-hot, a dimensão é o tamanho do nosso vocabulário.
Em seguida, adicionamos nossos dados ao índice usando o método add, que requer um array NumPy 2D.
Realizando uma busca vetorial com FAISS
Com nosso índice totalmente configurado, agora podemos brincar de detetive e encontrar parágrafos em nosso conjunto de dados que correspondam mais de perto à nossa consulta de busca.
Aqui está nossa função de busca:
def search_for_paragraphs(search_term, num_results):
search_vector = convert_text_to_vector(search_term)
search_vector = np.array([search_vector]).astype('float32')
distances, indexes = index.search(search_vector, num_results)
for i, (distance, index) in enumerate(zip(distances[0], indexes[0])):
print(f"Result {i+1}, Distance: {distance}")
print(squad_data['data'][index]['paragraphs'][0]['context'])
print()
Nosso termo de busca é "What is the capital of France?" e queremos encontrar 5 resultados:
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
A search_for_paragraphs() primeiro transforma nosso termo de busca em um vetor codificado. Em seguida, usamos essa representação vetorial como método de busca em nosso índice. Isso precisa de um array 2D, então adicionamos uma dimensão extra ao nosso vetor de busca.
O método de busca por similaridade também precisa que digamos quantos resultados queremos (é para isso que serve num_results). O método search nos fornece dois arrays 2D: um para as distâncias dos resultados mais próximos e outro para seus índices. Podemos usar esses índices para encontrar os parágrafos reais em nosso conjunto de dados. Então, imprimimos a classificação de cada resultado, a distância de similaridade e o texto do parágrafo.
E aí está! Este é um exemplo básico de uso do FAISS para encontrar dados de texto semelhantes. É claro que o FAISS pode fazer coisas muito mais complexas, como buscar em espaços vetoriais de alta dimensionalidade. No entanto, este exemplo deve oferecer a você um bom ponto de partida para usar o FAISS.
Melhores práticas e dicas
Tem seus dados? Conheça-os: Antes de usar o FAISS, reserve um momento para conhecer seus dados. Faça perguntas como estas: Ele está cheio de números altos? Está cheio de lacunas ou repleto de informações? Conhecer seus dados ajudará você a escolher o tipo correto de índice FAISS e determinar a melhor forma de preparar seus dados.
O pré-processamento é fundamental: A forma como você prepara seus dados pode afetar significativamente o desempenho do FAISS. Para dados de texto, pense em usar maneiras mais inteligentes de transformar palavras em números, como TF-IDF ou Word2Vec, em vez de apenas codificação one-hot. Para imagens, tente usar recursos de uma rede neural convolucional (CNN).
Escolha o melhor índice para você: o FAISS tem vários tipos de índice, cada um com pontos fortes especiais. Alguns são ótimos para lidar com dados que têm muitas dimensões, outros são perfeitos para vetores binários, e alguns são feitos para lidar com dados muito, muito grandes. Portanto, certifique-se de escolher aquele que funcionará melhor para as suas necessidades.
Agrupe suas consultas em lotes: se você tiver consultas demais para executar no seu índice, é mais eficiente agrupá-las e executá-las todas de uma vez. O FAISS é otimizado para processamento em lote.
Ajuste seus parâmetros: o FAISS tem vários parâmetros ajustáveis, como o número de clusters na etapa de indexação e o número de probes na etapa de busca por similaridade vetorial. Não fique apenas com os padrões; experimente diferentes configurações para ver o que funciona melhor para os seus dados.
Bancos de dados vetoriais vs FAISS
O FAISS é uma ótima solução para busca ANN. Além disso, o FAISS fornece código de apoio que oferece funcionalidades adicionais para avaliação e ajuste de parâmetros relacionados à busca por similaridade e ao agrupamento de vetores densos. Ainda assim, ele tem algumas limitações quando você tem dezenas de milhões de vetores para armazenamento e recuperação e, ao mesmo tempo, exige respostas em tempo real ou recursos avançados relacionados a vetores de consulta.
Em comparação com o FAISS, bancos de dados vetoriais criados especificamente para esse fim, como Milvus e Zilliz Cloud, podem resolver os desafios mencionados acima e têm capacidades mais avançadas em:
Funcionalidades básicas, como suporte a CRUD, consistência de dados e busca com filtros
Disponibilidade do sistema com forte persistência de dados e melhor recuperação de desastres
Escalabilidade do sistema com suporte a balanceamento de carga, uma arquitetura distribuída que separa computação e armazenamento, e melhor usabilidade
RBAC com suporte para multi-tenant, SDKs de várias linguagens de programação, API restful e um sistema de monitoramento.
Milvus é o primeiro e mais popular banco de dados vetorial open-source do mundo para busca por similaridade em escala de bilhões e aplicações de IA. O Milvus pode armazenar, indexar e gerenciar mais de um bilhão de embeddings de vetores gerados por redes neurais profundas e outros modelos de machine learning (ML). Para tornar os bancos de dados vetoriais acessíveis a todos os desenvolvedores e organizações, a Zilliz contribuiu com o Milvus para a LF AI & Data Foundation como um projeto em estágio de incubação, e ele se graduou em junho de 2021.
Milvus Lite é uma versão leve do Milvus que roda localmente dentro da sua aplicação Python. Com base no popular banco de dados vetorial open-source Milvus, o Milvus Lite reutiliza os componentes principais para indexação vetorial e análise de consultas, enquanto remove elementos projetados para alta escalabilidade em sistemas distribuídos. Esse design cria uma solução compacta e eficiente, ideal para ambientes com recursos computacionais limitados, como laptops, Jupyter Notebooks e dispositivos móveis ou de edge.
Zilliz Cloud é um serviço de banco de dados vetorial totalmente gerenciado construído sobre o Milvus. Com o Zilliz Cloud, a recuperação vetorial é dez vezes mais rápida, e implantar e escalar aplicações de busca vetorial é mais fácil do que nunca. O Zilliz Cloud também oferece um nível gratuito, dando a todos os desenvolvedores acesso a essa tecnologia de ponta sem exigir nenhum compromisso financeiro.
Conclusão
E é isso! Juntos, percorremos o empolgante mundo do Facebook AI Similarity Search, ou FAISS. Desde entender o que ele é e como funciona, configurá-lo no seu sistema, até passar por alguns exemplos de código com o dataset SQuAD e ver como ele difere de bancos de dados vetoriais criados especificamente para esse fim, cobrimos bastante terreno.
Lembre-se, FAISS é uma ferramenta incrivelmente poderosa, projetada para tornar a busca em enormes quantidades de dados não apenas possível, mas eficiente. Sua versatilidade em acomodar diferentes tipos e tamanhos de dados é um testemunho de seu design.
À medida que você avança, munido desse conhecimento, lembre-se das melhores práticas e dicas que discutimos. Entender seus dados, escolher o índice certo, pré-processar seus dados de forma eficaz, agrupar suas consultas em lotes e ajustar seus parâmetros — todas essas etapas podem melhorar significativamente seus resultados.
Mas não pare por aqui. Continue explorando, experimentando e aprendendo. Seja mergulhando mais fundo nos diferentes tipos de índice que o FAISS oferece, explorando técnicas mais complexas de pré-processamento de dados ou experimentando casos de uso mais sofisticados, sempre há mais a aprender.
Este post foi escrito por Keshav Malik, um engenheiro de segurança altamente qualificado e entusiasmado. Keshav é apaixonado por automação, hacking e por explorar diferentes ferramentas e tecnologias. Ele adora encontrar soluções inovadoras para problemas complexos e está constantemente buscando novas oportunidades para crescer e melhorar como profissional. Ele se dedica a se manter à frente da curva e está sempre em busca das ferramentas e tecnologias mais recentes e avançadas.
Continue lendo

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

We spent 8 years making vector databases faster. Then we stopped.
Rarely queried embeddings still need to stay searchable. See how Vector Lakebase enables on-demand vector search without always-on compute costs.

Selecting the Right ETL Tools for Unstructured Data to Prepare for AI
Learn the right ETL tools for unstructured data to power AI. Explore key challenges, tool comparisons, and integrations with Milvus for vector search.



