Importer des données d'index depuis BigQuery

Ce guide explique comment importer des données d'index depuis BigQuery dans la recherche vectorielle avec l'API ImportIndex. Il simplifie le processus de remplissage des index de recherche vectorielle directement à partir de vos tables BigQuery contenant des embeddings vectoriels.

Préparer les données BigQuery pour l'importation

Avant d'importer des données d'index, votre table BigQuery doit comporter les colonnes suivantes :

  • Identifiants uniques : cette colonne contient des identifiants uniques pour chaque point de données. Il est mappé au champ id dans Vector Search.

  • Embeddings vectoriels : cette colonne contient les embeddings vectoriels, représentés sous la forme d'un champ FLOAT répété. Il est mappé au champ d'embedding dans Vector Search.

Vous pouvez éventuellement inclure les colonnes suivantes :

  • Restrictions : il s'agit de colonnes pour les restrictions de chaînes et numériques, qui vous permettent de filtrer vos données lors des recherches.

  • Métadonnées : colonnes de métadonnées à renvoyer avec les résultats de requête d'index de recherche vectorielle.

Préparer l'index Vector Search pour l'importation

Une fois vos données BigQuery préparées, assurez-vous que l'index de recherche vectorielle de destination :

  • Existe dans Vector Search au sein de votre projet : cet index sert de destination pour vos données importées. L'index doit être créé dans votre projet.

  • Est défini sur "Écraser" ou "Ajouter" : lors du processus d'importation, vous avez la possibilité d'écraser les données existantes dans votre index Vector Search ou d'ajouter les données importées depuis BigQuery. L'option "Écraser" remplace les points de données actuels par les données importées. L'ajout permet d'ajouter les nouvelles données à l'index existant.

  • La dimensionnalité correspond : la dimensionnalité des embeddings stockés dans vos données BigQuery doit être identique à celle configurée pour votre index Vector Search.

Spécifier ImportIndexRequest

Avant d'importer des données depuis BigQuery, créez un objet ImportIndexRequest qui spécifie l'index cible, si les données existantes doivent être écrasées et la configuration pour la connexion à BigQuery. Envoyez cet objet de requête à l'API ImportIndex.

Voici un exemple de ImportIndexRequest au format JSON :

{
  "name": "projects/[PROJECT_ID]/locations/[LOCATION]/indexes/[INDEX_ID]",
  "isCompleteOverwrite": true,
  "config": {
    "bigQuerySourceConfig": {
      "tablePath": "bq://[PROJECT_ID].[DATASET_ID].[TABLE_ID]",
      "datapointFieldMapping": {
        "idColumn": "[ID_COLUMN_NAME]",
        "embeddingColumn": "[EMBEDDING_COLUMN_NAME]",
        "restricts": [
          {
            "namespace": "[RESTRICT_NAMESPACE]",
            "allowColumn": ["[RESTRICT_ALLOW_COLUMN_NAME]"],
            "denyColumn": ["[RESTRICT_DENY_COLUMN_NAME]"]
          }
        ],
        "numericRestricts": [
          {
            "namespace": "[RESTRICT_NAMESPACE]",
            "valueColumn": "[RESTRICT_VALUE_COLUMN_NAME]",
            "valueType": "INT"
          }
        ],
        "metadataColumns": ["METADATA_COLUMN1", "METADATA_COLUMN2", ...]
      }
    }
  }
}
  • name : nom complet de la ressource de l'index Vector Search dans lequel vous souhaitez importer les données.

  • isCompleteOverwrite : valeur booléenne indiquant s'il faut écraser les données existantes dans l'index. Définissez la valeur sur true pour remplacer les données existantes.

  • config : contient la configuration de la source BigQuery.

    • bigquerySourceConfig : spécifie les informations permettant de se connecter à votre table BigQuery.

    • tablePath : chemin d'accès complet à votre table BigQuery au format bq://[PROJECT_ID].[DATASET_ID].[TABLE_ID].

    • datapointFieldMapping : mappe les colonnes de votre table BigQuery aux champs de la recherche vectorielle.

      • idColumn : nom de la colonne contenant les identifiants uniques.

      • embeddingColumn : nom de la colonne contenant les embeddings vectorielles.

      • restricts : (facultatif) spécifie les restrictions de chaîne.

      • namespace : espace de noms de la restriction.

      • allowColumn : tableau contenant le ou les noms de colonnes pour les valeurs autorisées de la restriction.

      • denyColumn : tableau contenant le ou les noms de colonnes pour les valeurs refusées pour la restriction.

      • numericRestricts : (facultatif) spécifie les restrictions numériques.

      • namespace : espace de noms de la restriction numérique.

      • value_column : nom de la colonne contenant des valeurs numériques.

      • value_type : type de la valeur numérique, tel que INT, FLOAT ou DOUBLE.

      • metadataColumns : (facultatif) champs de métadonnées à inclure dans l'embedding de caractéristiques. Ces champs de métadonnées peuvent être récupérés à partir des résultats de recherche de l'index, mais ils n'ont aucune incidence sur la recherche elle-même. Par exemple, le filtrage ne peut pas être effectué sur les champs de métadonnées.

Exécuter l'importation

Une fois que vous avez créé un ImportIndexRequest, envoyez-le au point de terminaison de l'API ImportIndex. Cela déclenche le processus d'importation, qui exporte les données de BigQuery et les ingère dans votre index Vector Search. ImportIndex renvoie une opération de longue durée. Vous pouvez utiliser l'ID d'opération pour surveiller la progression de l'opération d'importation.

Une fois les données importées stockées, elles résident dans votre index Vector Search et sont indiscernables des données ingérées à l'aide d'autres méthodes. L'index peut continuer à être géré à l'aide des API Vector Search standards.

L'exemple de code suivant illustre un résultat de requête avec return_full_datapoint défini sur "true" et la configuration du connecteur BigQuery qui spécifie une restriction genre, une restriction numérique year et les colonnes de métadonnées title et description.

nearest_neighbors {
  neighbors {
    datapoint {
      datapoint_id: "4"
      feature_vector: 0.7
      feature_vector: 0.8
      restricts {
        namespace: "genre"
        allow_list: "Drama"
      }
      embedding_metadata {
        title: "A Movie"
        description: "The story of A Movie..."
      }
      crowding_tag {
        crowding_attribute: "0"
      }
      numeric_restricts {
        namespace: "year"
        value_int: 1942
      }
    }
    distance: 0.75
  }
}