Compartilhar via


Busca em vetores no Azure Cosmos DB for NoSQL (versão prévia)

APLICA-SE A: 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.

Inscreva-se na versão prévia do recurso Busca em vetores

A busca de vetores para o Azure Cosmos DB for NoSQL requer inscrição na versão prévia do recurso na página "Recursos" do seu 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 "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 "Ativar" para se inscrever na versão prévia.

Observação

A solicitação de inscrição será aprovada automaticamente, porém pode levar alguns minutos para entrar em vigor.

Observação

O DiskANN está disponível em versão prévia restrita e exige o preenchimento desse formulário. Você será contatado por um membro da equipe do Azure Cosmos DB quando o recurso tiver sido integrado para usar o índice DiskANN.

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

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

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 deve ser usado quando houver pelo menos 1.000 vetores e menos de 100.000 vetores no contêiner.

  • 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. No entanto, como o DiskANN é um índice de vizinho mais próximo (ANN), a exatidão pode ser menor que quantizedFlat ou flat. O DiskANN está disponível em versão prévia restrita e exige o preenchimento desse formulário.

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

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

Observação

Os índices Quantized Flat e DiskANN exigem a inserção de pelo menos 1.000 vetores. 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.

Importante

Atualmente, na visualização da busca em vetores, não use caminho aninhado ou caracteres de curinga no caminho da política de vetores. Por enquanto, não há suporte para operações de substituição na política de vetores.

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 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Limites e restrições atuais

A indexação vetorial e a busca no Azure Cosmos DB for NoSQL apresentam algumas limitações enquanto estão nas fases iniciais da versão prévia pública.

  • Você pode especificar, no máximo, um tipo de índice por caminho na política de índice de vetores
  • Você pode especificar, no máximo, um tipo de índice DiskANN por contêiner
  • A indexação vetorial só tem suporte em contêineres novos.
  • 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.
  • quantizedFlat utiliza o mesmo método de compartimentalização que DiskANN e não é configurável no momento.
  • No momento, os bancos de dados com taxas de transferência compartilhadas não podem usar a versão prévia do recurso busca em vetores.
  • A taxa de ingestão deve ser limitada ao usar uma versão prévia antecipada do DiskANN.

Próxima etapa