Esta página descreve as diferentes maneiras de consultar embeddings de vetor. Para uma visão geral das pesquisas de similaridade ANN e KNN, consulte Pesquisas de vetor.
Pesquisar vizinhos mais próximos aproximados (ANN)
Para realizar uma pesquisa de RNN, use a
função approx_distance
em uma cláusula SELECT
e ORDER BY
. É necessário usar uma cláusula LIMIT
em uma pesquisa de
ANN. Também é possível receber o valor da distância colocando approx_distance
em uma
lista SELECT
.
Use a seguinte sintaxe para consultas de 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 embedding de vetor da tabela de base.string_to_vector
ouvector_to_string
: converte um vetor em uma string e uma string em um vetor para tornar o vetor legível por humanos.distance_measure
: especifica a medida de distância a ser usada para uma pesquisa de semelhança de vetor. Esse valor precisa corresponder ao valor definido no parâmetrodistance_measure
ao criar o índice. Esse parâmetro é obrigatório. Os valores possíveis para esse parâmetro são:COSINE
L2_SQUARED
DOT_PRODUCT
num_leaves_to_search
: opcional. Especifica o número de folhas a serem sondadas para uma pesquisa de similaridade de vetor ANN. Se você não especificar o número de folhas, o Cloud SQL vai usar um valor gerado com base no tamanho da tabela, no número de folhas no índice de vetor e em outros fatores. Esse valor está eminformation_schema.innodb_vector_indexes
. Recomendamos ajustarnum_leaves_to_search
para alcançar o melhor equilíbrio entre a qualidade da pesquisa e o desempenho da sua carga de trabalho específica. Se for aumentado, isso afeta o desempenho, mas melhora a recuperação.
O exemplo a seguir 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;
Filtrar resultados de consultas de approx_distance
É possível 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 pós-filtragem. A
função approx_distance
é avaliada antes da aplicação do filtro, o que significa
que o número de resultados retornados 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
retorna os 11 vizinhos mais próximos do vetor de consulta, independentemente do preço. Na filtragem pós-postagem, os produtos com preço
menor que 100 são selecionados. É possível que todos os vizinhos mais próximos tenham um
preço < 100, então há 11 resultados para a consulta. Como alternativa, se nenhum
dos vizinhos mais próximos tiver um preço menor que 100, zero linhas serão retornadas.
Se você prever que o filtro na condição WHERE
é muito seletivo, uma pesquisa exata (KNN) pode ser uma opção melhor para garantir que um número suficiente de linhas seja retornado.
Verificar o status de fallback nas pesquisas de ANNA
Há casos em que uma pesquisa ANN é substituída por uma pesquisa KNN. Isso inclui o seguinte:
- Não há um índice de vetor na tabela base.
- Há um índice de vetor na tabela base, mas ele usa uma medida de distância diferente do parâmetro
distance_measure
nas opções de pesquisaapprox_distance
. - O índice vetorial está corrompido ou invisível para a transação atual.
- O
LIMIT
especificado é maior que 10.000. LIMIT
não foi especificado.- A consulta atual envolve mais de uma chamada
approx_distance
na mesma tabela de base. - O otimizador calcula que é mais eficiente usar a KNN.
Todos esses casos enviam um aviso ao cliente indicando que a pesquisa exata foi realizada e o motivo.
Use o seguinte comando no cliente mysql para conferir o status de fallback:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Se você quiser usar a ANN e ela voltar para a KNN, a consulta poderá ser executada mais lentamente. Encontre o motivo da falha e avalie se é necessário fazer mudanças para que a ANN seja usada.
Exemplo: criar um índice de vetor e executar uma consulta ANN
O tutorial de exemplo a seguir apresenta etapas para criar um índice de vetor e executar uma consulta de ANN no Cloud SQL.
- Gerar embeddings de vetor. É possível criar embeddings de vetor manualmente ou usar uma API de embedding de texto de sua preferência. Para conferir um exemplo que usa a Vertex AI, consulte Gerar embeddings de vetor com base em dados de linha.
Crie uma tabela no Cloud SQL que contenha uma coluna de embeddings de vetor com três dimensões.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
Insira um embedding de vetor na coluna.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
Faça commit das alterações.
commit;
Crie o índice de vetores usando 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 sintaxe a seguir para realizar uma pesquisa ANN com um
LIMIT
de quatro resultados de 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;
Pesquisar vizinhos k-mais próximos (KNN)
Para realizar uma pesquisa de vizinho mais próximo, use a
função vector_distance
com uma opção de medida de distância e uma função de conversão de vetor
(string_to_vector
ou vector_to_string
) em uma instruçã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 a seguir mostra como usar essa consulta com a função cosine_distance
e a função de conversão de vetor string_to_vector
.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Encontrar a distância do cosseno em uma consulta KNN
Use a função cosine_distance
do Cloud SQL
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;
Encontrar a distância do produto escalar em uma consulta KNN
Use a função dot_product
do Cloud SQL para calcular a distância usando o produto escalar.
SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Encontrar a distância L2 ao quadrado em uma consulta KNN
Use a função l2_squared_distance
do Cloud SQL 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;
A seguir
- Leia a visão geral sobre a pesquisa de vetor no Cloud SQL.
- Saiba como ativar e desativar embeddings de vetores na sua instância.
- Saiba como gerar embeddings de vetor.
- Saiba como criar índices de vetor.
- Saiba como realizar pesquisas em embeddings vetoriais.