Questa pagina descrive i diversi modi in cui puoi eseguire query sugli embedding vettoriali. Per una panoramica delle ricerche di similarità ANN e KNN, consulta Ricerche vettoriali.
Cercare i vicini più prossimi approssimati (ANN)
Per eseguire una ricerca ANN, utilizza la
funzione approx_distance
in una clausola SELECT
e ORDER BY
. Devi utilizzare una clausola LIMIT
in una ricerca ANN. Puoi anche ottenere il valore della distanza inserendo approx_distance
in un elenco SELECT
.
Utilizza la seguente sintassi per le query 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;
La funzione approx_distance
utilizza le seguenti opzioni:
embedding
: utilizza il nome della colonna del vettore di embedding della tabella di base.string_to_vector
ovector_to_string
: converte un vettore in una stringa e una stringa in un vettore per rendere il vettore leggibile.distance_measure
: specifica la misura di distanza da utilizzare per una ricerca di similarità vettoriale. Questo valore deve corrispondere a quello impostato nel parametrodistance_measure
quando hai creato l'indice. Questo parametro è obbligatorio. I valori possibili per questo parametro sono:COSINE
L2_SQUARED
DOT_PRODUCT
num_leaves_to_search
: facoltativo. Specifica il numero di foglie da analizzare per una ricerca di somiglianze vettoriali ANN. Se non specifichi il numero di foglie, Cloud SQL utilizza un valore generato in base alle dimensioni della tabella, al numero di foglie nell'indice vettoriale e ad altri fattori. Puoi visualizzare questo valore ininformation_schema.innodb_vector_indexes
. Ti consigliamo di ottimizzarenum_leaves_to_search
per ottenere il miglior equilibrio tra qualità e rendimento della ricerca per il tuo carico di lavoro specifico. Se aumentato, influisce sulle prestazioni, ma migliora il richiamo.
L'esempio seguente mostra come utilizzare approx_distance
per trovare le prime K righe più vicine utilizzando la misura di distanza l2_squared
e ordinare i risultati in base alla distanza.
# 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;
Filtrare i risultati delle query approx_distance
Puoi utilizzare la funzione approx_distance
con le condizioni WHERE
che filtrano
i risultati della query con un predicato non vettoriale per eseguire il post-filtraggio. La funzione
approx_distance
viene valutata prima dell'applicazione del filtro, il che significa
che il numero di risultati restituiti è non deterministico.
Ad esempio, per la seguente query:
SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;
La funzione approx_distance
restituisce gli 11 vicini più prossimi al vettore di query
indipendentemente dal prezzo. Nel filtro dei post, vengono selezionati i prodotti con un prezzo
< 100. È possibile che tutti i vicini più prossimi abbiano un prezzo < 100, quindi la query restituisce 11 risultati. In alternativa, se nessuno
dei vicini più prossimi ha un prezzo < 100, vengono restituite 0 righe.
Se prevedi che il filtro nella condizione WHERE
sia molto selettivo, una
ricerca esatta (KNN) potrebbe essere un'opzione migliore per garantire che venga restituito un numero sufficiente
di righe.
Controllare lo stato di fallback nelle ricerche ANN
In alcuni casi, una ricerca ANN viene eseguita come ricerca KNN. Questi includono:
- Non è presente alcun indice vettoriale nella tabella di base.
- Esiste un indice vettoriale nella tabella di base, ma utilizza una misura di distanza diversa dal parametro
distance_measure
nelle opzioni di ricercaapprox_distance
. - L'indice vettoriale è danneggiato o invisibile alla transazione corrente.
- Il valore di
LIMIT
specificato è maggiore di 10.000. - Non è specificato alcun
LIMIT
. - La query corrente prevede più di una chiamata
approx_distance
sulla stessa tabella di base. - L'ottimizzatore calcola che è più efficiente utilizzare KNN.
In tutti questi casi, viene visualizzato un avviso per il cliente che indica che è stata eseguita la ricerca esatta e il motivo.
Utilizza il seguente comando nel client mysql per visualizzare lo stato di fallback:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Se vuoi utilizzare ANN e viene eseguito il fallback a KNN, la query potrebbe essere eseguita più lentamente. Devi trovare il motivo per cui viene utilizzato il fallback e valutare se apportare modifiche in modo che venga utilizzata la rete neurale artificiale.
Esempio: crea un indice vettoriale ed esegui una query ANN
La seguente procedura dettagliata fornisce i passaggi per creare un indice vettoriale ed eseguire una query ANN in Cloud SQL.
- Genera vector embedding. Puoi creare incorporamenti vettoriali manualmente o utilizzare un'API di incorporamento di testo a tua scelta. Per un esempio che utilizza Vertex AI, consulta Generare incorporamenti vettoriali in base ai dati delle righe.
Crea una tabella in Cloud SQL contenente una colonna di vector embedding con tre dimensioni.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
Inserisci un embedding vettoriale nella colonna.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
Esegui il commit delle modifiche.
commit;
Crea l'indice vettoriale utilizzando la funzione
L2_squared
per misurare la distanza.CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
Utilizza la seguente sintassi per eseguire una ricerca ANN con un
LIMIT
di 4 risultati di ricerca: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;
Ricerca K-Nearest Neighbor (KNN)
Per eseguire una ricerca dei K vicini più prossimi, utilizza la
funzione vector_distance
con un'opzione di misurazione della distanza e una funzione di conversione dei vettori
(string_to_vector
o vector_to_string
) in un'istruzione SELECT
. Utilizza la seguente sintassi:
SELECT vector_distance(string_to_vector('[1,2,3]'),
string_to_vector('[1,2,3]'),
'Distance_Measure=dot_product');
Sostituisci i valori [1,2,3] con i valori di incorporamento dei tuoi dati.
Il seguente esempio mostra come utilizzare questa query con la funzione cosine_distance
e la funzione di conversione del vettore string_to_vector
.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Ottenere la distanza coseno in una query KNN
Utilizza la funzione Cloud SQL
cosine_distance
per calcolare la distanza utilizzando il coseno.
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Ottenere la distanza prodotto scalare in una query KNN
Utilizza la
funzione dot_product
di Cloud SQL per calcolare la distanza utilizzando il prodotto scalare.
SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Ottenere la distanza al quadrato L2 in una query KNN
Utilizza la funzione Cloud SQL
l2_squared_distance
per calcolare la distanza utilizzando L2 al quadrato.
SELECT
l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance
FROM books
WHERE id = 10;
Passaggi successivi
- Leggi la panoramica della ricerca vettoriale su Cloud SQL.
- Scopri come attivare e disattivare i vector embedding nella tua istanza.
- Scopri come generare vector embedding.
- Scopri come creare indici vettoriali.
- Scopri come eseguire ricerche sugli embedding vettoriali.