Questa pagina illustra in dettaglio come puoi interagire con Cloud SQL per creare applicazioni che utilizzano gli embedding vettoriali.
Cloud SQL per MySQL supporta l'archiviazione di incorporamenti vettoriali. Puoi quindi creare indici di ricerca vettoriale ed eseguire ricerche di similarità su questi incorporamenti vettoriali, insieme al resto dei dati archiviati in Cloud SQL.
Archiviazione degli embedding vettoriali
Puoi utilizzare Cloud SQL per MySQL per archiviare gli incorporamenti vettoriali creando una colonna di incorporamenti vettoriali in una tabella. La colonna di embedding vettoriale speciale viene mappata al
tipo di dati VARBINARY
. Come per altri dati relazionali nella tabella, puoi accedere agli embedding vettori nella tabella con le garanzie transazionali esistenti. Una tabella con una colonna di embedding vettoriale è una normale tabella InnoDB ed è quindi conforme alle proprietà atomicità, coerenza, isolamento e durabilità (ACID).
Le proprietà ACID variano solo per le ricerche nell'indice di ricerca vettoriale.
Puoi creare fino a una colonna di embedding vettoriale in una tabella e un indice di ricerca vettoriale per tabella. Ogni embedding di vettore memorizzato nella stessa colonna deve avere esattamente le stesse dimensioni specificate quando hai definito la colonna. Un embedding vettoriale ha un limite massimo di 16.000 dimensioni. Se hai abbastanza spazio di archiviazione e memoria a disposizione, puoi avere tabelle separate con colonne di embedding di vettori e indici di ricerca vettoriale diversi nella stessa istanza.
Anche se non esiste un limite fisso per il numero di incorporamenti di vettori che puoi memorizzare in una tabella, gli indici di ricerca di vettori richiedono memoria. Per questo motivo, ti consigliamo di non memorizzare più di 10 milioni di embedding vettoriali in una tabella.
La replica funziona allo stesso modo per la colonna di embedding vettoriale come per altre colonne InnoDB di MySQL.
Ricerca di somiglianza
Cloud SQL supporta la ricerca di somiglianza utilizzando sia le query di ricerca K-Nearest Neighbor (KNN) sia quelle di ricerca Approximate Nearest Neighbor (ANN). Puoi utilizzare entrambi i tipi di ricerche vettoriali nelle tue istanze Cloud SQL. Puoi creare un indice di ricerca vettoriale per le ricerche ANN.
Ricerca K-Nearest Neighbor (KNN)
Cloud SQL supporta le query utilizzando la ricerca vettoriale KNN, nota anche come ricerca del vicino più prossimo esatto. L'esecuzione di una ricerca vettoriale KNN fornisce un recupero perfetto. Puoi eseguire ricerche KNN senza dover creare un indice di ricerca vettoriale. La ricerca KNN si basa sull'esecuzione di un algoritmo di scansione della tabella.
Per la ricerca KNN, Cloud SQL supporta anche le seguenti funzioni di ricerca della distanza vettoriale:
- Coseno
- Prodotto scalare
- Distanza al quadrato L2
Per ulteriori informazioni sull'utilizzo delle funzioni di distanza di ricerca vettoriale, consulta Eseguire query sulla distanza di un embedding vettoriale.
Ricerca Approximate Nearest Neighbor (ANN)
Cloud SQL supporta la creazione ed esecuzione di query sulle ricerche con reti neurali artificiali tramite la creazione di indici di ricerca vettoriale. Un indice di ricerca vettoriale ANN ti consente di ottimizzare per prestazioni rapide anziché per un recupero perfetto. Per la ricerca ANN, Cloud SQL supporta i seguenti tipi di indici:
BRUTE_FORCE
: il tipo di indice di ricerca vettoriale predefinito per una tabella di base con meno di 10.000 righe. Questo tipo è ideale per le ricerche all'interno di un sottoinsieme più piccolo di un set di dati originale. La memoria utilizzata dall'indice è uguale alle dimensioni del set di dati. Questo tipo di indice non viene mantenuto sul disco.TREE_SQ
: il tipo di indice di ricerca vettoriale predefinito per una tabella di base con almeno 10.000 righe. Questo tipo utilizza la quantità minima di memoria o circa il 25% delle dimensioni del set di dati. Gli indiciTREE_SQ
vengono memorizzati su disco.TREE_AH
: un tipo di indice di ricerca vettoriale che fornisce un algoritmo di tipo di ricerca con hashing asimmetrico. Come implementato in Cloud SQL, questo tipo di indice non è ottimizzato per l'impronta in memoria e non è persistente.
Aggiorna gli indici di ricerca vettoriale
Cloud SQL per MySQL aggiorna gli indici di ricerca vettoriale in tempo reale. Qualsiasi transazione
che esegue operazioni di Data Manipulation Language (DML) sulla tabella di base propaga anche le modifiche agli indici di ricerca vettoriale associati. Le modifiche a un indice di ricerca vettoriale sono visibili immediatamente a tutte le altre transazioni, il che significa un livello di isolamento di READ_UNCOMMITTED
.
Se esegui il rollback di una transazione, le modifiche corrispondenti al rollback si verificano anche nell'indice di ricerca vettoriale.
Replica degli indici di ricerca vettoriale
Cloud SQL per MySQL replica gli indici di ricerca di vettori in tutte le repliche di lettura. I filtri di replica e la replica degli indici di ricerca vettoriale alle repliche a cascata non sono supportati.
Configurare un'istanza per supportare gli embedding vettoriali
Questa sezione descrive come configurare l'istanza Cloud SQL per supportare lo stoccaggio, l'indicizzazione e le query degli embedding vettoriali.
Sia le istanze della versione Cloud SQL Enterprise sia quelle della versione Cloud SQL Enterprise Plus supportano gli incorporamenti vettoriali.
Prima di iniziare
- L'istanza deve eseguire Cloud SQL per MySQL versione MySQL
8.0.36.R20240401.03_00
o successiva. - L'istanza deve disporre di spazio su disco e memoria sufficienti per allocare la memoria per il numero totale di embedding vettore nell'istanza.
Attivare il supporto per gli embedding vettoriali
Per attivare il supporto degli embedding di vettori, devi configurare i flag del database MySQL.
gcloud sql instances patch INSTANCE_NAME \ --database-flags=FLAGS
Sostituisci INSTANCE_NAME con il nome dell'istanza su cui vuoi attivare il supporto dell'embedding di vettori.
In FLAGS, configura i seguenti flag MySQL sull'istanza:
cloudsql_vector
: imposta questo flag suon
per attivare il supporto di archiviazione e ricerca per l'inserimento di vettori. Puoi creare nuove colonne di embedding vettoriale e indici di ricerca vettoriale nell'istanza.cloudsql_vector_max_mem_size
: facoltativo. Specifica l'allocazione massima della memoria in byte per tutti gli indici di ricerca vettoriale nell'istanza. Se non specifichi questo flag, l'allocazione della memoria predefinita è 1 GB, ovvero l'allocazione minima della memoria. Per ulteriori informazioni su come calcolare l'importo da specificare, consulta Configurare l'allocazione della memoria per gli indici di ricerca vettoriale.Questa memoria dedicata proviene dalla memoria allocata al tuo
innodb_buffer_pool_size
. Il pool di buffer disponibile viene ridotto della stessa quantità. Il valore massimo consentito per questo flag è il 50% delinnodb_buffer_pool_size
totale.Se specifichi un valore superiore al 50% del totale
innodb_buffer_pool_size
, Cloud SQL riduce il valore effettivo al 50% delle dimensioni disponibili e registra un messaggio di avviso per l'istanza.
Dopo aver configurato i flag, il comando potrebbe essere simile al seguente:
gcloud sql instances patch my-instance \ --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296
I flag per configurare il supporto degli embedding di vettori in Cloud SQL per MySQL sono flag statici. Dopo aver aggiornato l'istanza con i flag, l'istanza viene riavviata automaticamente affinché le modifiche alla configurazione vengano applicate.
Per ulteriori informazioni su come configurare i flag di database per MySQL, consulta Configurare i flag di database.
Disattivare il supporto degli embedding vettoriali
Per disattivare il supporto degli embedding vettoriali, imposta il cloudsql_vector
flag su off
.
Ad esempio:
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_vector=off
Sostituisci INSTANCE_NAME con il nome dell'istanza su cui disattivi il supporto dell'embedding di vettori.
L'impostazione di cloudsql_vector
su off
impedisce di creare nuove colonne di embedding di vettori e nuovi indici di ricerca di vettori. Dopo aver configurato questo
flag statico, l'istanza si riavvia automaticamente affinché la modifica della configurazione
venga applicata.
Dopo il riavvio dell'istanza, Cloud SQL per MySQL esegue le seguenti operazioni:
- Rimuove tutti gli indici di ricerca vettoriale
TREE_SQ
persistenti dal disco. - Mantiene le voci della tabella del dizionario di dati per gli indici di ricerca vettoriale che sono stati creati. Tuttavia, Cloud SQL per MySQL non ricostruisce gli indici e qualsiasi query di ricerca in questi indici restituisce un errore.
- Continua a memorizzare gli embedding vettoriali nelle tabelle di base. Gli incorporamenti vettoriali rimangono accessibili.
Se in un secondo momento riattivi il flag cloudsql_vector
per l'istanza, Cloud SQL tenta di ricostruire gli indici durante il riavvio dell'istanza in base alle voci della tabella del dizionario dei dati.
Configurare l'allocazione della memoria per gli indici di ricerca vettoriale
Cloud SQL crea e gestisce gli indici di ricerca vettoriale in memoria. Il tipo di indice TREE_SQ
rimane invariato in caso di arresto pulito e viene ricaricato dopo il riavvio dell'istanza.
Durante l'esecuzione, tutti gli indici di ricerca vettoriale devono rimanere in memoria.
Per assicurarti che Cloud SQL abbia memoria sufficiente per mantenere in memoria tutti gli indici di ricerca vettoriale, configura l'istanza Cloud SQL con un flag di database cloudsql_vector_max_mem_size
.
cloudsql_vector_max_mem_size
regola la quantità di memoria dedicata dall'istanza Cloud SQL per gli indici di ricerca vettoriale. Quando configuri il valore del flag, tieni presente quanto segue:
- Il valore predefinito e minimo è 1 GB. Il limite superiore è il 50% della dimensione del pool di buffer.
- Dopo aver impostato questo flag, l'istanza viene riavviata automaticamente affinché la modifica della configurazione venga applicata.
- Se l'istanza ha utilizzato tutta la memoria configurata, non puoi creare o modificare indici di ricerca vettoriale.
Per aggiornare la memoria allocata per gli indici di ricerca di vettori nell'istanza,
modifica il valore del flag cloudsql_vector_max_mem_size
.
gcloud sql instances patch INSTANCE_NAME \ --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE
Sostituisci quanto segue:
- INSTANCE_NAME: il nome dell'istanza su cui stai modificando l'allocazione della memoria.
- NEW_MEMORY_VALUE: l'allocazione della memoria aggiornata, in byte, per i tuoi indici di ricerca vettoriale
Questa modifica riavvia automaticamente l'istanza in modo che possa essere applicata.
Calcolare la memoria richiesta
La quantità di memoria richiesta da un indice dipende dal tipo di indice, dal numero di embedding vettoriali e dalla dimensionalità degli embedding. Esistono due requisiti di memoria da considerare:
- Memoria per la creazione: la memoria richiesta durante la creazione dell'indice
- Memoria dell'indice: la memoria occupata dall'indice dopo la sua compilazione
Per un determinato indice, la dimensione del set di dati corrisponde alla memoria necessaria per leggere tutti gli incorporamenti vettori in memoria. Poiché ogni dimensione è rappresentata da un valore float che utilizza 4 byte di memoria, puoi determinare la dimensione del set di dati come segue:
dataset_size = <num_embeddings> * (4 * <dimensions>)
Ad esempio, se hai 1 milione di embedding di 768 dimensioni, il valore di dataset_size
è 3 GB.
In base all'esempio precedente, i requisiti di memoria per i diversi tipi di indice sono i seguenti:
Tipo di indice | Memoria del tempo di compilazione | Memoria dell'indice |
---|---|---|
TREE_SQ |
4 GB | 1 GB |
TREE_AH
|
3,5 GB | 3,5 GB |
BRUTE_FORCE
|
3 GB | 3 GB |
Se utilizzi indici di ricerca vettoriale TREE_SQ
, devi anche tenere conto della memoria richiesta per la persistenza in fase di esecuzione. Alla quantità totale di
memoria nella configurazione, aggiungi la quantità di memoria dell'indice utilizzata dall'indice di ricerca vettoriale TREE_SQ
attivo più grande.
Ogni volta che la tabella di base in cui sono archiviati gli embedding vettoriali viene sottoposta a operazioni DML, l'indice di ricerca vettoriale viene aggiornato in tempo reale. Questi aggiornamenti
modificano l'impronta in memoria dell'indice, che può ridursi o espandersi a seconda
dell'operazione DML. Puoi monitorare l'impronta di memoria di un indice eseguendo una query sulla tabella information_schema.innodb_vector_indexes
. Per informazioni su come monitorare le dimensioni dell'indice di ricerca di vettori, consulta Monitorare gli indici di ricerca di vettori.
Configurazione della replica di lettura
Se l'istanza soddisfa i criteri di attivazione della versione di manutenzione e degli indicatori, Cloud SQL supporta completamente gli embedding di vettori su una replica di lettura.
Se crei una replica da un'istanza principale in cui è abilitato il supporto dell'embedding vettoriale, la replica di lettura eredita le impostazioni di supporto dell'embedding vettoriale dall'istanza principale. Devi attivare il supporto dell'embedding di vettori individualmente nelle istanze di replica di lettura già esistenti.
In termini di impatto sul ritardo della replica, la creazione e la gestione degli indici di ricerca vettoriale avviene nello stesso modo degli indici MySQL standard.
Gli indici di ricerca vettoriale non sono supportati nelle repliche a cascata.
Esempio: un semplice indice e una query di ricerca di vettori ANN
La procedura dettagliata di esempio riportata di seguito illustra i passaggi per creare un indice di ricerca vettoriale basato su ANN e una query in Cloud SQL.
Genera incorporamenti 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 delle righe.
Crea una tabella in Cloud SQL per MySQL 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 di ricerca vettoriale. Se stai creando un indice
TREE_SQ
oTREE_AH
, la tabella deve avere almeno 1000 righe.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Trova i vicini più prossimi.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Genera embedding vettoriali in base ai dati delle righe
Puoi generare un embedding vettoriale per i dati di una determinata riga utilizzando un'API di embedding di testo come Vertex AI o OpenAI. Puoi utilizzare qualsiasi API di embedding del testo con gli embedding di vettori Cloud SQL. Tuttavia, devi utilizzare la stessa API di embedding del testo per la generazione di vettori di stringhe di query. Non puoi combinare API diverse per i dati di origine e la vettorializzazione delle query.
Ad esempio, puoi generare un embedding vettoriale da Vertex AI:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("text-embedding-004")
embeddings = model.get_embeddings(["What is life?"])
for embedding in embeddings:
vector = embedding.values
print(f"Length of Embedding Vector: {len(vector)}")
return vector
if __name__ == "__main__":
text_embedding()
Memorizza gli embedding vettoriali
Questa sezione fornisce esempi di istruzioni per l'archiviazione di incorporamenti vettoriali in Cloud SQL.
Creare una nuova tabella con una colonna di embedding di vettori
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Aggiungere una colonna di embedding di vettori a una tabella esistente
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Inserire un embedding vettoriale
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')
);
Inserire più incorporamenti vettoriali
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')),
('book title', string_to_vector('[4,5,6]')
);
Esegui l'upsert di un embedding vettoriale
INSERT INTO books (
id,
title,
embedding
) VALUES (
1,
'book title',
string_to_vector('[1,2,3]')
)
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');
Aggiornare un embedding vettoriale
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Eliminare un embedding vettoriale
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Lavorare con gli indici di ricerca vettoriale
Per impostazione predefinita, puoi eseguire la ricerca del vicino più prossimo esatto, che fornisce un recupero perfetto. Puoi anche aggiungere un indice per utilizzare la ricerca ANN, che offre una maggiore velocità a fronte di un calo del richiamo. A differenza degli indici tipici, dopo aver aggiunto un indice approssimativo, vedrai risultati diversi per le query.
Consigli
Questa sezione fornisce le best practice per lavorare con gli indici di ricerca vettoriale. Ogni carico di lavoro è diverso e potrebbe essere necessario apportare modifiche di conseguenza.
- Prima di creare un indice di ricerca vettoriale, devi caricare i dati nella tabella.
La tabella di base deve contenere almeno 1000 righe.
Questi requisiti si applicano solo ai tipi di indici di ricerca
TREE_SQ
eTREE_AH
. Se hai più punti dati disponibili, puoi eseguire una suddivisione e un addestramento migliori dell'indice. - Monitora l'utilizzo della memoria degli indici. Se l'istanza esaurisce la memoria,
non puoi creare o compilare indici. Per gli indici esistenti,
dopo aver raggiunto la soglia, Cloud SQL scrive periodicamente avvisi nel log degli errori MySQL. Puoi visualizzare l'utilizzo della memoria nella tabella
information_schema.innodb_vector_indexes
. - Se la tabella di base sottostante ha subito modifiche DML importanti, ricostruisci
gli indici di ricerca vettoriale. Per ottenere le dimensioni iniziali dell'indice al momento della compilazione e le dimensioni attuali dell'indice, esegui una query sulla tabella
information_schema.innodb_vector_indexes
. - In genere, è accettabile lasciare che il numero di partizioni venga calcolato internamente. Se hai un caso d'uso in cui vuoi specificare il numero di partizioni, devi avere almeno 100 punti dati per partizione.
Tabella di base di sola lettura durante le operazioni dell'indice di ricerca vettoriale
Per tutta la durata di tutte e tre le operazioni dell'indice di ricerca vettoriale (creazione, modifica ed eliminazione), la tabella di base viene impostata in modalità di sola lettura. Durante queste operazioni, non sono consentite operazioni DML nella tabella di base.
Persistenza, arresto e impatto sulla manutenzione
Solo gli indici di ricerca vettoriale che utilizzano il tipo TREE_SQ
vengono mantenuti sul disco
in caso di arresto pulito di un'istanza.
Gli indici di ricerca vettoriale che utilizzano i tipi TREE_AH
e BRUTE_FORCE
sono
solo in memoria.
Dopo un arresto pulito di un'istanza, Cloud SQL ricarica gli indici di ricerca vettoriale al riavvio dell'istanza. Tuttavia, dopo un arresto anomalo o un arresto non corretto, Cloud SQL deve ricostruire gli indici di ricerca di vettori. Ad esempio, ogni volta che l'istanza subisce un arresto anomalo e viene eseguita la procedura di recupero dal backup e dal ripristino, dal recupero point-in-time (PITR) o dal failover di alta disponibilità (HA), Cloud SQL ricostruisce gli indici di ricerca vettoriale. Per questi eventi si verifica quanto segue:
- La ricostruzione avviene automaticamente in background.
- Durante la ricostruzione, la tabella di base è in modalità di sola lettura.
- Se la ricostruzione automatica non riesce ad acquisire un blocco della tabella entro un determinato periodo di tempo, la ricostruzione non va a buon fine. Potresti dover ricostruire manualmente l'indice.
Il tempo necessario per la ricostruzione di un indice potrebbe aumentare il tempo necessario per un Shutdown, il che potrebbe anche aumentare il tempo di manutenzione e aggiornamento richiesto per un'istanza.
Creare un indice di ricerca vettoriale
L'istruzione per creare un indice di ricerca vettoriale utilizza la seguente sintassi:
CALL mysql.create_vector_index('INDEX_NAME', 'DB_NAME.TABLE_NAME', 'COLUMN_NAME', 'PARAMETERS' );
Ad esempio:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
Il nome dell'indice specificato deve essere univoco all'interno del database.
Parametri dell'indice di ricerca vettoriale
Le funzioni create search index (e alter search index) supportano più parametri che puoi specificare con coppie chiave-valore separate da virgole. Tutti i parametri della funzione di creazione dell'indice di ricerca sono facoltativi. Se specifichi una stringa vuota o NULL, per l'indice vengono configurati i valori predefiniti dei parametri.
- distance_measure: i valori supportati sono:
L2_SQUARED
,COSINE
eDOT_PRODUCT
.L2_SQUARED
è il valore predefinito. - num_neighbors: il numero di vicini da restituire per impostazione predefinita durante le query ANN. Puoi anche ignorare questo parametro quando
esegui la query di ricerca. Il valore predefinito è
10
. index_type: specifica il tipo di indice da creare. I valori validi sono:
BRUTE_FORCE
,TREE_SQ
eTREE_AH
.BRUTE_FORCE
è il valore predefinito per una tabella con meno di 10.000 righeTREE_SQ
è il valore predefinito per una tabella con almeno 10.000 righe
Per specificare il tipo di indice
TREE_AH
oTREE_SQ
, la dimensione della tabella di base deve essere superiore a 1000 righe.num_parititions: specifica il numero di cluster K-means da creare. Questo parametro è consentito solo se hai configurato un
index_type
. Questa opzione non è applicabile aBRUTE_FORCE
. Se specifichi il tipo di indiceTREE_SQ
oTREE_AH
, la dimensione della tabella di base deve essere maggiore o uguale a num_partitions * 100.
Modificare un indice di ricerca vettoriale
CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');
La funzione alter_vector_index
viene utilizzata esplicitamente per ricostruire un indice di ricerca vettoriale. Per utilizzare questa funzione, l'indice deve già esistere. Ti consigliamo di
riedificare un indice per i seguenti casi d'uso:
- Vuoi ricostruire l'indice con opzioni diverse. Ad esempio, potresti voler utilizzare un tipo di indice o una misura della distanza diversa.
- Vuoi ricostruire l'indice perché la tabella di base ha subito modifiche sostanziali al DML. Ad esempio, devi addestrare nuovamente l'indice di ricerca vettoriale in base ai dati attuali nella tabella di base.
Tutti i parametri per la ricostruzione dell'indice sono identici a quelli disponibili per la creazione dell'indice e sono facoltativi. Se specifichi una stringa vuota o NULL durante la ricostruzione dell'indice, l'indice viene ricostruito in base ai parametri specificati al momento della creazione. Se non vengono forniti parametri al momento della creazione dell'indice, vengono utilizzati i valori predefiniti.
L'indice di ricerca vettoriale esistente è disponibile durante l'operazione di modifica. Puoi comunque eseguire query di ricerca sull'indice.
Eliminare un indice di ricerca vettoriale
Non puoi eseguire un'operazione DDL su una tabella che ha un indice di ricerca vettoriale. Prima di eseguire l'operazione DDL sulla tabella, devi eliminare l'indice di ricerca vettoriale.
CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');
Esegui query sugli embedding vettoriali
Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sugli embedding vettoriali.
Visualizza gli embedding vettoriali
SELECT vector_to_string(embedding) FROM books;
Ottenere la ricerca del vicino più prossimo esatta per un embedding vettoriale
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Ottenere la ricerca del vicino più prossimo approssimativo in un embedding vettoriale
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
L'esecuzione di una ricerca ANN supporta due parametri. Entrambi sono facoltativi.
- num_partitions: specifica il numero di partizioni da analizzare per una ricerca di vettori ANN. Se non specifichi il numero di partizioni, la ricerca utilizza un valore generato in base alle dimensioni della tabella, al numero di partizioni nell'indice di ricerca vettoriale e ad altri fattori.
- num_neighbors: specifica il numero di vicini da restituire. Questo valore ha la precedenza sul valore impostato al momento della creazione dell'indice di ricerca dei vettori.
Filtra gli embedding vettoriali
Utilizza colonne aggiuntive come predicati per perfezionare il filtro dei risultati delle query di embedding vettoriale. Ad esempio, se aggiungi una colonna printyear
, puoi aggiungere un valore dell'anno specifico come filtro alla query.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Esegui una query sulla distanza di un embedding vettoriale
Questa sezione fornisce esempi di funzioni di distanza vettoriale disponibili per la ricerca KNN.
Ottieni la distanza coseno
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Ottieni la distanza 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
SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Ottenere righe entro una determinata distanza
SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;
Puoi combinarlo con ORDER BY
e LIMIT
SELECT id, vector_to_string(embedding),
l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;
Monitorare gli indici di ricerca vettoriale
Per ottenere informazioni in tempo reale su tutti gli indici di ricerca vettoriale nell'istanza, utilizza la tabella information_schema.innodb_vector_indexes
.
Per visualizzare la tabella, esegui il seguente comando:
SELECT * FROM information_schema.innodb_vector_indexes;
L'output di esempio potrebbe essere simile al seguente:
*************************** 1. row *************************** INDEX_NAME: test.t4_index TABLE_NAME: test.t4_bf INDEX_TYPE: BRUTE_FORCE DIST_MEASURE: SquaredL2Distance STATUS: Ready STATE: INDEX_READY_TO_USE PARTITIONS: 0 SEARCH_PARTITIONS: 0 INITIAL_SIZE: 40000 CURRENT_SIZE: 40000 QUERIES: 0 MUTATIONS: 0 INDEX_MEMORY: 160000 DATASET_MEMORY: 0
Nella tabella information_schema.innodb_vector_indexes
puoi visualizzare quanto segue:
- Le opzioni potenzialmente generate. In altre parole,
num_partitions
o il numero di partizioni da analizzare per una query. - Le colonne
STATE
eSTATUS
indicano lo stato corrente dell'indice. Durante la fase di compilazione, la colonna dello stato fornisce informazioni sul grado di avanzamento dell'indice di ricerca vettoriale. - La colonna
INITIAL_SIZE
fornisce le dimensioni della tabella durante la creazione dell'indice. Puoi confrontare questa dimensione conCURRENT_SIZE
per farti un'idea di quanto l'indice sia cambiato dalla sua creazione a causa delle operazioni DML sulla tabella di base. - Le colonne
QUERIES
eMUTATIONS
forniscono informazioni in tempo reale sull'utilizzo dell'indice. Le colonne
INDEX_MEMORY
eDATASET_MEMORY
forniscono informazioni sul consumo di memoria dell'indice.INDEX_MEMORY
indica la quantità di memoria utilizzata dall'indice e
DATASET_MEMORY
indica la quantità di memoria aggiuntiva consumata durante il tempo di compilazione.
Per ottenere un elenco degli indici di vettori di ricerca creati nell'istanza, puoi visualizzare la tabella del dizionario di dati mysql.vector_indexes
.
Per visualizzare la tabella, esegui il seguente comando:
SELECT * FROM mysql.vector_indexes;
Esempio di output:
*************************** 1. row *************************** index_name: test.index1 table_name: test.t1 column_name: j index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED status: ACTIVE create_time: 2024-04-08 22:46:21 update_time: 2024-04-08 22:46:21 1 row in set (0.00 sec)
Limitazioni
- Può esserci una sola colonna di incorporamento di vettori per tabella.
- Può essere presente un solo indice di ricerca vettoriale per tabella.
- Un embedding di vettori può avere fino a 16.000 dimensioni.
- Il partizionamento a livello di tabella InnoDB nelle tabelle con colonne di embedding vettoriale non è supportato.
- Se l'istanza si riavvia da un arresto anomalo, Cloud SQL ricostruisce automaticamente l'indice di ricerca vettoriale.
- Durante la ricostruzione dell'indice di ricerca vettoriale, la tabella di base è di sola lettura.
- Se Cloud SQL non riesce ad acquisire un blocco della tabella entro il tempo specificato, la ricostruzione automatica dell'indice potrebbe non riuscire.
- Se la ricostruzione automatica dell'indice non va a buon fine, devi ricostruirlo manualmente.
- Per aggiungere una colonna di embedding di vettori, la tabella deve avere una chiave primaria. Cloud SQL non supporta le chiavi principali di tipo
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
o tipi di dati spaziali. Le chiavi primarie composite non possono includere nessuno di questi tipi. - Se in una tabella è presente un indice di ricerca vettoriale, le operazioni DDL non sono consentite. L'indice di ricerca vettoriale deve essere eliminato prima di eseguire operazioni DDL sulla tabella di base.
- Le rappresentazioni vettoriali non sono supportate nelle tabelle non InnoDB o nelle tabelle temporanee.
- La colonna di embedding del vettore non può essere una colonna generata.
- Il predicato
NEAREST..TO
può essere combinato con altri predicati "scalari" utilizzandoAND
oOR
. I predicati scalari nella tabella vengono valutati dopo l'applicazione dei predicati vettoriali. - Il predicato
NEAREST..TO
è supportato solo in un statementSELECT
. Altre istruzioni DML non supportanoNEAREST..TO
. - Le sottoquery non sono supportate con
NEAREST..TO
. Non è possibile aggiungere un vincolo alla chiave primaria della tabella di base se è presente un indice di ricerca vettoriale. Il pre-filtro è possibile solo tramite le funzioni di distanza e utilizzando
ORDER BY
conLIMIT
.Ad esempio, se crei la seguente tabella:
CREATE TABLE books ( bookid INT PRIMARY KEY, title VARCHAR(1000), author VARCHAR(100), printyear int, country VARCHAR(100), bvector VECTOR(1536) USING VARBINARY //bvector is embedding vector of book's plot,genre,reviews etc );
A questo punto, puoi utilizzare la seguente query per eseguire il prefiltro.
//select query to obtain books by specific author and having similar plot-genre-reviews SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist FROM books where author='cloudsql' ORDER BY dist LIMIT 10
Il post-filtro è supportato con le funzioni
NEAREST..TO
e distance.
Risoluzione dei problemi
In caso di arresto anomalo, l'indice viene ricostruito automaticamente. Quando è in corso una ricostruzione, sono presenti due limitazioni:
- Durante la creazione dell'indice, la tabella di base è in modalità di sola lettura.
- Durante la ricreazione dell'indice, le query ANN sugli indici esistenti non vanno a buon fine.