Aller au contenu principal

Optimisation vectorielle sur les tables gérées par Unity Catalog

info

Bêta

Cette fonctionnalité est en bêta.

L’optimisation vectorielle accélère les recherches de similitude sur les colonnes vectorielles dans les tables gérées par Unity Catalog. Lorsque vous exécutez une query de recherche vectorielle avec APPROX NEAREST BY, Databricks peut utiliser l’optimisation vectorielle pour limiter la recherche aux données susceptibles de contenir les correspondances les plus proches. Cela réduit la quantité de données scannées, en particulier pour les grandes tables.

Pour utiliser l’optimisation vectorielle, créez un index vectoriel sur une colonne et spécifiez une métrique de scoring : similarité cosinus, produit scalaire ou distance L2. L’optimisation prédictive refresh automatiquement l’index à mesure que vos données changent. Les queries éligibles qui utilisent la colonne indexée et la fonction de comparaison correspondante utilisent l’optimisation ; les autres queries utilisent une recherche par force brute. Pour la syntaxe et les exemples de query, consultez clause NEAREST BY.

Exigences​

Pour créer un index vectoriel sur une table :

  • Utilisez Databricks Runtime 19 ou une version ultérieure.
  • Vous devez disposer des permissions SELECT et MODIFY sur la table, USE CATALOG sur son catalogue et USE SCHEMA sur son schéma.
  • La table doit être une table Delta Lake ou Iceberg gérée par Unity Catalog.
  • Créez l’index dans le même catalogue et le même schéma que la table.
  • L’optimisation prédictive doit être activée sur la table pour refresh automatiquement l’index.
  • Le suivi des lignes doit être activé avant de créer l'index. Voir Suivi des lignes dans Databricks.
  • La table doit contenir des données lorsque vous créez l'index.
  • La colonne de vecteurs doit avoir le type de données ARRAY<FLOAT>, et tous les vecteurs doivent avoir le même nombre d'éléments.

Pour utiliser l’optimisation vectorielle dans une jointure APPROX NEAREST BY, placez la table avec l’index vectoriel sur la droite et utilisez la fonction de comparaison qui correspond à la métrique de score de l’index. La table vecteur-query sur la gauche doit également avoir le suivi des lignes activé.

Créer un index vectoriel​

Utilisez CREATE VECTOR INDEX pour créer un index pour une colonne et une métrique de scoring. Par exemple, cette instruction crée un index avec une similarité cosinus pour la colonne embedding :

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

Vous pouvez créer plusieurs index vectoriels sur la même colonne pour prendre en charge différentes métriques de score.

Chaque métrique de scoring correspond à une fonction de query :

Métrique de scoring

Fonction de query

cosine_similarity

vector_cosine_similarity

inner_product

vector_inner_product

l2_distance

vector_l2_distance

Métrique de scoring

Fonction de query

cosine_similarity

vector_cosine_similarity

inner_product

vector_inner_product

l2_distance

vector_l2_distance

important

Utilisez la fonction de query qui correspond à la métrique de scoring de l’index dans votre query APPROX NEAREST BY. S’il n’existe aucun index correspondant, la query s’exécute sans optimisation vectorielle.

query des données avec une optimisation vectorielle​

Placez la table avec l'index vectoriel sur le côté droit d'une jointure APPROX NEAREST BY. Vous pouvez filtrer la table query-vector sur la gauche tout en utilisant l'optimisation vectorielle. La jointure par batch suivante renvoie jusqu'à 10 documents par vecteur de query :

SQL
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);

Maintenance et statut de l'index​

Après avoir créé un index vectoriel, l’optimisation prédictive le refresh automatiquement à mesure que la table change. Les query incluent immédiatement les nouvelles lignes ajoutées, même avant que ces lignes n’aient été indexées.

Pour trouver les index associés à une table, exécutez DESCRIBE EXTENDED:

SQL
DESCRIBE EXTENDED main.analytics.documents;

La section # Indexes de la sortie affiche le nom et le nom complet de chaque index. Par exemple :

# Indexes
documents_embedding_cosine_idx main.analytics.documents_embedding_cosine_idx

Pour inspecter l’index, utilisez son nom complet :

SQL
DESCRIBE INDEX main.analytics.documents_embedding_cosine_idx;

La sortie inclut des informations sur la colonne indexée et la métrique de score. Par exemple :

propriété

Valeur

Nom

documents_embedding_cosine_idx

Colonnes

embedding

Métrique de score

cosine_similarity

propriété

Valeur

Nom

documents_embedding_cosine_idx

Colonnes

embedding

Métrique de score

cosine_similarity

L'optimisation prédictive refresh l'index, mais ne le réentraîne pas automatiquement. Si la distribution des vecteurs dans votre table change de manière significative, le réentraînement peut aider à maintenir la qualité de la recherche.

Pour réentraîner l'index, supprimez-le et recréez-le avec la même colonne et la même métrique de score. Par exemple :

SQL
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');

Supprimer un index vectoriel​

Utilisez DROP INDEX pour supprimer un index vectoriel :

SQL
DROP INDEX main.analytics.documents_embedding_cosine_idx;

Après avoir supprimé l'index, les queries qui dépendaient de lui s'exécutent sans l'accélération de cet index.

remarque

Avant de renommer, de supprimer ou de modifier le type d’une colonne indexée, supprimez chaque index vectoriel sur cette colonne.

Limitations​

  • Lorsque vous créez l'index, la table peut comporter jusqu'à 1 milliard de lignes et les vecteurs peuvent contenir jusqu'à 4 096 éléments.

  • Dans les cas suivants, les query utilisent une recherche en force brute au lieu d’une optimisation vectorielle :

    • La query utilise time travel sur la table indexée.
    • La table possède des filtres de ligne, des masques de colonne ou des politiques de contrôle d’accès basé sur les attributs (ABAC).
    • La table est une source ou une cible OpenSharing.

    Cela s’applique même si vous ajoutez ces politiques ou si vous commencez à start la table après avoir créé l’index.