Alimenter votre système agentif avec HTAP dans AlloyDB

1. Présentation

Dans la partie 1, nous avons réussi à transformer des PDF chaotiques et non structurés en tables propres, intelligentes et structurées dans BigQuery à l'aide de Knowledge Catalog et de DataScan. Nous disposons désormais d'un entrepôt de données robuste. Dans la partie 2, nous avons configuré AlloyDB comme base transactionnelle et y avons fédéré nos tables BigQuery, créant ainsi une couche de données unifiée sans dupliquer un seul octet.

Aujourd'hui, nous allons créer le cerveau. Nous allons créer une application multi-agent, le "FroyoOS Store Manager", qui se trouve au-dessus de cette couche de données pour répondre aux questions, vérifier les allergènes et traiter les commandes en direct.

Le défi : découpler l'IA de votre agent

Lorsque vous créez un agent d'IA qui doit communiquer avec des bases de données, l'anti-modèle le plus courant consiste à forcer les données et la logique d'IA directement dans votre application Python. Cela rend votre application fragile, non sécurisée et incroyablement difficile à maintenir à mesure que votre architecture de données se développe.

Pour résoudre ce problème, nous allons utiliser MCP (Model Context Protocol) Toolbox. MCP Toolbox sert de couche d'abstraction de données unifiée. Nous définissons nos opérations de base de données de manière déclarative dans un simple fichier tools.yaml. Nous déployons cette boîte à outils en tant que point de terminaison sans serveur sécurisé sur Google Cloud Run. Notre agent d'IA se connecte simplement à ce point de terminaison et dit : "Exécute l'outil 'place_order'."

La puissance du traitement HTAP

Avant de commencer à créer l'agent, expliquons pourquoi le titre de cet article mentionne spécifiquement le traitement HTAP (Hybrid Transactional/Analytical Processing).

Dans une architecture traditionnelle, si un agent d'IA devait traiter une commande utilisateur en direct (une charge de travail OLTP transactionnelle) et croiser des milliers de mappages d'ingrédients complexes (une charge de travail OLAP analytique), votre application Python devrait gérer les connexions à deux bases de données entièrement différentes. Cela crée une latence, une surcharge de sécurité et une gestion d'état fragiles.

Nous avons transformé AlloyDB en une centrale HTAP en fédérant de manière native notre entrepôt de données BigQuery directement dans PostgreSQL. Grâce à cette architecture HTAP, notre agent d'IA n'a plus besoin de communiquer qu'avec un seul point de terminaison de base de données. Il peut insérer des transactions en direct dans la table live_orders et exécuter des analyses analytiques lourdes sur l'ensemble de données BigQuery fédéré froyo_data en même temps, sans dupliquer un seul octet de données. Voyons comment nous exposons ce moteur à notre IA.

Au travail !

f372e1ecf65501e4.png

Points abordés

  • Configurer un cluster, une instance et un réseau AlloyDB en un clic
  • Configurer une extension pour préparer la fédération
  • Configurer la fédération de BigQuery vers AlloyDB
  • Effectuer un test

Conditions requises

  • Un navigateur (Chrome ou Firefox, par exemple)
  • Un projet Google Cloud avec facturation activée.
  • Connaître les principes de base de SQL

2. Avant de commencer

Créer un projet

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.
  1. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud. Cliquez sur Activer Cloud Shell en haut de la console Google Cloud.

Image du bouton "Activer Cloud Shell"

  1. Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini sur votre ID de projet à l'aide de la commande suivante :
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet.
gcloud config list project
  1. Si vous souhaitez vous authentifier
gcloud auth login
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project <YOUR_PROJECT_ID>
  1. Activez les API requises : exécutez cette commande pour activer toutes les API requises :
gcloud services enable \
  alloydb.googleapis.com \
  bigquery.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  iam.googleapis.com \
  secretmanager.googleapis.com \
  compute.googleapis.com \
  servicenetworking.googleapis.com

Problèmes courants et dépannage

Syndrome du "projet fantôme"

Vous avez exécuté gcloud config set project, mais vous consultez en fait un autre projet dans l'interface utilisateur de la console. Vérifiez l'ID du projet dans la liste déroulante en haut à gauche !

Barrière de facturation

Vous avez activé le projet, mais vous avez oublié le compte de facturation. AlloyDB est un moteur hautes performances. Il ne démarre pas si le "réservoir" (facturation) est vide.

Délai de propagation de l'API

Vous avez cliqué sur "Activer les API", mais la ligne de commande indique toujours Service Not Enabled. Attendez 60 secondes. Le cloud a besoin d'un moment pour activer ses neurones.

Quotas

Si vous utilisez un tout nouveau compte d'essai, vous pouvez atteindre un quota régional pour les instances AlloyDB. Si us-central1 échoue, essayez us-east1.

3. Préparer les données

Assurez-vous que les données structurées que nous avons extraites des PDF non structurés sont disponibles dans BigQuery et que la fédération AlloyDB des données BigQuery est également établie et testée. Si vous n'avez pas effectué ces étapes, c'est le bon moment pour les exécuter en suivant les instructions ici et ici pour les parties 1 et 2, respectivement.

Remarque :

Si vous essayez cet atelier de programmation, n'exécutez pas l'étape de nettoyage de la partie 2 (suppression du cluster et de l'instance), car nous avons besoin de l'orchestration AlloyDB pour notre système agentique présenté ici.

En plus des données que nous avons déjà créées dans la partie 2, nous devons créer une table supplémentaire dans l'instance AlloyDB. Accédez à AlloyDB Studio à l'aide du lien suivant :

https://console.cloud.google.com/alloydb/locations/us-central1/clusters/my-alloydb-cluster/studio

Modifiez le nom du cluster dans le lien ci-dessus si vous utilisez un autre cluster.

Dans AlloyDB Studio, dans un nouvel onglet de l'éditeur de requête, exécutez l'instruction suivante :

CREATE TABLE live_orders (
    order_id SERIAL PRIMARY KEY,
    customer_name VARCHAR(100),
    product_id VARCHAR(100),
    quantity INT,
    order_status VARCHAR(50) DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Cela devrait créer la table live_orders dans votre base de données.

4. Définir l'abstraction (tools.yaml)

Tout d'abord, nous enregistrons formellement nos opérations de base de données. Nous créons un fichier tools.yaml qui définit comment notre agent interagit avec AlloyDB, qui contient à la fois les données transactionnelles et analytiques (données analytiques issues de la fédération BigQuery).

  1. Accédez à votre terminal Cloud Shell. Passez en mode Éditeur.
  2. Créez un dossier dans votre répertoire racine : "froyo-agent"
  3. Dans le dossier, créez un fichier tools.yaml et collez le contenu suivant : (remplacez les valeurs par les vôtres pour le projet, le cluster, l'instance et le mot de passe)
# tools.yaml
sources:
    alloydb-source:
        kind: "alloydb-postgres"
        project: "*******"
        region: "us-central1"
        cluster: "my-alloydb-cluster"
        instance: "my-primary-inst"
        database: "postgres"
        user: "postgres"
        password: "*******"
        ipType: "private"


tools:
  check_allergens:
    kind: postgres-sql
    source: alloydb-source
    description: Queries the federated BigQuery tables to find allergens for a product.
    statement: |
      SELECT a.allergen_name
      FROM consistsof c
      INNER JOIN product p ON c.product_id = p.product_id
      INNER JOIN ingredient i ON c.ingredient_id = i.ingredient_name
      INNER JOIN containsallergen a ON i.ingredient_id = a.ingredient_id
      WHERE UPPER(p.product_name) LIKE UPPER($1)
    parameters:
      - name: product_name
        type: string
        description: The name of the product to check. (e.g., '%Midnight%')


  place_order:
    kind: postgres-sql
    source: alloydb-source
    description: Inserts a new live transaction into the native AlloyDB orders table.
    statement: |
      INSERT INTO live_orders (customer_name, product_id, quantity)
      VALUES ($1, (SELECT product_id FROM product WHERE product_name ILIKE '%' || $2 || '%' LIMIT 1), $3) RETURNING order_id;
    parameters:
      - name: customer_name
        type: string
        description: The name of the customer placing the order.
      - name: product_name
        type: string
        description: The name of the product being ordered.
      - name: quantity
        type: integer
        description: The quantity of the product being ordered.


toolsets:
  alloydb_tools:
    - check_allergens
    - place_order

Nous avons limité les capacités de notre agent à deux outils : vérifier les allergènes et passer une commande.

5. Déployer la boîte à outils sur Cloud Run

Pour rendre cette boîte à outils disponible pour notre application, nous la déployons de manière sécurisée à l'aide de gcloud CLI. Cela crée notre point de terminaison de couche d'abstraction.

  1. Passez au terminal Cloud Shell et accédez au répertoire de travail en exécutant la commande :
cd froyo-agent
  1. Enregistrez le fichier tools.yaml dans un secret nommé "tools-froyo" :
gcloud secrets create tools-froyo --data-file=tools.yaml
  1. Déployez le conteneur MCP Toolbox sur Cloud Run.
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
gcloud run deploy toolbox-froyo \
    --image $IMAGE \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools-froyo:latest" \
    --args="--config=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --network easy-alloydb-vpc \
    --subnet easy-alloydb-subnet \
    --allow-unauthenticated \
    --vpc-egress private-ranges-only

Les valeurs "network" et "subnet" doivent être remplacées si vous avez utilisé des valeurs différentes de celles que nous avons configurées dans l'atelier de programmation de la partie 2.

  1. Notez l'URL Cloud Run obtenue (par exemple, https://toolbox-froyo-xxx.run.app).

6. Le backend agentique (app.py)

Notre base de données étant abstraite, notre code Python peut se concentrer entièrement sur l'orchestration et le raisonnement.

Nous utilisons Agent Development Kit (ADK) avec Flask. L'ADK fournit une mémoire de session de niveau entreprise (InMemorySessionService), ce qui signifie que notre agent se souvient du contexte de la conversation. Il s'intègre de manière native à ToolboxSyncClient pour extraire de manière transparente nos outils de Cloud Run.

Voici votre fichier app.py :

https://github.com/AbiramiSukumaran/froyo-data/blob/main/app.py

L'application Python Flask simple connecte l'agent ADK aux outils que nous avons définis dans notre boîte à outils, qui à son tour interagit avec AlloyDB (ainsi qu'avec les données fédérées BigQuery) et répond à l'utilisateur.

7. L'interface utilisateur et l'exécution de l'application

Pour offrir une expérience appropriée à nos responsables de magasin, nous avons créé une interface utilisateur élégante et glassmorphe (templates/index.html) avec une barre latérale de catalogue de produits en direct et une interface de chat interactive.

Vous trouverez le fichier index.html dans le fichier de dépôt ici :

https://github.com/AbiramiSukumaran/froyo-data/blob/main/templates/index.html

Avant d'exécuter l'application, assurez-vous que vos dépendances sont installées en créant le fichier requirements.txt avec le contenu suivant :

Flask>=3.0.0
google-genai>=0.1.0
mcp>=1.0.0
google-adk
toolbox-core
toolbox-langchain
python-dotenv

et que votre fichier .env est rempli :

GOOGLE_API_KEY=***
MCP_TOOLBOX_SERVER_URL=***

Depuis le terminal Cloud Shell, en vous assurant que vous vous trouvez dans le dossier du projet, exécutez les commandes suivantes une par une :

Installez les dépendances :

pip install -r requirements.txt

Exécutez le fichier Python :

python app.py

Cliquez sur le lien qui s'affiche dans le terminal ou ouvrez http://localhost:8080.

84f7f7037d57634a.png

8. Le test ultime

Cliquez sur un produit du catalogue pour poser la question suivante à l'agent :

Does Midnight Swirl have any allergens?

La réponse suivante devrait s'afficher :

f591a86f763a1652.png

En coulisses :

  1. L'agent ADK reçoit l'invite et décide d'utiliser l'outil check_allergens.
  2. Il appelle de manière sécurisée MCP Toolbox sur Cloud Run.
  3. La boîte à outils exécute la requête dans AlloyDB, qui se fédère instantanément à BigQuery pour analyser les relations complexes que nous avons créées dans la partie 1.
  4. La base de données renvoie "Soja", que l'agent résume clairement dans l'interface utilisateur.

Ensuite, nous disons :

Order 2 Midnight Swirls for Alice.

d0c37690a1375100.png

L'agent transmet la chaîne "Midnight Swirl" à la boîte à outils. Le code SQL sous-jacent résout dynamiquement la chaîne en un ID entier via BigQuery, insère la commande en direct dans AlloyDB et confirme la transaction.

Dépôt de code

https://github.com/AbiramiSukumaran/froyo-data

9. Libérer de l'espace

Une fois cet atelier terminé, n'oubliez pas de supprimer le cluster et l'instance AlloyDB.

Cela devrait nettoyer le cluster ainsi que ses instances.

10. Félicitations pour votre agent !

Réfléchissez à ce que nous venons d'accomplir :

Notre système agentique bien orchestré interagit uniquement avec MCP Toolbox for Databases. En coulisses, il gère l'appel d'outil et les données de la logique d'IA de notre application, ce qui simplifie le flux :

  1. Notre application transactionnelle (exécutée sur AlloyDB) peut gérer des sessions utilisateur rapides et simultanées.
  2. Lorsqu'elle a besoin de données analytiques volumineuses ou d'un contexte historique (comme les informations sur les fournisseurs ou les mappages d'ingrédients complexes), elle interroge le schéma froyo_data de BigQuery.
  3. Aucun ETL. Aucun pipeline de données interrompu. Aucune base de données désynchronisée. Nous stockons une seule fois (dans BQ) et calculons où nous en avons besoin.

Maintenant que notre agent et notre base de données (analytiques et transactionnelles) sont complets, passons à la partie suivante.

Et ensuite ?

Notre agent fonctionne parfaitement... sur le chemin idéal. Dans la partie 4, nous allons créer un pipeline d'évaluation d'agent pour tester rigoureusement la validité, la mise à la terre et les performances de notre système agentique. J'espère vous y retrouver !