Creare un indice HNSW

Seleziona una versione della documentazione:

Questa pagina descrive come utilizzare gli embedding archiviati per generare indici ed eseguire query sugli embedding utilizzando un indice HNSW con AlloyDB Omni. Per saperne di più sull'archiviazione degli embedding, consulta Archiviare i vector embedding.

Prima di iniziare

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

Crea un indice HNSW

AlloyDB Omni supporta la creazione di un indice hnsw basato su grafici disponibile con pgvector di serie utilizzando l'estensione pgvector di AlloyDB Omni. L'utilizzo di un indice hnsw comporta una ricerca greedy che si sposta nel grafico alla ricerca costante del vicino più vicino al vettore di query finché non trova un risultato ottimale. Offre prestazioni di query più veloci, ma tempi di compilazione più lenti rispetto a IVF.

Per saperne di più sull'algoritmo HNSW, consulta Grafici gerarchici navigabili di Small World.

Per creare un indice hnsw, esegui la query seguente:

CREATE INDEX INDEX_NAME ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');

Sostituisci quanto segue:

  • INDEX_NAME: il nome dell'indice che vuoi creare, ad esempio my-hnsw-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

  • NUMBER_OF_CONNECTIONS: il numero massimo di connessioni per nodo nel grafico. Puoi iniziare con il valore predefinito 16 e sperimentare con valori più elevati in base alle dimensioni del set di dati.

  • CANDIDATE_LIST_SIZE: la dimensione di un elenco di candidati mantenuto durante la costruzione del grafo, che aggiorna costantemente i candidati migliori attuali per i vicini più prossimi di un nodo. Imposta questo valore su un valore superiore al doppio del valore m, ad esempio 64.

Per visualizzare lo stato di 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 e la fase building graph scompare dopo la creazione dell'indice.

Per ottimizzare l'indice per un richiamo target e un bilanciamento QPS, consulta Ottimizzare un hnsw indice.

Esegui una query

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

Per trovare i vicini semantici più vicini per un vector embedding, 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 a cui confrontare il testo.

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

  • EMBEDDING_COLUMN: la colonna contenente gli embedding 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 vector embedding di cui vuoi trovare i vicini semantici archiviati più vicini.

  • ROW_COUNT: il numero di righe da restituire.

    Specifica 1 se vuoi solo la corrispondenza migliore.

Per saperne di più su altri esempi di query, consulta Esecuzione di query.

Puoi anche utilizzare la embedding() funzione per tradurre il testo in un vettore. Applica il vettore a uno degli pgvector operatori del vicino più prossimo, <-> per la distanza L2, per trovare le righe del database con gli embedding 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