Crea un indice IVFFLAT

Questa pagina descrive come utilizzare gli incorporamenti archiviati per generare indici ed eseguire query sugli incorporamenti utilizzando un indice IVFFlat con AlloyDB per PostgreSQL. Per saperne di più sull'archiviazione degli embedding, consulta Archivia gli embedding vettoriali.

Prima di iniziare

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

Crea un indice IVFFlat

Stock pgvector fornisce anche una versione dell'indice IVF denominata IVFFlat che offre tempi di compilazione più rapidi e occupa meno memoria rispetto all'indice hnsw.

Per creare un indice IVFFlat, completa i seguenti passaggi:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Sostituisci quanto segue:

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

  • 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: vector_l2_ops

    • Prodotto interno: vector_ip_ops

    • Distanza coseno: vector_cosine_ops

  • LIST_COUNT: il numero di elenchi da utilizzare con questo indice. Per ulteriori informazioni su come decidere questo valore, vedi Ottimizzare un indice IVFFlat.

    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 ivfflat (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Sostituisci DIMENSIONS con la larghezza dimensionale della colonna di incorporamento. Per saperne di più 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 attuale della creazione dell'indice.

Per ottimizzare l'indice per un bilanciamento di precisione e QPS target, consulta Ottimizzare un indice IVFFlat.

Esegui una query

Dopo aver archiviato e indicizzato gli embedding nel database, puoi iniziare a eseguire query utilizzando la funzionalità di query pgvector.

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 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 a cui confrontare il testo.

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

  • EMBEDDING_COLUMN: la colonna contenente gli incorporamenti archiviati.

  • 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 embedding di cui vuoi trovare i vicini semantici memorizzati più vicini.

  • ROW_COUNT: il numero di righe da restituire.

    Specifica 1 se vuoi solo la corrispondenza migliore.

Per altri esempi di query, consulta la sezione Query.

Puoi anche utilizzare la funzione embedding() per tradurre il testo in un vettore. Applica il vettore a uno degli pgvectoroperatori 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 cast esplicito della chiamata embedding() a vector per utilizzare questi valori con gli operatori pgvector.

Passaggi successivi