Trabalhe com incorporações vetoriais (pré-visualização)

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.

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.

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.

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 índices TREE_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 como on 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 de innodb_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.

  1. 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.

  2. 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
    );
    
  3. Inserir uma incorporação vetorial na coluna.

    INSERT INTO books VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
    );
    
  4. Consolide as alterações.

    commit;
    
  5. Crie o índice do Vector Search. Se estiver a criar um índice TREE_SQ ou TREE_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'
                                   );
    
  6. 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 e TREE_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 e DOT_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 e TREE_AH.

    • BRUTE_FORCE é a predefinição para uma tabela com menos de 10 000 linhas
    • TREE_SQ é a predefinição para uma tabela com 10 000 ou mais linhas

    Para especificar o tipo de índice TREE_AH ou TREE_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 um index_type. Esta opção não se aplica a BRUTE_FORCE. Se especificar o tipo de índice TREE_SQ ou TREE_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 e STATUS 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 com CURRENT_SIZE para ter uma ideia da variação do índice desde a sua criação devido a DMLs na tabela base.
  • As colunas QUERIES e MUTATIONS fornecem estatísticas em tempo real sobre a ocupação do índice.
  • As colunas INDEX_MEMORY e DATASET_MEMORY fornecem informações sobre o consumo de memória do índice. INDEX_MEMORY indica a quantidade de memória consumida pelo índice e DATASET_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

  1. Só pode existir uma coluna de incorporação vetorial por tabela.
  2. Só pode existir um índice de pesquisa vetorial por tabela.
  3. Uma incorporação vetorial pode ter até 16 000 dimensões.
  4. A partição ao nível da tabela do InnoDB em tabelas com colunas de incorporação de vetores não é suportada.
  5. Se a instância for reiniciada a partir de um encerramento não limpo, o Cloud SQL recompila automaticamente o índice de pesquisa vetorial.
    1. Enquanto o índice de pesquisa vetorial está a ser reconstruído, a tabela base é só de leitura.
    2. 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.
    3. Se a recriação automática do índice falhar, tem de recriar o índice manualmente.
  6. 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.
  7. 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.
  8. As incorporações de vetores não são suportadas em tabelas que não sejam InnoDB nem em tabelas temporárias.
  9. A coluna de incorporação de vetores não pode ser uma coluna gerada.
  10. O predicado NEAREST..TO pode ser combinado com outros predicados "escalares" usando AND ou OR. Os predicados escalares na tabela são avaliados depois de os predicados vetoriais serem aplicados.
  11. O predicado NEAREST..TO só é suportado numa declaração SELECT. Outras declarações DML não suportam NEAREST..TO.
  12. 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.
  13. A pré-filtragem só é viável através de funções de distância e da utilização de ORDER BY com LIMIT.

    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:

  1. Durante a criação do índice, a tabela base está no modo de leitura.
  2. Enquanto o índice está a ser recriado, as consultas de ANN em relação aos índices existentes falham.

O que se segue?