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
ouvector_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âmetrodistance_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 eminformation_schema.innodb_vector_indexes
. Recomendamos que ajustenum_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 pesquisaapprox_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.
- 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.
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);
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 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;
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?
- Leia a vista geral sobre a pesquisa vetorial no Cloud SQL.
- Saiba como ativar e desativar as incorporações vetoriais na sua instância.
- Saiba como gerar incorporações vetoriais.
- Saiba como criar índices vetoriais.
- Saiba como fazer pesquisas em incorporações vetoriais.