Optimisation vectorielle sur les tables gérées par Unity Catalog
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
SELECTetMODIFYsur la table,USE CATALOGsur son catalogue etUSE SCHEMAsur 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 :
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 |
|---|---|
|
|
|
|
|
|
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 :
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:
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 :
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 |
|
Colonnes |
|
Métrique de score |
|
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 :
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 :
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.
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.