Cette page explique comment utiliser des représentations vectorielles continues stockées pour générer des index et des représentations vectorielles continues de requête à l'aide des index ScaNN
, IVF
, IVFFlat
et HNSW
avec AlloyDB pour PostgreSQL.
Pour en savoir plus sur le stockage des embeddings, consultez Stocker des embeddings vectoriels.
Avant de commencer
Avant de pouvoir commencer à créer des index, vous devez remplir les conditions préalables suivantes.
Les vecteurs d'embedding sont ajoutés à une table dans votre base de données AlloyDB.
La version
0.5.0
ou ultérieure de l'extensionvector
, basée surpgvector
, étendue par Google pour AlloyDB, est installée.CREATE EXTENSION IF NOT EXISTS vector;
Pour générer des index
ScaNN
, installez l'extensionalloydb_scann
en plus de l'extensionvector
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Créer un index
Vous pouvez créer l'un des types d'index suivants pour les tables de votre base de données.
Créer un index ScaNN
AlloyDB alloydb_scann
, une extension PostgreSQL développée par Google qui implémente un indice de voisin le plus proche hautement efficace basé sur l'algorithme ScaNN.
L'index ScaNN
est un indice de quantification basé sur un arbre pour la recherche des voisins les plus proches approximatifs. Il offre un temps de création d'index plus court et une empreinte mémoire plus faible que HNSW
. De plus, il fournit un RPS plus rapide que HNSW
en fonction de la charge de travail.
Index ScaNN
arborescent à deux niveaux
Pour appliquer un indice d'arbre à deux niveaux à l'aide de l'algorithme ScaNN à une colonne contenant des embeddings vectoriels stockés, exécutez la requête LDD suivante:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Remplacez les éléments suivants :
INDEX_NAME
: nom de l'index que vous souhaitez créer (par exemple,my-scann-index
) Les noms d'index sont partagés dans votre base de données. Assurez-vous que chaque nom d'index est unique pour chaque table de votre base de données.TABLE
: table à laquelle ajouter l'index.EMBEDDING_COLUMN
: colonne qui stocke les donnéesvector
.DISTANCE_FUNCTION
: fonction de distance à utiliser avec cet index. Choisissez l'une des options suivantes :Distance L2:
l2
Produit scalaire:
dot_product
Distance de cosinus:
cosine
NUM_LEAVES_VALUE
: nombre de partitions à appliquer à cet index. Définissez cette valeur sur une valeur comprise entre 1 et 1048576. Pour en savoir plus sur la détermination de cette valeur, consultez Configurer un indiceScaNN
.
Index ScaNN
arborescent à trois niveaux
Pour créer un indice en arbre à trois niveaux à l'aide de l'algorithme ScaNN pour une colonne contenant des représentations vectorielles continues stockées, exécutez la requête LDD suivante:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Remplacez les éléments suivants :
MAX_NUM_LEVELS
: nombre maximal de niveaux de l'arborescence de clustering K-means. Définissez la valeur sur1
(par défaut) pour la quantification basée sur un arbre à deux niveaux et sur2
pour la quantification basée sur un arbre à trois niveaux.
Une fois l'index créé, vous pouvez exécuter des requêtes de recherche de voisins les plus proches qui l'utilisent en suivant les instructions de la section Envoyer une requête de type plus proches voisins avec un texte donné.
Les paramètres d'index doivent être définis pour trouver le juste équilibre entre le RPS et la récupération. Pour en savoir plus sur l'ajustement de l'index ScaNN
, consultez Ajuster un index ScaNN
.
Pour créer cet index sur une colonne d'embeddings qui utilise le type de données real[]
au lieu de vector
, convertissez la colonne en type de données vector
:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Remplacez DIMENSIONS
par la largeur dimensionnelle de la colonne d'embeddings. Pour savoir comment trouver les dimensions, consultez la fonction vector_dims
dans les fonctions de vecteur.
Pour afficher la progression de l'indexation, utilisez la vue pg_stat_progress_create_index
:
SELECT * FROM pg_stat_progress_create_index;
La colonne phase
indique l'état actuel de la création de votre index, et la phase building index: tree training
disparaît une fois l'index créé.
Pour ajuster votre index en fonction d'un rappel cible et d'un équilibre RPS, consultez Ajuster un index ScaNN
.
Exécuter une requête
Une fois que vous avez stocké et indexé les embeddings dans votre base de données, vous pouvez commencer à effectuer des requêtes à l'aide de la fonctionnalité de requête pgvector
. Vous ne pouvez pas exécuter de requêtes de recherche groupées à l'aide de l'extension alloydb_scann
.
Pour trouver les voisins sémantiques les plus proches d'un vecteur d'embedding, vous pouvez exécuter l'exemple de requête suivant, dans lequel vous définissez la même fonction de distance que celle que vous avez utilisée lors de la création de l'index.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Remplacez les éléments suivants :
TABLE
: table contenant l'embedding à comparer au texte.INDEX_NAME
: nom de l'index que vous souhaitez utiliser (par exemple,my-scann-index
).EMBEDDING_COLUMN
: colonne contenant les embeddings stockées.DISTANCE_FUNCTION_QUERY
: fonction de distance à utiliser avec cette requête. Choisissez l'une des options suivantes en fonction de la fonction de distance utilisée lors de la création de l'index:Distance L2:
<->
Produit interne:
<#>
Distance de cosinus:
<=>
EMBEDDING
: vecteur d'embedding pour lequel vous souhaitez trouver les voisins sémantiques les plus proches.ROW_COUNT
: nombre de lignes à afficher.Spécifiez
1
si vous souhaitez n'obtenir que la meilleure correspondance.
Pour en savoir plus sur d'autres exemples de requêtes, consultez la section Interrogation.
Vous pouvez également utiliser la fonction embedding()
pour traduire le texte en vecteur. Vous appliquez le vecteur à l'un des opérateurs pgvector
correspondant aux plus proches voisins, <->
pour la distance L2, afin de rechercher les lignes de la base de données présentant les embeddings les plus similaires sur le plan de la sémantique.
Comme embedding()
renvoie un tableau real
, vous devez convertir explicitement l'appel embedding()
en type de données vector
pour utiliser ces valeurs avec les opérateurs pgvector
.
CREATE EXTENSION IF NOT EXISTS google_ml_integration VERSION '1.2';
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
Remplacez les éléments suivants :
MODEL_ID
: ID du modèle à interroger.Si vous utilisez Vertex AI Model Garden, spécifiez
text-embedding-005
comme ID de modèle. Il s'agit des modèles cloud que AlloyDB peut utiliser pour les embeddings de texte. Pour en savoir plus, consultez Embeddings de texte.Facultatif:
VERSION_TAG
: balise de version du modèle à interroger. Ajoutez le préfixe@
au tag.Si vous utilisez l'un des modèles
text-embedding-005
en anglais avec Vertex AI, spécifiez l'un des tags de version (par exemple,text-embedding-005
) listés dans Versions de modèle.Google vous recommande vivement de toujours spécifier le tag de version. Si vous ne spécifiez pas la balise de version, AlloyDB utilise toujours la dernière version du modèle, ce qui peut entraîner des résultats inattendus.
TEXT
: texte à traduire en embedding vectoriel.
Étape suivante
- Exemple de workflow d'embedding
- Régler les performances des requêtes vectorielles
- Métriques de l'index vectoriel
- Découvrez comment créer un assistant d'achat intelligent avec AlloyDB, pgvector et la gestion des points de terminaison de modèle.