Nesta página, descrevemos as diferentes maneiras de consultar embeddings de vetor. Para uma visão geral das pesquisas de similaridade de ANN e KNN, consulte pesquisas de vetor.
Pesquisar vizinhos mais próximos aproximados (ANN)
Para realizar uma pesquisa de ANN, 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. Você também pode 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.distance_measure
: especifique a medida de distância a ser usada em uma pesquisa de similaridade de vetor. Esse valor precisa corresponder ao que você definiu 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 usará um valor gerado com base no tamanho da tabela, no número de folhas no índice de vetor e em outros fatores. Você pode conferir esse valor eminformation_schema.innodb_vector_indexes
. Recomendamos que você ajustenum_leaves_to_search
para alcançar o melhor equilíbrio entre qualidade e desempenho da pesquisa para sua carga de trabalho específica. Se for aumentado, ele vai afetar o desempenho, mas melhorar a capacidade de recordaçã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 approx_distance
É possível usar a função approx_distance
com condições WHERE
que filtram resultados de consultas com um predicado não vetorial para realizar a 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, independente do preço. No pós-filtragem, os produtos com um preço
< 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. Se nenhum dos vizinhos mais próximos tiver um preço < 100, zero linhas serão retornadas.
Se você prevê que seu 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 substituição nas pesquisas da ANN
Em alguns casos, uma pesquisa de ANN volta para uma pesquisa de KNN. Isso inclui o seguinte:
- Não há um índice de vetor na tabela de base.
- Há um índice de vetor na tabela de 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. - Nenhum
LIMIT
foi especificado. - A consulta atual envolve mais de uma chamada
approx_distance
na mesma tabela de base. - O otimizador calcula que é mais eficiente usar o KNN.
Em todos esses casos, um aviso é enviado ao cliente indicando que a pesquisa exata foi realizada e o motivo.
Use o seguinte comando no cliente mysql para conferir o status de failback:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Se você quiser usar a ANN e ela estiver voltando para a KNN, a consulta poderá ser executada mais lentamente. Descubra o motivo da substituição e avalie se é necessário fazer mudanças para que a ANN seja usada.
Exemplo: criar um índice de vetor e executar uma consulta de 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 seguinte sintaxe para realizar uma pesquisa de ANN com um
LIMIT
de quatro 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;
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 de 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 de 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 de L2 ao quadrado em uma consulta de 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 vetorial 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 fazer pesquisas em embeddings de vetores.