Pesquisa vetorial no Cloud SQL para MySQL

Nesta página, descrevemos como as buscas vetoriais 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 vetoriais em conjunto com os outros dados armazenados.

Armazenamento de embeddings de vetor

Você armazena embeddings de vetor 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 as linhas da tabela e as representações vetoriais, é 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 embedding de vetor só pode armazenar embeddings de vetor que usem exatamente as mesmas dimensões que você especificar ao definir a coluna. Não há restrições quanto ao 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, será possível ter várias tabelas com as próprias colunas de embedding de vetor.

A replicação de dados funciona da mesma maneira para a coluna de embedding 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 embedding de vetor, consulte Limitações.

Índices vetoriais

É preciso usar um índice de vetor para realizar pesquisas de similaridade de ANN nos embeddings de vetor. O Cloud SQL cria índices vetoriais 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 vetorial, 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 vai falhar.

Ao decidir se vai criar um índice de vetor, se você tiver um número pequeno de linhas, considere se é possível realizar uma pesquisa KNN. A decisão de usar uma pesquisa 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 vetorial.

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

Atualizações do índice vetorial

O Cloud SQL atualiza os í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 alterações nos índices de vetor associados. Os índices de vetor se comportam da mesma forma que qualquer outro índice secundário na tabela. Os índices vetoriais são totalmente consistentes em termos de transação e compatíveis com ACID. Se você reverter uma transação, as alterações de reversão correspondentes também ocorrerão no índice de vetor.

Replicação de índices vetoriais

O Cloud SQL replica índices vetoriais para todas as réplicas de leitura, incluindo réplicas em cascata. Quando você cria 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, é preciso 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 vetoriais são mantidos da mesma forma que as tabelas base, com suporte total a ACID. Os índices vetoriais 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 vetorial quando a instância é encerrada ou recebe manutenção.

Manutenção de índice

Depois que operações de DML extensas são realizadas na tabela base, o índice de vetor que você treinou 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. Ele é criado com o treinamento em dados atuais. Ele permanece inalterado durante o ciclo de vida do índice.
  • As folhas do índice. Elas contêm todas as linhas de dados. As folhas de índice nunca ficam fora de sincronia.

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 compatíveis em tabelas com índices de vetor

As seguintes operações de linguagem de definição de dados (DDL) não são compatíveis com tabelas que têm índices de vetor.

  • Operações de alteração de tabela que exigem o algoritmo de cópia
  • Operações de alteração de tabela que exigem a recriação da tabela
  • Remover ou alterar a chave primária
  • Mover a tabela para um espaço de tabela geral

O Cloud SQL oferece 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 vizinhos k-mais próximos (KNN) na sua 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 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 buscas vetoriais ao realizar buscas vetoriais 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 vetoriais correspondentes.
  • Distância de L2 ao quadrado: mede a distância euclidiana entre dois vetores adicionando a distância ao quadrado em cada dimensão.

A busca vetorial KNN é o método de pesquisa preferido quando você precisa de resultados exatos ou quer adicionar filtragem seletiva. A pesquisa KNN calcula a distância do vetor de consulta com cada embedding no conjunto de dados para encontrar o vizinho mais próximo. As pesquisas KNN no Cloud SQL oferecem recall perfeito. As pesquisas KNN não usam um índice vetorial, 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 usa dois vetores como entrada: o vetor de consulta (o que você está procurando) e um vetor candidato do conjunto de dados. Ele calcula a distância entre esses dois vetores. Use vector_distance em uma instrução SELECT. Para mais informações, consulte Pesquisar vizinhos k-mais próximos (KNN).

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

A pesquisa vetorial de ANN é o tipo de pesquisa preferido quando a eficiência da consulta é uma preocupação. Ele 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 vetoriais. Esses índices priorizam a velocidade de pesquisa em detrimento do recall perfeito. No Cloud SQL, o tipo de índice TREE_SQ é usado para pesquisas de ANN.

Para realizar uma pesquisa de ANN, use a função approx_distance com uma opção de medição de distância. Use 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, use a filtragem iterativa. Com a filtragem iterativa, sua consulta de pesquisa pode retornar mais resultados da pesquisa ao verificar mais o índice de vetor até que o número preferido de vizinhos seja encontrado.

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

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

Em alguns casos, uma pesquisa de ANN volta para uma pesquisa de KNN. Para mais informações, consulte Verificar o status de substituição para pesquisas de ANN.

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

O Cloud SQL para MySQL introduziu suporte para pesquisa vetorial na versão 8.0.36 e posteriores. A partir da versão 9.7 do Cloud SQL para MySQL, o Cloud SQL modificou recursos específicos de busca vetorial para melhorar a integração com as funcionalidades de suporte e armazenamento de vetores desenvolvidas pela comunidade, introduzidas no MySQL 9.0.

A tabela a seguir compara as versões do Cloud SQL para MySQL e mostra como as diferenças entre elas podem afetar o uso da pesquisa vetorial 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 vetores Para adicionar embeddings de vetor ao banco de dados MySQL e usar a busca vetorial, defina a flag cloudsql_vector como on na instância do Cloud SQL. Se você quiser criar índices de vetor e realizar uma pesquisa de ANN, defina a flag cloudsql_vector como on.
Colunas de embedding de vetor em uma tabela Uma tabela só pode ter uma coluna de embedding de vetor. Você só pode ter uma coluna de embedding de vetor por tabela se criar um índice na tabela. Se você não criar um índice na tabela, ela poderá ter várias colunas de embedding de vetor.
Uso de COMMENT e CONSTRAINT para identificar colunas de embedding de vetor Para distinguir a coluna de embedding 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 nem 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 vetores Formato VARBINARY Formato de armazenamento baseado na comunidade
Sintaxe para declarar o tipo de dados vetoriais VECTOR(VECTOR_DIMENSIONS)
USING VARBINARY
VECTOR(VECTOR_DIMENSIONS)
[USING VARBINARY]
Diferenças entre as funções de conversão A saída da função vector_to_string é impressa como o valor inteiro. A saída da função vector_to_string é renderizada em notação científica, que é o padrão da comunidade.

Limitações

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

  • Só pode haver um índice vetorial 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.
  • Chaves primárias que usam os tipos de dados BIT, BINARY, VARBINARY, JSON, BLOB, TEXT ou dados espaciais não são compatíveis com índices de vetor. Chaves primárias compostas também não podem conter qualquer um desses tipos.
  • Se houver um índice vetorial, não será possível adicionar uma restrição à chave primária da tabela base.
  • Quando um índice vetorial está presente em uma tabela, há operações de DDL que não podem ser realizadas. Para mais informações, consulte Operações DDL não compatíveis em tabelas com índices vetoriais.

As seguintes restrições se aplicam às consultas de pesquisa vetorial:

  • 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 após as funções vetoriais approx_distance.

A seguir