Esta página detalha como pode interagir com o Cloud SQL para criar aplicações que usam incorporações de vetores.
O Cloud SQL para MySQL suporta o armazenamento de incorporações vetoriais. Em seguida, pode criar índices de pesquisa vetorial e realizar pesquisas de similaridade nestas incorporações vetoriais, juntamente com o resto dos dados que armazena no Cloud SQL.
Armazenamento de incorporações vetoriais
Pode usar o Cloud SQL para MySQL para armazenar incorporações de vetores criando uma coluna de incorporação de vetores numa tabela. A coluna de incorporação de vetores especiais é mapeada para o tipo de dados VARBINARY
. Tal como outros dados relacionais na tabela, pode aceder a incorporações de vetores na tabela com as garantias transacionais existentes. Uma tabela que tem uma coluna de incorporação de vetores é uma tabela InnoDB normal e, por isso, está em conformidade com as propriedades de atomicidade, consistência, isolamento e durabilidade (ACID). As propriedades ACID só divergem para as pesquisas de índice de pesquisa vetorial.
Considere o seguinte ao configurar uma tabela para incorporações vetoriais:
Pode criar um máximo de uma coluna de incorporação de vetores numa tabela e um índice de pesquisa vetorial por tabela. Cada incorporação de vetor armazenada na mesma coluna tem de ter exatamente as mesmas dimensões que especificou quando definiu a coluna. Uma incorporação vetorial tem um limite superior de 16 000 dimensões. Se tiver armazenamento e memória suficientes disponíveis, pode ter tabelas separadas com diferentes colunas de incorporação de vetores e índices de pesquisa vetorial na mesma instância.
Embora não exista um limite máximo para o número de incorporações de vetores que pode armazenar numa tabela, os índices de pesquisa vetorial requerem memória. Por este motivo, recomendamos que não armazene mais de 10 milhões de incorporações de vetores numa tabela.
Consulte também a lista de limitações.
A replicação funciona da mesma forma para a coluna de incorporação de vetores como para outras colunas do MySQL InnoDB.
Pesquisa por semelhança
O Cloud SQL suporta a pesquisa de similaridade através de consultas de pesquisa de K-nearest neighbor (KNN) e approximate nearest neighbor (ANN). Pode usar ambos os tipos de pesquisas vetoriais nas suas instâncias do Cloud SQL. Só pode criar um índice do Vector Search para pesquisas de ANN.
Pesquisa de vizinho mais próximo (KNN)
O Cloud SQL suporta consultas através da pesquisa de vetores KNN, também denominada pesquisa exata do vizinho mais próximo. A execução de uma pesquisa de vetores KNN oferece uma capacidade de memorização perfeita. Pode realizar pesquisas KNN sem ter de criar um índice de pesquisa vetorial. A pesquisa KNN baseia-se na execução de um algoritmo de análise de tabelas.
Para a pesquisa KNN, o Cloud SQL também suporta as seguintes funções de pesquisa de distância vetorial:
- Cosseno
- Produto escalar
- Distância ao quadrado L2
Para mais informações sobre a utilização de funções de distância de pesquisa vetorial, consulte o artigo Consultar a distância de uma incorporação de vetores.
Pesquisa de vizinho mais próximo aproximado (ANN)
O Cloud SQL suporta a criação e a consulta de pesquisas ANN através da criação de índices de pesquisa vetorial. Um índice de pesquisa de vetores de ANN permite otimizar para um desempenho rápido em vez de uma recordação perfeita. Para a pesquisa de ANN, o Cloud SQL suporta os seguintes tipos de índice:
BRUTE_FORCE
: o tipo de índice de pesquisa vetorial predefinido para uma tabela base que tenha menos de 10 000 linhas. Este tipo é mais adequado para pesquisas num subconjunto mais pequeno de um conjunto de dados original. A memória usada pelo índice é igual ao tamanho do conjunto de dados. Este tipo de índice não é guardado no disco.TREE_SQ
: o tipo de índice de pesquisa vetorial predefinido para uma tabela base com 10 000 ou mais linhas. Este tipo usa a menor quantidade de memória ou, aproximadamente, 25% do tamanho do conjunto de dados. Os índicesTREE_SQ
são mantidos no disco.TREE_AH
: um tipo de índice de pesquisa vetorial que fornece um algoritmo de tipo de pesquisa de hash assimétrico. Conforme implementado no Cloud SQL, este tipo de índice não está otimizado para a pegada de memória e não é persistente.
Atualize os índices de pesquisa vetorial
O Cloud SQL para MySQL atualiza os índices de pesquisa vetorial em tempo real. Qualquer transação
que execute operações de linguagem de manipulação de dados (DML) na tabela base também
propaga alterações aos índices de pesquisa vetorial associados. As alterações num índice de pesquisa vetorial são visíveis imediatamente para todas as outras transações, o que significa um nível de isolamento de READ_UNCOMMITTED
.
Se reverter uma transação, as alterações de reversão correspondentes também ocorrem no índice de pesquisa vetorial.
Replicação de índices de pesquisa vetorial
O Cloud SQL para MySQL replica os índices de pesquisa vetorial para todas as réplicas de leitura. Os filtros de replicação e a replicação de índices de pesquisa vetorial em réplicas em cascata não são suportados.
Configure uma instância para suportar incorporações vetoriais
Esta secção descreve como configurar a sua instância do Cloud SQL para suportar o armazenamento, a indexação e a consulta de incorporações vetoriais.
As instâncias da edição Cloud SQL Enterprise e da edição Cloud SQL Enterprise Plus suportam incorporações vetoriais.
Antes de começar
- A sua instância tem de estar a executar a versão
8.0.36.R20240401.03_00
ou posterior do Cloud SQL para MySQL. - A sua instância tem de ter espaço em disco suficiente para atribuir memória para o número total de incorporações de vetores na instância.
Ative as incorporações vetoriais
Para ativar o suporte para incorporações vetoriais, tem de configurar as flags da base de dados MySQL.
gcloud sql instances patch INSTANCE_NAME \ --database-flags=FLAGS
Substitua INSTANCE_NAME pelo nome da instância na qual quer ativar o suporte de incorporação de vetores.
No FLAGS, configure as seguintes flags do MySQL na sua instância:
cloudsql_vector
: defina esta flag comoon
para ativar o armazenamento de incorporação de vetores e o suporte de pesquisa. Pode criar novas colunas de incorporação de vetores e índices de pesquisa de vetores na instância.cloudsql_vector_max_mem_size
: opcional. Especifique a atribuição máxima de memória em bytes para todos os índices de pesquisa vetorial na instância. Se não especificar esta flag, a atribuição de memória predefinida é de 1 GB, que é a atribuição de memória mínima. Para mais informações sobre como calcular o valor a especificar, consulte o artigo Configure a atribuição de memória para índices de pesquisa vetorial.Esta memória dedicada provém da memória alocada ao seu
innodb_buffer_pool_size
. O seu conjunto de reservas disponível é reduzido no mesmo valor. O valor máximo permitido para esta flag é 50% do seu total deinnodb_buffer_pool_size
.Se especificar um valor superior a 50% do total
innodb_buffer_pool_size
, o Cloud SQL reduz o valor efetivo para 50% do tamanho disponível e regista uma mensagem de aviso para a instância.
Depois de configurar as flags, o comando pode ter um aspeto semelhante ao seguinte:
gcloud sql instances patch my-instance \ --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296
As flags para configurar o suporte de incorporações vetoriais no Cloud SQL para MySQL são flags estáticas. Depois de atualizar a instância com as flags, a instância é reiniciada automaticamente para que as alterações de configuração entrem em vigor.
Para mais informações sobre como configurar flags de base de dados para o MySQL, consulte o artigo Configure flags de base de dados.
Desative as incorporações vetoriais
Para desativar as incorporações vetoriais, defina a flag cloudsql_vector
como
off
.
Por exemplo:
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_vector=off
Substitua INSTANCE_NAME pelo nome da instância na qual está a desativar o suporte de incorporação vetorial.
A definição de cloudsql_vector
como off
impede a criação de novas colunas de incorporação de vetores e índices de pesquisa vetorial. Depois de configurar esta flag estática, a instância é reiniciada automaticamente para que a alteração de configuração entre em vigor.
Após o reinício da instância, o Cloud SQL para MySQL faz o seguinte:
- Remove todos os índices de pesquisa vetorial
TREE_SQ
persistentes do disco persistente. - Mantém as entradas da tabela do dicionário de dados para os índices de pesquisa vetorial que foram criados. No entanto, o Cloud SQL para MySQL não recria os índices e quaisquer consultas de pesquisa a estes índices devolvem um erro.
- Continua a armazenar as incorporações vetoriais nas tabelas de base. As incorporações de vetores permanecem acessíveis.
Se reativar posteriormente a flag cloudsql_vector
para a instância, o Cloud SQL tenta reconstruir os índices enquanto a instância é reiniciada com base nas entradas na tabela do dicionário de dados.
Ler configuração da réplica
Se a instância cumprir os critérios de versão de manutenção e ativação de flags, o Cloud SQL suporta totalmente as incorporações de vetores numa réplica de leitura.
Se criar uma réplica a partir de uma instância principal com suporte de incorporação de vetores ativado, a réplica de leitura herda as definições de suporte de incorporação de vetores da instância principal. Tem de ativar o suporte de incorporação de vetores individualmente nas instâncias de réplica de leitura já existentes.
Em termos de impacto no atraso de replicação, a criação e a manutenção de índices de pesquisa vetorial funcionam da mesma forma que os índices MySQL normais.
Os índices de pesquisa vetorial não são suportados em réplicas em cascata.
Exemplo: um índice de pesquisa vetorial de ANN e uma consulta
O exemplo seguinte explica os passos para criar um índice de pesquisa de vetores baseado em ANN e uma consulta no Cloud SQL.
Gere incorporações vetoriais. Pode criar incorporações vetoriais manualmente ou usar uma API de incorporação de texto à sua escolha. Para ver um exemplo que usa o Vertex AI, consulte o artigo Gere incorporações vetoriais com base em dados de linhas.
Crie uma tabela no Cloud SQL para MySQL que contenha uma coluna de incorporação de vetores com três dimensões.
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY );
Inserir uma incorporação vetorial na coluna.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Consolide as alterações.
commit;
Crie o índice do Vector Search. Se estiver a criar um índice
TREE_SQ
ouTREE_AH
, a tabela tem de ter, pelo menos, 1000 linhas.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Obtenha os vizinhos mais próximos.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Gere incorporações vetoriais com base nos dados das linhas
Pode gerar uma incorporação vetorial para os dados de uma determinada linha através de uma API de incorporação de texto, como a Vertex AI ou a OpenAI. Pode usar qualquer API de incorporação de texto com incorporações de vetores do Cloud SQL. No entanto, tem de usar a mesma API de incorporação de texto para a geração de vetores de strings de consulta. Não pode combinar diferentes APIs para dados de origem e vetorização de consultas.
Por exemplo, pode gerar uma incorporação vetorial a partir do Vertex AI:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("text-embedding-004")
embeddings = model.get_embeddings(["What is life?"])
for embedding in embeddings:
vector = embedding.values
print(f"Length of Embedding Vector: {len(vector)}")
return vector
if __name__ == "__main__":
text_embedding()
Armazene incorporações vetoriais
Esta secção fornece exemplos de declarações para armazenar incorporações vetoriais no Cloud SQL.
Crie uma nova tabela com uma coluna de incorporação vetorial
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Adicione uma coluna de incorporação vetorial a uma tabela existente
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Insira uma incorporação vetorial
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')
);
Insira várias incorporações vetoriais
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')),
('book title', string_to_vector('[4,5,6]')
);
Inserir ou atualizar uma incorporação de vetor
INSERT INTO books (
id,
title,
embedding
) VALUES (
1,
'book title',
string_to_vector('[1,2,3]')
)
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');
Atualize uma incorporação vetorial
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Elimine uma incorporação vetorial
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Trabalhe com índices de pesquisa vetorial
Por predefinição, pode realizar a pesquisa do vizinho mais próximo exata, que oferece a capacidade de memorização perfeita. Também pode adicionar um índice para usar a pesquisa ANN, que troca alguma capacidade de memorização por velocidade. Ao contrário dos índices típicos, depois de adicionar um índice aproximado, vê resultados diferentes para as consultas.
Recomendações
Esta secção fornece práticas recomendadas para trabalhar com índices de pesquisa vetorial. Cada carga de trabalho é diferente e pode ter de fazer ajustes em conformidade.
- Antes de criar um índice de pesquisa vetorial, tem de carregar dados para a tabela. A tabela base tem de ter, pelo menos, 1000 linhas. Estes requisitos aplicam-se apenas aos tipos de índice de pesquisa
TREE_SQ
eTREE_AH
. Se tiver mais pontos de dados disponíveis, terá uma melhor partição e formação do índice. - Monitorize a utilização de memória dos índices. Se a instância ficar sem memória,
não pode criar nem compilar índices. Para os índices existentes, depois de atingir o limite, o Cloud SQL escreve avisos no registo de erros do MySQL periodicamente. Pode ver a utilização de memória na tabela
information_schema.innodb_vector_indexes
. - Se a tabela base subjacente tiver sofrido alterações significativas de DML, recompile os índices de pesquisa vetorial. Para obter o tamanho inicial do índice no momento da compilação e o tamanho atual do índice, consulte a tabela
information_schema.innodb_vector_indexes
. - Geralmente, é aceitável deixar o número de partições a ser calculado internamente. Se tiver um exemplo de utilização em que quer especificar o número de partições, tem de ter pelo menos 100 pontos de dados por partição.
Tabela base só de leitura durante operações de índice de pesquisa vetorial
Durante todas as operações do índice de pesquisa vetorial (criar, alterar e eliminar), a tabela base é colocada num modo só de leitura. Durante estas operações, não são permitidos DMLs na tabela base.
Persistência, encerramento e impacto na manutenção
Apenas os índices de pesquisa vetorial que usam o tipo TREE_SQ
são persistentes no disco
num encerramento limpo de um encerramento de instância.
Os índices de pesquisa vetorial que usam os tipos TREE_AH
e BRUTE_FORCE
são apenas na memória.
Após um encerramento limpo de uma instância, o Cloud SQL recarrega os índices de pesquisa vetorial à medida que a instância é reiniciada. No entanto, após uma falha de sistema ou um encerramento não limpo, o Cloud SQL tem de reconstruir os índices de pesquisa vetorial. Por exemplo, sempre que a sua instância sofre uma falha de sistema e uma recuperação a partir da cópia de segurança e do restauro, da recuperação num determinado momento (PITR) ou da ativação pós-falha de alta disponibilidade (AD), o Cloud SQL recompila os seus índices de pesquisa vetorial. Para estes eventos, ocorre o seguinte:
- A reconstrução ocorre automaticamente em segundo plano.
- Durante a reconstrução, a tabela base está no modo de leitura.
- Se a reconstrução automática não conseguir bloquear a tabela dentro de um período de tempo limite específico, a reconstrução falha. Em alternativa, pode ter de reconstruir o índice manualmente.
O tempo necessário para uma reconstrução do índice pode aumentar o tempo necessário para um encerramento, o que também pode aumentar o tempo de manutenção e atualização necessário para uma instância.
Configure a atribuição de memória para índices de pesquisa vetorial
O Cloud SQL cria e mantém índices de pesquisa vetorial na memória. O tipo de índice TREE_SQ
persiste num encerramento limpo e é recarregado após o reinício da instância. Durante a execução, todos os índices de pesquisa vetorial têm de permanecer na memória.
Para se certificar de que o Cloud SQL tem memória suficiente disponível para manter todos os
índices de pesquisa vetorial na memória, configure a instância do Cloud SQL com
uma cloudsql_vector_max_mem_size
flag de base de dados. cloudsql_vector_max_mem_size
determina a quantidade de memória que a instância do Cloud SQL dedica aos índices de pesquisa vetorial. Quando configurar o valor da flag, tenha em atenção o seguinte:
- O valor predefinido e mínimo é de 1 GB. O limite superior é 50% do tamanho do conjunto de memória intermédia.
- Depois de definir esta flag, a instância é reiniciada automaticamente para que a alteração de configuração entre em vigor.
- Se a sua instância tiver usado toda a memória configurada, não pode criar nem alterar nenhum índice de pesquisa vetorial.
Para atualizar a memória alocada para os índices de pesquisa vetorial na instância, altere o valor da flag cloudsql_vector_max_mem_size
.
gcloud sql instances patch INSTANCE_NAME \ --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE
Substitua o seguinte:
- INSTANCE_NAME: o nome da instância na qual está a alterar a atribuição de memória.
- NEW_MEMORY_VALUE: a atribuição de memória atualizada, em bytes, para os seus índices de pesquisa vetorial.
Esta alteração reinicia automaticamente a instância para que a alteração possa entrar em vigor.
Calcule a memória necessária
A quantidade de memória que um índice requer depende do tipo de índice, do número de incorporações de vetores e da dimensionalidade das incorporações. Existem dois requisitos de memória a ter em conta:
- Memória de tempo de compilação: a memória necessária durante a compilação do índice.
- Memória do índice: a memória que o índice ocupa após a criação do índice.
Para um determinado índice, o respetivo tamanho do conjunto de dados é a memória necessária para ler todas as incorporações de vetores na memória. Uma vez que cada dimensão é representada por um número de vírgula flutuante que usa 4 bytes de memória, pode determinar o dataset_size da seguinte forma:
dataset_size = <num_embeddings> * (4 * <dimensions>)
Por exemplo, se tiver um milhão de incorporações de 768 dimensões, o seu dataset_size
é de 3 GB.
Com base no exemplo anterior, os requisitos de memória para os diferentes tipos de índice são os seguintes:
Tipo de índice | Memória de tempo de compilação | Memória de índice |
---|---|---|
TREE_SQ |
4 GB | 1 GB |
TREE_AH
|
3,5 GB | 3,5 GB |
BRUTE_FORCE
|
3 GB | 3 GB |
Se estiver a usar TREE_SQ
índices de pesquisa vetorial, também tem de
ter em conta a memória necessária para a persistência no momento da execução. Ao valor total de memória na sua configuração, adicione a quantidade de memória do índice usada pelo maior índice de pesquisa vetorial TREE_SQ
ativo.
Sempre que a tabela base onde as incorporações de vetores são armazenadas é submetida a operações de DML, o índice de pesquisa vetorial é atualizado em tempo real. Estas atualizações
alteram a pegada de memória do índice, que pode diminuir ou aumentar consoante
a operação DML. Pode monitorizar a ocupação de memória de um índice consultando a tabela information_schema.innodb_vector_indexes
. Para ver informações
sobre a monitorização do tamanho do seu índice de pesquisa vetorial, consulte o artigo Monitorize índices de pesquisa vetorial.
Crie um índice de pesquisa vetorial
A declaração para criar um índice de pesquisa vetorial usa a seguinte sintaxe:
CALL mysql.create_vector_index('INDEX_NAME', 'DB_NAME.TABLE_NAME', 'COLUMN_NAME', 'PARAMETERS' );
Por exemplo:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
O nome do índice que especificar tem de ser exclusivo na base de dados.
Parâmetros do índice de pesquisa vetorial
As funções mysql.create_vector_index
e mysql.alter_vector_index
suportam vários parâmetros que pode especificar com pares de valor-chave separados por vírgulas.
Todos os parâmetros da função mysql.create_vector_index
são opcionais. Se especificar uma string vazia ou NULL, os valores dos parâmetros predefinidos são configurados para o índice.
distance_measure
: os valores suportados são:L2_SQUARED
,COSINE
eDOT_PRODUCT
.L2_SQUARED
é a predefinição.num_neighbors
: o número de vizinhos a devolver de uma consulta ANN. Também pode substituir este parâmetro quando efetua a consulta de pesquisa. O valor predefinido é10
.index_type
: especifica o tipo de índice a criar. Os valores válidos são:BRUTE_FORCE
,TREE_SQ
eTREE_AH
.BRUTE_FORCE
é a predefinição para uma tabela com menos de 10 000 linhasTREE_SQ
é a predefinição para uma tabela com 10 000 ou mais linhas
Para especificar o tipo de índice
TREE_AH
ouTREE_SQ
, a dimensão da tabela base tem de ter mais de 1000 linhas.num_parititions
: especifica o número de clusters K-means a criar. Este parâmetro só é permitido se tiver configurado umindex_type
. Esta opção não se aplica aBRUTE_FORCE
. Se especificar o tipo de índiceTREE_SQ
ouTREE_AH
, o tamanho da tabela base tem de ser superior ou igual a num_partitions * 100.
Altere um índice de pesquisa vetorial
CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');
A função alter_vector_index
é usada explicitamente para reconstruir um índice de pesquisa vetorial. Para usar esta função, o índice tem de existir. Pode querer
reconstruir um índice para os seguintes exemplos de utilização:
- Para reconstruir o índice com opções diferentes. Por exemplo, pode querer usar um tipo de índice diferente ou uma medida de distância diferente.
- Para reconstruir o índice porque a tabela base sofreu alterações significativas de DML. Por exemplo, tem de voltar a preparar o índice de pesquisa vetorial com base nos dados da tabela base.
Todos os parâmetros para a recriação do índice são idênticos aos disponíveis para a criação do índice e também são opcionais. Se especificar uma string vazia ou NULL quando recompilar o índice, o índice é recompilado com base nos parâmetros especificados no momento da criação do índice. Se não forem fornecidos parâmetros no momento da criação do índice, são usados os valores dos parâmetros predefinidos.
O índice de pesquisa vetorial existente está disponível durante a operação.alter_vector_index
Pode continuar a executar consultas de pesquisa no índice.
Elimine um índice do Vector Search
Não pode executar uma operação DDL numa tabela que tenha um índice de pesquisa vetorial. Antes de realizar a operação DDL na tabela, tem de eliminar o índice de pesquisa de vetores.
CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');
Consultar incorporações de vetores
Esta secção apresenta exemplos das diferentes formas de consultar incorporações de vetores.
Veja as incorporações vetoriais
SELECT vector_to_string(embedding) FROM books;
Obtenha a pesquisa exata de um vizinho para uma incorporação vetorial
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Obtenha a pesquisa de vizinhos aproximada para uma incorporação vetorial
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
A execução de uma pesquisa de RNA suporta dois parâmetros. Ambos são opcionais.
- num_partitions: especifique o número de partições a sondar para uma pesquisa de vetores de ANN. Se não especificar o número de partições, a pesquisa usa um valor gerado com base no tamanho da tabela, no número de partições no índice de pesquisa vetorial e noutros fatores.
- num_neighbors: especifique o número de vizinhos a devolver. Este valor substitui o valor definido no momento da criação do índice de pesquisa vetorial.
Filtre incorporações de vetores
Use colunas adicionais como predicados para otimizar a filtragem dos resultados da consulta de incorporação de vetores. Por exemplo, se adicionar uma coluna printyear
, pode adicionar um valor de ano específico como filtro à sua consulta.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Consultar a distância de uma incorporação de vetor
Esta secção apresenta exemplos de funções de distância vetorial que estão disponíveis para a pesquisa KNN.
Obtenha a distância do cosseno
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtenha a distância do produto escalar
SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtenha a distância L2 ao quadrado
SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtenha linhas dentro de uma determinada distância
SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;
Pode combinar com ORDER BY
e LIMIT
SELECT id, vector_to_string(embedding),
l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;
Monitorize os índices de pesquisa vetorial
Para obter informações em tempo real sobre todos os índices de pesquisa vetorial na instância, use a tabela information_schema.innodb_vector_indexes
.
Para ver a tabela, execute o seguinte comando:
SELECT * FROM information_schema.innodb_vector_indexes;
O resultado de exemplo pode ter o seguinte aspeto:
*************************** 1. row *************************** INDEX_NAME: test.t4_index TABLE_NAME: test.t4_bf INDEX_TYPE: BRUTE_FORCE DIST_MEASURE: SquaredL2Distance STATUS: Ready STATE: INDEX_READY_TO_USE PARTITIONS: 0 SEARCH_PARTITIONS: 0 INITIAL_SIZE: 40000 CURRENT_SIZE: 40000 QUERIES: 0 MUTATIONS: 0 INDEX_MEMORY: 160000 DATASET_MEMORY: 0
Na tabela information_schema.innodb_vector_indexes
, pode ver o seguinte:
- As opções que são potencialmente geradas. Por outras palavras,
num_partitions
ou o número de partições a analisar para uma consulta. - As colunas
STATE
eSTATUS
indicam o estado atual do índice. Durante a fase de criação, a coluna de estado fornece informações sobre o progresso do índice de pesquisa vetorial na fase de criação. - A coluna
INITIAL_SIZE
indica o tamanho da tabela durante a criação do índice. Pode comparar este tamanho comCURRENT_SIZE
para ter uma ideia da variação do índice desde a sua criação devido a DMLs na tabela base. - As colunas
QUERIES
eMUTATIONS
fornecem estatísticas em tempo real sobre a ocupação do índice. - As colunas
INDEX_MEMORY
eDATASET_MEMORY
fornecem informações sobre o consumo de memória do índice.INDEX_MEMORY
indica a quantidade de memória consumida pelo índice eDATASET_MEMORY
indica a quantidade de memória adicional consumida durante o tempo de compilação.
Para obter uma lista dos índices vetoriais de pesquisa criados na instância, pode ver a tabela do dicionário de dados mysql.vector_indexes
.
Para ver a tabela, execute o seguinte comando:
SELECT * FROM mysql.vector_indexes;
Exemplo de saída:
*************************** 1. row *************************** index_name: test.index1 table_name: test.t1 column_name: j index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED status: ACTIVE create_time: 2024-04-08 22:46:21 update_time: 2024-04-08 22:46:21 1 row in set (0.00 sec)
Limitações
- Só pode existir uma coluna de incorporação vetorial por tabela.
- Só pode existir um índice de pesquisa vetorial por tabela.
- Uma incorporação vetorial pode ter até 16 000 dimensões.
- A partição ao nível da tabela do InnoDB em tabelas com colunas de incorporação de vetores não é suportada.
- Se a instância for reiniciada a partir de um encerramento não limpo, o Cloud SQL recompila automaticamente o índice de pesquisa vetorial.
- Enquanto o índice de pesquisa vetorial está a ser reconstruído, a tabela base é só de leitura.
- Se o Cloud SQL não conseguir adquirir um bloqueio na tabela dentro do tempo especificado, a reconstrução automática do índice pode falhar.
- Se a recriação automática do índice falhar, tem de recriar o índice manualmente.
- Para adicionar uma coluna de incorporação vetorial, a tabela tem de ter uma chave primária.
O Cloud SQL não suporta chaves primárias do tipo
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
nem tipos de dados espaciais. As chaves primárias compostas não podem incluir nenhum destes tipos. - Se existir um índice de pesquisa vetorial numa tabela, as operações DDL não são permitidas. O índice de pesquisa vetorial tem de ser eliminado antes de realizar operações DDL na tabela base.
- As incorporações de vetores não são suportadas em tabelas que não sejam InnoDB nem em tabelas temporárias.
- A coluna de incorporação de vetores não pode ser uma coluna gerada.
- O predicado
NEAREST..TO
pode ser combinado com outros predicados "escalares" usandoAND
ouOR
. Os predicados escalares na tabela são avaliados depois de os predicados vetoriais serem aplicados. - O predicado
NEAREST..TO
só é suportado numa declaraçãoSELECT
. Outras declarações DML não suportamNEAREST..TO
. - As subconsultas não são suportadas com
NEAREST..TO
. Não é possível adicionar uma restrição à chave primária da tabela base se existir um índice de pesquisa vetorial. A pré-filtragem só é viável através de funções de distância e da utilização de
ORDER BY
comLIMIT
.Por exemplo, se criar a seguinte tabela:
CREATE TABLE books ( bookid INT PRIMARY KEY, title VARCHAR(1000), author VARCHAR(100), printyear int, country VARCHAR(100), bvector VECTOR(1536) USING VARBINARY //bvector is embedding vector of book's plot,genre,reviews etc );
Em seguida, pode usar a seguinte consulta para conseguir a pré-filtragem.
//select query to obtain books by specific author and having similar plot-genre-reviews SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist FROM books where author='cloudsql' ORDER BY dist LIMIT 10
A pós-filtragem é suportada com as funções
NEAREST..TO
e de distância.
Resolver problemas
Em caso de falha, o índice é reconstruído automaticamente. Quando uma reconstrução está em curso, existem duas restrições:
- Durante a criação do índice, a tabela base está no modo de leitura.
- Enquanto o índice está a ser recriado, as consultas de ANN em relação aos índices existentes falham.