Lavorare con gli embedding vettoriali (anteprima)

Questa pagina descrive in dettaglio come interagire con Cloud SQL per creare applicazioni che utilizzano i vector embedding.

Cloud SQL per MySQL supporta l'archiviazione di vector embedding. Puoi quindi creare indici di ricerca vettoriale ed eseguire ricerche di somiglianza 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 i vector embedding creando una colonna di vector embedding in una tabella. La colonna speciale di vector embedding viene mappata al tipo di dati VARBINARY. Come per altri dati relazionali nella tabella, puoi accedere ai vector embedding nella tabella con le garanzie transazionali esistenti. Una tabella con una colonna di vector embedding è una normale tabella InnoDB ed è quindi conforme alle proprietà di atomicità, coerenza, isolamento e durabilità (ACID). Le proprietà ACID deviano solo per le ricerche nell'indice di ricerca vettoriale.

Quando configuri una tabella per i vector embedding, tieni presente quanto segue:

  • Puoi creare al massimo una colonna di vector embedding in una tabella e un indice di ricerca vettoriale per tabella. Ogni vector embedding archiviato nella stessa colonna deve avere esattamente le stesse dimensioni specificate quando hai definito la colonna. Un vector embedding ha un limite massimo di 16.000 dimensioni. Se hai spazio di archiviazione e memoria sufficienti, puoi avere tabelle separate con colonne di vector embedding e indici della Ricerca vettoriale diversi nella stessa istanza.

  • Sebbene non esista un limite rigido al numero di vector embedding 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 vector embedding in una tabella.

  • Consulta anche l'elenco delle limitazioni.

La replica funziona allo stesso modo per la colonna di vector embedding e per le altre colonne InnoDB di MySQL.

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

Cloud SQL supporta l'esecuzione di query utilizzando la ricerca vettoriale KNN, nota anche come ricerca esatta del vicino più prossimo. L'esecuzione di una ricerca vettoriale KNN fornisce un recall perfetto. Puoi eseguire ricerche KNN senza dover creare un indice della 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 saperne di più sull'utilizzo delle funzioni di distanza di Vector Search, consulta Esegui query sulla distanza di un vector embedding.

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 ti consente di ottimizzare le prestazioni per ottenere risultati rapidi anziché 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 per le ricerche all'interno di un sottoinsieme più piccolo di un set di dati originale. La memoria utilizzata dall'indice è pari 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 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 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 il footprint della 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 apportate 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, anche le modifiche di rollback corrispondenti vengono applicate all'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 i vector embedding

Questa sezione descrive come configurare l'istanza Cloud SQL per supportare l'archiviazione, l'indicizzazione e l'esecuzione di query sui vector embedding.

Sia le istanze della versione Cloud SQL Enterprise sia quelle della versione Cloud SQL Enterprise Plus supportano i vector embedding.

Prima di iniziare

Abilita i vector embedding

Per attivare il supporto dei vector embedding, 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 abilitare il supporto del vector embedding.

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

  • cloudsql_vector: imposta questo flag su on per abilitare il supporto per l'archiviazione e la ricerca di vector embedding. Puoi creare nuove colonne di vector embedding 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 della memoria minima. Per saperne di più su come calcolare la quantità da specificare, consulta Configura 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 totale di innodb_buffer_pool_size.

    Se specifichi un valore superiore al 50% del 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 dei vector embedding in Cloud SQL per MySQL sono flag statici. Dopo aver aggiornato l'istanza con i flag, l'istanza si riavvia automaticamente per applicare le modifiche alla configurazione.

Per saperne di più su come configurare i flag di database per MySQL, consulta Configura i flag di database.

Disattiva i vector embedding

Per disattivare i vector embedding, 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 stai disattivando il supporto dei vector embedding.

Se imposti cloudsql_vector su off, non puoi creare nuove colonne di vector embedding e indici di ricerca vettoriale. Dopo aver configurato questo flag statico, l'istanza si riavvia automaticamente per applicare la modifica della configurazione.

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 le query di ricerca su questi indici restituiscono un errore.
  • Continua ad archiviare i vector embedding nelle tabelle di base. I vector embedding rimangono accessibili.

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

Configurazione della replica di lettura

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

Se crei una replica da un'istanza principale con il supporto del vector embedding abilitato, la replica di lettura eredita le impostazioni del supporto del vector embedding dall'istanza principale. Devi abilitare il supporto del vector embedding singolarmente sulle istanze di replica di lettura già esistenti.

In termini di impatto sul ritardo di replica, la creazione e la gestione degli indici di Vector Search funzionano allo stesso modo degli indici MySQL standard.

Gli indici di ricerca vettoriale non sono supportati sulle 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 ed eseguire query in Cloud SQL.

  1. Genera vector embedding. Puoi creare vector embedding manualmente o utilizzare un'API di text embedding di tua scelta. Per un esempio che utilizza Vertex AI, consulta Genera vector embedding basati sui dati delle righe.

  2. Crea una tabella in Cloud SQL per MySQL contenente una colonna di vector embedding con tre dimensioni.

    CREATE TABLE books (
    id   INTEGER PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(60),
    embedding VECTOR(3) USING VARBINARY
    );
    
  3. Inserisci un vector embedding 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 contenere almeno 1000 righe.

    CALL mysql.create_vector_index('vectorIndex',
                                   'dbname.books',
                                   'embedding',
                                   'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED'
                                   );
    
  6. Ottenere i vicini più prossimi.

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

Genera vector embedding in base ai dati delle righe

Puoi generare un vector embedding per i dati di una determinata riga utilizzando un'API di text embedding come Vertex AI o OpenAI. Puoi utilizzare qualsiasi API di text embedding con i vector embedding di Cloud SQL. Tuttavia, devi utilizzare la stessa API di text embedding 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 vector embedding 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()

Archivia i vector embedding

Questa sezione fornisce esempi di istruzioni per l'archiviazione di vector embedding in Cloud SQL.

Crea una nuova tabella con una colonna di vector embedding

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

Aggiungi una colonna di vector embedding a una tabella esistente

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

Inserisci un vector embedding

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

Inserisci più vector embedding

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

Applica l'upsert a 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;

Elimina un vector embedding

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

Utilizza gli indici di ricerca vettoriale

Per impostazione predefinita, puoi eseguire la ricerca del vicino più prossimo esatto, che fornisce il richiamo perfetto. Puoi anche aggiungere un indice per utilizzare la ricerca ANN, che sacrifica un po' di recall per la velocità. 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 l'utilizzo degli indici di ricerca vettoriale. Ogni workload è 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 della Ricerca TREE_SQ e TREE_AH. Se hai a disposizione più punti dati, la partizione e l'addestramento dell'indice saranno migliori.
  • Monitora la memoria utilizzata dagli indici. Se l'istanza esaurisce la memoria, non puoi creare o generare indici. Per gli indici esistenti, dopo aver raggiunto la soglia, Cloud SQL scrive periodicamente avvisi nel log degli errori di MySQL. Puoi visualizzare la memoria utilizzata nella tabella information_schema.innodb_vector_indexes.
  • Se la tabella di base sottostante ha subito modifiche DML importanti, ricrea gli indici di ricerca vettoriale. Per ottenere le dimensioni iniziali dell'indice al momento della creazione 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 di indice di ricerca vettoriale

Per tutta la durata delle tre operazioni di indice di Vector Search (creazione, modifica ed eliminazione), la tabella di base viene impostata in modalità di sola lettura. Durante queste operazioni, non sono consentiti 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 regolare 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 non corretto, Cloud SQL deve ricreare gli indici di ricerca vettoriale. Ad esempio, ogni volta che l'istanza subisce un arresto anomalo e un recupero da backup e ripristino, un recupero point-in-time (PITR) o un failover ad alta affidabilità (HA), Cloud SQL ricrea 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 a bloccare la tabella entro un periodo di timeout specifico, la ricostruzione non va a buon fine. Potrebbe essere necessario ricreare 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 di manutenzione e aggiornamento richiesto per un'istanza.

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

Cloud SQL crea e gestisce gli indici di ricerca vettoriale in memoria. Il tipo di indice TREE_SQ persiste in caso di arresto normale 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 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 massimo è il 50% delle dimensioni del pool di buffer.
  • Dopo aver impostato questo flag, l'istanza viene riavviata automaticamente per applicare la modifica alla configurazione.
  • Se l'istanza ha esaurito tutta la memoria configurata, non puoi creare o modificare 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 della memoria.
  • NEW_MEMORY_VALUE: l'allocazione della memoria aggiornata, in byte, per gli indici di ricerca vettoriale.

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

Calcola la memoria richiesta

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

  • Memoria in fase di creazione: 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 set di dati è la memoria necessaria per leggere tutti i vector embedding in memoria. Dato che ogni dimensione è rappresentata da un float che utilizza 4 byte di memoria, puoi determinare dataset_size come segue:

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

Ad esempio, se hai un 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 runtime. Alla quantità totale di memoria nella tua 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 i vector embedding viene sottoposta a operazioni DML, l'indice di ricerca vettoriale viene aggiornato in tempo reale. Questi aggiornamenti modificano il footprint della memoria dell'indice, che può ridursi o espandersi a seconda dell'operazione DML. Puoi monitorare il footprint della 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 vettoriale, consulta Monitora gli indici di ricerca vettoriale.

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 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, per l'indice vengono configurati i valori parametro predefiniti.

  • 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 eseguire l'override di questo parametro quando esegui la query di ricerca. Il valore predefinito è 10.
  • index_type: specifica il tipo di indice da creare. I valori validi sono: BRUTE_FORCE, TREE_SQ 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 almeno 10.000 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.

Modifica un indice di ricerca vettoriale

CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');

La funzione alter_vector_index viene utilizzata esplicitamente per ricreare un indice di Vector Search. 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 o una misura di distanza diversi.
  • Per ricreare l'indice perché la tabella di base ha subito modifiche DML importanti. Ad esempio, devi riaddestrare l'indice di ricerca vettoriale in base ai dati nella tabella di base.

Tutti i parametri per la ricostruzione dell'indice sono identici a quelli disponibili per la creazione dell'indice e sono anche facoltativi. Se specifichi una stringa vuota o NULL quando ricrei l'indice, questo viene ricreato 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 dei parametri predefiniti.

L'indice di ricerca vettoriale esistente è disponibile durante l'operazione alter_vector_index. 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 sui vector embedding

Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sui vector embedding.

Visualizza i vector embedding

SELECT vector_to_string(embedding) FROM books;

Ottieni la ricerca del vicino esatto per un vector embedding

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

Ottieni la ricerca del vicino approssimato per un vector embedding

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 sondare 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 Vector Search e ad altri fattori.
  • num_neighbors: specifica il numero di vicini da restituire. Questo valore sostituisce quello impostato al momento della creazione dell'indice di ricerca vettoriale.

Filtra i vector embedding

Utilizza colonne aggiuntive come predicati per perfezionare il filtro dei risultati delle query di vector embedding. 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;

Esegui query sulla distanza di un vector embedding

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;

Ottieni la distanza al quadrato L2

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

Recupera le righe entro una certa 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;

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 che potrebbero essere generate. In altre parole, num_partitions o il numero di partizioni da sondare 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 sullo stato di avanzamento dell'indice di ricerca vettoriale nella fase di creazione.
  • La colonna INITIAL_SIZE indica 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 dei DML nella tabella di base.
  • Le colonne QUERIES e MUTATIONS forniscono informazioni in tempo reale sul livello di attività 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 fase di creazione.

Per ottenere un elenco degli indici vettoriali 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ò esistere una sola colonna di vector embedding per tabella.
  2. Può esistere un solo indice di ricerca vettoriale per tabella.
  3. Un vector embedding può avere fino a 16.000 dimensioni.
  4. Il partizionamento a livello di tabella InnoDB su tabelle con colonne di vector embedding non è supportato.
  5. Se l'istanza viene riavviata da un arresto non corretto, Cloud SQL ricrea 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 ricostruzione automatica dell'indice potrebbe non riuscire.
    3. Se la ricostruzione automatica dell'indice non riesce, devi ricostruirlo manualmente.
  6. Per aggiungere una colonna di vector embedding, la tabella deve avere una chiave primaria. Cloud SQL non supporta chiavi primarie 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. I vector embedding non sono supportati su tabelle non InnoDB o su tabelle temporanee.
  9. La colonna di vector embedding 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 è possibile solo tramite 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
    );
    

    In questo caso, puoi utilizzare la seguente query per ottenere 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 NEAREST..TO e le funzioni di distanza.

Risoluzione dei problemi

In caso di arresto anomalo, l'indice viene ricostruito automaticamente. Quando è in corso una ricostruzione, 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