Lavorare con gli embedding vettoriali (anteprima)

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.

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.

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.

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 indici TREE_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

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 su on 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 tuo innodb_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.

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

  2. 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
    );
    
  3. Inserisci un embedding vettoriale 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 TREE_SQ o un indice TREE_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'
                                   );
    
  6. 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 e TREE_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 sono L2_SQUARED, COSINE e DOT_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 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 10.000 o più 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 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 e STATUS 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 con CURRENT_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 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 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

  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 viene riavviata 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 sulla tabella entro il tempo specificato, la ricompilazione automatica dell'indice potrebbe non riuscire.
    3. Se la ricreazione automatica dell'indice non riesce, devi ricrearlo 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 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. Gli incorporamenti vettoriali non sono supportati nelle tabelle non InnoDB o nelle tabelle temporanee.
  9. La colonna di incorporamento 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'istruzione 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-filtraggio è fattibile 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
    );
    

    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:

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

Passaggi successivi