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 embedding vettoriali creando una colonna di embedding vettoriale 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 ai vettori di embedding nella tabella con le garanzie transazionali esistenti. Una tabella con una colonna di embedding vettoriale è una normale tabella InnoDB ed è quindi conforme alle proprietà di atomicità, coerenza, isolamento e durabilità (ACID). Le proprietà ACID variano solo per le ricerche nell'indice di ricerca vettoriale.
Tieni presente quanto segue quando configuri una tabella per gli embedding di vettori:
Puoi creare al massimo una colonna di embedding di vettori in una tabella e un indice di ricerca di vettori per tabella. Ogni embedding di vettore archiviato nella stessa colonna deve avere esattamente le stesse dimensioni specificate quando hai definito la colonna. Un embedding vettoriale ha un limite superiore di 16.000 dimensioni. Se hai spazio di archiviazione e memoria sufficienti, puoi avere tabelle separate con colonne di embedding di vettori e indici di ricerca di vettori diversi nella stessa istanza.
Sebbene non esista un limite fisso per il numero di incorporamenti vettoriali che puoi memorizzare in una tabella, gli indici di ricerca vettoriale richiedono memoria. Per questo motivo, consigliamo di memorizzare in una tabella non più di 10 milioni di embedding vettoriali.
Consulta anche l'elenco delle limitazioni.
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 similarità 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 di vettori nelle tue istanze Cloud SQL. Puoi creare un indice di ricerca vettoriale solo 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 offre 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 è permanente.
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 immediatamente visibili 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.
Configura 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 incorporamenti 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 sufficiente per allocare la memoria per il numero totale di embedding vettore nell'istanza.
Attiva 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 nell'istanza:
cloudsql_vector
: imposta questo flag suon
per attivare lo spazio di archiviazione e il supporto della ricerca per gli incorporamenti vettoriali. Puoi creare nuove colonne di embedding di vettori e nuovi indici di ricerca di vettori 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 si riavvia 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 gli incorporamenti vettoriali
Per disattivare gli embedding vettoriali, imposta il flag cloudsql_vector
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 tutte le query di ricerca per questi indici restituiscono un errore.
- Continua a memorizzare gli embedding vettoriali nelle tabelle di base. Gli embedding 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.
Configurazione delle repliche di lettura
Se l'istanza soddisfa i criteri di attivazione della versione di manutenzione e dei flag, Cloud SQL supporta completamente gli embedding vettoriali in 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 indice e una query di ricerca vettoriale 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 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 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 del vettore della stringa 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 distribuiti 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 esatta, che fornisce un recupero perfetto. Puoi anche aggiungere un indice per utilizzare la ricerca ANN, che offre una maggiore velocità a fronte di un recupero inferiore. 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, avrai 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 significative, ricostruisci
gli indici di ricerca vettoriale. Per ottenere le dimensioni iniziali dell'indice al momento della compilazione e le dimensioni correnti 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 di 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 la tua istanza subisce un arresto anomalo e viene recuperata da un backup e un ripristino, da un recupero point-in-time (PITR) o da un 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. Potrebbe essere necessario ricostruire l'indice manualmente.
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.
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
persiste 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 che l'istanza Cloud SQL dedica agli 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 gli 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 gli 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 vettori di embedding e dalla dimensionalità degli embedding. Esistono due requisiti di memoria da considerare:
- Memoria al momento della compilazione:la memoria richiesta durante la compilazione dell'indice.
- Memoria dell'indice: la memoria occupata dall'indice dopo la sua compilazione.
Per un determinato indice, le dimensioni del set di dati corrispondono 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 un milione di embedding di 768 dimensioni, dataset_size
è pari a 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.
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 mysql.create_vector_index
e mysql.alter_vector_index
supportano più parametri che puoi specificare con coppie chiave-valore separate da virgole.
Tutti i parametri della funzione mysql.create_vector_index
sono facoltativi. Se specifichi una stringa vuota o NULL, i valori predefiniti dei parametri vengono configurati per l'indice.
distance_measure
: i valori supportati sonoL2_SQUARED
,COSINE
eDOT_PRODUCT
.L2_SQUARED
è il valore predefinito.num_neighbors
: il numero di vicini da restituire da una query ANN. Puoi anche eseguire l'override di 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 unindex_type
. Questa opzione non si applica 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
ricostruire un indice per i seguenti casi d'uso:
- Per ricostruire l'indice con opzioni diverse. Ad esempio, potresti voler utilizzare un tipo di indice o una misura della distanza diversa.
- Per ricostruire l'indice perché la tabella di base ha subito modifiche DML importanti. Ad esempio, devi addestrare nuovamente l'indice di ricerca vettoriale in base ai dati 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 alter_vector_index
. Puoi comunque eseguire query di ricerca sull'indice.
Eliminare un indice di ricerca vettoriale
Non puoi eseguire un'operazione DDL su una tabella con 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 supera il valore impostato al momento della creazione dell'indice di ricerca vettoriale.
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 sul carico dell'indice. - Le colonne
INDEX_MEMORY
eDATASET_MEMORY
forniscono informazioni sul consumo di memoria dell'indice.INDEX_MEMORY
indica la quantità di memoria impiegata dall'indice eDATASET_MEMORY
indica la quantità di memoria aggiuntiva impiegata durante la 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 vettore 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 sulla 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 ricostruire manualmente l'indice.
- 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 principali 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 di vettori 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'istruzioneSELECT
. 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 di vettori. 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 );
Potresti quindi utilizzare la seguente query per applicare 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 di distanza.
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 ricostruzione dell'indice, le query ANN sugli indici esistenti non vanno a buon fine.