Dados vetoriais de índice no Cosmos DB (em Azure e Fabric)

O Cosmos DB (em Azure e Fabric) oferece indexação vetorial e pesquisa eficientes. Este recurso é projetado para lidar com vetores multimodais e de alta dimensão, permitindo uma pesquisa vetorial eficiente e precisa em qualquer escala. Agora você pode armazenar vetores diretamente nos documentos ao lado de seus dados. Cada documento em seu banco de dados pode conter não apenas dados tradicionais sem esquema, mas também vetores multimodais de alta dimensão como outras propriedades dos documentos. Esta colocalização de dados e vetores permite uma indexação e pesquisa eficientes, uma vez que os vetores são armazenados na mesma unidade lógica que os dados que representam. Manter vetores e dados juntos simplifica o gerenciamento de dados, as arquiteturas de aplicativos de IA e a eficiência das operações baseadas em vetores.

O Cosmos DB oferece a flexibilidade que oferece na escolha do método de indexação vetorial:

  • Uma busca exata de vizinhos "planos" ou k-mais próximos (às vezes chamada de força bruta) pode fornecer 100% de recuperação para buscas vetoriais menores e focadas. especialmente quando combinado com filtros de consulta e chaves de partição.

  • Um índice plano quantizado que comprime vetores usando métodos de quantização baseados em DiskANN para melhor eficiência na pesquisa kNN.

  • DiskANN, um conjunto de algoritmos de indexação vetorial de última geração desenvolvido pela Microsoft Research para potenciar pesquisas vetoriais multimodais eficientes e de alta precisão em qualquer escala.

A pesquisa vetorial no Cosmos DB pode ser combinada com todos os outros filtros e índices de consulta NoSQL suportados usando cláusulas WHERE. Essa combinação permite que suas pesquisas vetoriais sejam os dados mais relevantes para seus aplicativos.

Esse recurso aprimora os principais recursos do Cosmos DB, tornando-o mais versátil para lidar com dados vetoriais e requisitos de pesquisa em aplicativos de IA.

O que é um repositório vetorial?

Um repositório vetorial ou banco de dados vetorial é um banco de dados projetado para armazenar e gerenciar incorporações vetoriais, que são representações matemáticas de dados em um espaço de alta dimensão. Neste espaço, cada dimensão corresponde a uma característica dos dados, e dezenas de milhares de dimensões podem ser usadas para representar dados sofisticados. A posição de um vetor neste espaço representa suas características. Palavras, frases ou documentos inteiros, imagens, áudio e outros tipos de dados podem ser vetorizados.

Como funciona uma loja vetorial?

Em um repositório vetorial, algoritmos de pesquisa vetorial são usados para indexar e consultar incorporações. Alguns algoritmos de pesquisa vetorial bem conhecidos incluem Hierarchical Navigable Small World (HNSW), Inverted File (IVF), DiskANN, etc. A pesquisa vetorial é um método que ajuda você a encontrar itens semelhantes com base em suas características de dados, em vez de correspondências exatas em um campo de propriedade. Esta técnica é útil em aplicações como procurar texto semelhante, encontrar imagens relacionadas, fazer recomendações ou até mesmo detetar anomalias. Ele é usado para consultar as incorporações vetoriais de seus dados que você criou usando um modelo de aprendizado de máquina usando uma API de incorporação. Exemplos de APIs de embeddings são Azure OpenAI Embeddings ou Hugging Face em Azure. A pesquisa vetorial 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 no Cosmos DB, as incorporações podem ser armazenadas, indexadas e consultadas junto com os dados originais. Essa abordagem elimina o custo extra de replicar dados em um banco de dados vetorial puro separado. Além disso, essa arquitetura mantém as incorporações vetoriais e os dados originais juntos, o que facilita melhor as operações de dados multimodais e permite maior consistência, escala e desempenho dos dados.

Políticas de vetor de contêiner

A execução da pesquisa vetorial com o Cosmos DB exige que você defina uma política de vetor para o contêiner. Esta política fornece informações essenciais para que o mecanismo de banco de dados realize uma pesquisa eficiente de similaridade para vetores encontrados nos documentos do contêiner. Essa configuração também informa a política de indexação vetorial das informações necessárias, caso você opte por especificar uma. As seguintes informações estão incluídas na política de vetores contidos:

  • path: a propriedade que contém o vetor (obrigatório).

  • datatype: o tipo de dados da propriedade vetorial. Os tipos suportados são float32 (padrão), int8e uint8.

  • dimensions: A dimensionalidade ou comprimento de cada vetor no caminho. 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 a distância/semelhança. As métricas suportadas são:

    • cosine, que tem valores de $-1$ (menos semelhantes) a $+1$ (mais semelhantes).

    • dot product, que tem valores de $-\infty$ (menos semelhante) a $+\infty$ (mais semelhante).

    • euclidean, que tem valores de $0$ (mais semelhantes) a $+\infty$ (menos semelhantes).

Observação

Cada caminho único pode ter, no máximo, uma política. No entanto, várias políticas podem ser especificadas se todas tiverem como destino um caminho diferente.

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

Política com um único caminho vetorial

Este exemplo demonstra uma configuração de política de incorporação vetorial com um único caminho vetorial, mostrando a configuração básica para armazenar vetores float32 de 1536 dimensões com semelhança de cosseno. Esta configuração ilustra:

  • /[0]: Usa o tipo de dados float32 com similaridade do cosseno para vetores de 1536 dimensões (comum nas incorporações OpenAI)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

Política com dois caminhos vetoriais

Este exemplo demonstra como configurar uma política de indexação vetorial com dois caminhos diferentes de incorporação vetorial, cada um com tipos de dados, funções de distância e dimensões distintas. Esta configuração ilustra:

  • /[0]: Usa o tipo de dados float32 com similaridade do cosseno para vetores de 1536 dimensões (comum nas incorporações OpenAI)
  • /[1]: Usa o tipo de dados int8 com distância do produto ponto para vetores de 100 dimensões (mais eficiente em termos de memória para incorporações menores)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

Para obter mais informações e exemplos de configurações de uma política de vetor de contêiner, consulte Exemplos de política de indexação de vetores.

Políticas de indexação vetorial

Os índices vetoriais aumentam a eficiência ao realizar pesquisas vetoriais usando a função do VectorDistance sistema. As pesquisas de vetores têm menor latência, maior taxa de transferência e menor consumo de RU ao usar um índice vetorial. Você pode especificar estes tipos de políticas de índice de vetor:

Description Dimensões máximas
flat Armazena vetores no mesmo índice que outras propriedades indexadas. 505
quantizedFlat Quantifica (comprime) vetores antes de armazenar no índice. Essa política 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 no DiskANN para uma pesquisa aproximada rápida e eficiente. 4096

Alguns pontos a observar:

  • Os flat tipos de índice e quantizedFlat usam o índice do Cosmos DB para armazenar e ler cada vetor durante uma pesquisa vetorial. As pesquisas vetoriais com um flat índice são pesquisas de força bruta e produzem 100% de precisão ou recuperação. Ou seja, é garantido que eles encontrarão os vetores mais semelhantes no conjunto de dados. No entanto, existe uma limitação de 505 dimensões para vetores em um índice plano.

  • O quantizedFlat índice armazena vetores quantizados (compactados) no índice. Pesquisas vetoriais com quantizedFlat índice também são pesquisas de força bruta, no entanto, sua precisão pode ser um pouco inferior a 100%, uma vez que os vetores são quantificados antes de adicionar ao índice. No entanto, as pesquisas vetoriais com quantized flat devem ter menor latência, maior taxa de transferência e menor custo de RU do que as pesquisas vetoriais em um flat índice. Esse índice é uma boa opção para cenários menores ou cenários em que você está usando filtros de consulta para restringir a pesquisa vetorial a um conjunto relativamente pequeno de vetores. quantizedFlat é recomendado quando o número de vetores a serem indexados é algo em torno de 50.000 ou menos por partição física. No entanto, esta recomendação é apenas uma orientação geral e o desempenho real deve ser testado, uma vez que cada cenário pode ser diferente.

  • O índice diskANN é um índice separado definido especificamente para vetores utilizando DiskANN, um conjunto de algoritmos de indexação vetorial de alto desempenho desenvolvido 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 alta precisão. Em geral, o DiskANN é o mais eficiente de todos os tipos de índice se houver mais de 50.000 vetores por partição física.

  • Os índices quantizedFlat e diskANN suportam dois métodos de quantização no objeto vectorIndexes através da propriedade quantizerType: product e spherical.

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

{
  "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"
    }
  ]
}

Métodos de quantização

Além disso, pode especificar o método de quantização diretamente no vectorIndexes objeto. O Cosmos DB suporta dois métodos de quantização: product, o método padrão, e spherical (no Public Preview), que podem apresentar melhores características de desempenho, incluindo tempos de indexação mais rápidos e maior recordação. O método de quantização pode ser especificado usando a quantizerType propriedade no vectorIndexes objeto, conforme mostrado abaixo:

{
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN",
      "quantizerType": "spherical"
    }
  ]
}

Importante

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

Realize uma pesquisa vetorial 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 pesquisa vetorial usando a função interna VECTORDISTANCE em uma consulta. Um exemplo de consulta NoSQL que projeta a pontuação de similaridade como o alias score, e ordena por ordem de mais semelhante a menos semelhante:

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Importante

Sempre use a cláusula TOP N na instrução SELECT de uma consulta. Caso contrário, a pesquisa vetorial tenta retornar muito mais resultados, fazendo com que a consulta custe mais unidades de solicitação (RUs) e tenha latência maior do que o necessário.