Ce document explique comment utiliser les embeddings stockés pour générer des index et interroger des embeddings. Pour en savoir plus sur le stockage des embeddings, consultez Stocker des embeddings vectoriels.
Vous pouvez créer des index ScaNN
, IVF
, IVFFlat
et HNSW
avec AlloyDB.
Avant de commencer
Avant de pouvoir commencer à créer des index, vous devez remplir les conditions préalables suivantes.
Les vecteurs d'embeddings sont ajoutés à une table de 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
, un
Extension PostgreSQL développée par Google qui implémente une
un index des plus proches voisins efficace basé sur l'algorithme ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
L'index ScaNN
est un index de quantification basé sur une arborescence pour la recherche approximative
la recherche des plus proches voisins. Il permet de réduire le temps de création d'index et l'empreinte
espace mémoire utilisé par rapport à HNSW
. De plus, il peut offrir RPS plus élevé que
par rapport à HNSW
en fonction de la charge de travail.
une table de votre base de données AlloyDB. Si vous essayez de générer un index ScaNN
sur une table vide ou partitionnée, vous risquez de rencontrer des problèmes. Pour en savoir plus
Pour en savoir plus sur les erreurs générées, consultez Résoudre les erreurs d'indexation ScaNN.
Index arborescent à deux niveaux ScaNN
Pour appliquer un index arborescent à 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 souhaitezcreate (créer), par exemple
my-scann-index
. Les noms d'index sont partagésdans votre base de données. Assurez-vous que chaque nom d'index est unique pour chaque
dans votre base de données.
TABLE
: table à laquelle ajouter l'index.EMBEDDING_COLUMN
: colonne qui stocke les donnéesvector
.le retraitement des données.
DISTANCE_FUNCTION
: fonction de distance à utiliseravec 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 une valeur comprise entre 1 et 1 048 576. Pour en savoir plus
Pour savoir comment déterminer cette valeur, consultez Régler un index
ScaNN
.
Index ScaNN
à trois niveaux
Pour créer un index arborescent à trois niveaux à l'aide de l'algorithme ScaNN dans 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, max_num_levels = MAX_NUM_LEVELS);
Remplacez les éléments suivants :
MAX_NUM_LEVELS
: nombre maximal de niveaux deArborescence de clustering en k-moyennes. Définissez la valeur sur
1
(par défaut) pour la quantification arborescente à deux niveaux.quantification et sur
2
pour la quantification arborescente à trois niveaux.
Une fois l'index créé, vous pouvez exécuter des requêtes de recherche des voisins les plus proches qui
utilisent l'index en suivant les instructions de la section [Envoyer une requête de type plus proches voisins
requête avec le texte donné](#query).
Les paramètres d'index doivent être définis de manière à trouver le juste équilibre entre les RPS et
le rappel. Pour en savoir plus sur le réglage de l'index ScaNN
, consultez [Régler un index ScaNN
index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).
Pour créer cet index sur une colonne d'embeddings qui utilise le type de données real[]
au lieu de vector
, convertissez le type de données de la colonne en 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
embedding. Pour savoir comment trouver les dimensions,
consultez la fonction vector_dims
dans [Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
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.
La phase building index: tree training
disparaît une fois l'index créé.
Pour régler votre index afin d'obtenir un équilibre entre le rappel et les RPS cibles, consultez Régler un index ScaNN
.
Analyser votre table indexée
Après avoir créé l'index ScaNN
, exécutez la commande ANALYZE
pour mettre à jour les statistiques sur vos données.
ANALYZE TABLE;
Exécuter une requête
Une fois que vous avez stocké et indexé les embeddings dans votre base de données, vous pouvez commencer à
interroger à l'aide de la requête [pgvector
functionality](https://github.com/pgvector/pgvector#querying). 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 la
l'exemple de requête suivant, dans lequel vous définissez la même fonction de distance que celle 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 auquel comparer letexte à.
INDEX_NAME
: nom de l'index que vous souhaitez utiliser (par exemple,Exemple :
my-scann-index
.EMBEDDING_COLUMN
: colonne contenant lesembeddings.
DISTANCE_FUNCTION_QUERY
: fonction de distance à utiliser avec cetterequête. Choisissez l'une des options suivantes, selon 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 plus proches voisins sémantiques qui sont stockés.voisins sémantiques de.
ROW_COUNT
: nombre de lignes à afficher.Spécifiez
1
si vous souhaitez n'obtenir que la meilleure correspondance.
Pour d'autres exemples de requêtes, consultez
Vous pouvez également utiliser la fonction embedding()
pour traduire le
du texte en vecteur. Vous appliquez le vecteur à l'un des
Opérateur pgvector
correspondant aux plus proches voisins, <->
pour la distance L2, afin de rechercher les lignes de la base de données présentant les
les représentations vectorielles continues les plus proches sémantiquement.
Comme embedding()
renvoie un tableau real
, vous devez convertir explicitement l'appel
Appel embedding()
à vector
pour utiliser ces valeurs avec pgvector
d'opérateurs.
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
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 à interrogerSi vous utilisez Vertex AI Model Garden, spécifiez
text-embedding-005
comme ID de modèle. Il s'agit des modèles cloud qu'AlloyDB peut utiliser pour les embeddings textuels. Pour en savoir plus, consultez Embeddings textuels.VERSION_TAG
(facultatif) : tag de version du modèle à interroger. Ajoutez le préfixe@
au tag.Si vous utilisez l'un des modèles
text-embedding
en anglais avec Vertex AI, spécifiez l'un des tags de version (par exemple,text-embedding-005
) listés dans la section Versions de modèle.Google vous recommande vivement de spécifier le tag de version. Si vous ne spécifiez pas le tag 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.
Étapes suivantes
- Exemple de workflow d'embedding
- Régler les performances des requêtes vectorielles
- Métriques d'index vectoriel