Curso
A indexação vetorial virou uma ferramenta super útil pra criar aplicativos modernos. Ele permite que você façabuscas rápidas e eficientesde similaridade em dados de alta dimensão, muitas vezes chamadas de embutimentos vetoriais. Esse recurso agora está totalmente integrado ao MongoDB, permitindo que os desenvolvedores criem funcionalidades sofisticadas diretamente em seus bancos de dados.
Este artigo é um guia prático para configurar e usar a indexação vetorial no MongoDB. Vamos ver o processo passo a passo, desde a criação do seu primeiro índice até a execução de consultas complexas. Você também vai aprender as melhores práticas e ver um exemplo real de como criar um sistema de recomendação de produtos para uma loja de comércio eletrônico.
O que é indexação vetorial?
Basicamente, a indexação vetorial é uma técnica pra organizar incorporações vetoriais e acelerar as buscas por similaridade. Diferente dos índices tradicionais que funcionam com valores escalares (como números ou strings), um índice vetorial é otimizado para encontrar vetores “vizinhos” em um espaço multidimensional.
Incorporações vetoriais são representações numéricas de dados complexos, incluindo texto, imagens e áudio. Por exemplo, a descrição de um produto pode ser convertida em um vetor, onde produtos parecidos têm vetores mais próximos uns dos outros no espaço. Essa proximidade permite aplicações poderosas como:
- Pesquisa semântica: Encontrar produtos com base no significado de uma consulta, não só em correspondências de palavras-chave.
- Sistemas de recomendação: Sugerir produtos ou conteúdos aos usuários com base nas suas preferências.
- Reconhecimento de imagem: Identificando imagens parecidas em um banco de dados enorme.
Configurando a indexação vetorial no MongoDB
Pra começar, você vai precisar de um cluster MongoDB Atlas. A pesquisa vetorial é um recurso nativo da nuvem. Você pode experimentar esse recurso no MongoDB Atlas ou na edição gratuita Community Edition. Neste artigo, vamos usar o MongoDB Atlas.
Passo 1: Crie um cluster MongoDB Atlas
Crie um novo cluster no MongoDB Atlas. O nível M0 gratuito é suficiente para fins de teste.
Passo 2: Crie uma coleção e insira os dados
Primeiro, conecte-se ao seu cluster usando o MongoDB Shell (mongosh) ou o driver que você preferir. Depois, crie uma nova coleção chamadaprodutos e insira documentos com um campo vetorial. Cada documento deve representar um produto e incluir um campode incorporação , que vai guardar a representação vetorial do produto.
Aqui está um exemplo mais completo com três documentos de produtos diferentes, cada um com um vetor gerado aleatoriamente para mostrar como os dados podem ser. Num cenário real, você substituiria esses dados por embeddings gerados por um modelo de IA.
db.products.insertMany([
{
"name": "Wireless Noise-Canceling Headphones",
"category": "Electronics",
"description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
"price": 249.99,
"embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
},
{
"name": "Smart Coffee Maker",
"category": "Home Goods",
"description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
"price": 129.99,
"embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
},
{
"name": "Ultra-light Backpack",
"category": "Travel",
"description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
"price": 79.99,
"embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
}
]);
Cada documento tem um nome, categoria, descrição e preço, além do campo importante . Aincorporação é uma matriz de tamanho fixo de números que representa o significado semântico da descrição do produto. O tamanho dessa matriz, oua dimensionalidade de um , depende do modelo usado para criar as incorporações. Neste exemplo, a dimensionalidade é 128.
Esses são os dados que vamos usar pra criar nosso índice vetorial e poder fazer a pesquisa semântica e recomendações de produtos.
Passo 3: Crie um índice vetorial
Depois de ter seus dados com as incorporações em uma coleção, o próximo passo é criar um índice vetorial. Esse índice é super importante pra fazer buscas rápidas e eficientes por semelhanças. O comando abaixo usa createSearchIndex para criar um índice vetorial no campo de incorporação.
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"dynamic": true,
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 128,
"similarity": "cosine"
}
]
},
}
});
Entendendo a configuração
A configuração do índice é definida nos campos do objeto de definição, na matriz ` `. Essa estrutura é o modelo de como o MongoDB Atlas organiza seus vetores para uma recuperação super rápida.
Os principais parâmetros para a indexação vetorial são:
- caminho: Isso define o nome exato do campo nos seus documentos que guarda a matriz vetorial, que é “embedding” neste exemplo.
- numDimensions: Esse é o parâmetro mais importante. deve corresponder exatamente ao número de elementos na matriz vetorial produzida pelo seu modelo de incorporação (por exemplo, 128, 768, 1536).
- : Isso define a métrica matemática usada para calcular a “proximidade” entre dois vetores durante uma pesquisa.
- O coseno é normalmente recomendado para pesquisa semântica, pois mede o ângulo entre vetores, com foco na direção semântica.
- Outras opções incluem euclidiana (distância em linha reta) e dotProduct.
Parâmetros de desempenho opcionais
Para um ajuste avançado ajustes de desempenho, o MongoDB Atlas permite que você especifique parâmetros opcionais para otimizar o armazenamento e a memória:
- quantização: Esse parâmetro é usado para comprimir seus vetores, o que reduz bastante o tamanho do índice e o espaço ocupado na memória.
- escalar ou binário podem ser especificados para quantizar os vetores, trocando uma pequena quantidade de recuperação por grandes ganhos em armazenamento e velocidade.
Fazendo consultas de pesquisa vetorial
Depois que o índice estiver pronto, você pode usar o $vectorSearch agregação para fazer consultas de similaridade.
Vamos encontrar os produtos mais parecidos com um vetor de consulta. Essa consulta normalmente seria gerada a partir da pesquisa feita por um usuário.
// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": queryVector,
"path": "embedding",
"numCandidates": 100, // Number of documents to scan
"limit": 5 // Number of results to return
}
},
{
"$project": {
"name": 1,
"description": 1,
"_id": 0
}
}
]);
- queryVector: O vetor que você está procurando.
- caminho: O nome do campo que tem as incorporações vetoriais.
- numCandidates: O número de documentos candidatos a serem digitalizados no índice. Um número maior melhora a precisão, mas aumenta a latência.
- limite: O número de resultados principais a serem retornados.
O $project é opcional, mas é útil para moldar a saída e excluir os dados vetoriais do resultado.
Melhores práticas para indexação vetorial
Ao ajustar seu índice vetorial para um desempenho ideal, você precisa equilibrar precisão e velocidade. O segredo é ajustar os parâmetros do índice com base no seu conjunto de dados específico e nas suas metas de desempenho.
Escolhendo a métrica de similaridade certa
A escolha da métrica é super importante, porque define o quanto dois vetores são “parecidos”. Você pode conferir a documentação do MongoDB para saber mais sobre os campos.
- cosseno: Ideal para similaridade semântica, especialmente com texto. Mede o ângulo entre vetores, sem se importar com o comprimento deles. Isso é super importante para modelos em que o comprimento do vetor não faz diferença.
- euclidean: Mede a distância em linha reta entre dois vetores. Use isso se a magnitude (ou comprimento) dos vetores for importante para o seu significado, como em certos tipos de dados em que um valor maior significa uma característica mais forte.
- dotProduct: Calcula o produto escalar de dois vetores. Essa métrica é frequentemente usada em sistemas de recomendação. Quando as incorporações vetoriais são normalizadas para um comprimento de 1, o produto escalar é funcionalmente equivalente à similaridade coseno.
Gerenciando dimensões de incorporação
O parâmetro de dimensões é super importante e precisa ser igualzinho à saída do seu modelo de incorporação. Um erro comum é escolher um número que não combina com o resultado do modelo. Um modelo com mais dimensões consegue capturar mais detalhes, mas vai ter um índice maior e as consultas podem ficar mais lentas. Sempre dá uma olhada na documentação do seu modelo pra confirmar as dimensões dele (por exemplo,o text-embedding-ada-002 da OpenAI tem 1536 dimensões).
Ajuste do índice
Os parâmetros numCandidates e numLists são essenciais para equilibrar velocidade e precisão. Uma boa dica é começar com um número baixode candidatos numCandidates e aumentar até chegar a um nível satisfatório de precisão. Você também pode experimentar diferentesnumLists para índicesivf para encontrar o ponto ideal para o seu conjunto de dados.
Exemplo de caso de uso: Criando um sistema de recomendações simples
Vamos aplicar esses conceitos a um exemplo prático: um sistema de recomendação de produtos de comércio eletrônico.
Passo 1: Armazene dados de produtos com incorporações
Primeiro, vamos guardar os nomes dos produtos, as categorias e uma incorporação vetorial para cada um deles. A incorporação pode ser gerada a partir da descrição ou das características do produto.
db.products.insertMany([
{
"name": "Smart Speaker",
"category": "Electronics",
"embedding": [0.8, 0.9, 0.1, ...]
},
{
"name": "Wireless Earbuds",
"category": "Electronics",
"embedding": [0.7, 0.8, 0.2, ...]
},
{
"name": "Leather Wallet",
"category": "Fashion",
"embedding": [0.1, 0.2, 0.9, ...]
}
]);
Passo 2: Crie um índice vetorial emuma incorporação d
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"fields": [
{
"type": "vector",
"path": "embedding", // The field containing the vectors
"numDimensions": 128, // The correct field name is 'numDimensions'
"similarity": "cosine" // The correct field name is 'similarity'
// Index algorithm (like HNSW) is managed automatically by Atlas
}
]
}
}
});
Passo 3: Pesquisar produtos parecidos
Agora, vamos encontrar produtos parecidos com o Smart Speaker. Vamos usar a incorporação para Smart Speaker como nosso vetor de consulta.
const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": smartSpeakerEmbedding,
"path": "embedding",
"numCandidates": 50,
"limit": 3
}
},
{
"$project": {
"name": 1,
"category": 1,
"_id": 0
}
}
]);
Essa consulta vai mostrar os três principais produtos cujas incorporações vetoriais são mais parecidas com a incorporação do Smart Speaker, recomendando itens parecidos, como fones de ouvido sem fio.
Conclusão
Os recursos de pesquisa vetorial do MongoDB abrem novas possibilidades para a criação de aplicativos inteligentes e personalizados. Ao integrar a indexação vetorial diretamente no banco de dados, o MongoDB simplifica a arquitetura, facilitando o gerenciamento de dados e a realização de pesquisas rápidas por similaridade.
Com o poder da pesquisa vetorial, você pode ir além da simples correspondência de palavras-chave e criar recursos que entendem o contexto e o significado dos seus dados. A gente te incentiva a começar a experimentar o plano gratuito do MongoDB Atlas e ver como a indexação vetorial pode melhorar seus aplicativos.
Perguntas frequentes
O que é uma incorporação vetorial e por que ela é necessária para a pesquisa vetorial?
Uma incorporação vetorial é uma representação numérica de dados como texto ou imagens. É necessário para a pesquisa vetorial porque permite que o banco de dados meça a semelhança semântica entre itens calculando a distância entre seus vetores, indo além da simples correspondência de palavras-chave.
Preciso de uma versão específica do MongoDB pra usar o Vector Search?
Sim. A pesquisa vetorial é um recurso integrado do MongoDB Atlas, a versão hospedada na nuvem do MongoDB. Não está disponível nas edições comunitárias ou locais do banco de dados.
Preciso gerar eu mesmo as incorporações vetoriais?
Sim, você precisa gerar as incorporações vetoriais para seus dados antes de poder armazená-los no MongoDB e criar um índice vetorial. O MongoDB não gera essas incorporações para você. Normalmente, você vai usar um serviço de terceiros ou um modelo pré-treinado de uma plataforma comoOpenAI, Hugging Face ou Google AI para transformar seu texto, imagens ou outros dados em vetores numéricos.
Posso juntar a pesquisa vetorial com outras consultas do MongoDB?
Sim, você pode. A pesquisa vetorial é uma etapa de agregação ($vectorSearch), o que significa que você pode usá-la dentro de um pipeline de agregação MongoDB maior. Isso permite que você combine a pesquisa vetorial com outras etapas poderosas, como $match, $project, $limit e $lookup, para criar consultas sofisticadas que fazem filtragem, classificação e enriquecimento de dados em uma única operação. Essa capacidade é conhecida como pesquisa híbrida e é essencial para a criação de aplicativos do mundo real.
Qual é a diferença entre os tipos de índice IVF e HNSW?
Tanto o IVF quanto o HNSW são algoritmos usados para a busca aproximada do vizinho mais próximo (ANN). A principal diferença está na forma como eles organizam os dados.
Karen é uma engenheira de dados apaixonada por criar plataformas de dados escalonáveis. Ela tem experiência em automação de infraestrutura com o Terraform e está animada para compartilhar seus conhecimentos em postagens de blog e tutoriais. Karen é uma construtora de comunidades e é apaixonada por promover conexões entre profissionais de dados.