Nesta página, descrevemos como as pesquisas de vetores são implementadas em instâncias do Cloud SQL para MySQL. Com o Cloud SQL, é possível armazenar embeddings vetoriais, criar índices de vetor e realizar pesquisas de vetor com seus outros dados armazenados.
Armazenamento de embeddings de vetor
Você armazena embeddings de vetor em uma tabela compatível com 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 semântica transacional existente.
Para estabelecer o mapeamento entre linhas da tabela e representações de vetor, crie 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 necessárias para o embedding. 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 quanto ao 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 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 conferir uma lista de limitações e restrições de tabelas, colunas e instruções DML de incorporação de vetores, consulte Limitações.
Índices vetoriais
Você precisa usar um índice vetorial para realizar pesquisas de similaridade de ANN nos seus embeddings vetoriais. 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 sua 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 incorporações na tabela de base, a criação do índice vai falhar.
Ao decidir se é necessário criar um índice de vetor, considere se é possível fazer uma pesquisa de KNN em vez disso, caso tenha um número pequeno de linhas. 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 ver uma lista de limitações e restrições dos í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 mudanças 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 vetores são totalmente consistentes em termos de transação e compatíveis com ACID. Se você reverter uma transação, as mudanças de reversão correspondentes também vão ocorrer no índice de vetor.
Replicação de índices vetoriais
O Cloud SQL replica os índices de vetor em todas as réplicas de leitura, inclusive para replicação em cascata. Quando você cria uma réplica de leitura de uma instância principal com embeddings de vetor, a réplica herda as configurações de embeddings 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 vetores são persistidos da mesma forma que as tabelas de base, com suporte total a ACID. Os índices de vetores estão sempre sincronizados com os dados da tabela de base e têm a mesma visibilidade, isolamento e segurança contra falhas. Não há impacto no índice de vetores quando a instância é desligada ou recebe manutenção.
Manutenção de índice
Depois que operações DML extensivas são realizadas na tabela de 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. Ele é criado com base em dados atuais. Ela permanece inalterada durante o ciclo de vida do índice.
- O índice sai. Elas contêm todas as linhas de dados. Os índices nunca ficam dessincronizados.
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
- Operações de alteração de tabela que exigem algoritmo de cópia.
- Operações de alteração de tabela que exigem a reconstrução da tabela.
- Remova ou mude 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 aproximado mais próximo (ANN) e de vizinho k-mais próximo (KNN) na sua instância. Quando você executa uma consulta, o vetor dela é comparado aos 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 vetoriais ao realizar 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 dos vetores correspondentes.
- Distância L2 ao quadrado: mede a distância euclidiana entre dois vetores adicionando a distância ao quadrado em cada dimensão.
Pesquisa KNN
Uma pesquisa de vetor KNN é o método 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 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 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 perto (KNN).
Se você perceber que o 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.
Pesquisa da ANN
Uma pesquisa de vetor ANN é o tipo de pesquisa preferido quando a eficiência da consulta é uma preocupação. Ele acelera as pesquisas por 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 da pesquisa em vez da recuperação perfeita. 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. 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 a pós-filtragem dos resultados da pesquisa. Para
mais informações, consulte
Pesquisar vizinhos aproximados mais próximos (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.
Requisitos
O Cloud SQL exige que você ative os 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 abaixo as limitações das 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.
- 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 vetores. Chaves primárias compostas também não podem conter qualquer um 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 não compatíveis em tabelas com índices de vetor.
Estas são as restrições para consultas de pesquisa vetorial:
- A função
approx_distance
só pode ser usada em uma listaORDER BY
ouSELECT
. - Os predicados que envolvem a tabela de base podem ser usados na condição
WHERE
em combinação com expressõesapprox_distance
na listaORDER BY
ouSELECT
. Os predicados de condiçãoWHERE
são avaliados depois das funções de vetorapprox_distance
.
Práticas recomendadas para trabalhar com índices de vetor
Nesta seção, você vai conhecer as práticas recomendadas para trabalhar com índices de vetores. Cada carga de trabalho é diferente, e talvez você precise ajustá-la de acordo.
- Depois de operações DML importantes, é recomendável recriar o índice.
- Em geral, é 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, recomendamos ter pelo menos 100 vetores por folha para o melhor recall.
A seguir
- Leia a visão geral sobre a pesquisa vetorial no Cloud SQL.
- Saiba como gerar embeddings de vetor.
- Saiba como criar índices de vetor.
- Saiba como fazer pesquisas em embeddings de vetores.