Lavorare con gli incorporamenti vettoriali

Questa pagina mostra come interagire con Cloud SQL per creare applicazioni che utilizzano gli incorporamenti vettoriali.

Cloud SQL per MySQL supporta l'archiviazione di incorporamenti vettoriali. Puoi quindi crea indici di ricerca vettoriale ed esegui ricerche di somiglianza su questi vettori incorporamenti insieme al resto dei dati archiviati in Cloud SQL.

Archiviazione di incorporamento vettoriale

Puoi utilizzare Cloud SQL per MySQL per archiviare gli incorporamenti vettoriali creando un vettore di incorporamento 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 incorporamenti vettoriali nella tabella con 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 si differenziano 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 incorporamento vettoriale archiviato nella stessa colonna deve Avere esattamente le stesse dimensioni specificate al momento della definizione della colonna. Un incorporamento vettoriale ha un limite superiore 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 preciso al numero di incorporamenti vettoriali, archiviabili in una tabella, gli indici di ricerca vettoriale richiedono la 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 sia per la colonna di incorporamento vettoriale che per di altre colonne MySQL InnoDB.

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 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. Una ricerca vettoriale KNN fornisce un ricordo perfetto. Puoi eseguire ricerche KNN senza dover creare un vettore nell'indice di ricerca. La ricerca KNN si basa sull'esecuzione di un algoritmo di scansione della tabella.

Per la ricerca KNN, Cloud SQL supporta anche la seguente distanza vettoriale funzioni di ricerca:

  • Coseno
  • Prodotto scalare
  • Distanza al quadrato L2

Per ulteriori informazioni sull'uso delle funzioni di distanza di ricerca vettoriale, consulta: Esegui una query sulla distanza di un incorporamento 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 prestazioni veloci invece che richiamo 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 che ha 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 è uguale alle dimensioni del set di dati. Questo tipo di indice non è permanente su disco.
  • TREE_SQ: il tipo di indice di ricerca vettoriale predefinito per una tabella di base con 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'utilizzo di memoria e non è permanente.

Aggiorna 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 dell'indice di ricerca vettoriale sono visibili immediatamente a tutte le altre transazioni, che indica un livello di isolamento di READ_UNCOMMITTED.

Se esegui il rollback di una transazione, vengono apportate modifiche anche al rollback corrispondente si verificano 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 alle repliche a cascata non sono supportati.

Configura un'istanza per supportare gli embedding vettoriali

Questa sezione descrive come configurare l'istanza Cloud SQL per supportare l'archiviazione, l'indicizzazione e l'interrogazione degli incorporamenti 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 la versione Cloud SQL per MySQL MySQL 8.0.36.R20240401.03_00 o versioni successive.
  • L'istanza deve avere spazio su disco e memoria sufficienti per allocare la memoria per il numero totale di incorporamenti vettoriali nell'istanza.

Attiva il supporto per gli incorporamenti 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 abilitare il vettore all'incorporamento, all'archiviazione e alla ricerca. Puoi creare un nuovo incorporamento vettoriale di colonne e indici di ricerca vettoriale sull'istanza.
  • cloudsql_vector_max_mem_size: facoltativo. Specifica l'allocazione massima della memoria in byte per tutti gli indici di ricerca vettoriale 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 Configura l'allocazione della memoria per la ricerca vettoriale indici.

    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 totale innodb_buffer_pool_size, Cloud SQL riduce il valore effettivo a 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 flag 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 Configurare i flag di database.

Disattiva il supporto per gli incorporamenti vettoriali

Per disattivare il supporto degli incorporamenti vettoriali, imposta cloudsql_vector per 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 l'istanza si riavvia automaticamente per la modifica della configurazione per applicare le modifiche.

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

  • Rimuove tutti gli indici di ricerca vettoriale TREE_SQ persistenti dall'elenco permanente disco.
  • Mantiene le voci della tabella del dizionario dei dati per il vettore indici di ricerca creati. Tuttavia, Cloud SQL per MySQL non ricostruisce gli indici e le query di ricerca su questi indici restituiscono 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 ricostruire gli indici durante il riavvio dell'istanza in base alle voci della tabella del dizionario dei dati.

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 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 conservare tutte indici di ricerca vettoriale in memoria, configura l'istanza Cloud SQL a cloudsql_vector_max_mem_size flag di database. 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, mantieni quanto segue mente:

  • Il valore predefinito e minimo è 1 GB. Il limite superiore è pari al 50% della dimensione del pool di buffer.
  • Dopo aver impostato questo flag, l'istanza si riavvia automaticamente per l'applicazione della modifica alla configurazione.
  • Se l'istanza ha esaurito la memoria configurata, non puoi creare o modificare qualsiasi indice 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 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 embedding vettoriali e dalla dimensionalità degli embedding. Esistono due requisiti di memoria da considerare:

  • Memoria tempo di creazione:la memoria richiesta durante la creazione dell'indice.
  • Memoria indice: la memoria occupata dall'indice dopo che è creato

Per un dato indice, la dimensione del set di dati è la memoria necessaria per leggere tutti gli incorporamenti vettoriali in memoria. Dato che ogni dimensione è rappresentata è un valore in virgola mobile che utilizza 4 byte di memoria, puoi determinare il valore di dataset_size come che segue:

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

Ad esempio, se hai 1 milione di incorporamenti di dimensioni 768, i tuoi dataset_size è di 3 GB.

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

Tipo di indice Memoria data/ora build 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 gli indici di ricerca vettoriale TREE_SQ, devi anche la memoria richiesta 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 incorporamenti vettoriali è sottoposta a DML operazioni, 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'utilizzo della memoria di un indice tramite 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 con vettori il supporto dell'incorporamento vettoriale abilitato, la replica di lettura eredita il supporto dell'incorporamento vettoriale. e le impostazioni dell'istanza principale. Devi abilitare il supporto dell'incorporamento vettoriale singolarmente su istanze di replica di lettura già esistenti.

In termini di impatto sul ritardo della replica, la creazione e il mantenimento della ricerca vettoriale funzionano allo stesso modo dei normali indici MySQL.

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

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

La seguente procedura dettagliata di esempio fornisce i passaggi per creare un vettore basato su ANN su un indice e su una query di ricerca 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 basati su righe i tuoi dati.

  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ù vicini.

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

Generare incorporamenti vettoriali basati sui dati delle righe

Puoi generare un embedding vettoriale per i dati di una determinata riga utilizzando un'API di embedding del testo come Vertex AI o OpenAI. Puoi utilizzare qualsiasi API di incorporamento del testo con gli incorporamenti vettoriali di Cloud SQL. Tuttavia, devi utilizzare la stessa API di incorporamento del testo per le query la generazione di vettori di stringa. 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;

Inserisci un incorporamento 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 una ANN che scambia un certo richiamo con la velocità. A differenza degli indici tipici, Dopo aver aggiunto un indice approssimativo, vedi risultati diversi per query.

Consigli

Questa sezione fornisce le best practice per lavorare con la ricerca vettoriale. indici di appartenenza. Ogni carico di lavoro è diverso e potrebbe essere necessario adattarsi 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 né creare indici. Per gli indici esistenti, dopo aver raggiunto la soglia, Cloud SQL scrive avvisi nel log degli errori di MySQL periodicamente. Puoi visualizzare la memoria utilizzata nel Tabella information_schema.innodb_vector_indexes.
  • Se la tabella di base sottostante ha subito importanti modifiche DML, ricreala gli indici di ricerca vettoriale. Per ottenere la dimensione iniziale dell'indice a data e ora di creazione e la dimensione attuale dell'indice, esegui una query 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 sull'indice di ricerca vettoriale (creazione, la modifica e la rilascia: la tabella di base viene impostata in modalità di sola lettura. Durante queste operazioni, non sono consentiti DML nella tabella di base.

Persistenza, arresto e impatto sulla manutenzione

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

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

  • La ricostruzione avviene automaticamente in background.
  • Durante la ricreazione, la tabella di base è in modalità di sola lettura.
  • Se la ricreazione automatica non riesce a ottenere un blocco sulla tabella all'interno di un intervallo specifico la ripetizione non va a buon fine. Potresti dover ricreare 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 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 eseguire l'override di questo parametro quando l'esecuzione della query di ricerca. L'impostazione predefinita è 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 è l'impostazione predefinita per una tabella con almeno 10.000 righe

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

  • num_parititions: specifica quanti cluster K-means creare. Questo è 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 ricreare una ricerca vettoriale di Google. 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 ricreare l'indice perché la tabella di base è stata sottoposta a importanti processi DML modifiche. 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 quando ricrea l'indice, questo viene ricreato in base ai parametri specificati al momento della creazione dell'indice. Se non sono presenti parametri forniti al momento della creazione dell'indice, vengono utilizzati i valori parametro predefiniti.

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

Rilascia 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 sugli embedding vettoriali

Questa sezione fornisce esempi dei diversi modi in cui puoi eseguire query sul vettore incorporamenti.

Visualizza gli embedding vettoriali

SELECT vector_to_string(embedding) FROM books;

Ottenere la ricerca esatta del vicino in un incorporamento 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, utilizza un valore generato in base alle dimensioni della tabella, al numero le partizioni dell'indice di ricerca vettoriale e altri fattori.
  • num_neighbors: specifica il numero di vicini da restituire. Questo valore sostituisce il valore impostato al momento della creazione dell'indice di ricerca vettoriale.

Filtra gli embedding vettoriali

Utilizza colonne aggiuntive come predicati per ottimizzare il filtro del vettore incorporare i risultati della query. 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;

Query sulla distanza di un incorporamento 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 del prodotto Dot

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

Calcolare la distanza al quadrato L2

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

Visualizzare righe entro una 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;

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 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 verificare per una query.
  • Le colonne STATE e STATUS indicano lo stato attuale stato dell'indice. Durante la fase di creazione, la colonna dello stato fornisce informazioni sulla distanza dell'indice di ricerca vettoriale nella fase di creazione.
  • La colonna INITIAL_SIZE fornisce le dimensioni della tabella durante la creazione dell'indice. Puoi confrontare questa dimensione con CURRENT_SIZE per 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 offrono di insight in tempo reale sul livello di affollamento dell'indice.
  • Le colonne INDEX_MEMORY e DATASET_MEMORY fornisce informazioni sul consumo della memoria dell'indice. INDEX_MEMORY

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

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ò 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 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 sulla tabella entro il tempo specificato, la ricostruzione automatica dell'indice potrebbe non riuscire.
    3. Se la ricreazione automatica dell'indice non riesce, devi ricreare l'indice manualmente.
  6. Per aggiungere una colonna di embedding di vettori, la tabella deve avere una chiave primaria. Cloud SQL non supporta le chiavi primarie del tipo BIT, BINARY, VARBINARY, JSON e 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. Gli incorporamenti vettoriali non sono supportati su tabelle non InnoDB o su tabelle temporanee tabelle.
  9. La colonna di incorporamento vettoriale non può essere una colonna generata.
  10. Il predicato NEAREST..TO può essere combinato con altri "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. Un vincolo non può essere aggiunta alla chiave primaria della tabella di base se una ricerca vettoriale esistente.
  13. Il pre-filtro è possibile solo attraverso 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 applicare 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 NEAREST..TO e funzioni di distanza.

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 creazione dell'indice, le query ANN sugli indici esistenti non riescono.

Passaggi successivi