Cercare e filtrare con gli embedding vettoriali

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 o vector_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 parametro distance_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 in information_schema.innodb_vector_indexes. Ti consigliamo di perfezionare num_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 ricerca approx_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.

  1. 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.
  2. 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);
    
  3. Inserisci un embedding vettore nella colonna.

    INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
    
  4. Esegui il commit delle modifiche.

    commit;
    
  5. 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;
    
  6. 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