Bancos de dados vetoriais
Um banco de dados vetorial 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, porque os vetores podem ser comparados e analisados usando técnicas avançadas, como pesquisa de similaridade vetorial, quantização e clustering. 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 vetoriais são projetados para lidar com dados de alta dimensão, como texto, imagens e áudio, representando-os como vetores. Os bancos de dados vetoriais são úteis para tarefas como aprendizado de máquina, processamento de linguagem natural e reconhecimento de imagens, onde o objetivo é identificar padrões ou semelhanças em grandes conjuntos de dados.
Este artigo fornece alguns antecedentes sobre bancos de dados vetoriais e explica conceitualmente como você pode usar uma Eventhouse como um banco de dados vetorial em Inteligência em Tempo Real no Microsoft Fabric. Para obter um exemplo prático, consulte Tutorial: Usar uma casa de eventos como um banco de dados vetorial.
Conceitos-chave
Os seguintes conceitos-chave são usados em bancos de dados vetoriais:
Semelhança vetorial
A semelhança vetorial é uma medida de quão diferentes (ou semelhantes) dois ou mais vetores são. A pesquisa de semelhança vetorial é 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 semelhança de cosseno. Quanto mais próximos estiverem os dois vetores, mais semelhantes eles são.
Incorporações
As incorporações são uma maneira comum de representar dados em um formato vetorial para uso em bancos de dados vetoriais. Uma incorporação é uma representação matemática de um pedaço de dados, como uma palavra, documento de texto ou uma imagem, que é projetado para capturar seu significado semântico. As incorporações são criadas usando algoritmos que analisam os dados e geram um conjunto de valores numéricos que representam suas principais características. Por exemplo, uma incorporação de uma palavra pode representar seu significado, seu contexto e sua relação com outras palavras. O processo de criação de incorporações é simples. Embora possam ser criados usando pacotes python padrão (por exemplo, spaCy, sent2vec, Gensim), os Large Language Models (LLM) geram incorporações da mais alta qualidade para pesquisa semântica de texto. Por exemplo, você pode enviar texto para um modelo de incorporação no Azure OpenAI, e ele gera uma representação vetorial que pode ser armazenada para análise. Para obter mais informações, consulte Compreender incorporações no Serviço OpenAI do Azure.
Fluxo de trabalho geral
O fluxo de trabalho geral para usar um banco de dados vetorial é o seguinte:
- Incorporar dados: converta dados em formato vetorial usando um modelo de incorporação. Por exemplo, você pode incorporar dados de texto usando um modelo OpenAI.
- Armazenar vetores: armazene os vetores incorporados em um banco de dados vetorial. Você pode enviar os dados incorporados para uma Eventhouse para armazenar e gerenciar os vetores.
- Incorporar consulta: converta os dados da consulta em formato vetorial usando o mesmo modelo de incorporação usado para incorporar os dados armazenados.
- Vetores de consulta: use a pesquisa de semelhança vetorial para localizar entradas no banco de dados semelhantes à consulta.
Eventhouse como um banco de dados vetorial
No núcleo da Pesquisa de Semelhança Vetorial está a capacidade de armazenar, indexar e consultar dados vetoriais. As casas de eventos fornecem uma solução para lidar e analisar grandes volumes de dados, particularmente em cenários que exigem análise e exploração em tempo real, tornando-a uma excelente escolha para armazenar e pesquisar vetores.
Os seguintes componentes do permitem o uso de um banco de dados vetorial Eventhouse:
- O tipo de dados dinâmico , que pode armazenar dados não estruturados, como matrizes e pacotes de propriedades. Assim, o tipo de dados é recomendado para armazenar valores vetoriais. Você pode aumentar ainda mais o valor do vetor armazenando metadados relacionados ao objeto original como colunas separadas na tabela.
- O tipo
Vector16
de codificação projetado para armazenar vetores de números de vírgula flutuante em precisão de 16 bits, que usa oBfloat16
em vez do padrão de 64 bits. Essa codificação é recomendada para armazenar incorporações vetoriais de ML, pois reduz os requisitos de armazenamento em um fator de quatro e acelera as funções de processamento vetorial, como series_dot_product() e series_cosine_similarity() por ordens de magnitude. - A função series_cosine_similarity , que pode realizar pesquisas de semelhança vetorial em cima dos vetores armazenados no Eventhouse.
Otimizar para escala
Para obter mais informações sobre como otimizar a pesquisa de semelhança vetorial, leia o blog.
Para maximizar o desempenho e os tempos de pesquisa resultantes, siga as seguintes etapas:
- Defina a codificação da coluna de incorporações como Vetor16, a codificação de 16 bits dos coeficientes de vetores (em vez do padrão de 64 bits).
- Armazene a tabela de vetores de incorporação em todos os nós do cluster com pelo menos um fragmento por processador, o que é feito pelas seguintes etapas:
- Limite o número de vetores de incorporação por estilhaço alterando o ShardEngineMaxRowCount da política de fragmentação. A política de fragmentação equilibra os dados em todos os nós com várias extensões por nó para que a pesquisa possa usar todos os processadores disponíveis.
- Altere o RowCountUpperBoundForMerge da política de mesclagem. A política de fusão é necessária para suprimir as extensões de fusão após a ingestão.
Exemplo de etapas de otimização
No exemplo a seguir, uma tabela de vetores estáticos é definida para armazenar vetores 1M. A política de incorporação é definida como Vetor16 e as políticas de fragmentação e mesclagem são definidas para otimizar a tabela para pesquisa de semelhança vetorial. Para isso, vamos supor que o cluster tenha 20 nós, cada um tenha 16 processadores. Os estilhaços da tabela devem conter no máximo 1000000/(20*16)=3125 linhas.
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
Ingerir os dados para a tabela criada e definida na etapa anterior.