Créer un index IVFFLAT

Cette page explique comment utiliser les embeddings stockés pour générer des index et interroger des embeddings à l'aide d'un index IVFFlat 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'extension vector basée sur pgvector, étendue par Google pour AlloyDB, est installée.

    CREATE EXTENSION IF NOT EXISTS vector;
    

Créer un index IVFFlat

pgvector standard fournit également une version de l'index IVF nommée IVFFlat, qui offre un délai de compilation plus court et une empreinte mémoire réduite par rapport à l'index hnsw.

Pour créer un index IVFFlat, procédez comme suit :

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Remplacez les éléments suivants :

  • INDEX_NAME : nom de l'index que vous souhaitez créer, par exemple my-ivf-index.

  • TABLE : table à laquelle ajouter l'index.

  • EMBEDDING_COLUMN : colonne qui stocke les données vector.

  • 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

  • LIST_COUNT : nombre de listes à utiliser avec cet index. Pour savoir comment choisir cette valeur, consultez Régler un index IVFFlat.

    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 ivfflat (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

Remplacez DIMENSIONS par la largeur dimensionnelle de la colonne d'embeddings. Pour savoir comment trouver les dimensions, examinez la fonction vector_dims dans Fonctions vectorielles.

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.

Pour régler votre index afin d'obtenir un équilibre entre le rappel et les RPS cibles, consultez Régler un index IVFFlat.

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-scann-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