Vector search

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

Armazenamento de embeddings de vetor

Você armazena embeddings de vetor em uma tabela que é 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 atual.

Para estabelecer o mapeamento entre as linhas da tabela e as 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 do Cloud SQL e indicar o número de dimensões que a incorporação exige. A coluna de embedding de vetor só pode armazenar embeddings de vetor que usam exatamente as mesmas dimensões especificadas ao definir a coluna.

Uma tabela só pode ter uma coluna de embeddings de vetor. Não há restrições para o número de linhas na tabela.

Para distinguir a coluna de embeddings de vetor de outras colunas, o Cloud SQL adiciona um COMMENT e um CONSTRAINT especiais à 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 COMMENT. Não é possível modificar nem excluir o comentário ou a restrição.

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

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

Para conferir uma lista de limitações e restrições para tabelas de incorporação de vetores, colunas e instruções DML, consulte Limitações.

Índices vetoriais

É necessário usar um índice vetorial para realizar pesquisas de similaridade de ANN nos seus embeddings vetoriais. 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 inclusões de vetor na sua instância, será possível 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 incorporações na tabela base, a criação do índice vai falhar.

Ao decidir se vai criar um índice de vetor, se você tiver um pequeno número de linhas, considere realizar uma pesquisa KNN. A decisão de usar uma pesquisa KNN em vez de uma ANN também depende do número de dimensões na incorporação de vetores. Um número maior de embeddings pode exigir um índice de vetor.

Para conferir uma lista de limitações e restrições para í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 índices de vetor em tempo real. Qualquer transação que realiza operações de linguagem de manipulação de dados (DML) 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 de vetor são totalmente consistentes com transações 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 vetoriais

O Cloud SQL replica índices de vetor em todas as réplicas de leitura, inclusive para a replicação em cascata. Quando você cria uma nova réplica de leitura de uma instância principal que tem a incorporação de vetor, a réplica de leitura herda as configurações de incorporação 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 de base, com suporte total ao ACID. Os índices de vetores 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 é encerrada ou recebe manutenção.

Manutenção de índice

Depois que operações extensas de DML forem realizadas na tabela base, o índice de vetor que você treinou nos dados iniciais (no momento da criação do índice) poderá 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 base em dados atuais. Ele permanece inalterado durante o ciclo de vida do índice.
  • As folhas do índice. Eles contêm todas as linhas de dados. As folhas do índice nunca ficam dessincronizadas.

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

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

  • Alterar operações de tabela que exigem algoritmo de cópia.
  • Altere as operações de tabela que exigem a reconstrução da tabela.
  • Excluir ou mudar a chave primária.
  • Mova a tabela para um espaço de tabela geral.

Pesquisa vetorial

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 (KNN) e de vizinho aproximado mais próximo (ANN) na sua instância. Quando você executa uma consulta, o vetor de consulta é comparado com os vetores no seu 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 quando você realiza pesquisas de vetor ANN e KNN:

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

Uma pesquisa de vetor KNN é o método de pesquisa preferido quando você precisa de resultados exatos ou quer adicionar uma filtragem seletiva. A pesquisa KNN realiza um cálculo de distância do vetor de consulta com todos os embeddings 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 para 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 seu conjunto de dados. Ele 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 próximos (KNN).

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

Uma pesquisa vetorial 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 isso, o Cloud SQL organiza os dados em clusters ou partições e 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 vez do recall perfeito. No Cloud SQL, o tipo de índice TREE_SQ é usado para pesquisas de ANN.

Para realizar uma pesquisa de NNA, use a função approx_distance 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. Você também pode adicionar uma cláusula WHERE para realizar o pós-filtro dos resultados da pesquisa. Para mais informações, consulte Pesquisar vizinhos aproximados mais próximos (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 substituição para pesquisas de ANN.

Requisitos

O Cloud SQL exige que você ative as embeddings de vetor na instância usando a flag cloudsql_vector antes de adicionar embeddings de vetor. Para mais informações, consulte Ativar e desativar embeddings de vetor na sua instância.

Limitações

Confira a seguir as limitações em tabelas que têm uma coluna de embeddings de vetor:

  • Só pode haver uma coluna de embeddings de vetor para cada tabela.
  • Só pode haver um índice de vetor por tabela.
  • Um embedding de vetor é restrito a 16.000 dimensões.
  • 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 ou dados espaciais não são compatíveis com índices vetoriais.TEXT 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á algumas operações DDL que não podem ser realizadas. Para mais informações, consulte Operações DDL sem suporte em tabelas com índices de vetor.

Confira a seguir as restrições para consultas de pesquisa vetorial:

  • A função approx_distance só pode ser usada em uma lista ORDER BY ou SELECT.
  • 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 vetoriais approx_distance são avaliadas.

Práticas recomendadas para trabalhar com índices de vetor

Esta seção apresenta as práticas recomendadas para trabalhar com índices de vetor. Cada carga de trabalho é diferente, e talvez você precise ajustá-la de acordo.

  • Após operações DML importantes, é recomendável recriar o índice.
  • Geralmente, é aceitável deixar o Cloud SQL calcular o número de folhas a serem usadas. Se você quiser especificar o número de folhas em um caso de uso, é recomendável ter pelo menos 100 vetores por folha para uma melhor recuperação.

A seguir