Você pode usar o tipo vectorSearch para indexar campos para executar queries $vectorSearch. É possível definir o índice para as incorporações vetoriais nas quais deseja fazer query e quaisquer campos adicionais que deseja usar para pré-filtrar seus dados. É útil filtrar os dados para restringir o escopo da pesquisa semântica e garantir que determinadas incorporações vetoriais não sejam consideradas para comparação, como em um ambiente de vários inquilinos.
Você pode usar a UI do Atlas, a Administration API do Atlas, o Atlas CLI, mongosh ou um driver do MongoDB compatível para criar seu índice de Vector Search do MongoDB.
Observação
Não é possível usar o operador knnBeta obsoleto para fazer query nos campos indexados usando a definição de índice do tipo vectorSearch.
Considerações
Em uma definição de índice do tipo vectorSearch, você pode indexar arrays com apenas um único elemento. Você não pode indexar campos de incorporação dentro de arrays de documentos ou campos de incorporação dentro de arrays de objetos. Você pode indexar campos incorporados dentro de documentos usando a notação de ponto}. O mesmo campo de incorporação não pode ser indexado várias vezes na mesma definição de índice.
Antes de indexar suas embeddings, recomendamos convertê-las em vetores BSON BinData com subtipo float32, int1 ou int8 para armazenamento eficiente em seu cluster. Para saber mais, consulte como converter suas incorporações em vetores BSON.
Ao utilizar índices do MongoDB Vector Search , você pode experimentar um alto consumo de recursos em um nó ocioso para seu Atlas cluster. Isso se deve ao processo mongot subjacente, que executa várias operações essenciais para o MongoDB Vector Search. A utilização da CPU em um nó ocioso pode variar dependendo do número, complexidade e tamanho dos índices.
Para aprender mais sobre considerações de dimensionamento para seus índices, veja Requisitos de memória para indexação de vetores.
Se você fizer alterações na collection para a qual definiu o índice da MongoDB Vector Search , os dados mais recentes podem não estar disponíveis imediatamente para query. No entanto, o mongot monitora os fluxos de alteração e atualiza cópias armazenadas de dados, tornando os índices do MongoDB Vector Search eventualmente consistentes. Você pode visualizar o número de Documents indexados na UI do Atlas para verificar se as alterações na collection estão refletidas no índice.
Como alternativa, você pode criar um novo índice depois de adicionar novos documentos à sua coleção e aguardar que o índice se torne consultável. Você também pode implementar uma lógica de pesquisa semelhante à seguinte para garantir que o índice esteja pronto para consulta antes de tentar usá-lo.
Exemplo
console.log("Polling to check if the index is ready. This may take up to a minute.") let isQueryable = false; while (!isQueryable) { const cursor = collection.listSearchIndexes(); for await (const index of cursor) { if (index.name === result) { if (index.queryable) { console.log(`${result} is ready for querying.`); isQueryable = true; } else { await new Promise(resolve => setTimeout(resolve, 5000)); } } } }
Clientes aceitos
Você pode criar e gerenciar índices do MongoDB Vector Search por meio da UI do Atlas ,, Atlas CLI, Atlas Administration API e dosmongosh seguintes drivers do MongoDB :
Sintaxe
A seguinte sintaxe define o tipo de índice vectorSearch:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": "<field-to-index>", 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct", 8 "quantization": "none | scalar | binary", 9 "hnswOptions": { 10 "maxEdges": <number-of-connected-neighbors>, 11 "numEdgeCandidates": <number-of-nearest-neighbors> 12 } 13 }, 14 { 15 "type": "filter", 16 "path": "<field-to-index>" 17 }, 18 ... 19 ] 20 }
Campos de índice de Vector Search do MongoDB
A definição do índice MongoDB Vector Search utiliza os seguintes campos:
Opção | Tipo | necessidade | Propósito |
|---|---|---|---|
| Array de documentos de definição de campos | Obrigatório | Definições para os campos de vetor e filtro a serem indexados, uma definição por documento. Cada documento de definição de campo especifica o A array |
fields.type | String | Obrigatório | Tipo de campo a ser usado para indexar campos para
Para saber mais, consulte Sobre o tipo |
fields.path | String | Obrigatório | Nome do campo a ser indexado. Para campos aninhados, utilize notação de ponto para especificar o caminho para campos incorporados. |
fields.numDimensions | Int | Obrigatório | Número de dimensões vetoriais que o MongoDB Vector Search impõe no momento do índice e no momento da consulta. Você pode definir este campo somente para campos tipo Para indexar vetores quantizados ou BinData, você pode especificar um dos seguintes valores:
O modelo de incorporação escolhido determina o número de dimensões em suas incorporações vetoriais, com alguns modelos tendo múltiplas opções para quantas dimensões são geradas. Para saber mais, consulte Escolher um método para criar incorporações. |
fields.similarity | String | Obrigatório | Função de similaridade vetorial a ser usada para procurar os K- vizinhos mais próximos. Você pode definir este campo somente para campos tipo Você pode especificar um dos seguintes valores:
Para saber mais, consulte Sobre as funções de similaridade. |
fields.quantization | String | Opcional | Tipo de quantização vetorial automática para seus vetores. Use essa configuração somente se suas incorporações forem Você pode especificar um dos seguintes valores:
Para saber mais, consulte Quantização vetorial. |
fields.hnswOptions | Objeto | Opcional | Parâmetros a serem usados na construção do grafo Hierarchical Navigable Small Worlds. Se omitido, usa os valores padrão para os parâmetros IMPORTANTE: isso está disponível como um recurso de visualização. A modificação dos valores padrão pode impacto negativamente o índice e as consultas do MongoDB Vector Search . |
fields.hnswOptions.maxEdges | Int | Opcional | Número máximo de arestas (ou conexões) que um nó pode ter no grafo Hierarchical Navigable Small Worlds. O valor pode estar entre Um número maior melhora a recuperação (precisão dos resultados da pesquisa) porque o gráfico está mais bem conectado. No entanto, isso reduz a velocidade da consulta devido ao número de vizinhos para avaliar por nó de gráfico, aumenta a memória do gráfico de Mundos Pequenos Hierárquicos Navegáveis porque cada nó armazena mais conexões e reduz a indexação porque o MongoDB Vector Search avalia mais vizinhos e ajusta para cada novo nó adicionado ao gráfico. |
fields.hnswOptions.numEdgeCandidates | Int | Opcional | Analogamente a Um número mais alto fornece um grafo com conexões de alta qualidade, o que pode melhorar a qualidade da pesquisa (recall), mas também pode afetar negativamente a latência da query. |
Sobre o tipo vector
O campo vector da definição do seu índice deve conter uma array de números de um dos seguintes tipos:
BSON
doubleBSON BinData
vectorSubtipofloat32BSON BinData
vectorSubtipoint1BSON BinData
vectorSubtipoint8
Observação
Para aprender mais sobre como gerar vetores BSON BinData com subtipo float32 int1 ou int8 para seus dados, veja Como ingerir vetores pré-quantificados.
Você deve indexar o campo vetorial como o tipo vector dentro do array fields.
A seguinte sintaxe define o tipo de campo vector:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": <field-to-index>, 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct", 8 "quantization": "none | scalar | binary", 9 "hnswOptions": { 10 "maxEdges": <number-of-connected-neighbors>, 11 "numEdgeCandidates": <number-of-nearest-neighbors> 12 } 13 }, 14 ... 15 ] 16 }
Sobre as funções de similaridade
O MongoDB Vector Search oferece suporte às seguintes funções de similaridade:
euclidean- mede a distância entre as extremidades dos vetores. Esse valor permite medir a similaridade com base na variação de dimensões. Para saber mais, consulte Plano euclideano.cosine- mede a similaridade com base no ângulo entre os vetores. Esse valor permite que você meça a similaridade que não é dimensionada pela magnitude. Você não pode utilizar vetores de magnitude zero comcosine. Para medir a similaridade do cosseno, recomendamos normalizar seus vetores e usardotProduct.dotProduct- mede a similaridade comocosine, mas leva em consideração a magnitude do vetor. Se você normalizar a magnitude,cosineedotProductsão quase idênticos na medição de similaridade.Para usar
dotProduct, você deve normalizar o vetor para o comprimento unitário no momento do índice e no momento da query.
A tabela a seguir mostra as funções de similaridade para os vários tipos:
Tipo de incorporação do vetor | euclidean | cosine | dotProduct |
|---|---|---|---|
| √ | ||
| √ | √ | √ |
| √ | √ | √ |
| √ | √ | √ |
Para ingestão de vetores.
Para quantização escalar ou binária automática.
A fórmula para cada função de similaridade é a seguinte:
Para cosine, o MongoDB Vector Search utiliza o seguinte algoritmo para normalizar a pontuação:
score = (1 + cosine(v1,v2)) / 2
Este algoritmo normaliza a pontuação considerando a pontuação de similaridade do vetor de documento (
v1) e do vetor de query (v2), que tem o intervalo [-1,1]. O MongoDB Vector Search adiciona1à pontuação de similaridade para normalizar a pontuação para um intervalo [0,2] e depois divide por2para garantir um valor entre0e1.
Para dotProduct, o MongoDB Vector Search utiliza o seguinte algoritmo para normalizar a pontuação:
score = (1 + dotProduct(v1,v2)) / 2
Este algoritmo normaliza a pontuação considerando a pontuação de similaridade do vetor de documento (
v1) e do vetor de query (v2), que tem o intervalo [-1,1]. O MongoDB Vector Search adiciona1à pontuação de similaridade para normalizar a pontuação para um intervalo [0,2] e depois divide por2para garantir um valor entre0e1.
Para euclidean similaridade, o MongoDB Vector Search usa o seguinte algoritmo para normalizar a pontuação e garantir um valor entre 0 e 1:
score = 1 / (1 + euclidean(v1,v2))
Este algoritmo normaliza a pontuação calculando a distância euclideana, que é a distância entre o vetor de documento (
v1) e o vetor de query (v2), que tem o intervalo [0,∞]. O MongoDB Vector Search transforma a distância em uma pontuação de similaridade adicionando1à distância e, em seguida, divide1pelo resultado para garantir um valor entre0e1.
Para obter o melhor desempenho, verifique seu modelo de incorporação para determinar qual função de similaridade se alinha ao processo de treinamento do seu modelo de incorporação. Se você não tiver nenhuma orientação, comece com dotProduct. Definir fields.similarity para o valor dotProduct permite medir com eficiência a similaridade com base no ângulo e na magnitude. dotProduct consome menos recursos computacionais do que cosine e é eficiente quando os vetores são de comprimento unitário. No entanto, se seus vetores não forem normalizados, avalie as pontuações de similaridade nos resultados de uma query de exemplo para euclidean distância e cosine similaridade para determinar qual corresponde a resultados razoáveis.
Sobre o tipo filter
Opcionalmente, você pode indexar campos adicionais para pré-filtrar seus dados. É possível aplicar filtro a valores booleanos, data, objectId, valores numéricos, string e UUID, incluindo arrays desses tipos. É útil filtrar os dados para restringir o escopo da pesquisa semântica e garantir que nem todos os vetores sejam considerados para comparação. Isso reduz o número de documentos contra os quais executar comparações de similaridade, o que pode diminuir a latência da consulta e aumentar a precisão dos resultados da pesquisa.
Você deve indexar os campos que deseja filtrar usando o tipo filter dentro da array fields.
A seguinte sintaxe define o tipo de campo filter:
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 ... 6 }, 7 { 8 "type": "filter", 9 "path": "<field-to-index>" 10 }, 11 ... 12 ] 13 }
Se você quiser pré-filtrar usando pesquisa difusa, correspondência de frases, filtro de localização e outras funcionalidades de texto analisadas, crie um índice do tipo vetor do MongoDB Search vector e faça query usando o operador $vectorSearch em um estágio $search.
Observação
A pré-filtragem de seus dados não afeta a pontuação que o MongoDB Vector Search retorna usando vectorSearchScore para $vectorSearch consultas.
Crie um índice de Vector Search do MongoDB
Você pode criar um índice do MongoDB Vector Search para todas as collections que contêm incorporações vetoriais menores ou iguais a 8192 dimensões de comprimento para qualquer tipo de dados junto com outros dados em seu cluster por meio da UI do Atlas, API de administração do Atlas, Atlas CLI, mongosh ou um driver MongoDB compatível.
Pré-requisitos
Para criar um índice do MongoDB Vector Search , você deve ter um cluster com os seguintes pré-requisitos:
MongoDB versão
6.0.11,7.0.2ou superiorUma collection para a qual criar o índice do MongoDB Vector Search
Observação
Você pode utilizar o comandomongosh ou métodos de assistente do driver para criar índices MongoDB Vector Search em todas as camadas do cluster Atlas. Para obter uma lista de versões de driver compatíveis, consulte Clientes compatíveis.
Acesso necessário
Você precisa da função Project Data Access Admin ou superior para criar e gerenciar índices de Vector Search do MongoDB.
Limitações do índice
Não é possível criar mais de:
Índices 3 (independentemente do tipo,
searchouvector) em clustersM0.10 índices em clusters Flex.
Recomendamos que você crie não mais do que 2,500 índices de pesquisa em um único cluster M10+.
Procedimento
Observação
O procedimento inclui exemplos de definição de índice para a coleção embedded_movies no banco de dados sample_mflix . Se você carregar os dados de amostra em seu cluster e criar os índices de Vector Search do MongoDB de exemplo para essa coleção, poderá executar as queries de amostra $vectorSearch nessa coleção. Para saber mais sobre os exemplos de consultas que você pode executar, consulte Exemplos de $vectorSearch.
Ver um índice de Vector Search do MongoDB
Você pode visualizar índices do MongoDB Vector Search para todas as collections a partir da UI do Atlasmongosh , Atlas Administration API, Atlas CLI, ou de um MongoDB Driver compatível.
Acesso necessário
Você precisa ter a função Project Search Index Editor ou superior para visualizar os índices do MongoDB Vector Search.
Observação
Você pode utilizar o comando mongosh ou métodos de assistente do driver para recuperar índices MongoDB Vector Search em todas as camadas do Atlas cluster. Para obter uma lista de versões de driver compatíveis, consulte Clientes compatíveis.
Procedimento
Editar um índice de Vector Search do MongoDB
Você pode alterar a definição de índice de um índice existente do MongoDB Vector Search a partir da UI do Atlas, da Administration API do Atlas, do Atlas CLI, do mongosh ou de um driver do MongoDB compatível. Você não pode renomear um índice ou alterar o tipo de índice. Se você precisar alterar um nome ou tipo de índice, deverá criar um novo índice e excluir o antigo.
Importante
Depois de editar um índice, o MongoDB Vector Search o reconstrói. Enquanto o índice é reconstruído, você pode continuar a executar queries de pesquisa vetorial usando a definição de índice antiga. Quando o índice terminar de ser reconstruído, o índice antigo será automaticamente substituído. Este processo é semelhante aos índices de pesquisa MongoDB . Para saber mais, consulte Criar e atualizar um índice de pesquisa MongoDB.
Acesso necessário
Você deve ter a função Project Search Index Editor ou superior para editar um índice do MongoDB Vector Search.
Observação
Você pode utilizar o comando mongosh ou métodos de assistente do driver para editar índices MongoDB Vector Search em todas as camadas do Atlas cluster. Para obter uma lista de versões de driver compatíveis, consulte Clientes compatíveis.
Procedimento
Excluir um índice de Vector Search do MongoDB
Você pode excluir um índice do MongoDB Vector Search a qualquer momento a partir da UI do Atlas, da Administration API do Atlas, do Atlas CLI, mongosh ou de um driver do MongoDBcompatível.
Acesso necessário
Você deve ter a função Project Search Index Editor ou superior para excluir um índice do MongoDB Vector Search.
Observação
Você pode usar o comando mongosh ou os métodos assistente do driver para excluir índices do MongoDB Vector Search em todas as camadas do Atlas cluster. Para obter uma lista de versões de driver compatíveis, consulte Clientes compatíveis.
Procedimento
Status do índice
Quando você cria o índice do MongoDB Vector Search , a coluna Status mostra o estado atual do índice no nó primary do cluster. Clique no link View status details abaixo do status para visualizar o estado do índice em todos os nós do cluster.
Quando a coluna Status lê Active, o índice está pronto para utilizar. Em outros estados, queries em relação ao índice podem retornar resultados incompletos.
Status | Descrição |
|---|---|
Não iniciado | Atlas ainda não começou a construir o índice. |
Sincronização inicial | O Atlas está construindo o índice ou reconstruindo o índice após uma edição. Quando o índice está neste estado:
|
Ativo | O índice está pronto para uso. |
Recuperando | A denúncia encontrou um erro. Esse estado geralmente ocorre quando o ponto de replicação atual não está mais disponível no oplog |
Falhou | O Atlas não conseguiu criar o índice. Use o erro na janela modal View status details para solucionar o problema. Para saber mais, consulte Corrigir problemas. |
Exclusão em Andamento | O Atlas está excluindo o índice dos nós de cluster. |
Enquanto o Atlas constrói o índice e após a conclusão da construção, a coluna Documents mostra a porcentagem e o número de documentos indexados. A coluna também mostra o número total de documentos na coleção.