Questa pagina descrive come vengono implementate le ricerche vettoriali nelle istanze Cloud SQL per MySQL. Cloud SQL ti consente di archiviare i vector embedding, creare indici vettoriali ed eseguire ricerche vettoriali insieme agli altri dati archiviati.
Archiviazione dei vector embedding
I vector embedding vengono archiviati in una tabella conforme alle proprietà di atomicità, coerenza, isolamento e durabilità (ACID). Come altri dati relazionali nella tabella, puoi accedere ai vector embedding nella tabella con la semantica transazionale esistente.
Per stabilire il mapping tra le righe della tabella e le rappresentazioni vettoriali, devi creare una colonna nella tabella per archiviare i vector embedding. La colonna deve utilizzare il tipo di dati VECTOR. La colonna dei vector embedding può archiviare solo vector embedding che utilizzano esattamente le stesse dimensioni specificate quando definisci la colonna. Non esistono limitazioni per il numero di righe nella tabella in cui archivi i vector embedding.
Se hai spazio di archiviazione e memoria sufficienti disponibili nell'istanza Cloud SQL, puoi avere più tabelle con le proprie colonne di vector embedding.
La replica dei dati funziona allo stesso modo per la colonna dei vector embedding e per le altre colonne InnoDB di MySQL.
Per un elenco delle limitazioni e delle restrizioni per le tabelle, le colonne dei vector embedding, e le istruzioni DML, consulta Limitazioni.
Indici vettoriali
Devi utilizzare un indice vettoriale per eseguire ricerche di similarità ANN sui vector embedding. Cloud SQL crea indici vettoriali utilizzando l' algoritmo Scalable Nearest Neighbors (ScANN).
Gli indici vettoriali hanno i seguenti requisiti:
- Puoi creare un solo indice vettoriale per tabella.
- Se hai più tabelle con vector embedding nell'istanza, puoi creare indici vettoriali per ognuna di esse.
- Se stai creando un indice vettoriale, non puoi aggiungere un vincolo alla chiave primaria della tabella indicizzata.
Per una migliore qualità della ricerca, crea un indice vettoriale solo dopo aver caricato la maggior parte dei dati nella tabella di base. Se nella tabella di base sono presenti meno di 1000 embedding, la creazione dell'indice non riesce.
Quando decidi se creare un indice vettoriale, se hai un numero ridotto di righe, valuta se puoi eseguire una ricerca KNN. La decisione di utilizzare una ricerca KNN o ANN dipende anche dal numero di dimensioni del vector embedding. Un numero maggiore di embedding potrebbe richiedere un indice vettoriale.
Per un elenco delle limitazioni e delle restrizioni per gli indici vettoriali, consulta Limitazioni. Per informazioni sulla creazione di un indice vettoriale, consulta Creare e gestire indici vettoriali.
Aggiornamenti degli indici vettoriali
Cloud SQL aggiorna gli indici vettoriali in tempo reale. Qualsiasi transazione che esegue operazioni di data manipulation language (DML) sulla tabella di base propaga anche le modifiche agli indici vettoriali associati. Gli indici vettoriali si comportano come qualsiasi altro indice secondario della tabella. Gli indici vettoriali sono completamente coerenti a livello transazionale e conformi ad ACID. Se esegui il rollback di una transazione, le modifiche di rollback corrispondenti si verificano anche nell'indice vettoriale.
Replica degli indici vettoriali
Cloud SQL replica gli indici vettoriali in tutte le repliche di lettura, incluse le repliche a cascata. Quando crei una nuova replica di lettura da un'istanza principale con vector embedding, la replica di lettura eredita le impostazioni dei vector embedding dall'istanza principale. Per le repliche di lettura esistenti, devi abilitare il supporto dei vector embedding su ognuna di esse.
In termini di impatto sul ritardo di replica, la creazione e la gestione degli indici vettoriali funzionano allo stesso modo degli indici MySQL normali.
Persistenza, disattivazione e impatto sulla manutenzione
Gli indici vettoriali vengono mantenuti allo stesso modo delle tabelle di base, con il supporto ACID completo. Gli indici vettoriali sono sempre sincronizzati con i dati della tabella di base e hanno la stessa visibilità, lo stesso isolamento e la stessa sicurezza in caso di arresto anomalo. Non si verifica alcun impatto sull'indice vettoriale quando l'istanza viene arrestata o riceve la manutenzione.
Manutenzione indici
Dopo aver eseguito operazioni DML estese sulla tabella di base, l'indice vettoriale addestrato sui dati iniziali (al momento della creazione dell'indice) potrebbe non riflettere il nuovo stato. Ciò può influire sulla qualità della ricerca.
L'indice è composto da due parti:
- L'albero degli indici. Viene creato eseguendo l'addestramento sui dati esistenti. Rimane invariato per tutta la durata dell'indice.
- I nodi foglia dell'indice. Contengono tutte le righe di dati. I nodi foglia dell'indice non vengono mai desincronizzati.
L'albero degli indici potrebbe diventare meno efficiente dopo l'esecuzione di un numero elevato di istruzioni DML perché le righe si spostano da un nodo foglia all'altro. Per aggiornare l'albero degli indici, devi ricompilare l'indice.
Operazioni DDL non supportate nelle tabelle con indici vettoriali
Le seguenti operazioni di data definition language (DDL) non sono supportate per le tabelle con indici vettoriali.
- Operazioni di modifica della tabella che richiedono l'algoritmo di copia
- Operazioni di modifica della tabella che richiedono la ricompilazione della tabella
- Eliminare o modificare la chiave primaria
- Spostare la tabella in uno spazio delle tabelle generale
Ricerca vettoriale
Cloud SQL fornisce funzioni di distanza vettoriale che utilizzi per eseguire ricerche di similarità vettoriale Approximate Nearest Neighbor (ANN) e K-Nearest Neighbor (KNN) sull'istanza. Quando esegui una query, il vettore di query viene confrontato con i vettori nel set di dati. Le funzioni di distanza calcolano la distanza tra i vettori utilizzando una metrica di similarità come il coseno. I vettori con la distanza più breve tra loro sono i più simili e vengono restituiti nei risultati di ricerca.
Cloud SQL utilizza le seguenti funzioni per misurare la distanza tra i vettori nelle ricerche vettoriali quando esegui ricerche vettoriali ANN e KNN:
- Coseno: misura il coseno dell'angolo tra due vettori. Un valore più piccolo indica una maggiore similarità tra i vettori.
- Prodotto scalare: calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudini dei vettori corrispondenti.
- Distanza L2 al quadrato: misura la distanza euclidea tra due vettori aggiungendo la distanza al quadrato su ogni dimensione.
Ricerca KNN
Una ricerca vettoriale KNN è il metodo di ricerca preferito quando hai bisogno di risultati esatti o vuoi aggiungere filtri selettivi. La ricerca KNN esegue un calcolo della distanza del vettore di query con ogni embedding nel set di dati per trovare il vicino più prossimo. Le ricerche KNN in Cloud SQL forniscono un richiamo perfetto. Le ricerche KNN non utilizzano un indice vettoriale, quindi sono una buona opzione quando si lavora con set di dati più piccoli.
Per eseguire una ricerca KNN, utilizza la funzione vector_distance che accetta due vettori come input: il vettore di query (ciò che stai cercando) e un vettore candidato dal set di dati. Calcola la distanza tra questi due vettori.
Utilizza vector_distance in un'istruzione SELECT. Per saperne di più, consulta
Cercare i K-Nearest Neighbor (KNN).
Se noti che KNN non ha un buon rendimento, puoi creare un indice vettoriale in un secondo momento e continuare a utilizzare approx_distance nella tua applicazione per le ricerche ANN.
Ricerca ANN
Una ricerca vettoriale ANN è il tipo di ricerca preferito quando l'efficienza delle query è un problema. Accelera le ricerche di similarità calcolando la distanza tra il vettore di query e solo una parte dei vettori nel set di dati. Per farlo, Cloud SQL organizza i dati in cluster o partizioni e poi concentra la ricerca sui cluster più vicini alla query. Le ricerche ANN richiedono indici vettoriali. Questi indici danno la priorità alla velocità di ricerca rispetto al richiamo perfetto. In Cloud SQL, il TREE_SQ viene utilizzato per le ricerche ANN.
Per eseguire una ricerca ANN, utilizza la
approx_distance funzione con un'
opzione di misurazione della distanza. Utilizza approx_distance in un elenco ORDER BY o SELECT e una clausola LIMIT è consentita per limitare i risultati di ricerca. Puoi anche aggiungere una clausola WHERE per eseguire il post-filtraggio dei risultati di ricerca.
Se vuoi avere un maggiore controllo sul numero di risultati restituiti
quando esegui una ricerca ANN con filtri, puoi
utilizzare il filtro iterativo. Con il filtro iterativo, la query di ricerca può restituire più risultati di ricerca eseguendo la scansione di una parte maggiore dell'indice vettoriale finché non viene trovato il numero preferito di vicini.
Puoi abilitare il filtro iterativo per la query di ricerca impostando il flag cloudsql_vector_iterative_filtering su ON a livello di sessione per i singoli client o a livello globale per tutti i client che si connettono all'istanza.
Per saperne di più, consulta Cercare i vicini più prossimi approssimativi (ANN).
In alcuni casi, una ricerca ANN esegue il fallback a una ricerca KNN. Per saperne di più, consulta Controllare lo stato di fallback per le ricerche ANN.
Differenze nel supporto vettoriale nelle versioni di Cloud SQL per MySQL
Cloud SQL per MySQL ha introdotto il supporto per la ricerca vettoriale nella versione 8.0.36 e successive. A partire dalla versione 9.7 di Cloud SQL per MySQL, Cloud SQL ha modificato funzionalità di ricerca vettoriale specifiche per integrarsi meglio con le funzionalità di supporto e archiviazione vettoriale sviluppate dalla community introdotte in MySQL 9.0 sviluppato dalla community.
La tabella seguente fornisce un confronto tra le versioni di Cloud SQL per MySQL che mostrano come le differenze di versione possono influire sull'utilizzo della ricerca vettoriale in Cloud per MySQL.
| Area di supporto | Cloud SQL per MySQL 8.4 e versioni precedenti | Cloud SQL per MySQL 9.7 e versioni successive |
|---|---|---|
| Abilitazione vettoriale | Per aggiungere vector embedding al database MySQL e utilizzare
la ricerca vettoriale, devi impostare il flag cloudsql_vector
su on per l'istanza Cloud SQL.
|
Se vuoi creare indici vettoriali ed eseguire la ricerca ANN, devi impostare il flag cloudsql_vector su on. |
| Colonne di vector embedding in una tabella | Una tabella può avere una sola colonna di vector embedding. | Se crei un indice nella tabella, puoi avere una sola colonna di vector embedding per tabella. Se non crei un indice nella tabella, la tabella può avere più colonne di vector embedding. |
Utilizzo di COMMENT
e CONSTRAINT per identificare le colonne di vector embedding
|
Per distinguere la colonna di vector embedding dalle altre colonne, Cloud SQL aggiunge un'annotazione COMMENT speciale e una regola CONSTRAINT alla colonna.
Il vincolo è obbligatorio per la convalida dell'input e l'annotazione della colonna di vector embedding è visibile come commento. Non puoi modificare o eliminare il commento o il vincolo.
|
L'annotazione COMMENT e la regola CONSTRAINT non vengono più utilizzate per identificare le colonne di vector embedding in Cloud SQL per MySQL 9.7.
|
| Limite di dimensioni | Un vector embedding è limitato a 16.000 dimensioni senza valore predefinito. | Un vector embedding è limitato a 16.383 dimensioni con un valore predefinito di 2048. |
| Formato di archiviazione vettoriale |
Formato VARBINARY
|
Formato di archiviazione basato sulla community |
| Sintassi per la dichiarazione del tipo di dati vettoriali |
VECTOR(VECTOR_DIMENSIONS)
|
VECTOR(VECTOR_DIMENSIONS)
|
| Differenze tra le funzioni di conversione | L'output della funzione vector_to_string viene stampato come valore intero.
|
L'output della vector_to_string
funzione viene visualizzato in notazione scientifica,
che è lo standard della community.
|
Limitazioni
Di seguito sono riportate le limitazioni che si applicano a tutte le versioni di Cloud SQL che supportano i vettori:
- Può esistere un solo indice vettoriale per tabella.
- La colonna di vector embedding non può essere una colonna generata.
- Il partizionamento a livello di tabella nelle tabelle con colonne di vector embedding non è supportato.
- Le chiavi primarie che utilizzano i tipi di dati
BIT,BINARY,VARBINARY,JSON,BLOB,TEXTo dati spaziali non sono supportate per gli indici vettoriali. Le chiavi primarie composite non possono includere nessuno di questi tipi. - Se è presente un indice vettoriale, non puoi aggiungere un vincolo alla chiave primaria della tabella di base.
- Quando è presente un indice vettoriale in una tabella, non puoi eseguire alcune operazioni DDL. Per saperne di più, consulta Operazioni DDL non supportate nelle tabelle con indici vettoriali.
Le seguenti restrizioni si applicano alle query di ricerca vettoriale:
- La funzione
approx_distancepuò essere utilizzata solo in un elencoORDER BYoSELECT. - I predicati che coinvolgono la tabella di base possono essere utilizzati nella condizione
WHEREin combinazione con le espressioniapprox_distancenell'elencoORDER BYoSELECT. I predicati della condizioneWHEREvengono valutati dopo la valutazione delle funzioni vettorialiapprox_distance.
Passaggi successivi
- Leggi la panoramica sulla ricerca vettoriale in Cloud SQL.
- Scopri come generare vector embedding.
- Scopri come creare indici vettoriali.
- Scopri come eseguire ricerche sui vector embedding.