Lavorare con le incorporamenti vettoriali utilizzando Cloud SQL per MySQL

Questa pagina descrive come interagire con Cloud SQL per creare applicazioni che utilizzino incorporamenti vettoriali.

Cloud SQL per MySQL supporta l'archiviazione di incorporamenti vettoriali. Poi puoi creare indici di ricerca vettoriale ed eseguire ricerche di somiglianze su questi incorporamenti vettoriali insieme al resto dei dati archiviati in Cloud SQL.

Spazio di archiviazione di rappresentazioni distribuite di vettori

Puoi utilizzare Cloud SQL per MySQL per archiviare incorporamenti vettoriali creando una colonna di incorporamento vettoriale in una tabella. La colonna di incorporamento speciale vettoriale è 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 differiscono solo per le ricerche dell'indice di ricerca vettoriale.

Puoi creare fino a una colonna di incorporamento vettoriale in una tabella e un indice di ricerca vettoriale per tabella. Ogni incorporamento di vettori archiviato nella stessa colonna deve avere esattamente le stesse dimensioni specificate al momento della definizione della colonna. Un incorporamento di vettori ha un limite massimo di 16.000 dimensioni. Se disponi di spazio di archiviazione e memoria sufficienti, puoi avere tabelle separate con colonne di incorporamento vettoriali diverse e indici di ricerca vettoriale diversi sulla stessa istanza.

Anche se non esiste un limite fisso al numero di incorporamenti vettoriali che puoi archiviare in una tabella, gli indici di ricerca vettoriale richiedono memoria. Per questo motivo, ti consigliamo di non archiviare più di 10 milioni di incorporamenti vettoriali in una tabella.

La replica funziona nello stesso modo per la colonna di incorporamento vettoriale e per altre colonne InnoDB MySQL.

Cloud SQL supporta la ricerca per somiglianza utilizzando le query di ricerca del vicino più prossimo (KNN) e del vicino più prossimo (ANN) approssimativo. Puoi utilizzare entrambi i tipi di ricerche vettoriali nelle tue istanze Cloud SQL. Puoi creare un indice di ricerca vettoriale per le ricerche ANN.

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 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 delle tabelle.

Per la ricerca KNN, Cloud SQL supporta anche le seguenti funzioni di ricerca della distanza vettoriale:

  • Coseno
  • Prodotto scalare
  • Distanza al quadrato L2

Per scoprire di più sull'uso delle funzioni di distanza di ricerca vettoriale, consulta Eseguire query sulla distanza di un incorporamento di un vettore.

Cloud SQL supporta la creazione e l'esecuzione di query sulle ricerche ANN tramite la creazione di indici di ricerca vettoriale. Un indice di ricerca vettoriale ANN consente di ottimizzare prestazioni rapide anziché 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 per le ricerche in un sottoinsieme più piccolo di un set di dati originale. La memoria utilizzata dall'indice è uguale alla dimensione del set di dati. Questo tipo di indice non è permanente 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% della dimensione del set di dati. Gli indici TREE_SQ sono persistenti su disco.
  • TREE_AH: un tipo di indice di ricerca vettoriale che fornisce un algoritmo di tipo di ricerca di hashing asimmetrico. Come implementato in Cloud SQL, questo tipo di indice non è ottimizzato per l'utilizzo della memoria e non è persistente.

Aggiorna indici di ricerca vettoriale

Cloud SQL per MySQL aggiorna gli indici di ricerca vettoriale in tempo reale. Qualsiasi transazione che esegue operazioni DML (Data Manipulation Language) sulla tabella di base trasmette anche le modifiche agli indici di ricerca vettoriali associati. Le modifiche in un indice di ricerca vettoriale sono visibili immediatamente a tutte le altre transazioni, il che significa un livello di isolamento READ_UNCOMMITTED.

Se esegui il rollback di una transazione, nell'indice di ricerca vettoriale si verificano anche le modifiche corrispondenti.

Replica degli indici di ricerca vettoriale

Cloud SQL per MySQL replica gli indici di ricerca vettoriale su tutte le repliche di lettura. I filtri di replica e la replica degli indici di ricerca vettoriale in 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 di incorporamenti vettoriali.

Sia le istanze Cloud SQL Enterprise che Cloud SQL Enterprise Plus supportano le rappresentazioni distribuite vettoriali.

Prima di iniziare

  • L'istanza deve eseguire Cloud SQL per MySQL MySQL versione 8.0.36.R20240401.03_00 o successiva.
  • L'istanza deve avere spazio su disco e memoria sufficienti per allocare memoria per il numero totale di incorporamenti vettoriali nell'istanza.

Attiva il supporto per gli incorporamenti vettoriali

Per attivare il supporto per gli incorporamenti vettoriali, 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 abilitare il supporto dell'incorporamento di vettori.

In FLAGS, configura i seguenti flag MySQL sulla tua istanza:

  • cloudsql_vector: imposta questo flag su on per abilitare il supporto della ricerca e dell'archiviazione tramite incorporamento di vettori. Puoi creare nuove colonne di incorporamento vettoriale e indici di ricerca vettoriale sull'istanza.
  • cloudsql_vector_max_mem_size: facoltativo. Specifica l'allocazione massima della memoria in byte per tutti gli indici di ricerca vettoriale dell'istanza. Se non specifichi questo flag, l'allocazione predefinita della memoria è 1 GB, ovvero l'allocazione minima della memoria. Per ulteriori informazioni su come calcolare la quantità 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 è ridotto della stessa quantità. Il valore massimo consentito per questo flag è 50% del totale di innodb_buffer_pool_size.

    Se specifichi un valore superiore al 50% del valore totale di innodb_buffer_pool_size, Cloud SQL riduce il valore effettivo al 50% della dimensione disponibile 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 di incorporamenti vettoriali in Cloud SQL per MySQL sono flag statici. Dopo aver aggiornato l'istanza con i flag, l'istanza viene riavviata automaticamente per rendere effettive le modifiche alla configurazione.

Per ulteriori informazioni su come configurare i flag di database per MySQL, consulta Configurare i flag di database.

Disattiva il supporto per gli incorporamenti vettoriali

Per disattivare il supporto per 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 per la quale stai disattivando il supporto dell'incorporamento di vettori.

L'impostazione di cloudsql_vector su off ti impedisce di creare nuove colonne di incorporamento vettoriale e nuovi indici di ricerca vettoriale. Dopo aver configurato il flag statico, l'istanza si riavvia automaticamente per applicare la modifica alla configurazione.

Dopo il riavvio dell'istanza, Cloud SQL per MySQL procede come segue:

  • Rimuove tutti gli indici di ricerca vettoriale TREE_SQ persistenti dal disco permanente.
  • Conserva le voci della tabella del dizionario dati per gli indici di ricerca vettoriale 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 seguito riattivi il flag cloudsql_vector per l'istanza, Cloud SQL tenterà di ricreare gli indici mentre l'istanza si riavvia in base alle voci nella tabella del dizionario dati.

Configura l'allocazione della memoria per gli indici di ricerca vettoriale

Cloud SQL crea e gestisce indici di ricerca vettoriale in memoria. Il tipo di indice TREE_SQ persiste dopo un arresto pulito e viene ricaricato dopo il riavvio dell'istanza. Durante il runtime, tutti gli indici di ricerca vettoriale devono rimanere in memoria.

Per assicurarti che Cloud SQL disponga di 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 si riavvia automaticamente per applicare la modifica della configurazione.
  • Se l'istanza ha esaurito 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 viene modificata 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 per rendere effettiva la modifica.

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. Devi considerare due requisiti di memoria:

  • Memoria del tempo di build: la memoria richiesta durante la creazione dell'indice.
  • Memoria dell'indice: la memoria occupata dall'indice dopo la sua creazione

Per un determinato indice, la dimensione del suo set di dati è la memoria necessaria per leggere tutti gli incorporamenti vettoriali in memoria. Dato che ogni dimensione è rappresentata da un numero in virgola mobile che utilizza 4 byte di memoria, puoi determinare la dimensione del set di dati nel seguente modo:

dataset_size = <num_embeddings> * (4 * <dimensions>)

Ad esempio, se disponi di 1 milione di incorporamenti di 768 dimensioni, il tuo dataset_size è di 3 GB.

Sulla base dell'esempio precedente, i requisiti di memoria per i diversi tipi di indice sono i seguenti:

Tipo di indice Crea memoria temporale Memoria indice
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

Se utilizzi gli indici di ricerca vettoriale TREE_SQ, devi anche tenere conto della memoria richiesta per la persistenza in fase di runtime. Alla quantità totale di memoria nella configurazione, aggiungi la quantità di memoria dell'indice utilizzata dal più grande indice di ricerca vettoriale TREE_SQ attivo.

Ogni volta che la tabella di base in cui sono archiviati gli incorporamenti di vettori viene sottoposta a operazioni DML, l'indice di ricerca vettoriale viene aggiornato in tempo reale. Questi aggiornamenti modificano l'ingombro della memoria dell'indice, che può ridursi o espandersi a seconda dell'operazione DML. Puoi monitorare l'utilizzo della 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, consulta Monitorare gli indici di ricerca vettoriale.

Configurazione della replica di lettura

Se l'istanza soddisfa i criteri di abilitazione dei flag e della versione di manutenzione, Cloud SQL supporta completamente gli incorporamenti vettoriali su una replica di lettura.

Se crei una replica da un'istanza principale in cui è abilitato il supporto dell'incorporamento vettoriale, la replica di lettura eredita le impostazioni di supporto dell'incorporamento vettoriale dall'istanza principale. Devi abilitare il supporto dell'incorporamento vettoriale singolarmente su istanze di replica di lettura già esistenti.

In termini di impatto sul ritardo di replica, la creazione e la gestione degli indici di ricerca vettoriale funziona come i normali indici MySQL.

Gli indici di ricerca vettoriale non sono supportati sulle repliche a cascata.

Esempio: una query e un indice di ricerca vettoriale ANN semplici

La procedura dettagliata di esempio riportata di seguito illustra i passaggi per creare un indice di ricerca vettoriale e una query basati su ANN in Cloud SQL.

  1. Genera incorporamenti vettoriali. Puoi creare incorporamenti vettoriali manualmente o usare un'API di incorporamento di testo di tua scelta. Per un esempio che utilizza Vertex AI, consulta Generare incorporamenti vettoriali basati sui dati di riga.

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

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

    commit;
    
  5. Crea l'indice di ricerca vettoriale. Se stai creando un indice TREE_SQ o TREE_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'
                                   );
    
  6. Trova i vicini più prossimi.

    SELECT title FROM books
    WHERE
    NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
    

Genera incorporamenti vettoriali in base ai dati delle righe

Puoi generare un incorporamento di vettore per i dati di una determinata riga utilizzando un'API di incorporamento di testo come Vertex AI o OpenAI. Puoi utilizzare qualsiasi API di incorporamento di testo con gli incorporamenti vettoriali di Cloud SQL. Tuttavia, devi utilizzare la stessa API di incorporamento del testo per la generazione del vettore di stringhe di query. Non puoi combinare API diverse per i dati di origine e la vettore delle query.

Ad esempio, puoi generare un incorporamento di vettore da Vertex AI:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("textembedding-gecko@001")
    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()

Archivia incorporamenti di vettori

Questa sezione fornisce esempi di istruzioni per l'archiviazione di incorporamenti vettoriali in Cloud SQL.

Crea una nuova tabella con una colonna di incorporamento 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;

Inserisci un'incorporamento di vettore

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]')
);

Eseguire l'upsert di un'incorporamento di vettore

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'incorporamento di vettore

UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;

Eliminare un'incorporamento di vettore

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 un richiamo perfetto. Puoi aggiungere un indice anche per usare la ricerca ANN, che scambia un richiamo per velocità. A differenza degli indici tipici, dopo aver aggiunto un indice approssimativo, vedrai risultati diversi per le query.

Suggerimenti

Questa sezione fornisce le best practice per lavorare con gli indici di ricerca vettoriali. Ogni carico di lavoro è diverso e potresti dover adeguarti di conseguenza.

  • Prima di creare un indice di ricerca vettoriale, devi caricare i dati nella tabella. La tabella di base deve avere almeno 1000 righe. Questi requisiti si applicano solo ai tipi di indici di ricerca TREE_SQ e TREE_AH. Se hai più punti dati disponibili, il partizionamento e l'addestramento dell'indice saranno migliori.
  • Monitorare l'utilizzo della memoria da parte degli indici. Se l'istanza esaurisce la memoria, non puoi creare o creare indici. Per gli indici esistenti, dopo aver raggiunto la soglia, Cloud SQL scrive avvisi nel log degli errori MySQL periodicamente. Puoi visualizzare l'utilizzo della memoria nella tabella information_schema.innodb_vector_indexes.
  • Se la tabella di base sottostante è stata sottoposta a importanti modifiche DML, ricrea 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 il numero di partizioni da calcolare 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 sull'indice di ricerca vettoriale

Per la durata di tutte e tre le operazioni sull'indice di ricerca vettoriale (creazione, modifica e rimozione), la tabella di base viene messa in modalità di sola lettura. Durante queste operazioni, non sono consentiti DML nella tabella di base.

Persistenza, arresto e impatto sulla manutenzione

Solo gli indici di ricerca vettoriale che utilizzano il tipo TREE_SQ rimangono su disco dopo un arresto pulito dopo l'arresto 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 anomalo, Cloud SQL deve ricreare gli indici di ricerca vettoriale. Ad esempio, ogni volta che l'istanza subisce un arresto anomalo e un ripristino da backup e ripristino, recupero point-in-time (PITR) o failover ad alta disponibilità, Cloud SQL ricostruisce i tuoi indici di ricerca vettoriale. Per questi eventi si verifica quanto segue:

  • La ricreazione viene eseguita automaticamente in background.
  • Durante la nuova creazione, la tabella di base è in modalità di sola lettura.
  • Se la ricompilazione automatica non riesce a ottenere un blocco nella tabella entro un periodo di timeout specifico, Potrebbe essere necessario ricreare l'indice manualmente.

Il tempo necessario per la rigenerazione di un indice potrebbe aumentare il tempo necessario per l'arresto, il che potrebbe aumentare anche i tempi di manutenzione e aggiornamento richiesti per un'istanza.

Crea 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 di creazione dell'indice di ricerca e di modifica dell'indice di ricerca supportano più parametri che puoi specificare con coppie chiave-valore separate da virgole. Tutti i parametri delle funzioni di creazione dell'indice di ricerca sono facoltativi. Se specifichi una stringa vuota o NULL, i valori predefiniti dei parametri vengono configurati per l'indice.

  • distance_measure: i valori supportati sono L2_SQUARED, COSINE e DOT_PRODUCT. L2_SQUARED è l'impostazione predefinita.
  • num_neighbors: il numero di vicini da restituire per impostazione predefinita durante le query ANN. Puoi anche sostituire 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 e TREE_AH.

    • BRUTE_FORCE è l'impostazione predefinita per una tabella con meno di 10.000 righe
    • TREE_SQ è l'impostazione predefinita per una tabella con 10.000 o più righe

    Per specificare il tipo di indice TREE_AH o TREE_SQ, la dimensione della tabella di base deve essere maggiore di 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 a BRUTE_FORCE. Se specifichi il tipo di indice TREE_SQ o TREE_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 ricreare 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:

  • Vuoi ricreare l'indice con opzioni diverse. Ad esempio, potresti voler utilizzare un tipo di indice o una misura della distanza diversi.
  • Vuoi ricreare l'indice perché la tabella di base è stata sottoposta a importanti modifiche DML. Ad esempio, devi riaddestrare l'indice di ricerca vettoriale in base ai dati correnti nella tabella di base.

Tutti i parametri necessari per ricreare l'indice sono identici a quelli disponibili per la creazione dell'indice e sono facoltativi. Se specifichi una stringa vuota o NULL quando ricrei l'indice, quest'ultimo viene ricreato in base ai parametri specificati al momento della creazione dell'indice. Se al momento della creazione dell'indice non vengono forniti parametri, vengono utilizzati i valori predefiniti dei parametri.

L'indice di ricerca vettoriale esistente è disponibile durante l'operazione di modifica. Puoi comunque eseguire query di ricerca sull'indice.

Elimina 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 su incorporamenti dei vettori

Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sugli incorporamenti vettori.

Visualizza le rappresentazioni distribuite di vettori

SELECT vector_to_string(embedding) FROM books;

Ottieni la ricerca esatta del vicino a un incorporamento di un vettore

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

Ottieni la ricerca approssimativa del vicino a un incorporamento di un vettore

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 testare per una ricerca vettoriale 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 sostituisce il valore impostato al momento della creazione dell'indice di ricerca vettoriale.

Filtra incorporamenti di vettori

Utilizza colonne aggiuntive come predicati per perfezionare il filtro dei risultati delle query di incorporamento vettoriale. Ad esempio, se aggiungi una colonna printyear, puoi aggiungere un valore anno specifico come filtro alla query.

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;

Query sulla distanza di un'incorporamento di un vettore

Questa sezione fornisce esempi di funzioni di distanza vettoriale disponibili per la ricerca KNN.

Calcola la distanza coseno

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Ottenere la distanza del prodotto Dot

SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Calcolare la distanza al quadrato L2

SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Visualizzare righe entro una determinata distanza

SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;

Puoi combinare 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;

Monitora 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;

Un 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 scansionare per una query.
  • Le colonne STATE e STATUS indicano lo stato attuale dell'indice. Durante la fase di creazione, la colonna dello stato fornisce informazioni su quanto si trova l'indice di ricerca vettoriale nella fase di creazione.
  • La colonna INITIAL_SIZE fornisce le dimensioni della tabella durante la creazione dell'indice. Puoi confrontare questa dimensione con CURRENT_SIZE per avere un'idea di quanto è cambiato l'indice dalla sua creazione a causa dei file DML nella tabella di base.
  • Le colonne QUERIES e MUTATIONS forniscono informazioni in tempo reale sul livello di affollamento dell'indice.
  • Le colonne INDEX_MEMORY e DATASET_MEMORY forniscono informazioni sul consumo di memoria dell'indice. INDEX_MEMORY

    indica la quantità di memoria consumata dall'indice e DATASET_MEMORY indica la quantità di memoria aggiuntiva consumata durante la creazione.

Per ottenere un elenco degli indici vettoriali di ricerca creati nell'istanza, puoi visualizzare la tabella del dizionario 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

  1. Può esserci una sola colonna di incorporamento vettoriale per tabella.
  2. Può esserci un solo indice di ricerca vettoriale per tabella.
  3. Un incorporamento vettoriale può avere fino a 16.000 dimensioni.
  4. Il partizionamento a livello di tabella InnoDB nelle tabelle con colonne di incorporamento vettoriale non è supportato.
  5. Se l'istanza si riavvia da un arresto non corretto, Cloud SQL ricostruisce automaticamente l'indice di ricerca vettoriale.
    1. Durante la ricostruzione dell'indice di ricerca vettoriale, la tabella di base è di sola lettura.
    2. Se Cloud SQL non riesce ad acquisire un blocco nella tabella entro il periodo di tempo specificato, la ricreazione automatica dell'indice potrebbe non riuscire.
    3. Se la ricreazione automatica dell'indice non va a buon fine, devi ricreare l'indice manualmente.
  6. 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 composte non possono includere questi tipi.
  7. 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.
  8. Gli incorporamenti vettoriali non sono supportati nelle tabelle non InnoDB o nelle tabelle temporanee.
  9. La colonna di incorporamento vettoriale non può essere una colonna generata.
  10. Il predicato NEAREST..TO può essere combinato con altri predicati "scalari" utilizzando AND o OR. I predicati scalari nella tabella vengono valutati dopo l'applicazione dei predicati vettoriali.
  11. Il predicato NEAREST..TO è supportato solo in un'istruzione SELECT. Altre istruzioni DML non supportano NEAREST..TO.
  12. Le sottoquery non sono supportate con NEAREST..TO. Impossibile aggiungere un vincolo alla chiave primaria della tabella di base se è presente un indice di ricerca vettoriale.
  13. Il pre-filtro è possibile solo tramite le funzioni di distanza e utilizzando ORDER BY con LIMIT.

    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
    );
    

    Quindi, puoi utilizzare la seguente query per eseguire il pre-filtro.

    //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.

Risolvere i problemi

In caso di arresto anomalo, l'indice viene ricreato automaticamente. Quando è in corso una ricompilazione, sono previste due limitazioni:

  1. Durante la creazione dell'indice, la tabella di base è in modalità di sola lettura.
  2. Durante la nuova creazione dell'indice, le query ANN su indici esistenti non vanno a buon fine.

Passaggi successivi