Créer un moteur d'excédent en temps réel avec Gemini 3 Flash et Cloud SQL

1. Présentation

Dans cet atelier de programmation, vous allez créer Neighbor Loop, une application de partage de surplus durables qui traite l'intelligence comme un élément à part entière de la couche de données.

En intégrant Gemini 3.0 Flash et l'intégration ML de Cloud SQL, vous passerez du stockage de base à l'intelligence dans la base de données. Vous apprendrez à effectuer des analyses d'éléments multimodaux et à découvrir des sémantiques directement dans SQL.

645daa545b0e46a6.png

Ce que vous allez faire

Application Web "swipe-to-match" hautes performances pour le partage des surplus de la communauté.

Points abordés

  • Provisionnement en un clic : découvrez comment configurer une instance Cloud SQL conçue pour les charges de travail d'IA.
  • Embeddings dans la base de données : génération de vecteurs text-embedding-005 directement dans les instructions INSERT.
  • Raisonnement multimodal : utilisation de Gemini 3.0 Flash pour "voir" des éléments et générer automatiquement des bios amusantes de type "rencontres".
  • Découverte sémantique : effectuer des "vérifications d'ambiance" basées sur la logique dans les requêtes SQL à l'aide de la fonction ai.if() pour filtrer les résultats en fonction du contexte, et pas seulement des mathématiques.

Architecture

Neighbor Loop contourne les goulots d'étranglement traditionnels de la couche Application. Au lieu d'extraire les données pour les traiter, nous utilisons :

  1. Intégration Cloud SQL + ML : pour générer et stocker des vecteurs en temps réel.
  2. Google Cloud Storage : pour stocker les images
  3. Gemini 3.0 Flash : pour effectuer un raisonnement en moins d'une seconde sur des données d'image et de texte directement via SQL.
  4. Cloud Run : pour héberger un backend Flask léger et monofichier.

Conditions requises

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

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 connaît votre projet.
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
  1. Activez les API requises : suivez ce lien et activez les API.

Vous pouvez également utiliser la commande gcloud. Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

Problèmes 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 le menu déroulant en haut à gauche.

Barricade de facturation

Vous avez activé le projet, mais oublié le compte de facturation. Cloud SQL ne démarrera pas si la facturation est vide.

Décalage de la propagation de l'API

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

3. Configuration de la base de données

Dans cet atelier, nous utiliserons Cloud SQL pour PostgreSQL comme base de données pour les données de test.

Commençons par créer une instance Cloud SQL dans laquelle l'ensemble de données de test sera chargé.

  1. Cliquez sur le bouton ou copiez le lien ci-dessous dans le navigateur dans lequel l'utilisateur de la console Google Cloud est connecté.

  1. Une fois cette étape terminée, le dépôt sera cloné dans votre éditeur Cloud Shell local. Vous pourrez ensuite exécuter la commande ci-dessous à partir du dossier du projet (assurez-vous d'être dans le répertoire du projet) :
sh run.sh
  1. Utilisez maintenant l'UI (en cliquant sur le lien dans le terminal ou sur le lien "Prévisualiser sur le Web" dans le terminal).
  2. Saisissez les informations concernant l'ID du projet et le nom de l'instance pour commencer.
  3. Allez prendre un café pendant que les journaux défilent. Pour en savoir plus sur le fonctionnement en coulisses, cliquez ici.

Problèmes et dépannage

Région non concordante

Si vous avez activé vos API dans us-central1, mais que vous essayez de provisionner le cluster dans asia-south1, vous risquez de rencontrer des problèmes de quota ou des retards dans les autorisations du compte de service. Choisissez une seule région pour l'ensemble de l'atelier.

Délai d'inactivité de Cloud Shell

Si votre pause-café dure 30 minutes, Cloud Shell peut se mettre en veille et déconnecter le processus sh run.sh. Laissez l'onglet actif.

4. Provisionnement de schémas

Une fois votre instance Cloud SQL en cours d'exécution, accédez à l'éditeur SQL de Cloud SQL Studio pour activer les extensions d'IA et provisionner le schéma.

5a835906362f7609.png

Vous devrez peut-être attendre la fin de la création de votre instance. Une fois l'instance créée, connectez-vous à Cloud SQL à l'aide des identifiants que vous avez créés. Utilisez les données suivantes pour vous authentifier auprès de PostgreSQL :

  • Nom d'utilisateur : "postgres"
  • Base de données : "postgres"
  • Mot de passe : "cloudsql" (ou celui que vous avez défini lors de la création)

Une fois l'authentification réussie dans Cloud SQL Studio, les commandes SQL sont saisies dans l'éditeur. Vous pouvez ajouter plusieurs fenêtres de l'éditeur en cliquant sur le signe plus à droite de la dernière fenêtre.

9408d708b7dac90c.png

Vous saisirez des commandes pour Cloud SQL dans les fenêtres de l'éditeur, en utilisant les options "Exécuter", "Mettre en forme" et "Effacer" selon les besoins.

Activer les extensions

Pour créer cette application, nous allons utiliser les extensions pgvector et google_ml_integration. L'extension pgvector vous permet de stocker et de rechercher des embeddings vectoriels. L'extension google_ml_integration fournit les fonctions que vous utilisez pour accéder aux points de terminaison de prédiction Vertex AI afin d'obtenir des prédictions en SQL. Activez ces extensions en exécutant les LDD suivants :

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

Créer une table

Vous pouvez créer une table à l'aide de l'instruction LDD ci-dessous dans Cloud SQL Studio :

-- Items Table (The "Profile" you swipe on)
CREATE TABLE items (
   item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   owner_id UUID,
   provider_name TEXT,
   provider_phone TEXT,
   title TEXT,
   bio TEXT,
   category TEXT,
   image_url TEXT,
   item_vector VECTOR(768),
   status TEXT DEFAULT 'available',
   created_at TIMESTAMP DEFAULT NOW()
);

-- Swipes Table (The Interaction)
CREATE TABLE swipes (
   swipe_id SERIAL PRIMARY KEY,
   swiper_id UUID,
   item_id UUID REFERENCES items(item_id),
   direction TEXT CHECK (direction IN ('left', 'right')),
   is_match BOOLEAN DEFAULT FALSE,
   created_at TIMESTAMP DEFAULT NOW()
);

La colonne item_vector permettra de stocker les valeurs vectorielles du texte.

Accorder l'autorisation

Exécutez l'instruction ci-dessous pour accorder l'exécution de la fonction "embedding" :

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Activer l'intégration de ML

Pour exploiter les fonctionnalités de machine learning directement dans votre base de données, vous devez activer l'indicateur d'intégration ML.

Vous pouvez exécuter la commande ci-dessous à partir du terminal Cloud Shell :

INSTANCE_NAME="<<The name of your Cloud SQL Instance>>"

gcloud sql instances patch $INSTANCE_NAME --tier=db-custom-1-3840

gcloud sql instances patch $INSTANCE_NAME \
    --database-flags=cloudsql.enable_google_ml_integration=on

gcloud sql instances patch $INSTANCE_NAME --enable-google-ml-integration

Attribuer le rôle Utilisateur Vertex AI au compte de service Cloud SQL

Dans la console Google Cloud IAM, accordez au compte de service Cloud SQL (qui ressemble à ceci : service-<<PROJECT_NUMBER>>@cp-sa-cloud-sql.iam.gserviceaccount.com) l'accès au rôle "Utilisateur Vertex AI". PROJECT_NUMBER correspondra au numéro de votre projet.

Vous pouvez également exécuter la commande ci-dessous à partir du terminal Cloud Shell :

INSTANCE_NAME="<<The name of your Cloud SQL Instance>>"
PROJECT_ID=$(gcloud config get-value project)

SA_EMAIL=$(gcloud sql instances describe $INSTANCE_NAME --format='value(serviceAccountEmailAddress)')
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA_EMAIL" \
    --role="roles/aiplatform.user"

Enregistrer le modèle Gemini 3 Flash dans Cloud SQL

Exécutez l'instruction SQL ci-dessous à partir de l'éditeur de requête Cloud SQL.

CALL google_ml.create_model(
    model_id => 'gemini-3-flash-preview',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/<<YOUR_PROJECT_ID>>/locations/global/publishers/google/models/gemini-3-flash-preview:generateContent',
    model_qualified_name => 'gemini-3-flash-preview',
    model_provider => 'google',
    model_type => 'generic',
    model_auth_type => 'cloudsql_service_agent_iam'
);
--replace <<YOUR_PROJECT_ID>> with your project id.

Problèmes et dépannage

La boucle "Mot de passe oublié"

Si vous avez utilisé la configuration "En un clic" et que vous ne vous souvenez plus de votre mot de passe, accédez à la page "Informations de base sur l'instance" dans la console, puis cliquez sur "Modifier" pour réinitialiser le mot de passe postgres.

Erreur "Extension introuvable"

Si CREATE EXTENSION échoue, c'est souvent parce que l'instance est toujours dans un état "Maintenance" ou "Mise à jour" depuis le provisionnement initial. Vérifiez si l'étape de création de l'instance est terminée et attendez quelques secondes si nécessaire.

Délai de propagation IAM

Vous avez exécuté la commande IAM gcloud, mais la commande SQL CALL échoue toujours et affiche une erreur d'autorisation. La propagation des modifications IAM peut prendre un certain temps sur le réseau Google. Respirez.

Incompatibilité de la dimension du vecteur

La table items est définie sur VECTOR(768). Si vous essayez d'utiliser un autre modèle (par exemple, un modèle à 1 536 dimensions) ultérieurement, vos insertions seront corrompues. Respecte text-embedding-005.

Faute de frappe dans l'ID du projet

Dans l'appel create_model, si vous laissez les crochets « » ou si vous saisissez mal l'ID de votre projet, l'enregistrement du modèle semblera réussi, mais échouera lors de la première requête réelle. Vérifiez votre chaîne.

L'intégration Vertex AI est désactivée

Exécutez –enable-google-ml-integration (distinct de l'option de base de données).

5. Stockage d'images (Google Cloud Storage)

Pour stocker les photos de nos articles excédentaires, nous utilisons un bucket GCS. Pour cette application de démonstration, nous souhaitons que les images soient accessibles au public afin qu'elles s'affichent instantanément dans nos cartes à balayer.

  1. Créez un bucket : créez un bucket dans votre projet GCP (par exemple, neighborloop-images), de préférence dans la même région que votre base de données et votre application.
  2. Configurer l'accès public : accédez à l'onglet Autorisations du bucket.
  3. Ajoutez le compte principal allUsers.
  4. Attribuez le rôle Lecteur des objets Storage (pour que tout le monde puisse voir les photos) et le rôle Créateur des objets Storage (pour les besoins de l'importation de la démo).

Alternative (compte de service) : si vous préférez ne pas utiliser l'accès public, assurez-vous que le compte de service de votre application dispose d'un accès complet à Cloud SQL et des rôles Storage nécessaires pour gérer les objets de manière sécurisée.

Si vous souhaitez exécuter la commande et accorder un accès public. Exécutez les commandes ci-dessous dans le terminal Cloud Shell :

BUCKET_NAME="<<your-bucket-name>>"
gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
    --member="allUsers" \
    --role="roles/storage.objectViewer"

Problèmes et dépannage

The Region Drag

Si votre base de données se trouve dans us-central1 et votre bucket dans europe-west1, vous ralentissez littéralement votre IA. La "vérification de l'ambiance" se fait rapidement, mais la récupération de l'image pour l'UI sera lente. Conservez-les dans la même région !

Unicité des noms de buckets

Les noms de buckets constituent un espace de noms global. Si vous essayez de nommer votre bucket neighborloop-images, il est probable que quelqu'un d'autre l'ait déjà fait. Si la création échoue, ajoutez un suffixe aléatoire.

Confusion entre "Créateur" et "Lecteur"

Confusion entre "Créateur" et "Lecteur" : si vous n'ajoutez que "Lecteur", votre application plantera lorsqu'un utilisateur tentera de lister un nouvel élément, car il n'aura pas l'autorisation d'écrire dans le fichier. Vous aurez besoin des deux pour cette configuration de démonstration spécifique.

6. Créons l'application

Clonez ce dépôt dans votre projet et examinons-le.

  1. Pour cloner ce dépôt, exécutez les commandes suivantes une par une depuis le terminal Cloud Shell (dans le répertoire racine ou à l'emplacement où vous souhaitez créer ce projet) :
git clone https://github.com/flazer99/neighbor-loop-cloud-sql

cd neighbor-loop-cloud-sql/

Le projet devrait être créé. Vous pouvez le vérifier dans l'éditeur Cloud Shell.

53a398aff6ba7d5b.png

  1. Obtenir votre clé API Gemini
  2. Accédez à Google AI Studio : accédez à aistudio.google.com.
  3. Connexion : utilisez le même compte Google que celui que vous utilisez pour votre projet Google Cloud.
  4. Créer une clé API :
  5. Dans la barre latérale de gauche, cliquez sur "Get API key" (Obtenir une clé API).
  6. Cliquez sur le bouton "Créer une clé API dans un nouveau projet".
  7. Copiez la clé : une fois la clé générée, cliquez sur l'icône de copie.
  8. Définissez maintenant les variables d'environnement dans le fichier .env.
GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>
DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<HOST_IP>>:<<PORT>>/postgres
GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Remplacez les valeurs des espaces réservés <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>..

Problèmes et dépannage

Confusion entre plusieurs comptes

Si vous êtes connecté à plusieurs comptes Google (personnel et professionnel), AI Studio peut sélectionner le mauvais compte par défaut. Vérifiez l'avatar en haut à droite pour vous assurer qu'il correspond à votre compte de projet GCP.

Dépassement du quota du niveau sans frais

Si vous utilisez le niveau sans frais, des limites de fréquence (requêtes par minute) s'appliquent. Si vous balayez trop rapidement dans la boucle de quartier, vous pouvez obtenir une erreur 429 Too Many Requests. Ralentissez !

Sécurité des clés exposées

Si vous avez accidentellement git commit votre fichier .env contenant la clé. Ajoutez toujours .env à votre .gitignore.

7. Vérifions le code

Le profil de rencontre de vos affaires

c2c543562cc9b353.png

Lorsqu'un utilisateur importe la photo d'un article, il ne devrait pas avoir à écrire une longue description. J'utilise Gemini 3 Flash pour "voir" l'article et rédiger la fiche à sa place.

Dans le backend, l'utilisateur fournit simplement un titre et une photo. Gemini s'occupe du reste :

prompt = """
You are a witty community manager for NeighborLoop.
Analyze this surplus item and return JSON:
{
   "bio": "First-person witty dating-style profile bio for the product, not longer than 2 lines",
   "category": "One-word category",
   "tags": ["tag1", "tag2"]
}
"""
response = genai_client.models.generate_content(
   model="gemini-3-flash-preview",
   contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"), prompt],
   config=types.GenerateContentConfig(response_mime_type="application/json")
)

21f871a1b549efcf.png

Embeddings en temps réel dans la base de données

aa783a459f1b02da.png

L'une des fonctionnalités les plus intéressantes de Cloud SQL est la possibilité de générer des embeddings sans quitter le contexte SQL. Au lieu d'appeler un modèle d'embedding en Python et de renvoyer le vecteur à la base de données, je fais tout en une seule instruction INSERT à l'aide de la fonction embedding() :

INSERT INTO items (owner_id, provider_name, provider_phone, title, bio, category, image_url, status, item_vector)
VALUES (
   :owner, :name, :phone, :title, :bio, :cat, :url, 'available',
   embedding('text-embedding-005', :title || ' ' || :bio)::vector
)

Cela permet de s'assurer que chaque élément est "consultable" par sa signification dès qu'il est publié. Notez que cette partie couvre la fonctionnalité "Lister le produit" de l'application Neighbor Loop.

Ajouter une capture d&#39;écran de la fonctionnalité de fiche produit

Recherche vectorielle avancée et filtrage intelligent avec Gemini 3.0

La recherche de mots clés standards est limitée. Si vous recherchez "quelque chose pour réparer ma chaise", une base de données traditionnelle peut ne rien renvoyer si le mot "chaise" ne figure pas dans un titre. Neighbor Loop résout ce problème grâce à la recherche vectorielle avancée de Cloud SQL AI.

En utilisant l'extension pgvector et le stockage optimisé de Cloud SQL, nous pouvons effectuer des recherches de similarité extrêmement rapides. Mais la vraie "magie" opère lorsque nous combinons la proximité vectorielle avec la logique basée sur les LLM.

SELECT item_id, title, bio, category, image_url,
      1 - (item_vector <=> embedding('text-embedding-005', :query)::vector) as score
FROM items 
WHERE status = 'available' 
 AND item_vector IS NOT NULL 
ORDER BY score DESC 
LIMIT 5

Cette requête représente un changement architectural majeur : nous déplaçons la logique vers les données. Au lieu d'extraire des milliers de résultats dans le code de l'application pour les filtrer, Gemini 3 Flash effectue une "vérification de l'ambiance" à l'intérieur du moteur de base de données. Cela réduit la latence et les coûts de sortie, et garantit que les résultats ne sont pas seulement mathématiquement similaires, mais aussi contextuellement pertinents.

Capture d&#39;écran de la fonctionnalité de recherche sémantique

La boucle "Balayer pour trouver un partenaire"

L'UI est un jeu de cartes classique.

Balayez vers la gauche pour supprimer.

Balayer vers la droite : c'est un match !

Capture d&#39;écran de la fonctionnalité Balayer pour faire correspondre

Lorsque vous balayez l'écran vers la droite, le backend enregistre l'interaction dans notre tableau des balayages et marque l'élément comme correspondant. L'interface utilisateur déclenche instantanément un pop-up affichant les coordonnées du fournisseur pour que vous puissiez organiser la collecte.

8. Déployons-la sur Cloud Run.

  1. Déployez-le sur Cloud Run en exécutant la commande suivante à partir du terminal Cloud Shell où le projet est cloné. Assurez-vous d'être dans le dossier racine du projet.

Exécutez la commande suivante dans votre terminal Cloud Shell :

gcloud run deploy neighbor-loop-cloud-sql \
   --source . \
   --region=us-central1 \
   --allow-unauthenticated \
   --network=easy-cloudsql-vpc \
   --subnet=easy-cloudsql-subnet \
   --vpc-egress=private-ranges-only \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:5432/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Remplacez les valeurs des espaces réservés <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

Une fois la commande terminée, une URL de service est générée. Copiez-le.

Utilisez maintenant l'URL du service (point de terminaison Cloud Run que vous avez copié précédemment) et testez l'application. Importez une photo de cet ancien outil électrique et laissez Gemini faire le reste !

Problèmes et dépannage

La boucle "Échec de la révision"

Si le déploiement se termine, mais que l'URL renvoie un 500 Internal Server Error, consultez les journaux. Cela est généralement dû à une variable d'environnement manquante (par exemple, une faute de frappe dans votre DATABASE_URL) ou au fait que le compte de service Cloud Run ne dispose pas des autorisations nécessaires pour lire les données de votre bucket GCS.

9. Dépannage de haut niveau

206a26fcd93ea48.png

10. Démo

Vous devriez pouvoir utiliser votre point de terminaison pour les tests.

Toutefois, pour les besoins de la démonstration, vous pouvez utiliser cette commande pendant quelques jours :

11. Effectuer un nettoyage

Une fois cet atelier terminé, n'oubliez pas de supprimer l'instance Cloud SQL.

12. Félicitations

Vous avez créé l'application Neighbor Loop pour des communautés durables avec Google Cloud. En déplaçant l'intégration et la logique d'IA Gemini 3 Flash dans Cloud SQL, l'application est incroyablement rapide (en fonction des paramètres de déploiement) et le code est remarquablement propre. Nous ne stockons pas seulement des données, mais aussi des intentions.

La combinaison de la vitesse de Gemini 3 Flash et du traitement vectoriel optimisé de Cloud SQL représente une véritable avancée pour les plates-formes axées sur la communauté.