Questa pagina descrive i diversi modi in cui puoi eseguire query sugli embedding vettoriali. Per una panoramica delle ricerche di somiglianza ANN e KNN, consulta le ricerche vettoriali.
Cerca i vicini più prossimi approssimativi (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
SELECT
elenco.
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 dell'embedding del vettore della tabella di base.string_to_vector
ovector_to_string
: converte un vettore in una stringa e una stringa in un vettore per renderlo leggibile.distance_measure
: specifica la misura della distanza da utilizzare per una ricerca di somiglianza di vettori. 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 esaminare per una ricerca di somiglianza vettoriale ANN. Se non specifichi il numero di entità, Cloud SQL utilizza un valore generato in base alle dimensioni della tabella, al numero di entità nell'indice di vettore e ad altri fattori. Puoi visualizzare questo valore ininformation_schema.innodb_vector_indexes
. Ti consigliamo di perfezionarenum_leaves_to_search
per trovare 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 della 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 di approssimazione della distanza
Puoi utilizzare la funzione approx_distance
con condizioni WHERE
che filtrano
i risultati della query con un predicato non vettoriale per eseguire il post-filtro. La funzioneapprox_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ù vicini al vettore
della query, indipendentemente dal prezzo. Nel post-filtro, vengono selezionati i prodotti con un prezzo inferiore a 100. È possibile che tutti i risultati vicini abbiano un prezzo inferiore a 100, quindi ci sono 11 risultati per la query. In alternativa, se nessuno
tra i vicini più vicini ha un prezzo inferiore a 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 assicurarti che venga restituito un numero sufficiente di righe.
Controllare lo stato di riserva nelle ricerche ANN
In alcuni casi, una ricerca con reti neurali artificiali passa a una ricerca KNN. tra cui:
- Non è presente alcun indice vettoriale nella tabella di base.
- Nella tabella di base è presente un indice di vettori, ma utilizza una misura della distanza diversa da quella del parametro
distance_measure
nelle opzioni di ricercaapprox_distance
. - L'indice del vettore è danneggiato o invisibile alla transazione corrente.
- Il valore
LIMIT
specificato è maggiore di 10000. - Non è stato specificato
LIMIT
. - La query corrente prevede più di una chiamata
approx_distance
nella stessa tabella di base. - L'ottimizzatore calcola che è più efficiente utilizzare KNN.
In tutti questi casi, viene inviato un avviso al client che indica che è stata eseguita la ricerca esatta e il motivo.
Utilizza il seguente comando nel client mysql per visualizzare lo stato di riserva:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Se vuoi utilizzare l'ANN e viene eseguito il fallback alla KNN, la query potrebbe essere eseguita più lentamente. Devi trovare il motivo per cui viene eseguito il fallback e valutare se apportare modifiche in modo da utilizzare l'ANN.
Esempio: crea un indice vettoriale ed esegui una query ANN
La procedura dettagliata di esempio riportata di seguito illustra i passaggi per creare un indice di vettori ed eseguire una query ANN in Cloud SQL.
- Genera embedding vettoriali. Puoi creare incorporamenti di vettori manualmente o utilizzare un'API di incorporamento del testo a tua scelta. Per un esempio che utilizza Vertex AI, consulta Generare incorporamenti vettoriali in base ai dati di riga.
Crea una tabella in Cloud SQL contenente una colonna di incorporamento vettoriale con tre dimensioni.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
Inserisci un embedding vettore nella colonna.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
Esegui il commit delle modifiche.
commit;
Crea l'indice del vettore 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 del vicino più prossimo K, utilizza la
funzione vector_distance
con un'opzione di misurazione della distanza e una funzione di conversione del vettore
(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 dati.
L'esempio seguente 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 di coseno in una query KNN
Utilizza la funzione cosine_distance
di Cloud SQL per calcolare la distanza utilizzando la funzione cosinussoide.
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 l2_squared_distance
di Cloud SQL 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 sulla ricerca di vettori su Cloud SQL.
- Scopri come attivare e disattivare gli embedding vettoriali nella tua istanza.
- Scopri come generare embedding vettoriali.
- Scopri come creare indici di vettori.
- Scopri come eseguire ricerche sui vector embedding.