Les index Hierarchical Navigable Small World (HNSW) dans AlloyDB pour PostgreSQL vous permettent d'accélérer les recherches de similarité vectorielle sur les embeddings stockés avec un rappel élevé et une faible latence de requête. Vous pouvez créer des index HNSW basés sur un graphe à l'aide de l'extension vector, régler les paramètres de compilation de l'index et exécuter des requêtes de similarité sur vos embeddings indexés. 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.0ou ultérieure de l'extensionvectorbasé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 exemple,my-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_opsProduit interne :
vector_ip_opsDistance 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éfaut16et 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
1si 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 embedding() fonction pour traduire le
texte en vecteur. Vous appliquez le vecteur à l'un des
pgvector opérateurs 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.
Étape suivante
- Créer un index ScaNN
- Effectuer 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.