Creare indici e vettori di query

Seleziona una versione della documentazione:

Questo documento mostra come utilizzare gli embedding archiviati per generare indici ed eseguire query sugli embedding. Per saperne di più sull'archiviazione degli embedding, consulta Archivia gli embedding vettoriali.

Con AlloyDB puoi creare indici ScaNN, IVF, IVFFlat e HNSW.

Prima di iniziare

Prima di poter iniziare a creare indici, devi completare i seguenti prerequisiti.

  • I vettori di incorporamento vengono aggiunti a una tabella nel tuo database AlloyDB.

  • È installata la vectorversione dell'estensione 0.5.0 o successive basate su pgvector, estese da Google per AlloyDB.

    CREATE EXTENSION IF NOT EXISTS vector;
    
  • Per generare gli indici ScaNN, installa l'estensione alloydb_scann oltre all'estensione vector.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Crea un indice

Puoi creare uno dei seguenti tipi di indice per le tabelle del database.

Crea un indice ScaNN

AlloyDB alloydb_scann, un

Estensione PostgreSQL sviluppata da Google che implementa un

efficiente indice dei vicini più prossimi basato su [ScaNN

algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).

L'indice ScaNN è un indice di quantizzazione basato su un albero per la ricerca approssimativa

ricerca del vicino più prossimo. Offre tempi di creazione dell'indice più brevi e

footprint della memoria rispetto a HNSW. Inoltre, offre QPS più veloci in

rispetto a HNSW in base al workload.

una tabella nel tuo database AlloyDB. Se provi a generare un indice ScaNN

su una tabella vuota o partizionata, potresti riscontrare alcuni problemi. Per saperne di più

Per informazioni sugli errori generati, vedi Risolvere i problemi relativi agli errori dell'indice ScaNN.

Indice ScaNN ad albero a due livelli

Per applicare un indice ad albero a due livelli utilizzando l'algoritmo ScaNN a una colonna

contenente gli embedding vettoriali archiviati, esegui la seguente query DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE);

Sostituisci quanto segue:

  • INDEX_NAME: il nome dell'indice che vuoi

    creare, ad esempio my-scann-index. I nomi degli indici vengono condivisi

    nel database. Assicurati che ogni nome dell'indice sia univoco per ogni

    tabella nel database.

  • TABLE: la tabella a cui aggiungere l'indice.

  • EMBEDDING_COLUMN: una colonna che memorizza vector

    dati pubblici o condivisi.

  • DISTANCE_FUNCTION: la funzione di distanza da utilizzare

    con questo indice. Scegli una delle opzioni seguenti:

    • Distanza L2: l2

    • Prodotto scalare: dot_product

    • Distanza coseno: cosine

  • NUM_LEAVES_VALUE: il numero di partizioni da applicare

    questo indice. Imposta un valore compreso tra 1 e 1048576. Per ulteriori informazioni

    Per informazioni su come decidere questo valore, vedi Ottimizzare un indice ScaNN.

Indice ScaNN ad albero a tre livelli

Per creare un indice ad albero a tre livelli utilizzando l'algoritmo ScaNN in una colonna

contenente gli embedding vettoriali archiviati, esegui la seguente query DDL:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Sostituisci quanto segue:

  • MAX_NUM_LEVELS: il numero massimo di livelli della

    Albero di clustering K-means. Imposta su 1(valore predefinito) per la struttura ad albero a due livelli

    quantizzazione e 2 per la quantizzazione basata su albero a tre livelli.

Dopo aver creato l'indice, puoi eseguire query di ricerca del vicino più prossimo che

utilizza l'indice seguendo le istruzioni riportate in [Crea un indice di ricerca del vicino più prossimo

query con il testo specificato](#query).

I parametri dell'indice devono essere impostati in modo da trovare il giusto equilibrio tra QPS e

richiamo. Per maggiori informazioni sull'ottimizzazione dell'indice ScaNN, vedi [Ottimizzare un ScaNN

index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).

Per creare questo indice in una colonna di incorporamento che utilizza il tipo di dati real[]

anziché vector, esegui il cast della colonna nel tipo di dati vector:


CREATE INDEX INDEX_NAME ON TABLE

  USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)

  WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);

Sostituisci DIMENSIONS con la larghezza dimensionale del

colonna di embedding. Per ulteriori informazioni su come trovare le dimensioni,

vedi la funzione vector_dims in [Vector

functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).

Per visualizzare l'avanzamento dell'indicizzazione, utilizza la visualizzazione pg_stat_progress_create_index:


SELECT * FROM pg_stat_progress_create_index;

La colonna phase mostra lo stato attuale della creazione dell'indice, mentre

La fase building index: tree training scompare dopo la creazione dell'indice.

Per ottimizzare l'indice per un bilanciamento del recupero e delle QPS target, consulta Ottimizzare un indice ScaNN.

Analizzare la tabella indicizzata

Dopo aver creato l'indice ScaNN, esegui il comando ANALYZE per aggiornare le statistiche sui tuoi dati.


ANALYZE TABLE;

Esegui una query

Dopo aver archiviato e indicizzato gli incorporamenti nel database, puoi iniziare

query utilizzando la [pgvector query

functionality](https://github.com/pgvector/pgvector#querying). Non puoi eseguire

query di ricerca collettive utilizzando l'estensione alloydb_scann.

Per trovare i vicini semantici più prossimi per un vettore di incorporamento, puoi eseguire il comando

query di esempio seguente, in cui imposti la stessa funzione di distanza che hai utilizzato

durante la creazione dell'indice.


  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']

    LIMIT ROW_COUNT

Sostituisci quanto segue:

  • TABLE: la tabella contenente l'embedding da confrontare

    a cui inviare il messaggio.

  • INDEX_NAME: il nome dell'indice che vuoi utilizzare, ad esempio

    ad esempio, my-scann-index.

  • EMBEDDING_COLUMN: la colonna contenente il valore memorizzato

    embedding.

  • DISTANCE_FUNCTION_QUERY: la funzione di distanza da utilizzare con questo

    query. Scegli una delle seguenti opzioni in base alla funzione di distanza utilizzata

    durante la creazione dell'indice:

    • Distanza L2: <->

    • Prodotto interno: <#>

    • Distanza coseno: <=>

  • EMBEDDING: il vettore di embedding per cui vuoi trovare il vettore memorizzato più vicino

    vicini semantici di.

  • ROW_COUNT: il numero di righe da restituire.

    Specifica 1 se vuoi solo la corrispondenza migliore.

Per ulteriori informazioni su altri esempi di query, vedi

Query.

Puoi anche utilizzare la funzione embedding() per tradurre il

in un vettore. Applichi il vettore a uno dei

operatore dei vicini più prossimi pgvector, <-> per la distanza L2, per trovare le righe del database con il

gli incorporamenti semanticamente più simili.

Poiché embedding() restituisce un array real, devi eseguire il cast esplicito di

embedding() chiama vector per utilizzare questi valori con pgvector

operatori.


  CREATE EXTENSION IF NOT EXISTS google_ml_integration;

  CREATE EXTENSION IF NOT EXISTS vector;



  SELECT * FROM TABLE

    ORDER BY EMBEDDING_COLUMN::vector

    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')

    LIMIT ROW_COUNT

Sostituisci quanto segue:

  • MODEL_ID: l'ID del modello da interrogare.

    Se utilizzi Vertex AI Model Garden, specifica text-embedding-005 come ID modello. Questi sono i modelli basati su cloud che AlloyDB può utilizzare per gli incorporamenti di testo. Per ulteriori informazioni, vedi Incorporamenti di testo.

  • Facoltativo: VERSION_TAG: il tag della versione del modello da interrogare. Aggiungi il prefisso @ al tag.

    Se utilizzi uno dei modelli in inglese text-embedding con Vertex AI, specifica uno dei tag di versione, ad esempio text-embedding-005, elencati in Versioni del modello.

    Google consiglia vivamente di specificare sempre il tag della versione. Se non specifichi il tag della versione, AlloyDB utilizza sempre l'ultima versione del modello, il che potrebbe portare a risultati imprevisti.

  • TEXT: il testo da tradurre in un vector embedding.

Passaggi successivi