Crea un indice IVF

Gli indici Inverted File (IVF) in AlloyDB per PostgreSQL consentono di accelerare le ricerche di somiglianza vettoriale sugli embedding archiviati ad alta dimensionalità utilizzando la quantizzazione scalare. Puoi creare indici IVF con l'estensione vector per ridurre la memoria utilizzata e velocizzare le query per i vettori con un massimo di 8000 dimensioni. Per saperne di più sull'archiviazione degli embedding, consulta Archivia i vector embedding.

Prima di iniziare

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

Crea un indice IVF

Stock pgvector supporta la ricerca del vicino più prossimo approssimato tramite l'indicizzazione. AlloyDB aggiunge a questo supporto una funzionalità di quantizzazione scalare che puoi specificare quando crei un indice. Se abilitata, la quantizzazione scalare può velocizzare notevolmente le query con vettori dimensionali più grandi e consente di archiviare vettori con un massimo di 8000 dimensioni.

Per attivare la quantizzazione scalare su un indice basato su pgvector, specifica IVF come metodo di indicizzazione e SQ8 come quantizzatore:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

Sostituisci quanto segue:

  • INDEX_NAME: il nome dell'indice che vuoi creare, ad esempio my-ivf-index. I nomi degli indici sono 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: 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 saperne di più su come decidere questo valore, consulta Ottimizza un indice IVF.

  • QUANTIZER: il tipo di quantizzatore che vuoi utilizzare.

    Imposta uno dei seguenti valori:

    • SQ8: consigliato. Risposta alle query più rapida e supporto di vettori con un massimo di 8000 dimensioni, ma con una certa perdita di richiamo, che non influisce sugli scenari di produzione.

    • FLAT: risposta alle query più lenta, utilizzo della memoria utilizzata più elevato e supporto di vettori con un massimo di 2000 dimensioni, ma può ottenere una perdita di richiamo trascurabile.

    Per creare questo indice su una colonna di embedding 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 ivf ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS))) DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

Sostituisci DIMENSIONS con la larghezza dimensionale della colonna di embedding. 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 vista 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 postings indica che la creazione dell'indice è quasi completata.

Per ottimizzare l'indice per un richiamo target e un bilanciamento delle QPS, consulta Ottimizza un indice IVF.

Esegui una query

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

Per trovare i vicini semantici più prossimi per un vettore di 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 con cui confrontare il testo.

  • 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 vettore di 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 funzione embedding() per tradurre il testo in un vettore. Applichi il vettore a uno degli operatori del vicino più prossimo di pgvector, <-> 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