Pesquisa vetorial no Cloud SQL para MySQL

Nesta página, descrevemos como as pesquisas de vetor são implementadas em instâncias do Cloud SQL para MySQL. O Cloud SQL permite armazenar embeddings de vetor, criar índices de vetor e realizar pesquisas de vetor em conjunto com outros dados armazenados.

Armazenamento de embeddings de vetor

Os embeddings de vetor são armazenados em uma tabela compatível com as propriedades de atomicidade, consistência, isolamento e durabilidade (ACID). Assim como outros dados relacionais na tabela, é possível acessar os embeddings de vetor na tabela com a semântica transacional existente.

Para estabelecer o mapeamento entre linhas de tabela e representações de vetor, é necessário criar uma coluna na tabela para armazenar os embeddings de vetor. A coluna precisa usar o tipo de dados VECTOR. A coluna de embeddings de vetor só pode armazenar embeddings de vetor que usam exatamente as mesmas dimensões especificadas ao definir a coluna. Não há restrições para o número de linhas na tabela em que você armazena embeddings de vetor.

Se você tiver armazenamento e memória suficientes disponíveis na instância do Cloud SQL, poderá ter várias tabelas com colunas de embeddings de vetor próprias.

A replicação de dados funciona da mesma maneira para a coluna de embeddings de vetor e para outras colunas do MySQL InnoDB.

Para uma lista de limitações e restrições para tabelas, colunas, e instruções DML de embeddings de vetor, consulte Limitações.

Índices vetoriais

É necessário usar um índice de vetor para realizar pesquisas de similaridade de ANN nos embeddings de vetor. O Cloud SQL cria índices de vetor usando o algoritmo Scalable Nearest Neighbors (ScANN).

Os índices vetoriais têm os seguintes requisitos:

  • Só é possível criar um índice de vetor por tabela.
  • Se você tiver várias tabelas com embeddings de vetor na instância, poderá criar índices de vetor para cada uma delas.
  • Se você estiver criando um índice de vetor, não será possível adicionar uma restrição à chave primária da tabela indexada.

Para melhorar a qualidade da pesquisa, crie um índice de vetor somente depois de carregar a maior parte dos dados na tabela base. Se você tiver menos de 1.000 embeddings na tabela base, a criação do índice falhará.

Ao decidir se você quer criar um índice de vetor, se tiver um pequeno número de linhas, considere se é possível realizar uma pesquisa de KNN. A decisão de usar uma pesquisa de KNN ou ANN também depende do número de dimensões no embedding de vetor. Um número maior de embeddings pode exigir um índice de vetor.

Para uma lista de limitações e restrições para índices de vetor, consulte Limitações. Para informações sobre como criar um índice de vetor, consulte Criar e gerenciar índices de vetor.

Atualizações de índice de vetor

O Cloud SQL atualiza índices de vetor em tempo real. Qualquer transação que realiza operações de linguagem de manipulação de dados (DML, na sigla em inglês) na tabela base também propaga mudanças nos índices de vetor associados. Os índices de vetor se comportam da mesma maneira que qualquer outro índice secundário na tabela. Os índices de vetor são totalmente consistentes do ponto de vista transacional e compatíveis com ACID. Se você reverter uma transação, as mudanças de reversão correspondentes também ocorrerão no índice de vetor.

Replicação de índices de vetor

O Cloud SQL replica índices de vetor em todas as réplicas de leitura, incluindo réplicas em cascata. Ao criar uma nova réplica de leitura de uma instância principal que tem embedding de vetor, a réplica de leitura herda as configurações de embedding de vetor da instância principal. Para réplicas de leitura atuais, é necessário ativar o suporte a embeddings de vetor em cada uma delas.

Em termos de impacto no atraso de replicação, a criação e a manutenção de índices de vetor funcionam da mesma maneira que os índices normais do MySQL.

Permanência, encerramento e impacto na manutenção

Os índices de vetor são mantidos da mesma forma que as tabelas base, com suporte completo a ACID. Os índices de vetor estão sempre sincronizados com os dados da tabela base e têm a mesma visibilidade, isolamento e segurança contra falhas. Não há impacto no índice de vetor quando a instância é desligada ou recebe manutenção.

Manutenção de índice

Depois que operações DML extensas são realizadas na tabela base, o índice de vetor treinado nos dados iniciais (no momento da criação do índice) pode não refletir o novo estado. Isso pode afetar a qualidade da pesquisa.

O índice tem duas partes:

  • A árvore de índice. Ela é criada pelo treinamento em dados atuais. Ela permanece inalterada durante o ciclo de vida do índice.
  • As folhas de índice. Elas contêm todas as linhas de dados. As folhas de índice nunca ficam dessincronizadas.

A árvore de índice pode se tornar menos eficiente depois que um grande número de instruções DML é executado, porque as linhas se movem de uma folha para outra. Para atualizar a árvore de índice, é necessário recriar o índice.

Operações DDL não aceitas em tabelas com índices de vetor

As seguintes operações de linguagem de definição de dados (DDL, na sigla em inglês) não são aceitas para tabelas que têm índices de vetor.

  • Alterar operações de tabela que exigem o algoritmo de cópia
  • Alterar operações de tabela que exigem a recriação da tabela
  • Descartar ou mudar a chave primária
  • Mover a tabela para um tablespace geral

O Cloud SQL fornece funções de distância de vetor que você usa para realizar pesquisas de similaridade de vetor de vizinho mais próximo aproximado (ANN) e de vizinho k-mais perto (KNN) na instância. Quando você executa uma consulta, o vetor de consulta é comparado aos vetores no conjunto de dados. As funções de distância calculam a distância entre os vetores usando uma métrica de similaridade, como o cosseno. Os vetores com a menor distância entre eles são os mais semelhantes e são retornados nos resultados da pesquisa.

O Cloud SQL usa as seguintes funções para medir a distância entre vetores em pesquisas de vetor ao realizar pesquisas de vetor de ANN e KNN:

  • Cosseno: mede o cosseno do ângulo entre dois vetores. Um valor menor indica maior similaridade entre os vetores.
  • Produto escalar: calcula o cosseno do ângulo multiplicado pelo produto das magnitudes de vetor correspondentes.
  • Distância L2 ao quadrado: mede a distância euclidiana entre dois vetores adicionando a distância ao quadrado em cada dimensão.

Uma pesquisa de vetor de KNN é o método de pesquisa preferido quando você precisa de resultados exatos ou quer adicionar filtragem seletiva. A pesquisa de KNN realiza um cálculo de distância do vetor de consulta com cada embedding no conjunto de dados para encontrar o vizinho mais próximo. As pesquisas de KNN no Cloud SQL oferecem recall perfeito. As pesquisas de KNN não usam um índice de vetor, então são uma boa opção ao trabalhar com conjuntos de dados menores.

Para realizar uma pesquisa de KNN, use a função vector_distance que recebe dois vetores como entrada: o vetor de consulta (o que você está procurando) e um vetor candidato do conjunto de dados. Ela calcula a distância entre esses dois vetores. Você usa vector_distance em uma instrução SELECT. Para mais informações, consulte Pesquisar vizinhos k-mais perto (KNN).

Se você descobrir que o KNN não está funcionando bem, poderá criar um índice de vetor mais tarde e continuar usando approx_distance no aplicativo para pesquisas de ANN.

Uma pesquisa de vetor de ANN é o tipo de pesquisa preferido quando a eficiência da consulta é uma preocupação. Ela acelera as pesquisas de similaridade calculando a distância entre o vetor de consulta e apenas uma parte dos vetores no conjunto de dados. Para fazer isso, o Cloud SQL organiza os dados em clusters ou partições e, em seguida, concentra a pesquisa nos clusters mais próximos da consulta. As pesquisas de ANN exigem índices de vetor. Esses índices priorizam a velocidade de pesquisa em vez do recall perfeito. No Cloud SQL, o TREE_SQ tipo de índice é usado para pesquisas de ANN.

Para realizar uma pesquisa de ANN, use a approx_distance função com uma opção de medição de distância. Você usa approx_distance em uma lista ORDER BY ou SELECT, e uma cláusula LIMIT é permitida para limitar os resultados da pesquisa. Também é possível adicionar uma cláusula WHERE para realizar a pós-filtragem dos resultados da pesquisa. Se você quiser ter mais controle sobre o número de resultados retornados ao realizar uma pesquisa de ANN com filtros, então você pode usar filtragem iterativa. Com a filtragem iterativa, a consulta de pesquisa pode retornar mais resultados de pesquisa verificando mais do índice de vetor até que o número preferido de vizinhos seja encontrado.

É possível ativar a filtragem iterativa para a consulta de pesquisa definindo a flag cloudsql_vector_iterative_filtering como ON em um nível de sessão para clientes individuais ou um nível global para todos os clientes que se conectam à instância.

Para mais informações, consulte Pesquisar vizinhos mais próximos aproximados (ANN).

Há alguns casos em que uma pesquisa de ANN volta para uma pesquisa de KNN. Para mais informações, consulte Verificar o status de fallback para pesquisas de ANN.

Diferenças de suporte de vetor nas versões do Cloud SQL para MySQL

O Cloud SQL para MySQL introduziu suporte para pesquisa de vetor na versão 8.0.36 e mais recentes. A partir da versão 9.7 do Cloud SQL para MySQL, o Cloud SQL modificou recursos específicos de pesquisa de vetor para integrar melhor o suporte de vetor e as funcionalidades de armazenamento desenvolvidas pela comunidade introduzidas no MySQL 9.0 desenvolvido pela comunidade.

A tabela a seguir fornece uma comparação das versões do Cloud SQL para MySQL que mostram como as diferenças na versão podem afetar o uso da pesquisa de vetor no Cloud para MySQL.

Área de suporte Cloud SQL para MySQL 8.4 e versões anteriores Cloud SQL para MySQL 9.7 e versões mais recentes
Ativação de vetor Para adicionar embeddings de vetor ao banco de dados MySQL e usar a pesquisa de vetor, defina a flag cloudsql_vector como on para a instância do Cloud SQL. Se você quiser criar índices de vetor e realizar a pesquisa de ANN, defina a flag cloudsql_vector como on.
Colunas de embeddings de vetor em uma tabela Uma tabela só pode ter uma coluna de embeddings de vetor. Você está limitado a uma coluna de embeddings de vetor por tabela somente se criar um índice na tabela. Se você não criar um índice na tabela, ela poderá ter várias colunas de embeddings de vetor.
Uso de COMMENT e CONSTRAINT para identificar colunas de embeddings de vetor Para distinguir a coluna de embeddings de vetor de outras colunas, o Cloud SQL adiciona uma anotação COMMENT especial e uma regra CONSTRAINT à coluna. A restrição é obrigatória para a validação de entradas, e a anotação da coluna de embeddings de vetor fica visível como um comentário. Não é possível modificar ou excluir o comentário ou a restrição. A anotação COMMENT e a regra CONSTRAINT não são mais usadas para identificar colunas de embeddings de vetor no Cloud SQL para MySQL 9.7.
Limite de dimensões Um embedding de vetor é restrito a 16.000 dimensões sem padrão. Um embedding de vetor é restrito a 16.383 dimensões com um padrão de 2.048.
Formato de armazenamento de vetor Formato VARBINARY Formato de armazenamento baseado na comunidade
Sintaxe para declarar o tipo de dados de vetor VECTOR(VECTOR_DIMENSIONS)
USING VARBINARY
VECTOR(VECTOR_DIMENSIONS)
[USING VARBINARY]
Diferenças de função de conversão A saída da função vector_to_string é impressa como o valor inteiro. A saída da vector_to_string função é renderizada em notação científica, que é o padrão da comunidade.

Limitações

As seguintes limitações se aplicam a todas as versões do Cloud SQL que oferecem suporte a vetores:

  • Só pode haver um índice de vetor por tabela.
  • A coluna de embeddings de vetor não pode ser uma coluna gerada.
  • Não é possível o particionamento no nível da tabela em tabelas com colunas de embeddings de vetor.
  • As chaves primárias que usam os tipos de dados BIT, BINARY, VARBINARY, JSON, BLOB, TEXT ou dados espaciais não são aceitas para índices de vetor. As chaves primárias compostas também não podem incluir nenhum desses tipos.
  • Se houver um índice de vetor, não será possível adicionar uma restrição à chave primária da tabela base.
  • Quando um índice de vetor está presente em uma tabela, há operações DDL que não podem ser realizadas. Para mais informações, consulte Operações DDL não aceitas em tabelas com índices de vetor.

As seguintes restrições são para consultas de pesquisa de vetor:

  • A função approx_distance só pode ser usada em uma lista ORDER BY ou SELECT.
  • Os predicados que envolvem a tabela base podem ser usados na condição WHERE em combinação com expressões approx_distance na lista ORDER BY ou SELECT. Os predicados de condição WHERE são avaliados depois que as funções de vetor approx_distance são avaliadas.

A seguir