Cette page explique comment utiliser les embeddings stockés pour générer des index et interroger des embeddings à l'aide d'un index 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'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;
Créer un index HNSW
AlloyDB permet de créer un index hnsw
basé sur un graphe, disponible avec pgvector
standard, à l'aide de l'extension pgvector
AlloyDB. L'utilisation d'un index hnsw
entraîne une recherche gloutonne qui parcourt le graphe en recherchant constamment le voisin le plus proche du vecteur de requête jusqu'à ce qu'elle trouve un résultat optimal. Cette approche offre une vitesse de requête plus élevée, mais des temps de compilation plus lents que IVF
.
Pour en savoir plus sur l'algorithme HNSW, consultez Hierarchical Navigable Small World graphs.
Pour créer un index hnsw
, exécutez la requête suivante :
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
Remplacez les éléments suivants :
INDEX_NAME
: nom de l'index que vous souhaitez créer, par exemplemy-hnsw-index
.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 :
vector_l2_ops
Produit interne :
vector_ip_ops
Distance de cosinus :
vector_cosine_ops
NUMBER_OF_CONNECTIONS
: nombre maximal de connexions par nœud dans le graphe. Vous pouvez commencer par la valeur par défaut16
et tester des valeurs plus élevées en fonction de la taille de votre ensemble de données.CANDIDATE_LIST_SIZE
: taille d'une liste de candidats conservée lors de la construction du graphe, qui met constamment à jour les meilleurs candidats à l'instant T pour les voisins les plus proches associés à un nœud. Définissez cet élément sur une valeur supérieure au double de la valeurm
(par exemple,64
).
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 graph
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 hnsw
.
Exécuter une requête
Une fois que vous avez stocké et indexé les embeddings dans votre base de données, vous pouvez commencer à les interroger à l'aide de la fonctionnalité de requête pgvector
.
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 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 le texte.INDEX_NAME
: nom de l'index que vous souhaitez utiliser (par exemple,my-hnsw-index
).EMBEDDING_COLUMN
: colonne contenant les embeddings stockés.DISTANCE_FUNCTION_QUERY
: fonction de distance à utiliser avec cette requê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.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 Effectuer des requêtes.
Vous pouvez également utiliser la fonction embedding()
pour traduire le texte en un 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 approchants sur le plan 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
.
Étapes suivantes
- Créer un index ScaNN
- Exécuter des recherches de similarité vectorielle
- Régler les performances des requêtes vectorielles
- Métriques d'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.