Questa pagina descrive in dettaglio come interagire con Cloud SQL per creare applicazioni che utilizzano vector embedding.
Cloud SQL per MySQL supporta l'archiviazione di incorporamenti vettoriali. Puoi quindi creare indici di ricerca vettoriale ed eseguire ricerche di similarità su questi vector embedding insieme al resto dei dati archiviati in Cloud SQL.
Archiviazione di vector embedding
Puoi utilizzare Cloud SQL per MySQL per archiviare gli incorporamenti vettoriali creando una colonna di incorporamento vettoriale in una tabella. La colonna speciale di incorporamento vettoriale viene mappata al tipo di dati VARBINARY
. Come altri dati relazionali nella tabella, puoi accedere
agli incorporamenti vettoriali nella tabella con le garanzie transazionali esistenti. Una tabella
con una colonna di incorporamento vettoriale è una normale tabella InnoDB ed è quindi
conforme alle proprietà di atomicità, coerenza, isolamento e durabilità (ACID). Le proprietà ACID deviano solo per le ricerche di indici di ricerca vettoriale.
Quando configuri una tabella per i vector embedding, tieni presente quanto segue:
Puoi creare al massimo una colonna di incorporamento vettoriale in una tabella e un indice di ricerca vettoriale per tabella. Ogni incorporamento vettoriale 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 vettoriale e indici di ricerca vettoriale diversi nella stessa istanza.
Sebbene non esista un limite rigido al numero di incorporamenti vettoriali che puoi archiviare in una tabella, gli indici di ricerca vettoriale richiedono memoria. Per questo motivo, ti consigliamo di archiviare non più di 10 milioni di incorporamenti vettoriali in una tabella.
Consulta anche l'elenco delle limitazioni.
La replica funziona allo stesso modo per la colonna di incorporamento vettoriale e per le altre colonne MySQL InnoDB.
Ricerca per somiglianza
Cloud SQL supporta la ricerca di similarità utilizzando query di ricerca K-Nearest Neighbor (KNN) e Approximate Nearest Neighbor (ANN). Puoi utilizzare entrambi i tipi di ricerca vettoriale 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 esatta del vicino più prossimo. L'esecuzione di una ricerca vettoriale KNN fornisce un richiamo 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 della ricerca vettoriale, consulta Eseguire query sulla distanza di un embedding vettoriale.
Ricerca approssimativa del vicino più prossimo (ANN)
Cloud SQL supporta la creazione e l'esecuzione di query di ricerca ANN tramite la creazione di indici di ricerca vettoriale. Un indice di ricerca vettoriale ANN ti consente di ottimizzare per prestazioni rapide anziché per un richiamo perfetto. Per la ricerca ANN, Cloud SQL supporta i seguenti tipi di indice:
BRUTE_FORCE
: il tipo di indice di ricerca vettoriale predefinito per una tabella di base con meno di 10.000 righe. Questo tipo è più adatto alle 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 salvato su disco.TREE_SQ
: il tipo di indice di ricerca vettoriale predefinito per una tabella di base con 10.000 o più righe. Questo tipo utilizza la quantità minima di memoria o circa il 25% delle dimensioni del set di dati. Gli indiciTREE_SQ
vengono salvati 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'utilizzo della memoria e non viene reso 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 apportate 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 di rollback corrispondenti vengono apportate anche nell'indice di ricerca vettoriale.
Replica degli indici di ricerca vettoriale
Cloud SQL per MySQL replica gli indici di ricerca vettoriale in tutte le repliche di lettura. I filtri di replica e la replica degli indici di ricerca vettoriale nelle repliche a cascata non sono supportati.
Configura un'istanza per supportare gli incorporamenti vettoriali
Questa sezione descrive come configurare l'istanza Cloud SQL per supportare l'archiviazione, l'indicizzazione e l'esecuzione di query sugli incorporamenti vettoriali.
Le istanze di Cloud SQL Enterprise e 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 successive. - L'istanza deve disporre di spazio su disco sufficiente per allocare la memoria per il numero totale di incorporamenti vettoriali sull'istanza.
Attivare gli incorporamenti vettoriali
Per attivare il supporto degli incorporamenti vettoriali, devi configurare i flag di 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 per l'incorporamento di vettori.
In FLAGS, configura i seguenti flag MySQL sull'istanza:
cloudsql_vector
: imposta questo flag suon
per abilitare l'archiviazione e la ricerca di incorporamenti vettoriali. Puoi creare nuove colonne di incorporamento vettoriale e indici di ricerca vettoriale sull'istanza.cloudsql_vector_max_mem_size
: facoltativo. Specifica l'allocazione massima di memoria in byte per tutti gli indici di ricerca vettoriale nell'istanza. Se non specifichi questo flag, l'allocazione di memoria predefinita è 1 GB, che è l'allocazione di memoria minima. Per ulteriori informazioni su come calcolare l'importo da specificare, consulta Configurare l'allocazione di memoria per gli indici di ricerca vettoriale.Questa memoria dedicata proviene dalla memoria allocata al tuo
innodb_buffer_pool_size
. Il buffer pool disponibile viene ridotto dello stesso importo. Il valore massimo consentito per questo flag è il 50% del tuoinnodb_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 incorporamenti vettoriali in Cloud SQL per MySQL sono statici. Dopo aver aggiornato l'istanza con i flag, l'istanza si riavvia automaticamente affinché le modifiche alla configurazione vengano applicate.
Per saperne di più su come configurare i flag di database per MySQL, consulta la pagina Configurare i flag di database.
Disattivare gli incorporamenti vettoriali
Per disattivare gli incorporamenti 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'incorporamento vettoriale.
Se imposti cloudsql_vector
su off
, non potrai creare nuove colonne di incorporamento vettoriale e indici di ricerca vettoriale. Dopo aver configurato questo flag statico, l'istanza si riavvia automaticamente affinché la modifica alla 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 permanente. - Conserva le voci della tabella del dizionario di dati per gli indici di ricerca vettoriale che sono stati creati. Tuttavia, Cloud SQL per MySQL non ricrea gli indici e qualsiasi query di ricerca in questi indici restituisce un errore.
- Continua ad archiviare gli incorporamenti 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 ricompilare gli indici durante il riavvio dell'istanza in base alle voci della tabella del dizionario dei dati.
Configurazione della replica di lettura
Se l'istanza soddisfa i criteri di abilitazione della versione di manutenzione e dei flag, Cloud SQL supporta completamente gli incorporamenti vettoriali su una replica di lettura.
Se crei una replica da un'istanza principale con il supporto dell'incorporamento di vettori abilitato, la replica di lettura eredita le impostazioni di supporto dell'incorporamento di vettori dall'istanza principale. Devi abilitare il supporto dell'incorporamento di vettori singolarmente nelle istanze di replica di lettura già esistenti.
In termini di impatto sul ritardo di replica, la creazione e la manutenzione degli indici di ricerca vettoriale funzionano allo stesso modo degli indici MySQL regolari.
Gli indici di ricerca vettoriale non sono supportati nelle repliche a cascata.
Esempio: un indice e una query di ricerca vettoriale ANN
La seguente procedura dettagliata di esempio fornisce i passaggi per creare un indice di ricerca vettoriale basato su ANN e una query in Cloud SQL.
Genera vector embedding. Puoi creare incorporamenti vettoriali manualmente o utilizzare un'API di incorporamento di testo a tua scelta. Per un esempio che utilizza Vertex AI, vedi Generare incorporamenti vettoriali in base ai dati delle righe.
Crea una tabella in Cloud SQL per MySQL che contenga 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 vettoriale 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
TREE_SQ
o un indiceTREE_AH
, la tabella deve contenere almeno 1000 righe.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Ottieni i vicini più prossimi.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Genera incorporamenti vettoriali basati sui 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 incorporamento di testo con i vector embedding di Cloud SQL. Tuttavia, devi utilizzare la stessa API per l'incorporamento di testo per la generazione di vettori di stringhe di query. Non puoi combinare API diverse per i dati di origine e la vettorizzazione 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()
Memorizzare gli incorporamenti vettoriali
Questa sezione fornisce esempi di istruzioni per l'archiviazione di vector embedding in Cloud SQL.
Creare una nuova tabella con una colonna di embedding vettoriale
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Aggiungere una colonna di incorporamento vettoriale a una tabella esistente
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Inserire un vector embedding
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]')
);
Inserisci o aggiorna un vector embedding
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]');
Aggiorna un vector embedding
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Eliminare un vector embedding
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Utilizzare gli indici di ricerca vettoriale
Per impostazione predefinita, puoi eseguire la ricerca esatta del vicino più prossimo, che fornisce il richiamo perfetto. Puoi anche aggiungere un indice per utilizzare la ricerca ANN, che privilegia la velocità a discapito del richiamo. A differenza degli indici tipici, dopo aver aggiunto un indice approssimativo, i risultati delle query sono diversi.
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 indice di ricerca
TREE_SQ
eTREE_AH
. Se hai a disposizione più punti dati, avrai una migliore partizione e un migliore addestramento 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 la dimensione iniziale dell'indice al momento della creazione e la dimensione attuale 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 di indice di ricerca vettoriale
Per la durata di tutte e tre le operazioni dell'indice di ricerca vettoriale (creazione, modifica ed eliminazione), la tabella di base viene inserita in modalità di sola lettura. Durante queste operazioni, non sono consentite istruzioni DML sulla tabella di base.
Persistenza, arresto e impatto sulla manutenzione
Solo gli indici di ricerca vettoriale che utilizzano il tipo TREE_SQ
vengono salvati su 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 l'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 anomalo, Cloud SQL deve ricreare gli indici di ricerca vettoriale. Ad esempio, ogni volta che l'istanza subisce un arresto anomalo e un ripristino dal backup e dal ripristino, dal recupero point-in-time (PITR) o dal failover di alta disponibilità (HA), Cloud SQL ricompila 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 ricompilazione automatica non riesce a bloccare la tabella entro un periodo di timeout specifico, la ricompilazione non va a buon fine. Potresti dover ricostruire l'indice manualmente.
Il tempo necessario per la ricostruzione di un indice potrebbe aumentare il tempo necessario per un arresto, il che potrebbe anche aumentare il tempo necessario per la manutenzione e l'aggiornamento di 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
viene mantenuto in caso di arresto pulito e 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 tutti gli indici di ricerca vettoriale in memoria, configura l'istanza Cloud SQL con un flag di database cloudsql_vector_max_mem_size
. cloudsql_vector_max_mem_size
determina 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 buffer pool.
- Dopo aver impostato questo flag, l'istanza viene riavviata automaticamente affinché la modifica della configurazione venga applicata.
- Se la tua 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 vettoriale 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 di memoria.
- NEW_MEMORY_VALUE: l'allocazione di memoria aggiornata, in byte, per gli indici di ricerca vettoriale.
Questa modifica riavvia automaticamente l'istanza in modo che possa diventare effettiva.
Calcolare la memoria richiesta
La quantità di memoria richiesta da un indice dipende dal tipo di indice, dal numero di incorporamenti vettoriali e dalla dimensionalità degli incorporamenti. Esistono due requisiti di memoria da considerare:
- Memoria di compilazione:la memoria richiesta durante la creazione dell'indice.
- Memoria indice: la memoria occupata dall'indice dopo la sua creazione.
Per un determinato indice, la dimensione del set di dati è la memoria necessaria per leggere tutti gli incorporamenti dei vettori in memoria. Dato che ogni dimensione è rappresentata da un numero in virgola mobile che utilizza 4 byte di memoria, puoi determinare dataset_size nel seguente modo:
dataset_size = <num_embeddings> * (4 * <dimensions>)
Ad esempio, se hai un milione di incorporamenti di 768
dimensioni, il tuo 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 costruzione | 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 necessaria per la persistenza in fase di runtime. 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 di memoria dell'indice, che può ridursi o espandersi a seconda
dell'operazione DML. Puoi monitorare l'utilizzo di memoria di un indice eseguendo una query sulla tabella information_schema.innodb_vector_indexes
. Per informazioni
sul monitoraggio delle dimensioni dell'indice di ricerca vettoriale, vedi Monitorare gli indici di ricerca vettoriale.
Crea un indice Vector Search
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 che specifichi 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 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 10.000 o più 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 è 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 in modo esplicito per ricostruire un indice di ricerca vettoriale. Per utilizzare questa funzione, l'indice deve già esistere. Potresti voler ricreare un indice per i seguenti casi d'uso:
- Per ricreare l'indice con opzioni diverse. Ad esempio, potresti voler utilizzare un tipo di indice diverso o una misura di distanza diversa.
- Per ricompilare l'indice perché la tabella di base ha subito modifiche DML importanti. Ad esempio, devi eseguire il retraining dell'indice di ricerca vettoriale in base ai dati nella tabella di base.
Tutti i parametri per la ricreazione dell'indice sono identici a quelli disponibili per la creazione dell'indice e sono anche facoltativi. Se specifichi una stringa vuota o NULL quando ricostruisci l'indice, l'indice viene ricostruito in base ai parametri specificati al momento della creazione dell'indice. Se non vengono forniti parametri al momento della creazione dell'indice, vengono utilizzati i valori predefiniti dei parametri.
L'indice di ricerca vettoriale esistente è disponibile durante l'operazione alter_vector_index
. Puoi comunque eseguire query di ricerca sull'indice.
Elimina un indice Vector Search
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');
Eseguire query sugli incorporamenti vettoriali
Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sugli incorporamenti di vettori.
Visualizza gli incorporamenti vettoriali
SELECT vector_to_string(embedding) FROM books;
Ottieni la ricerca esatta del vicino per un vector embedding
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Ottenere la ricerca approssimativa del vicino più prossimo per un incorporamento 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 override del valore impostato al momento della creazione dell'indice Vector Search.
Filtrare gli incorporamenti vettoriali
Utilizza colonne aggiuntive come predicati per perfezionare il filtraggio dei risultati della query di incorporamento
di vettori. Ad esempio, se aggiungi una colonna printyear
, puoi aggiungere un valore di anno specifico come filtro alla query.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Eseguire query sulla distanza di un vector embedding
Questa sezione fornisce esempi di funzioni di distanza vettoriale disponibili per la ricerca KNN.
Ottenere la distanza coseno
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Ottenere 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 le 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 questo comando:
SELECT * FROM information_schema.innodb_vector_indexes;
L'output di esempio potrebbe avere il seguente aspetto:
*************************** 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 attuale dell'indice. Durante la fase di creazione, la colonna Stato fornisce informazioni sullo stato 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 sia cambiato l'indice dalla sua creazione a causa di DML nella 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 eDATASET_MEMORY
indica la quantità di memoria aggiuntiva utilizzata durante la compilazione.
Per ottenere un elenco degli indici dei vettori di ricerca creati nell'istanza, puoi visualizzare
la tabella del dizionario dei dati mysql.vector_indexes
.
Per visualizzare la tabella, esegui questo 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 vettoriale per tabella.
- Può esserci un solo indice di ricerca vettoriale per tabella.
- Un incorporamento vettoriale può avere fino a 16.000 dimensioni.
- Il partizionamento a livello di tabella InnoDB nelle tabelle con colonne di incorporamento vettoriale non è supportato.
- Se l'istanza viene riavviata 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 ricompilazione automatica dell'indice potrebbe non riuscire.
- Se la ricreazione automatica dell'indice non riesce, devi ricrearlo manualmente.
- Per aggiungere una colonna di incorporamento vettoriale, la tabella deve avere una chiave primaria.
Cloud SQL non supporta le chiavi primarie di tipo
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
o i 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.
- Gli incorporamenti vettoriali non sono supportati nelle tabelle non InnoDB o nelle tabelle temporanee.
- La colonna di incorporamento 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 vettoriale. Il pre-filtraggio è fattibile 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 eseguire il pre-filtraggio.
//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-filtraggio è supportato con le funzioni
NEAREST..TO
e di distanza.
Risoluzione dei problemi
In caso di arresto anomalo, l'indice viene ricreato automaticamente. Quando una ricostruzione è in corso, esistono 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.