Creare indici e vettori di query

Questa pagina descrive come utilizzare gli embedding archiviati per generare indici e eseguire query sugli embedding utilizzando gli indici ScaNN, IVF, IVFFlat e HNSW con AlloyDB per PostgreSQL. Per saperne di più su come memorizzare gli embedding, consulta Memorizzare gli embedding di vettori.

Prima di iniziare

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

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

  • L'estensione vector versione 0.5.0 o successive basata su pgvector, estesa da Google per AlloyDB è installata.

    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;
    

Creare un indice

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

Crea un indice ScaNN

AlloyDB alloydb_scann, un'estensione PostgreSQL sviluppata da Google che implementa un indice di primo vicino molto efficiente basato sull'algoritmo ScaNN.

L'indice ScaNN è un indice di quantizzazione basato su albero per la ricerca approssimativa del vicino più prossimo. Offre tempi di creazione dell'indice inferiori e un utilizzo della memoria inferiore rispetto a HNSW. Inoltre, offre un QPS più elevato rispetto a HNSW in base al carico di lavoro.

Indice ScaNN ad albero a due livelli

Per applicare un indice ad albero a due livelli utilizzando l'algoritmo ScaNN a una colonna contenente incorporamenti 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 da creare, ad esempio my-scann-index. I nomi degli indici vengono condivisi nel database. Assicurati che ogni nome di indice sia univoco per ogni tabella del database.

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

  • EMBEDDING_COLUMN: una colonna che memorizza i dati vector.

  • 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 a questo indice. Imposta un valore compreso tra 1 e 1048576. Per ulteriori informazioni su come decidere questo valore, consulta Ottimizzare un indice ScaNN.

Indice ScaNN ad albero di tre livelli

Per creare un indice ad albero a tre livelli utilizzando l'algoritmo ScaNN in una colonna contenente incorporamenti 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 dell'albero di clustering K-means. Imposta su 1(valore predefinito) per la quantizzazione basata su albero a due livelli e su 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 fanno uso dell'indice seguendo le istruzioni riportate in Eseguire una query di ricerca del vicino più prossimo con un determinato testo.

I parametri dell'indice devono essere impostati per trovare il giusto equilibrio tra QPS e recupero. Per ulteriori informazioni sulla regolazione dell'indice ScaNN, consulta Regolare un indice ScaNN.

Per creare questo indice in una colonna di incorporamento che utilizza il tipo di dati real[] instead of vector, esegui il casting 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 della colonna di incorporamento. Per ulteriori informazioni su come trovare le dimensioni, consulta la funzione vector_dims in Funzioni vettoriali.

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 corrente della creazione dell'indice e la fase building index: tree training scompare dopo la creazione dell'indice.

Per ottimizzare l'indice in base a un equilibrio tra il numero di risultati restituiti e il QPS target, consulta Ottimizzare un indice ScaNN.

esegui una query

Dopo aver archiviato e indicizzato gli embedding nel database, puoi iniziare a eseguire query utilizzando la funzionalità di query pgvector. Non puoi eseguire query di ricerca collettive utilizzando l'estensione alloydb_scann.

Per trovare i vicini semantici più vicini per un vettore di incorporamento, puoi eseguire la seguente query di esempio, in cui imposti la stessa funzione di distanza utilizzata 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 con cui confrontare il testo.

  • INDEX_NAME: il nome dell'indice che vuoi utilizzare, ad esempio my-scann-index.

  • EMBEDDING_COLUMN: la colonna contenente gli embedding memorizzati.

  • DISTANCE_FUNCTION_QUERY: la funzione di distanza da utilizzare con questa 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 incorporamento di cui vuoi trovare i vicini semantici memorizzati più vicini.

  • ROW_COUNT: il numero di righe da restituire.

    Specifica 1 se vuoi solo la singola corrispondenza migliore.

Per ulteriori informazioni su altri esempi di query, consulta la sezione Esecuzione di query.

Puoi anche utilizzare la funzione embedding() per tradurre il testo in un vettore. Applicchi il vettore a uno degli pgvector operatori del vicino più prossimo, <-> per la distanza L2, per trovare le righe del database con gli incorporamenti semanticamente più simili.

Poiché embedding() restituisce un array real, devi eseguire il casting esplicito della chiamata embedding() a vector per utilizzare questi valori con gli operatori pgvector.

  CREATE EXTENSION IF NOT EXISTS google_ml_integration VERSION '1.2';
  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 su cui eseguire la query.

    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 embedding di testo. Per ulteriori informazioni, consulta Embedding di testo.

  • (Facoltativo) VERSION_TAG: il tag della versione del modello su cui eseguire la query. Anteponi al tag @.

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

    Google consiglia vivamente di specificare sempre il tag della versione. Se non specifichi il tag della versione, AlloyDB utilizza sempre la versione più recente del modello, il che potrebbe portare a risultati imprevisti.

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

Passaggi successivi