Ottimizzazione vettoriale sulle tabelle gestite di Unity Catalog

Importante

Questa funzionalità è in versione beta.

L'ottimizzazione vettoriale accelera le ricerche di similarità su colonne vettoriali nelle tabelle gestite da Unity Catalog. Quando esegui una query di ricerca vettoriale con APPROX NEAREST BY, Azure Databricks può utilizzare l'ottimizzazione vettoriale per restringere la ricerca ai dati che probabilmente contengono le corrispondenze più vicine. Questo riduce la quantità di dati scansionati, specialmente per tabelle grandi.

Per utilizzare l'ottimizzazione vettoriale, si crea un indice vettoriale su una colonna e si specifica una metrica di punteggio: similarità coseno, prodotto scalare o distanza L2. L'Ottimizzazione Predittiva aggiorna automaticamente l'indice man mano che i tuoi dati cambiano. Le query idonee che utilizzano la colonna indicizzata e la funzione di confronto corrispondente usano l'ottimizzazione; altre query utilizzano la ricerca a forza bruta. Per la sintassi delle query ed esempi, vedi clausola NEAREST BY.

Requirements

Per creare un indice vettoriale su una tabella:

  • Usa Databricks Runtime 19 o superiore.
  • Devi avere i permessi SELECT e MODIFY sulla tabella, USE CATALOG sul suo catalogo e USE SCHEMA sul suo schema.
  • La tabella deve essere una tabella Delta Lake o Iceberg gestita da Unity Catalog.
  • Crea l'indice nello stesso catalogo e schema della tabella.
  • L'Ottimizzazione Predittiva deve essere abilitata sulla tabella per aggiornare automaticamente l'indice.
  • Il tracciamento delle righe deve essere abilitato prima di creare l'indice. Consulta Rilevamento delle righe in Databricks.
  • La tabella deve contenere i dati quando si crea l'indice.
  • La colonna vettoriale deve avere il tipo ARRAY<FLOAT>di dato , e tutti i vettori devono avere lo stesso numero di elementi.

Per usare l'ottimizzazione vettoriale in una APPROX NEAREST BY join, posiziona la tabella con l'indice vettoriale a destra e usa la funzione di confronto che corrisponde alla metrica di punteggio dell'indice. Anche la tabella dei vettori di query a sinistra deve avere abilitato il tracciamento delle righe.

Creare un indice vettoriale

Usa CREATE VECTOR INDEX per creare un indice per una colonna e una metrica di punteggio. Ad esempio, questa affermazione crea un indice con similitudine coseno per la embedding colonna:

CREATE VECTOR INDEX main.analytics.documents_embedding_cosine_idx
ON main.analytics.documents (embedding)
OPTIONS (scoring_metric = 'cosine_similarity');

Puoi creare più indici vettoriali sulla stessa colonna per supportare diverse metriche di punteggio.

Ogni metrica di punteggio corrisponde a una funzione di interrogazione:

Metrica di assegnazione dei punteggi Funzione di query
cosine_similarity vector_cosine_similarity
inner_product vector_inner_product
l2_distance vector_l2_distance

Importante

Usa la funzione di query che corrisponde alla metrica di punteggio dell'indice nella tua APPROX NEAREST BY query. Se non esiste un indice corrispondente, la query viene eseguita senza ottimizzazione vettoriale.

Interrogare i dati con ottimizzazione vettoriale

Posiziona la tabella con l'indice vettoriale sul lato destro di una APPROX NEAREST BY join. Puoi filtrare la tabella dei vettori di query a sinistra usando comunque l'ottimizzazione vettoriale. Il seguente batch join restituisce fino a 10 documenti per ogni vettore di interrogazione:

SELECT
  q.query_id,
  d.document_id
FROM main.analytics.query_vectors AS q
INNER JOIN main.analytics.documents AS d
  APPROX NEAREST 10 BY SIMILARITY
    vector_cosine_similarity(q.embedding, d.embedding);

Manutenzione e stato dell'indice

Dopo aver creato un indice vettoriale, l'Ottimizzazione Predittiva lo aggiorna automaticamente man mano che la tabella cambia. Le query includono immediatamente le righe appena aggiunte, anche prima che quelle righe siano state indicizzate.

Per trovare gli indici associati a una tabella, esegui DESCRIBE EXTENDED:

DESCRIBE EXTENDED main.analytics.documents;

La sezione # Indexes dell'output mostra il nome di ciascun indice e il nome completo qualificato. Ad esempio:

# Indexes
documents_embedding_cosine_idx   main.analytics.documents_embedding_cosine_idx

Per ispezionare l'indice, usa il suo nome completamente qualificato:

DESCRIBE INDEX main.analytics.documents_embedding_cosine_idx;

L'output include informazioni sulla colonna indicizzata e sulla metrica di punteggio. Ad esempio:

proprietà valore
Name documents_embedding_cosine_idx
Columns embedding
Metrica di punteggio cosine_similarity

L'ottimizzazione predittiva aggiorna l'indice ma non lo riaddestra automaticamente. Se la distribuzione dei vettori nella tua tabella cambia significativamente, il ritraining può aiutare a mantenere la qualità della ricerca.

Per riaddestrare l'indice, eliminalo e ricrealo con la stessa colonna e metrica di punteggio. Ad esempio:

DROP INDEX main.analytics.documents_embedding_cosine_idx;

CREATE VECTOR INDEX main.analytics.documents_embedding_cosine_idx
ON main.analytics.documents (embedding)
OPTIONS (scoring_metric = 'cosine_similarity');

Elimina un indice vettoriale

Da usare DROP INDEX per rimuovere un indice vettoriale:

DROP INDEX main.analytics.documents_embedding_cosine_idx;

Dopo aver rimosso l'indice, le query che si basavano su di esso vengono eseguite senza l'accelerazione di quell'indice.

Note

Prima di rinominare, eliminare o cambiare il tipo di una colonna indicizzata, elimina ogni indice vettoriale su quella colonna.

Limitations

  • Quando si crea l'indice, la tabella può avere fino a 1 miliardo di righe, e i vettori possono contenere fino a 4.096 elementi.

  • Nei casi seguenti, le query utilizzano la ricerca a forza bruta invece dell'ottimizzazione vettoriale:

    • La query utilizza il time travel sulla tabella indicizzata.
    • La tabella contiene filtri riga, maschere a colonna o policy di controllo di accesso basate su attributi (ABAC).
    • La tabella è una sorgente o una destinazione OpenSharing.

    Questo vale anche se aggiungi queste politiche o inizi a condividere la tabella dopo aver creato l'indice.