Compartilhar via


Pesquisa vetorial no Azure Cosmos DB for NoSQL

O Azure Cosmos DB for NoSQL agora oferece busca e indexação de vetores em versão prévia. Esse recurso foi desenvolvido para lidar com vetores de alta dimensão, possibilitando uma busca em vetores 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 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 for NoSQL oferece a flexibilidade na escolha do método de indexação de vetores:

  • Uma busca exata "plana" (flat) ou de k-vizinhos mais próximos (k-nearest neighbors), às vezes chamada de busca por força bruta, pode proporcionar recall de recuperação de 100% para buscas em vetores menores e específicas, 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 vetores de última geração desenvolvidos pela Microsoft Research para criar uma busca em vetores eficiente e de alta exatidão em qualquer escala.

Saiba mais sobre a indexação vetorial aqui

A busca em vetores no Azure Cosmos DB pode ser combinada com todos os outros filtros e índices de consulta NoSQL compatíveis com o Azure Cosmos DB usando cláusulas WHERE. Isso garante que suas buscas em vetores sejam 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.


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 busca em vetores conhecidos incluem HNSW (Hierarchical Navigable Small World), IVF (Arquivo Invertido), DiskANN etc. A busca em vetores é 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 Inserções do Azure OpenAI ou 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 Vetorial integrado do Azure Cosmos DB for 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

A indexação de vetor e a pesquisa no Azure Cosmos DB for NoSQL exigem a habilitação na página Recursos do Azure Cosmos DB. Siga as etapas abaixo para se inscrever:

  1. Navegue até a página de recursos do Azure Cosmos DB for NoSQL.

  2. Selecione o painel "Recursos" no item de menu "Configurações".

  3. Selecione o recurso "Busca em Vetores no Azure Cosmos DB for NoSQL".

  4. Leia a descrição do recurso para confirmar que deseja se inscrever na versão prévia.

  5. Selecione "Habilitar" para ativar a funcionalidade de indexação e pesquisa de vetor.

    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
    

Observação

A solicitação de registro será aprovada automaticamente; no entanto, pode levar 15 minutos para ser totalmente ativada na conta.

Políticas vetoriais para 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 contidos:

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

Observação

Cada caminho exclusivo pode ter apenas uma política associada. No entanto, é possível especificar várias políticas, desde que cada uma delas se aplique a um caminho diferente.

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 dois caminhos de vetor

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

Políticas de indexação vetorial

Índices de vetores aumentam a eficiência ao realizar buscas em vetores usando a função de sistema VectorDistance. 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 Descrição 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 verificação completa e isso gerará encargos de RU mais altos para uma consulta de busca em vetores.

Alguns pontos a serem observados:

  • Os tipos de índice flat e quantizedFlat utilizam o índice do Azure Cosmos DB para armazenar e acessar cada vetor durante uma busca em vetores. 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/?"
        },
        {
            "path": "/vector1/*",
        },
        {
            "path": "/vector2/*",
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

Importante

O caminho do vetor adicionado à seção "excludedPaths" da política de indexação para garantir um desempenho otimizado para a inserção. Não adicionar o caminho do vetor a "excludedPaths" resultará em maior cobrança de RU e latência para inserções de vetores.

Importante

Atualmente, não há suporte para caracteres curinga (*, []) na política de vetor ou no índice de vetor.

Realize buscas em vetores com consultas usando VectorDistance()

Depois de criar um contêiner com a política de vetor desejada e inserir dados vetoriais no contêiner, você pode realizar uma busca vetorial usando a função de sistema Distância de Vetor em uma consulta. Um exemplo de uma consulta NoSQL que projeta a pontuação de similaridade como o alias SimilarityScore e classifica na ordem do mais similar para o menos similar:

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 TOP N cláusula na instrução SELECT de uma consulta. Caso contrário, a busca em vetores 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.
  • O quantizedFlat utiliza o mesmo método de compartimentalização que o DiskANN.
  • A taxa de inserções de vetor deve ser limitada. A ingestão muito grande (acima de 5 milhões de vetores) pode exigir tempo de compilação adicional de índices.
  • No momento, não há suporte para o recurso de busca em 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 busca em vetoreses em contas com o Repositório Analítico (e o Link do Synapse) e a 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