Compartilhar via


Pesquisa de vetor no Azure Cosmos DB para NoSQL

Azure Cosmos DB para NoSQL agora oferece indexação e busca eficiente de vetores. Esse recurso foi projetado para lidar com vetores multidimensionais e de alta dimensão, permitindo uma pesquisa de vetor eficiente e precisa em qualquer escala. Agora você pode armazenar vetores diretamente nos documentos, junto com seus dados. Cada documento em seu banco de dados pode conter não apenas dados tradicionais sem esquema, mas também vetores multidimensionais de alta dimensão como outras propriedades dos documentos. Essa colocalização de dados e vetores permite processos de indexação e busca eficientes, pois os vetores são armazenados na mesma unidade lógica dos dados que representam. Manter os vetores e os dados juntos simplifica o gerenciamento de dados, as arquiteturas de aplicativos de IA e a eficiência das operações baseadas em vetores.

O Azure Cosmos DB para NoSQL oferece flexibilidade, permitindo que você escolha o método de indexação de vetor:

  • Uma pesquisa exataplana ou de k-vizinhos mais próximos (às vezes chamada de força bruta) pode fornecer 100% de recuperação para busca em vetores menores e focadas. especialmente quando combinada com filtros de consulta e chaves de partição.
  • Um índice plano compartimentalizado que comprime vetores usando métodos de compartimentalização baseados em DiskANN para obter melhor eficiência na busca kNN.
  • DiskANN, um conjunto de algoritmos de indexação de vetor de última geração desenvolvidos pela Microsoft Research para impulsionar uma pesquisa de vetor multimodal eficiente e de alta precisão em qualquer escala.

Para saber mais sobre a indexação de vetor, consulte índices de vetor.

A pesquisa de vetor no Azure Cosmos DB pode ser combinada com todos os filtros e índices de consulta NoSQL com suporte do Azure Cosmos DB usando cláusulas WHERE. Isso permite que suas pesquisas de vetor forneçam os dados mais relevantes para seus aplicativos.

Esse recurso aprimora as principais funcionalidades do Azure Cosmos DB, tornando-o mais versátil para lidar com dados vetoriais e requisitos de busca em aplicativos de IA.


Observação

Interessado em capacidades de pesquisa vetorial com alta capacidade de processamento? O Azure Cosmos DB está desenvolvendo recursos avançados de pesquisa de vetor projetados para grandes conjuntos de dados de vetor emparelhados com inserções e pesquisas de taxa de transferência ultra-alta. Ele pode acomodar milhões de consultas por segundo (QPS) com baixa latência previsível e eficiência de custos inigualável. Inscreva-se para saber mais sobre oportunidades de acesso antecipado e ser notificado quando esses recursos estiverem disponíveis.

Inscreva-se para a versão prévia privada expandida.

O que é um repositório de vetores?

Um repositório de vetores é um banco de dados de vetores projetado para armazenar e gerenciar inserções de vetores, que são representações matemáticas de dados em um espaço altamente dimensional. Nesse espaço, cada dimensão corresponde a um recurso dos dados e dezenas de milhares de dimensões podem ser usadas para representar dados sofisticados. A posição de um vetor nesse espaço representa as características dele. Palavras, frases ou documentos inteiros e imagens, áudio e outros tipos de dados podem ser vetorizados.

Como funciona um repositório de vetores?

Em um repositório de vetores, algoritmos de busca em vetores são usados para indexar e consultar inserções. Alguns algoritmos de pesquisa de vetor bem conhecidos incluem Hierarchical Navigable Small World (HNSW), Inverted File (IVF) e DiskANN. A pesquisa vetorial é um método que ajuda a localizar itens semelhantes com base em suas características de dados, em vez de correspondências exatas em um campo de propriedade.

Essa técnica é útil em usos como pesquisa de texto semelhante, localização de imagens relacionadas, recomendações ou até mesmo detecção de anomalias. Ela é usada para consultar as inserções de vetores dos seus dados que você criou usando um modelo de machine learning por meio de uma API de inserções. Exemplos de APIs de inserções são as Inserções do Azure OpenAI ou o Hugging Face no Azure.

A busca em vetores mede a distância entre os vetores de dados e o vetor de consulta. Os vetores de dados mais próximos do vetor de consulta são os mais semelhantes semanticamente.

No banco de dados de vetor integrado no Azure Cosmos DB para NoSQL, as inserções podem ser armazenadas, indexadas e consultadas junto com os dados originais. Essa abordagem elimina o custo extra de replicação de dados em um banco de dados vetoriais puro separado. Além disso, essa arquitetura mantém as inserções vetoriais e os dados originais juntos, o que facilita melhor as operações de dados multimodais e possibilita maior consistência, escala e desempenho de dados.

Habilitar o recurso de indexação e busca em vetores

Para habilitar esse recurso para o Azure Cosmos DB para NoSQL, siga estas etapas:

  1. Vá para a página de recursos do Azure Cosmos DB para NoSQL.
  2. No painel esquerdo, em Configurações, selecione Recursos.
  3. Selecione a Pesquisa de Vetor para a API NoSQL.
  4. Leia a descrição do recurso para confirmar se você deseja habilitá-lo.
  5. Selecione Habilitar para ativar a pesquisa de vetor no Azure Cosmos DB para NoSQL.

Dica

Como alternativa, use a CLI do Azure para atualizar os recursos da sua conta para dar suporte à busca em vetores NoSQL.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

A solicitação de registro é aprovada automaticamente, mas pode levar 15 minutos para entrar em vigor.

Políticas de vetor de Contêineres

Para realizar buscas em vetores com o Azure Cosmos DB for NoSQL, é necessário definir uma política vetorial para o contêiner. Essa política fornece informações essenciais para que o mecanismo de banco de dados realize buscas de similaridade eficientes para os vetores encontrados nos documentos do contêiner. Isso também informa a política de indexação vetorial sobre as informações necessárias, caso você opte por especificar uma. As seguintes informações estão incluídas na política vetorial contida:

  • path: o caminho da propriedade que contém vetores (obrigatório).
  • datatype: o tipo de dados da propriedade de vetor. Os tipos com suporte são float32, float16, int8e uint8.
  • dimensions: a dimensionalidade ou o comprimento de cada vetor no caminho. Todos os vetores em um caminho devem ter o mesmo número de dimensões. O padrão é 1536.
  • distanceFunction: a métrica usada para calcular distância/similaridade. As métricas com suporte são:
    • cosseno (padrão), que tem valores de -1 (menos semelhante) a +1 (mais semelhante).
    • dot product, que possui valores de -inf (menos similar) a +inf (mais similar).
    • euclidiano, que tem valores de 0 (mais semelhante) a +inf (menos semelhante).

Observação

Cada caminho exclusivo pode ter no máximo uma política. No entanto, várias políticas poderão ser especificadas se todas elas forem direcionadas a um caminho diferente.

Observação

Muitos modelos de inserção representam elementos de um vetor usando float32. Em vez disso, o uso float16 pode reduzir o volume de armazenamento de vetores em 50%, no entanto, alguma redução na precisão pode resultar.

A política vetorial para contêineres pode ser descrita como objetos JSON. Aqui estão dois exemplos de políticas vetoriais para contêineres válidas:

Uma política com um único caminho de vetor

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

Uma política com duas trajetórias vetoriais

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"float16",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

Políticas de indexação vetorial

Os índices vetoriais aumentam a eficiência ao executar pesquisas de vetor usando a função VectorDistance do sistema. As buscas em vetores têm menor latência, maior taxa de transferência e menor consumo de Unidade de Solicitação (RU) ao usar um índice de vetores. Você pode especificar os seguintes tipos de políticas de índice de vetores:

Tipo Description Dimensões máximas
flat Armazena vetores no mesmo índice que outras propriedades indexadas. 505
quantizedFlat Quantifica (compacta) vetores antes de armazenar no índice. Isto pode melhorar a latência e a taxa de transferência ao custo de uma pequena quantidade de precisão. 4096
diskANN Cria um índice baseado em DiskANN para uma pesquisa aproximada rápida e eficiente. 4096

Observação

Os índices quantizedFlat e diskANN exigem que pelo menos 1.000 vetores sejam inseridos. Isso é para garantir a precisão do processo de compartimentalização. Se houver menos de 1.000 vetores, será executada uma varredura completa, resultando em taxas de RU mais altas para obter uma consulta de busca em vetores.

Alguns pontos a serem considerados:

  • Os tipos de índice flat e quantizedFlat usam o índice do Azure Cosmos DB para armazenar e ler cada vetor durante a execução de uma pesquisa de vetor. Buscas em vetores com um índice flat são buscas de força bruta e garantem 100% de exatidão ou recall. Ou seja, é garantido encontrar os vetores mais similares no conjunto de dados. Contudo, há uma limitação de 505 dimensões para vetores em um índice plano.

  • O índice quantizedFlat armazena vetores compartimentalizados (comprimidos) no índice. Buscas em vetores com índice quantizedFlat também são buscas de força bruta, contudo, a exatidão pode ser um pouco menor que 100%, já que os vetores são compartimentalizados antes de serem adicionados ao índice. No entanto, buscas em vetores com quantized flat devem ter menor latência, maior taxa de transferência e menor custo de RU do que buscas em vetores em um índice flat. Esta é uma boa opção para cenários menores ou cenários em que você está usando filtros de consulta para restringir a busca em vetores a um conjunto relativamente pequeno de vetores. quantizedFlat é recomendável quando o número de vetores a serem indexados é algo em torno de 50.000 ou menos por partição física. No entanto, essa é apenas uma diretriz geral e o desempenho real deve ser testado, pois cada cenário pode ser diferente.

  • O índice diskANN é separado e definido especificamente para vetores usando DiskANN, uma série de algoritmos de indexação de vetores de alta desempenho desenvolvidos pela Microsoft Research. Os índices DiskANN podem oferecer algumas das consultas de menor latência, maior taxa de transferência e menor custo de RU, mantendo ainda uma alta exatidão. Em geral, DiskANN será o mais executado de todos os tipos de índice se houver mais de 50.000 vetores por partição física.

Aqui estão alguns exemplos de políticas de índice de vetores válidas:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "diskANN"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

Importante

No momento, não há suporte para caracteres curinga (*, []) e caminhos vetoriais aninhados nas matrizes na política de vetor ou no índice de vetor.

Executar pesquisa de vetor com consultas usando VectorDistance

Depois de criar um contêiner com a política de vetor desejada e inserir dados de vetor no contêiner, você poderá realizar uma pesquisa de vetor usando a função do sistema VectorDistance em uma consulta. O exemplo a seguir mostra uma consulta NoSQL que projeta a pontuação de similaridade como o alias SimilarityScoree classifica em ordem mais semelhante à menos semelhante:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Importante

Sempre use uma cláusula TOP N na instrução SELECT de uma consulta. Caso contrário, a pesquisa de vetor tentará retornar muito mais resultados e a consulta custará mais RUs e terá uma latência maior do que o necessário.

Limitações atuais

A indexação e a busca em vetores no Azure Cosmos DB for NoSQL têm algumas limitações.

  • Os índices quantizedFlat e diskANN exigem pelo menos 1.000 vetores para serem indexados para garantir que a quantização seja precisa. Se menos de 1.000 vetores forem indexados, uma verificação completa será usada e os encargos de RU poderão ser maiores.
  • Os vetores indexados com o tipo de índice flat podem ter no máximo 505 dimensões. Os vetores indexados com o tipo de índice quantizedFlat ou DiskANN podem ter no máximo 4.096 dimensões.
  • A taxa de inserções de vetor deve ser limitada. A ingestão muito grande (com mais de 5M de vetores) em um curto período de tempo pode exigir mais tempo para a construção do índice.
  • No momento, não há suporte para o recurso de pesquisa de vetor nos contêineres existentes. Para usá-lo, um novo contêiner deve ser criado e a política de inserção de vetor no nível do contêiner deve ser especificada.
  • Não há suporte para bancos de dados de taxa de transferência compartilhada.
  • No momento, não há suporte para indexação e pesquisa de vetores nas contas com taxa de transferência compartilhada.
  • Depois que a indexação de vetor e a pesquisa estiverem habilitadas em um contêiner, ela não poderá ser desabilitada.

Próxima etapa