Pesquise e filtre com incorporações vetoriais

Esta página descreve as diferentes formas de consultar incorporações vetoriais. Para ver uma vista geral das pesquisas de similaridade ANN e KNN, consulte as pesquisas de vetores.

Pesquise vizinhos mais próximos aproximados (ANN)

Para realizar uma pesquisa ANN, use a função approx_distance numa cláusula SELECT e ORDER BY. Tem de usar uma cláusula LIMIT numa pesquisa de ANN. Também pode obter o valor da distância colocando approx_distance numa lista SELECT.

Use a seguinte sintaxe para consultas ANN:

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
  approx_distance(
    embedding_name,
    string_to_vector('[1,2,3]'),
    'distance_measure=cosine,num_leaves_to_search=3')
    dist
FROM table
ORDER BY dist
LIMIT limit_value;

A função approx_distance usa as seguintes opções:

  • embedding: usa o nome da coluna de incorporação de vetores da tabela base.
  • string_to_vector ou vector_to_string: converte um vetor numa string e uma string num vetor para tornar o vetor legível por humanos.
  • distance_measure: especifique a medida de distância a usar para uma pesquisa de similaridade de vetores. Este valor tem de corresponder ao valor que definiu no parâmetro distance_measure quando criou o índice. Este parâmetro é obrigatório. Os valores possíveis para este parâmetro são:
    • COSINE
    • L2_SQUARED
    • DOT_PRODUCT
  • num_leaves_to_search: opcional. Especifica o número de folhas a analisar para uma pesquisa de similaridade de vetores ANN. Se não especificar o número de folhas, o Cloud SQL usa um valor gerado com base no tamanho da tabela, no número de folhas no índice vetorial e noutros fatores. Pode ver este valor em information_schema.innodb_vector_indexes. Recomendamos que ajuste num_leaves_to_search para alcançar o melhor equilíbrio entre a qualidade da pesquisa e o desempenho para a sua carga de trabalho específica. Se for aumentado, afeta o desempenho, mas melhora a capacidade de memorização.

O exemplo seguinte mostra como usar approx_distance para encontrar as K linhas mais próximas usando a medida de distância l2_squared e ordenar os resultados por distância.

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
                         'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
    approx_distance
        (embedding, string_to_vector('[1,2,3]'),
         'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;

Filtre resultados de consultas approx_distance

Pode usar a função approx_distance com condições WHERE que filtram os resultados da consulta com um predicado não vetorial para realizar a filtragem posterior. A função approx_distance é avaliada antes de aplicar o filtro, o que significa que o número de resultados devolvidos é não determinístico.

Por exemplo, para a seguinte consulta:

SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;

A função approx_distance devolve os 11 vizinhos mais próximos do vetor de consulta, independentemente do preço. Na filtragem posterior, são selecionados os produtos com um preço inferior a 100. É possível que todos os vizinhos mais próximos tenham um preço inferior a 100, pelo que existem 11 resultados para a consulta. Em alternativa, se nenhum dos vizinhos mais próximos tiver um preço inferior a 100, são devolvidas 0 linhas.

Se prevê que o seu filtro na condição WHERE é muito seletivo, uma pesquisa exata (KNN) pode ser uma melhor opção para garantir que é devolvido um número suficiente de linhas.

Verifique o estado de alternativa nas pesquisas de ANN

Existem determinados casos em que uma pesquisa ANN recorre a uma pesquisa KNN. Estes incluem o seguinte:

  • Não existe um índice vetorial na tabela base.
  • Existe um índice vetorial na tabela base, mas usa uma medida de distância diferente do parâmetro distance_measure nas opções de pesquisa approx_distance.
  • O índice vetorial está danificado ou invisível para a transação atual.
  • O valor LIMIT especificado é superior a 10 000.
  • Não foi especificado nenhum LIMIT.
  • A consulta atual envolve mais do que uma chamada approx_distance na mesma tabela base.
  • O otimizador calcula que é mais eficiente usar o KNN.

Todos estes casos enviam um aviso ao cliente a indicar que foi feita uma pesquisa exata e o motivo.

Use o seguinte comando no cliente mysql para ver o estado de alternativa:

SHOW global status LIKE '%cloudsql_vector_knn_fallback%';

Se quiser usar a ANN e esta estiver a recorrer à KNN, a consulta pode ser executada mais lentamente. Deve encontrar o motivo pelo qual está a usar a alternativa e avaliar se deve fazer alterações para que seja usada a ANN.

Exemplo: crie um índice vetorial e execute uma consulta ANN

O exemplo seguinte explica os passos para criar um índice vetorial e executar uma consulta ANN 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 nos dados das linhas.
  2. Crie uma tabela no Cloud SQL 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 vetorial com a função L2_squared para medir a distância.

    CREATE
      VECTOR INDEX vectorIndex
    ON dbname.books(embeddings)
    USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
    
  6. Use a seguinte sintaxe para fazer uma pesquisa de ANN com um LIMIT de 4 resultados da pesquisa:

    SELECT title
    FROM books
    ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
    LIMIT 4;
    
    SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist
    FROM books
    ORDER BY dist
    LIMIT 4;
    

Pesquisa dos K vizinhos mais próximos (KNN)

Para realizar uma pesquisa de K-vizinhos mais próximos, use a função vector_distance com uma opção de medida de distância e uma função de conversão de vetores (string_to_vector ou vector_to_string) numa declaração SELECT. Use a seguinte sintaxe:

SELECT vector_distance(string_to_vector('[1,2,3]'),
                      string_to_vector('[1,2,3]'),
                      'Distance_Measure=dot_product');

Substitua os valores [1,2,3] pelos valores de incorporação dos seus dados.

O exemplo seguinte mostra como usar esta consulta com a função cosine_distance e a função de conversão de vetores string_to_vector.

SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;

Obtenha a distância de cosseno numa consulta KNN

Use a função Cloud SQL cosine_distance para calcular a distância usando o 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 num pedido KNN

Use a função dot_product do Cloud SQL para calcular a distância através do produto escalar.

SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;

Obtenha a distância ao quadrado L2 numa consulta KNN

Use a função Cloud SQL l2_squared_distance para calcular a distância usando L2 ao quadrado.

SELECT
  l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
    AS distance
FROM books
WHERE id = 10;

O que se segue?