Compartilhar via


Bancos de dados de vetores

Um banco de dados de vetores armazena e gerencia dados na forma de vetores, que são matrizes numéricas de pontos de dados.

O uso de vetores permite consultas e análises complexas, pois os vetores podem ser comparados e analisados usando técnicas avançadas, como pesquisa por similaridade de vetores, quantização e agrupamento. Os bancos de dados tradicionais não são adequados para lidar com dados de alta dimensão, que estão se tornando cada vez mais comuns na análise de dados. No entanto, os bancos de dados de vetores são projetados para lidar com dados de alta dimensão, como texto, imagens e áudio, representando-os como vetores. Os bancos de dados de vetores são úteis para tarefas como aprendizado de máquina, processamento de linguagem natural e reconhecimento de imagens, em que o objetivo é identificar padrões ou semelhanças em grandes conjuntos de dados.

Esse artigo fornece algumas informações básicas sobre bancos de dados de vetores e explica conceitualmente como você pode usar um Eventhouse como um banco de dados de vetores em Inteligência em Tempo Real no Microsoft Fabric. Para obter um exemplo prático, consulte Tutorial: usar uma Eventhouse como banco de dados de vetores.

Conceitos principais

Os seguintes conceitos-chave são usados em bancos de dados de vetores:

Similaridade de vetor

A similaridade de vetores é uma medida de quão diferentes (ou semelhantes) são dois ou mais vetores. A pesquisa por similaridade de vetores é uma técnica usada para encontrar vetores semelhantes em um conjunto de dados. Os vetores são comparados usando uma métrica de distância, como distância euclidiana ou similaridade de cosseno. Quanto mais próximos dois vetores estiverem, mais semelhantes eles serão.

Incorporações

Inserções são uma forma comum de representar dados em formato de vetores para uso em bancos de dados de vetores. Uma inserção é uma representação matemática de um dado, como uma palavra, um documento de texto ou uma imagem, projetada para capturar seu significado semântico. As inserções são criadas usando algoritmos que analisam os dados e geram um conjunto de valores numéricos que representam seus principais recursos. Por exemplo, a inserção de uma palavra pode representar seu significado, seu contexto e sua relação com outras palavras. O processo de criação de inserções é simples. Embora possam ser criadas usando pacotes python padrão (por exemplo, spaCy, sent2vec, Gensim), os LLM (Modelos de Linguagem Grandes) geram inserções da mais alta qualidade para pesquisa semântica de texto. Por exemplo, você pode enviar texto para um modelo de inserção no OpenAI do Azure, e ele gera uma representação de vetores que pode ser armazenada para análise. Para obter mais informações, consulte Compreender as inserções no serviço OpenAI do Azure.

Fluxo de trabalho geral

Esquema de como inserir, armazenar e consultar texto armazenado como vetores.

O fluxo de trabalho geral para usar um banco de dados de vetores é o seguinte:

  1. Inserir dados: converta dados em formato de vetores usando um modelo de inserção. Por exemplo, você pode inserir dados de texto usando um modelo OpenAI.
  2. Armazenar vetores: armazene os vetores inseridos em um banco de dados de vetores. Você pode enviar os dados inseridos a um Eventhouse para armazenar e gerenciar os vetores.
  3. Inserir consulta: converta os dados da consulta em formato de vetores usando o mesmo modelo de inserção usado para inserir os dados armazenados.
  4. Consultar vetores: use a pesquisa por similaridade de vetores para localizar entradas no banco de dados que sejam semelhantes à consulta.

Eventhouse como um banco de dados de vetores

No cerne da pesquisa por similaridade de vetores, está a capacidade de armazenar, indexar e consultar dados de vetores. Os Eventhouses fornecem uma solução para manipulação e análise de grandes volumes de dados, principalmente em cenários que exigem análise e exploração em tempo real, tornando-os uma excelente opção para armazenamento e pesquisa de vetores.

Os seguintes componentes do Eventhouse permitem o uso de um banco de dados vetorial:

  • O tipo de dados dinâmico, que pode armazenar dados não estruturados, como matrizes e pacotes de propriedades. Portanto, o tipo de dados é recomendado para armazenar valores de vetores. Você pode aumentar ainda mais o valor do vetor armazenando metadados relacionados ao objeto original como colunas separadas em sua tabela.
  • O tipo de codificação Vector16 projetado para armazenar vetores de números de ponto flutuante com precisão de 16 bits, que usa Bfloat16 em vez dos 64 bits padrão. Essa codificação é recomendada para armazenar inserções de vetores de ML, pois reduz os requisitos de armazenamento em um fator de quatro e acelera funções de processamento de vetores, como series_dot_product() e series_cosine_similarity(), em ordens de magnitude.
  • A função series_cosine_similarity, que pode realizar pesquisas de similaridade de vetores sobre os vetores armazenados no Eventhouse.

Otimizar para escala

Para obter mais informações sobre como otimizar a pesquisa de similaridade vetorial, leia o blog.

Para maximizar o desempenho e os tempos de pesquisa resultantes, siga as seguintes etapas:

  1. Defina a codificação da coluna de incorporações como Vector16, a codificação de 16 bits dos coeficientes vetoriais (em vez do padrão de 64 bits).
  2. Armazene a tabela de vetores de incorporação em todos os nós de cluster com pelo menos um fragmento por processador, o que é feito pelas seguintes etapas:
    1. Limite o número de vetores de inserção por fragmento alterando o ShardEngineMaxRowCount da política de fragmentação. A política de fragmentação equilibra dados em todos os nós com várias extensões por nó para que a pesquisa possa usar todos os processadores disponíveis.
    2. Altere o RowCountUpperBoundForMerge da política de mesclagem. A política de mesclagem é necessária para suprimir extensões de mesclagem após a assimilação.

Exemplo de etapas de otimização

No exemplo a seguir, uma tabela de vetores estáticos é definida para armazenar vetores de 1 M. A política de incorporação é definida como Vector16, e as políticas de fragmentação e mesclagem são definidas para otimizar a tabela para pesquisa de similaridade de vetor. Para isso, vamos supor que o cluster tenha 20 nós, cada um com 16 processadores. Os fragmentos da tabela devem conter no máximo 1000000/(20*16)=3125 linhas.

  1. Os seguintes comandos KQL são executados um a um para criar a tabela vazia e definir as políticas e a codificação necessárias:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. Ingerir os dados na tabela criada e definida na etapa anterior.

Próxima etapa