Lavorare con gli embedding vettoriali

Questa pagina illustra in dettaglio come puoi interagire con Cloud SQL per creare applicazioni che utilizzano gli embedding vettoriali.

Cloud SQL per MySQL supporta l'archiviazione di incorporamenti vettoriali. Puoi quindi creare indici di ricerca vettoriale ed eseguire ricerche di similarità su questi incorporamenti vettoriali, insieme al resto dei dati archiviati in Cloud SQL.

Archiviazione degli embedding vettoriali

Puoi utilizzare Cloud SQL per MySQL per archiviare gli incorporamenti vettoriali creando una colonna di incorporamenti vettoriali in una tabella. La colonna di embedding vettoriale speciale viene mappata al tipo di dati VARBINARY. Come per altri dati relazionali nella tabella, puoi accedere agli embedding vettori nella tabella con le garanzie transazionali esistenti. Una tabella con una colonna di embedding vettoriale è una normale tabella InnoDB ed è quindi conforme alle proprietà atomicità, coerenza, isolamento e durabilità (ACID). Le proprietà ACID variano solo per le ricerche nell'indice di ricerca vettoriale.

Puoi creare fino a una colonna di embedding vettoriale in una tabella e un indice di ricerca vettoriale per tabella. Ogni embedding di vettore memorizzato nella stessa colonna deve avere esattamente le stesse dimensioni specificate quando hai definito la colonna. Un embedding vettoriale ha un limite massimo di 16.000 dimensioni. Se hai abbastanza spazio di archiviazione e memoria a disposizione, puoi avere tabelle separate con colonne di embedding di vettori e indici di ricerca vettoriale diversi nella stessa istanza.

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

La replica funziona allo stesso modo per la colonna di embedding vettoriale come per altre colonne InnoDB di MySQL.

Cloud SQL supporta la ricerca di somiglianza utilizzando sia le query di ricerca K-Nearest Neighbor (KNN) sia quelle di ricerca Approximate Nearest Neighbor (ANN). Puoi utilizzare entrambi i tipi di ricerche vettoriali nelle tue istanze Cloud SQL. Puoi creare un indice di ricerca vettoriale per le ricerche ANN.

Cloud SQL supporta le query utilizzando la ricerca vettoriale KNN, nota anche come ricerca del vicino più prossimo esatto. L'esecuzione di una ricerca vettoriale KNN fornisce un recupero perfetto. Puoi eseguire ricerche KNN senza dover creare un indice di ricerca vettoriale. La ricerca KNN si basa sull'esecuzione di un algoritmo di scansione della tabella.

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

  • Coseno
  • Prodotto scalare
  • Distanza al quadrato L2

Per ulteriori informazioni sull'utilizzo delle funzioni di distanza di ricerca vettoriale, consulta Eseguire query sulla distanza di un embedding vettoriale.

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 indici TREE_SQ vengono memorizzati su disco.
  • TREE_AH: un tipo di indice di ricerca vettoriale che fornisce un algoritmo di tipo di ricerca con hashing asimmetrico. Come implementato in Cloud SQL, questo tipo di indice non è ottimizzato per l'impronta in memoria e non è persistente.

Aggiorna gli indici di ricerca vettoriale

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

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

Replica degli indici di ricerca vettoriale

Cloud SQL per MySQL replica gli indici di ricerca di vettori in tutte le repliche di lettura. I filtri di replica e la replica degli indici di ricerca vettoriale alle repliche a cascata non sono supportati.

Configurare un'istanza per supportare gli embedding vettoriali

Questa sezione descrive come configurare l'istanza Cloud SQL per supportare lo stoccaggio, l'indicizzazione e le query degli embedding vettoriali.

Sia le istanze della versione Cloud SQL Enterprise sia quelle della versione Cloud SQL Enterprise Plus supportano gli incorporamenti vettoriali.

Prima di iniziare

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

Attivare il supporto per gli embedding vettoriali

Per attivare il supporto degli embedding di vettori, devi configurare i flag del database MySQL.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

Sostituisci INSTANCE_NAME con il nome dell'istanza su cui vuoi attivare il supporto dell'embedding di vettori.

In FLAGS, configura i seguenti flag MySQL sull'istanza:

  • cloudsql_vector: imposta questo flag su on per attivare il supporto di archiviazione e ricerca per l'inserimento di vettori. Puoi creare nuove colonne di embedding vettoriale e indici di ricerca vettoriale nell'istanza.
  • cloudsql_vector_max_mem_size: facoltativo. Specifica l'allocazione massima della memoria in byte per tutti gli indici di ricerca vettoriale nell'istanza. Se non specifichi questo flag, l'allocazione della memoria predefinita è 1 GB, ovvero l'allocazione minima della memoria. Per ulteriori informazioni su come calcolare l'importo da specificare, consulta Configurare l'allocazione della memoria per gli indici di ricerca vettoriale.

    Questa memoria dedicata proviene dalla memoria allocata al tuo innodb_buffer_pool_size. Il pool di buffer disponibile viene ridotto della stessa quantità. Il valore massimo consentito per questo flag è il 50% del innodb_buffer_pool_size totale.

    Se specifichi un valore superiore al 50% del totaleinnodb_buffer_pool_size, Cloud SQL riduce il valore effettivo al 50% delle dimensioni disponibili e registra un messaggio di avviso per l'istanza.

Dopo aver configurato i flag, il comando potrebbe essere simile al seguente:

gcloud sql instances patch my-instance \
  --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296

I flag per configurare il supporto degli embedding di vettori in Cloud SQL per MySQL sono flag statici. Dopo aver aggiornato l'istanza con i flag, l'istanza viene riavviata automaticamente affinché le modifiche alla configurazione vengano applicate.

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

Disattivare il supporto degli embedding vettoriali

Per disattivare il supporto degli embedding vettoriali, imposta il cloudsql_vector flag su off.

Ad esempio:

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=cloudsql_vector=off

Sostituisci INSTANCE_NAME con il nome dell'istanza su cui disattivi il supporto dell'embedding di vettori.

L'impostazione di cloudsql_vector su off impedisce di creare nuove colonne di embedding di vettori e nuovi indici di ricerca di vettori. Dopo aver configurato questo flag statico, l'istanza si riavvia automaticamente affinché la modifica della configurazione venga applicata.

Dopo il riavvio dell'istanza, Cloud SQL per MySQL esegue le seguenti operazioni:

  • Rimuove tutti gli indici di ricerca vettoriale TREE_SQ persistenti dal disco.
  • Mantiene le voci della tabella del dizionario di dati per gli indici di ricerca vettoriale che sono stati creati. Tuttavia, Cloud SQL per MySQL non ricostruisce gli indici e qualsiasi query di ricerca in questi indici restituisce un errore.
  • Continua a memorizzare gli embedding vettoriali nelle tabelle di base. Gli incorporamenti vettoriali rimangono accessibili.

Se in un secondo momento riattivi il flag cloudsql_vector per l'istanza, Cloud SQL tenta di ricostruire gli indici durante il riavvio dell'istanza in base alle voci della tabella del dizionario dei dati.

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

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

Per assicurarti che Cloud SQL abbia memoria sufficiente per mantenere in memoria tutti gli indici di ricerca vettoriale, configura l'istanza Cloud SQL con un flag di database cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size regola la quantità di memoria dedicata dall'istanza Cloud SQL per gli indici di ricerca vettoriale. Quando configuri il valore del flag, tieni presente quanto segue:

  • Il valore predefinito e minimo è 1 GB. Il limite superiore è il 50% della dimensione del pool di buffer.
  • Dopo aver impostato questo flag, l'istanza viene riavviata automaticamente affinché la modifica della configurazione venga applicata.
  • Se l'istanza ha utilizzato tutta la memoria configurata, non puoi creare o modificare indici di ricerca vettoriale.

Per aggiornare la memoria allocata per gli indici di ricerca di vettori nell'istanza, modifica il valore del flag cloudsql_vector_max_mem_size.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome dell'istanza su cui stai modificando l'allocazione della memoria.
  • NEW_MEMORY_VALUE: l'allocazione della memoria aggiornata, in byte, per i tuoi indici di ricerca vettoriale

Questa modifica riavvia automaticamente l'istanza in modo che possa essere applicata.

Calcolare la memoria richiesta

La quantità di memoria richiesta da un indice dipende dal tipo di indice, dal numero di embedding vettoriali e dalla dimensionalità degli embedding. Esistono due requisiti di memoria da considerare:

  • Memoria per la creazione: la memoria richiesta durante la creazione dell'indice
  • Memoria dell'indice: la memoria occupata dall'indice dopo la sua compilazione

Per un determinato indice, la dimensione del set di dati corrisponde alla memoria necessaria per leggere tutti gli incorporamenti vettori in memoria. Poiché ogni dimensione è rappresentata da un valore float che utilizza 4 byte di memoria, puoi determinare la dimensione del set di dati come segue:

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

Ad esempio, se hai 1 milione di embedding di 768 dimensioni, il valore di dataset_size è 3 GB.

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

Tipo di indice Memoria del tempo di compilazione Memoria dell'indice
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

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

Ogni volta che la tabella di base in cui sono archiviati gli embedding vettoriali viene sottoposta a operazioni DML, l'indice di ricerca vettoriale viene aggiornato in tempo reale. Questi aggiornamenti modificano l'impronta in memoria dell'indice, che può ridursi o espandersi a seconda dell'operazione DML. Puoi monitorare l'impronta di memoria di un indice eseguendo una query sulla tabella information_schema.innodb_vector_indexes. Per informazioni su come monitorare le dimensioni dell'indice di ricerca di vettori, consulta Monitorare gli indici di ricerca di vettori.

Configurazione della replica di lettura

Se l'istanza soddisfa i criteri di attivazione della versione di manutenzione e degli indicatori, Cloud SQL supporta completamente gli embedding di vettori su una replica di lettura.

Se crei una replica da un'istanza principale in cui è abilitato il supporto dell'embedding vettoriale, la replica di lettura eredita le impostazioni di supporto dell'embedding vettoriale dall'istanza principale. Devi attivare il supporto dell'embedding di vettori individualmente nelle istanze di replica di lettura già esistenti.

In termini di impatto sul ritardo della replica, la creazione e la gestione degli indici di ricerca vettoriale avviene nello stesso modo degli indici MySQL standard.

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

Esempio: un semplice indice e una query di ricerca di vettori ANN

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

  1. Genera incorporamenti vettoriali. Puoi creare incorporamenti di vettori manualmente o utilizzare un'API di incorporamento del testo a tua scelta. Per un esempio che utilizza Vertex AI, consulta Generare incorporamenti vettoriali in base ai dati delle righe.

  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 embedding vettore 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 embedding vettoriali in base ai dati delle righe

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

Ad esempio, puoi generare un embedding vettoriale da Vertex AI:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

Memorizza gli embedding vettoriali

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

Creare una nuova tabella con una colonna di embedding di vettori

CREATE TABLE books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(60),
  embedding VECTOR(3) USING VARBINARY
  );

Aggiungere una colonna di embedding di vettori a una tabella esistente

ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;

Inserire un embedding vettoriale

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')
);

Inserire più incorporamenti vettoriali

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')),
     ('book title', string_to_vector('[4,5,6]')
);

Esegui l'upsert di un embedding vettoriale

INSERT INTO books (
  id,
  title,
  embedding
  ) VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
     )
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

Aggiornare un embedding vettoriale

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

Eliminare un embedding vettoriale

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

Lavorare con gli indici di ricerca vettoriale

Per impostazione predefinita, puoi eseguire la ricerca del vicino più prossimo esatto, che fornisce un recupero perfetto. Puoi anche aggiungere un indice per utilizzare la ricerca ANN, che offre una maggiore velocità a fronte di un calo del richiamo. A differenza degli indici tipici, dopo aver aggiunto un indice approssimativo, vedrai risultati diversi per le query.

Consigli

Questa sezione fornisce le best practice per lavorare con gli indici di ricerca vettoriale. Ogni carico di lavoro è diverso e potrebbe essere necessario apportare modifiche di conseguenza.

  • Prima di creare un indice di ricerca vettoriale, devi caricare i dati nella tabella. La tabella di base deve contenere almeno 1000 righe. Questi requisiti si applicano solo ai tipi di indici di ricerca TREE_SQ e TREE_AH. Se hai più punti dati disponibili, puoi eseguire una suddivisione e un addestramento migliori dell'indice.
  • Monitora l'utilizzo della memoria degli indici. Se l'istanza esaurisce la memoria, non puoi creare o compilare indici. Per gli indici esistenti, dopo aver raggiunto la soglia, Cloud SQL scrive periodicamente avvisi nel log degli errori MySQL. Puoi visualizzare l'utilizzo della memoria nella tabella information_schema.innodb_vector_indexes.
  • Se la tabella di base sottostante ha subito modifiche DML importanti, ricostruisci gli indici di ricerca vettoriale. Per ottenere le dimensioni iniziali dell'indice al momento della compilazione e le dimensioni attuali dell'indice, esegui una query sulla tabella information_schema.innodb_vector_indexes.
  • In genere, è accettabile lasciare che il numero di partizioni venga calcolato internamente. Se hai un caso d'uso in cui vuoi specificare il numero di partizioni, devi avere almeno 100 punti dati per partizione.

Tabella di base di sola lettura durante le operazioni dell'indice di ricerca vettoriale

Per tutta la durata di tutte e tre le operazioni dell'indice di ricerca vettoriale (creazione, modifica ed eliminazione), la tabella di base viene impostata in modalità di sola lettura. Durante queste operazioni, non sono consentite operazioni DML nella tabella di base.

Persistenza, arresto e impatto sulla manutenzione

Solo gli indici di ricerca vettoriale che utilizzano il tipo TREE_SQ vengono mantenuti sul disco in caso di arresto pulito di un'istanza. Gli indici di ricerca vettoriale che utilizzano i tipi TREE_AH e BRUTE_FORCE sono solo in memoria.

Dopo un arresto pulito di un'istanza, Cloud SQL ricarica gli indici di ricerca vettoriale al riavvio dell'istanza. Tuttavia, dopo un arresto anomalo o un arresto non corretto, Cloud SQL deve ricostruire gli indici di ricerca di vettori. Ad esempio, ogni volta che l'istanza subisce un arresto anomalo e viene eseguita la procedura di recupero dal backup e dal ripristino, dal recupero point-in-time (PITR) o dal failover di alta disponibilità (HA), Cloud SQL ricostruisce gli indici di ricerca vettoriale. Per questi eventi si verifica quanto segue:

  • La ricostruzione avviene automaticamente in background.
  • Durante la ricostruzione, la tabella di base è in modalità di sola lettura.
  • Se la ricostruzione automatica non riesce ad acquisire un blocco della tabella entro un determinato periodo di tempo, la ricostruzione non va a buon fine. Potresti dover ricostruire manualmente l'indice.

Il tempo necessario per la ricostruzione di un indice potrebbe aumentare il tempo necessario per un Shutdown, il che potrebbe anche aumentare il tempo di manutenzione e aggiornamento richiesto per un'istanza.

Creare un indice di ricerca vettoriale

L'istruzione per creare un indice di ricerca vettoriale utilizza la seguente sintassi:

CALL mysql.create_vector_index('INDEX_NAME',
                                'DB_NAME.TABLE_NAME',
                                'COLUMN_NAME',
                                'PARAMETERS'
                              );

Ad esempio:

CALL mysql.create_vector_index('vectorIndex',
                                'db.books',
                                'embedding',
                                'index_type=TREE_SQ, distance_measure=l2_squared'
                               );

Il nome dell'indice specificato deve essere univoco all'interno del database.

Parametri dell'indice di ricerca vettoriale

Le funzioni create search index (e alter search index) supportano più parametri che puoi specificare con coppie chiave-valore separate da virgole. Tutti i parametri della funzione di creazione dell'indice di ricerca sono facoltativi. Se specifichi una stringa vuota o NULL, per l'indice vengono configurati i valori predefiniti dei parametri.

  • distance_measure: i valori supportati sono: L2_SQUARED, COSINE e DOT_PRODUCT. L2_SQUARED è il valore predefinito.
  • num_neighbors: il numero di vicini da restituire per impostazione predefinita durante le query ANN. Puoi anche ignorare questo parametro quando esegui la query di ricerca. Il valore predefinito è 10.
  • index_type: specifica il tipo di indice da creare. I valori validi sono: BRUTE_FORCE, TREE_SQ e TREE_AH.

    • BRUTE_FORCE è il valore predefinito per una tabella con meno di 10.000 righe
    • TREE_SQ è il valore predefinito per una tabella con almeno 10.000 righe

    Per specificare il tipo di indice TREE_AH o TREE_SQ, la dimensione della tabella di base deve essere superiore a 1000 righe.

  • num_parititions: specifica il numero di cluster K-means da creare. Questo parametro è consentito solo se hai configurato un index_type. Questa opzione non è applicabile 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 esplicitamente per ricostruire un indice di ricerca vettoriale. Per utilizzare questa funzione, l'indice deve già esistere. Ti consigliamo di riedificare un indice per i seguenti casi d'uso:

  • Vuoi ricostruire l'indice con opzioni diverse. Ad esempio, potresti voler utilizzare un tipo di indice o una misura della distanza diversa.
  • Vuoi ricostruire l'indice perché la tabella di base ha subito modifiche sostanziali al DML. Ad esempio, devi addestrare nuovamente l'indice di ricerca vettoriale in base ai dati attuali nella tabella di base.

Tutti i parametri per la ricostruzione dell'indice sono identici a quelli disponibili per la creazione dell'indice e sono facoltativi. Se specifichi una stringa vuota o NULL durante la ricostruzione dell'indice, l'indice viene ricostruito in base ai parametri specificati al momento della creazione. Se non vengono forniti parametri al momento della creazione dell'indice, vengono utilizzati i valori predefiniti.

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

Eliminare un indice di ricerca vettoriale

Non puoi eseguire un'operazione DDL su una tabella che ha un indice di ricerca vettoriale. Prima di eseguire l'operazione DDL sulla tabella, devi eliminare l'indice di ricerca vettoriale.

CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');

Esegui query sugli embedding vettoriali

Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sugli embedding vettoriali.

Visualizza gli embedding vettoriali

SELECT vector_to_string(embedding) FROM books;

Ottenere la ricerca del vicino più prossimo esatta per un embedding vettoriale

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

Ottenere la ricerca del vicino più prossimo approssimativo in un embedding vettoriale

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

L'esecuzione di una ricerca ANN supporta due parametri. Entrambi sono facoltativi.

  • num_partitions: specifica il numero di partizioni da analizzare per una ricerca di vettori ANN. Se non specifichi il numero di partizioni, la ricerca utilizza un valore generato in base alle dimensioni della tabella, al numero di partizioni nell'indice di ricerca vettoriale e ad altri fattori.
  • num_neighbors: specifica il numero di vicini da restituire. Questo valore ha la precedenza sul valore impostato al momento della creazione dell'indice di ricerca dei vettori.

Filtra gli embedding vettoriali

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

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

Esegui una query sulla distanza di un embedding vettoriale

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

Ottieni la distanza coseno

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

Ottieni la distanza prodotto scalare

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

Ottenere la distanza al quadrato L2

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

Ottenere righe entro una determinata distanza

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

Puoi combinarlo con ORDER BY e LIMIT

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

Monitorare gli indici di ricerca vettoriale

Per ottenere informazioni in tempo reale su tutti gli indici di ricerca vettoriale nell'istanza, utilizza la tabella information_schema.innodb_vector_indexes.

Per visualizzare la tabella, esegui il seguente comando:

SELECT * FROM information_schema.innodb_vector_indexes;

L'output di esempio potrebbe essere simile al seguente:

*************************** 1. row ***************************
       INDEX_NAME: test.t4_index
       TABLE_NAME: test.t4_bf
       INDEX_TYPE: BRUTE_FORCE
     DIST_MEASURE: SquaredL2Distance
           STATUS: Ready
            STATE: INDEX_READY_TO_USE
       PARTITIONS: 0
SEARCH_PARTITIONS: 0
     INITIAL_SIZE: 40000
     CURRENT_SIZE: 40000
          QUERIES: 0
        MUTATIONS: 0
     INDEX_MEMORY: 160000
   DATASET_MEMORY: 0

Nella tabella information_schema.innodb_vector_indexes puoi visualizzare quanto segue:

  • Le opzioni potenzialmente generate. In altre parole, num_partitions o il numero di partizioni da analizzare per una query.
  • Le colonne STATE e STATUS 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 con CURRENT_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 e MUTATIONS forniscono informazioni in tempo reale sull'utilizzo dell'indice.
  • Le colonne INDEX_MEMORY e DATASET_MEMORY forniscono informazioni sul consumo di memoria dell'indice. INDEX_MEMORY

    indica la quantità di memoria utilizzata dall'indice e DATASET_MEMORY indica la quantità di memoria aggiuntiva consumata durante il tempo di compilazione.

Per ottenere un elenco degli indici di vettori di ricerca creati nell'istanza, puoi visualizzare la tabella del dizionario di dati mysql.vector_indexes.

Per visualizzare la tabella, esegui il seguente comando:

SELECT * FROM mysql.vector_indexes;

Esempio di output:

*************************** 1. row ***************************
   index_name: test.index1
   table_name: test.t1
  column_name: j
index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED
       status: ACTIVE
  create_time: 2024-04-08 22:46:21
  update_time: 2024-04-08 22:46:21
1 row in set (0.00 sec)

Limitazioni

  1. Può esserci una sola colonna di incorporamento di vettori per tabella.
  2. Può essere presente un solo indice di ricerca vettoriale per tabella.
  3. Un embedding di vettori può avere fino a 16.000 dimensioni.
  4. Il partizionamento a livello di tabella InnoDB nelle tabelle con colonne di embedding vettoriale non è supportato.
  5. Se l'istanza si riavvia da un arresto anomalo, 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 della tabella entro il tempo specificato, la ricostruzione automatica dell'indice potrebbe non riuscire.
    3. Se la ricostruzione automatica dell'indice non va a buon fine, devi ricostruirlo manualmente.
  6. Per aggiungere una colonna di embedding di vettori, la tabella deve avere una chiave primaria. Cloud SQL non supporta le chiavi principali di tipo BIT, BINARY, VARBINARY, JSON, BLOB, TEXT o tipi di dati spaziali. Le chiavi primarie composite non possono includere nessuno di questi tipi.
  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. Le rappresentazioni vettoriali non sono supportate nelle tabelle non InnoDB o nelle tabelle temporanee.
  9. La colonna di embedding del vettore 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 statement SELECT. Altre istruzioni DML non supportano NEAREST..TO.
  12. 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.
  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
    );

    A questo punto, puoi utilizzare la seguente query per eseguire il prefiltro.

    //select query to obtain books by specific author and having similar plot-genre-reviews
    SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist
    FROM books where author='cloudsql' ORDER BY dist LIMIT 10

    Il post-filtro è supportato con le funzioni NEAREST..TO e distance.

Risoluzione dei problemi

In caso di arresto anomalo, l'indice viene ricostruito automaticamente. Quando è in corso una ricostruzione, sono presenti due limitazioni:

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

Passaggi successivi