Créer un générateur de quiz avec l'IA générative et Cloud Run

1. Introduction

Dans cet atelier, vous allez créer un service Web pour générer des quiz et l'intégrer à une application amusante et fonctionnelle. Vous allez utiliser un langage de programmation différent de celui que vous avez peut-être utilisé auparavant : l'anglais.

Ce que vous allez effectuer...

  • Vous allez créer un prompt qui génère un quiz de culture générale en fonction d'un ensemble de critères.
  • Vous allez créer une application Web simple et vérifier qu'elle s'exécute comme prévu dans votre environnement de développement.
  • Vous ajouterez progressivement de la logique à votre application Web pour la transformer en serveur d'API qui génère des quiz en fonction d'un ensemble de paramètres d'entrée.
  • Vous verrez à quel point il est facile de déployer votre service de génération de quiz dans le cloud à l'aide de Google Cloud Run.
  • Enfin, vous configurerez une application réelle ( quizaic.com) pour utiliser votre service de génération de quiz déployé et vous pourrez jouer à des quiz en direct en fonction du résultat.

Ce que vous allez apprendre...

  • Découvrez comment créer un prompt basé sur un modèle pour un grand modèle de langage (LLM).
  • Découvrez comment créer une application de serveur Web simple en Python.
  • Découvrez comment ajouter la prise en charge du LLM de Google à votre application Web.
  • Déployez votre application dans le cloud pour que tout le monde puisse essayer votre nouvelle création.
  • Intégrer votre générateur de quiz dans une application plus grande

Ce dont vous avez besoin...

  • Navigateur Web Chrome
  • Un compte Google
  • Un projet Cloud pour lequel la facturation est activée

Cet atelier s'adresse aux développeurs de tous niveaux, y compris aux débutants. Bien que vous utilisiez Python, vous n'avez pas besoin de maîtriser la programmation Python pour comprendre le processus, car nous vous expliquerons tout le code que vous verrez.

2. Configuration

a08aa5878e36b60c.png

Cette section décrit tout ce que vous devez faire pour commencer cet atelier.

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. Si vous n'avez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrez Cloud Shell.

Dans cet atelier, vous allez travailler dans une session Cloud Shell. Cet environnement est un interpréteur de commandes hébergé sur une machine virtuelle qui s'exécute dans le cloud de Google. Vous pourriez tout aussi facilement effectuer les tâches de cette section en local sur votre propre ordinateur, mais le fait d'utiliser Cloud Shell permet à chacun de bénéficier d'une expérience reproductible dans un environnement cohérent. Après l'atelier, libre à vous de reproduire cette section sur votre ordinateur.

4a95152439f0159b.png

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire s'affiche pour vous expliquer de quoi il s'agit. Si cet écran s'est affiché, cliquez sur Continuer.

9c92662c6a846a5c.png

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

9f0e51b578fecce5.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.

Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est défini avec votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet :
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

Activer certaines API

Dans les étapes suivantes, vous verrez où ces services sont requis (et pourquoi). Mais pour l'instant, exécutez la commande ci-dessous pour autoriser votre projet à accéder à Cloud Build, Artifact Registry, Vertex AI et Cloud Run :

gcloud services enable cloudbuild.googleapis.com        \
                       artifactregistry.googleapis.com  \
                       aiplatform.googleapis.com        \
                       run.googleapis.com          

Un message semblable à celui qui suit s'affiche pour vous indiquer que l'opération s'est correctement déroulée :

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Prompting : programmation en langage naturel

92f630373224ead8.png

Nous allons commencer par apprendre à développer une requête pour un grand modèle de langage. Accédez à la console Google Cloud > Vertex AI > Vertex AI Studio (Langage). Une page semblable à celle-ci s'affiche :

bfe5706041ae6454.png

Sous Generate Text, cliquez sur le bouton Text Prompt. Dans la boîte de dialogue suivante, saisissez un prompt qui, selon vous, pourrait être efficace pour générer un quiz de culture générale en fonction des exigences suivantes :

  • Thème : Histoire du monde
  • Nombre de questions : 5
  • Niveau de difficulté : intermédiaire
  • Langue : anglais

Cliquez sur le bouton "Envoyer" pour afficher le résultat.

Comme le montre la capture d'écran ci-dessous, le panneau de droite vous permet de sélectionner le modèle que vous souhaitez utiliser et d'affiner certains paramètres :

8aa89a1970ea9335.png

Voici les paramètres disponibles :

  • La région dans laquelle votre demande de génération doit s'exécuter.
  • "Modèle" vous permet de sélectionner le grand modèle de langage que vous souhaitez utiliser. Pour cet atelier de programmation, conservez "gemini-1.0-pro-001".
  • La température permet de contrôler le degré de hasard dans la sélection des jetons. Des températures basses sont idéales pour les requêtes visant une réponse vraie ou correcte, tandis que des températures plus élevées peuvent entraîner des résultats plus diversifiés ou inattendus.
  • La limite de jetons détermine la quantité maximale de texte pouvant être générée à partir d'une requête. Un jeton correspond environ à quatre caractères. La valeur par défaut est 1 024.
  • Top K modifie la façon dont le modèle sélectionne les jetons pour la sortie. Une valeur top-K de 1 signifie que le jeton sélectionné est le plus probable parmi tous les jetons du vocabulaire du modèle (aussi appelé décodage glouton), tandis qu'un top-K de 3 signifie que le jeton suivant est sélectionné parmi les trois jetons les plus probables (à l'aide de la température). La valeur de Top K est fixée par défaut à 40.
  • Top P modifie la façon dont le modèle sélectionne les jetons pour la sortie. Les jetons sont sélectionnés du plus probable au moins probable, jusqu'à ce que la somme de leurs probabilités soit égale à la valeur Top P.
  • "Nombre max de réponses" correspond au nombre maximal de réponses du modèle générées par requête.
  • Une séquence d'arrêt est une série de caractères (espaces compris) qui arrête la génération de réponse si le modèle la rencontre.
  • L'option "Affichage progressif des réponses" permet de choisir si les réponses doivent être imprimées à mesure qu'elles sont générées ou enregistrées et affichées une fois terminées.
  • Le seuil de filtre de sécurité ajuste la probabilité de voir des réponses potentiellement dangereuses.

Une fois que vous avez une invite qui semble générer un quiz raisonnable selon les exigences mentionnées ci-dessus, nous pourrions analyser ce quiz à l'aide d'un code personnalisé. Mais ne serait-il pas préférable que le LLM génère le quiz dans un format structuré que nous pourrions charger directement dans notre programme ? Le programme que nous utiliserons plus tard dans cet atelier pour appeler votre générateur s'attend à ce que les quiz soient exprimés en JSON, qui est un format multilingue populaire pour représenter des données structurées.

Dans cet atelier, les quiz sont exprimés sous la forme d'un tableau d'objets, où chaque objet contient une question, un tableau de réponses possibles à cette question et une réponse correcte. Voici l'encodage JSON pour les quiz de cet atelier :

[
    {
        "question": "Who was the first person to walk on the moon?",
          "responses": [
              "Neil Armstrong",
              "Buzz Aldrin",
              "Michael Collins",
              "Yuri Gagarin"
           ],
           "correct": "Neil Armstrong"
    },
    {
        "question": "What was the name of the war that took place between the British and the French in North America from 1754 to 1763??",
          "responses": [
              "The French and Indian War",
              "The Seven Years' War",
              "The War of the Austrian Succession",
              "The Great War"
           ],
           "correct": "The French and Indian War"
    },

    ...
]

Essayez de modifier votre requête pour que le quiz soit désormais généré au format JSON requis.

  1. Décrivez précisément le format que vous recherchez (par exemple, la phrase en italique ci-dessus).
  2. Incluez dans votre requête un exemple du format JSON souhaité.

Une fois que vous avez créé votre requête pour générer des quiz selon les spécifications souhaitées, cliquez sur le bouton GET CODE en haut à droite de la page pour afficher le code Python qui peut être utilisé pour envoyer votre requête de manière programmatique à un LLM Vertex AI. Si vous souhaitez utiliser un langage de programmation autre que Python, consultez https://cloud.google.com/vertex-ai/docs/samples?text=generative.

4. Créer un serveur Web simple

c73008bb8a72b57b.png

Maintenant que vous disposez d'un prompt fonctionnel, nous souhaitons l'intégrer à une application plus grande. Bien sûr, nous pourrions intégrer votre prompt au code source de l'application plus grande, mais nous souhaitons que votre générateur fonctionne comme un microservice qui fournit un service de génération de quiz pour d'autres applications. Pour ce faire, nous devons créer un serveur Web simple et le rendre accessible au public. Nous le ferons dans les étapes suivantes.

Commencez par cliquer sur le bouton Open Editor en haut de votre panneau Cloud Shell. Elle se présente comme suit :

e2a06b5304079efc.png

Vous vous retrouverez alors dans un environnement IDE semblable à Visual Studio Code, dans lequel vous pourrez créer des projets, modifier le code source, exécuter vos programmes, etc.

Si votre écran est trop petit, vous pouvez agrandir ou réduire la ligne de séparation entre la console et votre fenêtre d'édition/de terminal en faisant glisser la barre horizontale entre ces deux régions, comme indiqué ici :

8dea35450851af53.png

Vous pouvez passer de l'éditeur au terminal et inversement en cliquant respectivement sur les boutons Open Editor et Open Terminal. Essayez maintenant de passer d'un environnement à l'autre.

Ensuite, créez un dossier dans lequel stocker votre travail pour cet atelier. Pour ce faire, cliquez sur le bouton Ajouter un dossier 5f4e64909bc15e30.png, saisissez quiz-generator, puis appuyez sur Entrée. Tous les fichiers que vous allez créer dans cet atelier et tout le travail que vous allez effectuer dans Cloud Shell se feront dans ce dossier.

Créez maintenant un fichier requirements.txt. Cela indique à Python les bibliothèques dont votre application dépend. Pour cette application Web simple, vous allez utiliser un module Python populaire pour créer des serveurs Web appelé Flask,, la bibliothèque cliente google-cloud-aiplatform et un framework de serveur Web appelé gunicorn. Dans le volet de navigation des fichiers, effectuez un clic droit sur le dossier quiz-generator, puis sélectionnez l'élément de menu New file, comme suit :

613eb3de4b9b750a.png

Lorsque vous êtes invité à saisir le nom du nouveau fichier, saisissez requirements.txt, puis appuyez sur la touche Entrée. Assurez-vous que le nouveau fichier se trouve dans le dossier du projet quiz-generator.

Collez les lignes suivantes dans le nouveau fichier pour spécifier que votre application dépend du package Python flask, du serveur Web gunicorn et de la bibliothèque cliente google-cloud-aiplatform, ainsi que des versions associées de chacun.

flask==3.0.0
gunicorn==21.2.0
google-cloud-aiplatform==1.47.0

Vous n'avez pas besoin d'enregistrer explicitement ce fichier, car l'éditeur Cloud enregistre automatiquement les modifications.

En utilisant la même technique, créez un autre fichier nommé main.py. Il s'agira du fichier source Python principal (et unique) de votre application. Assurez-vous que le nouveau fichier se trouve dans le dossier quiz-generator.

Insérez le code suivant dans ce fichier :

from flask import Flask
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Revenez dans le terminal et accédez au dossier du projet à l'aide de la commande suivante :

cd quiz-generator

Exécutez la commande suivante pour installer les dépendances de votre projet :

pip3 install -r requirements.txt

Une fois les dépendances installées, le résultat doit ressembler à ceci :

Successfully installed flask-3.0.0

Lancez maintenant votre application en exécutant cette commande dans le terminal :

flask --app main.py --debug run --port 8080

À ce stade, votre application s'exécute sur la machine virtuelle dédiée à votre session Cloud Shell. Cloud Shell inclut un mécanisme de proxy qui vous permet d'accéder aux serveurs Web (comme celui que vous venez de démarrer) exécutés sur votre machine virtuelle depuis n'importe où sur Internet.

Cliquez sur le bouton web preview, puis sur l'élément de menu Preview on Port 8080, comme suit :

7f938c0bc1b4154c.png

Un onglet de navigateur Web s'ouvre sur votre application en cours d'exécution, qui devrait ressembler à ceci :

aaaf366f9bf74a28.png

5. Ajouter une méthode de génération avec analyse des paramètres

Nous souhaitons maintenant ajouter la prise en charge de l'envoi d'une nouvelle méthode appelée generate. Pour ce faire, ajoutez une instruction d'importation afin de manipuler la requête HTTP et modifiez la route principale pour analyser cette requête et imprimer les paramètres, comme suit :

from flask import Flask
from flask import request                       #<-CHANGED
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])                #<-CHANGED
def generate():                                 #<-CHANGED
    params = request.args.to_dict()             #<-CHANGED
    html = f"<h1>Quiz Generator</h1>"           #<-CHANGED
    for param in params:                        #<-CHANGED
        html += f"<br>{param}={params[param]}"  #<-CHANGED
    return html                                 #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Actualisez l'onglet de votre navigateur Web pour voir les résultats. Cette fois, vous devriez voir le "Générateur de quiz", ainsi qu'un paramètre de requête automatiquement ajouté à votre URL (authuser). Essayez d'ajouter deux paramètres en ajoutant la chaîne "`&param1=val1&param2=val2`" à la fin de l'URL dans la barre d'adresse de votre navigateur. Rechargez la page. Vous devriez voir quelque chose comme ceci :

6e223ca358e4e009.png

Maintenant que nous avons vu comment envoyer et analyser les paramètres de requête d'une URL, nous allons ajouter la prise en charge des paramètres spécifiques que nous souhaitons envoyer à notre générateur de quiz, à savoir :

  • topic : thème du quiz souhaité
  • num_q : nombre de questions souhaité
  • diff : niveau de difficulté souhaité (facile, moyen, difficile)
  • lang : langue souhaitée pour le quiz
from flask import Flask
from flask import request
import os

# Default quiz settings  #<-CHANGED
TOPIC = "History"        #<-CHANGED
NUM_Q = "5"              #<-CHANGED
DIFF = "intermediate"    #<-CHANGED
LANG = "English"         #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):  #<-CHANGED
    if name in args:             #<-CHANGED
        return args[name]        #<-CHANGED
    return default               #<-CHANGED

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()        #<-CHANGED
    topic = check(args, "topic", TOPIC)  #<-CHANGED
    num_q = check(args, "num_q", NUM_Q)  #<-CHANGED
    diff = check(args, "diff", DIFF)     #<-CHANGED
    lang = check(args, "lang", LANG)     #<-CHANGED
    html = f"""
        <h1>Quiz Generator</h1><br>
        {topic=}<br>
        {num_q=}<br>
        {diff=}<br>
        {lang=}"""                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Actualisez l'onglet de votre navigateur Web pour voir les résultats. Une page Web semblable à celle-ci devrait s'afficher :

15eed60f6a805212.png

Essayez de modifier l'URL pour définir des valeurs pour différents paramètres. Par exemple, essayez d'ajouter le suffixe "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" à la fin de l'URL dans la barre d'adresse :

f629dba5fa207cef.png

6. Ajouter et mettre en forme votre requête

Nous allons ensuite ajouter la prise en charge des paramètres spécifiques que nous souhaitons envoyer à notre générateur de quiz, à savoir :

  • topic : thème du quiz souhaité
  • num_q : nombre de questions souhaité
  • diff : niveau de difficulté souhaité (facile, moyen, difficile)
  • lang : langue souhaitée pour le quiz

Copiez la requête que vous avez développée avec Vertex Generative AI Studio lors d'une étape précédente, mais remplacez les valeurs codées en dur pour le thème, le nombre de questions et le niveau de difficulté par les chaînes suivantes :

  • {topic}
  • {num_q}
  • {diff}
  • {lang}
from flask import Flask
from flask import request
import os

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys:
"Question", "responses", and "correct".

"""  #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)  #<-CHANGED 
    html = f"<h1>Prompt:</h1><br><pre>{prompt}</pre>"                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Actualisez l'onglet de votre navigateur Web pour voir les résultats. Une page Web semblable à celle-ci devrait s'afficher :

3c2b9dfcfba86b7a.png

Essayez de modifier l'URL pour modifier ces quatre paramètres.

7. Ajouter la bibliothèque cliente Vertex AI

Nous sommes maintenant prêts à utiliser la bibliothèque cliente Python Vertex AI pour générer votre quiz. Cela automatisera l'invite interactive que vous avez effectuée à l'étape 3 et donnera à votre service de génération un accès programmatique aux capacités LLM de Google. Mettez à jour votre fichier main.py comme suit :

Veillez à remplacer "YOUR_PROJECT" par l'ID de votre projet.

from flask import Flask
from flask import request
from flask import Response                                          #<-CHANGED
import os

import vertexai    
from vertexai.generative_models import GenerativeModel  #<-CHANGED

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
MODEL = "gemini-1.0-pro"  #<-CHANGED

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys "question", "responses", and "correct".

"""

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# Initialize Vertex AI access.
vertexai.init(project="YOUR_PROJECT", location="us-central1")  #<-CHANGED
parameters = {                                                 #<-CHANGED
    "candidate_count": 1,                                      #<-CHANGED
    "max_output_tokens": 1024,                                 #<-CHANGED
    "temperature": 0.5,                                        #<-CHANGED
    "top_p": 0.8,                                              #<-CHANGED
    "top_k": 40,                                               #<-CHANGED
}                                                              #<-CHANGED
model = GenerativeModel(MODEL)             #<-CHANGED

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)
    response = model.generate_content(prompt, generation_config=parameters)  #<-CHANGED
    print(f"Response from Model: {response.text}")           #<-CHANGED
    html = f"{response.text}"                                #<-CHANGED
    return Response(html, mimetype="application/json")       #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Actualisez l'onglet de votre navigateur Web pour voir les résultats. Notez que cela peut prendre plusieurs secondes, car vous effectuez maintenant une demande LLM. Une page Web semblable à celle-ci devrait s'afficher :

f43d3ba5102857b8.png

Essayez de modifier l'URL pour demander un autre thème de quiz, un autre nombre de questions et un autre niveau de difficulté.

Et voilà, votre microservice est terminé. Félicitations ! À l'étape suivante, vous apprendrez à déployer votre service dans le cloud afin que tout le monde puisse y accéder, où qu'il se trouve.

8. Vers le cloud !

67c99bf45a7b7805.png

Maintenant que vous avez créé votre propre générateur de quiz, vous allez vouloir partager cette merveille avec le reste du monde. Il est donc temps de le déployer dans le cloud. Mais vous aimeriez faire plus que simplement le partager. Vous souhaitez vous assurer que :

  • fonctionne de manière fiable : vous bénéficiez d'une tolérance aux pannes automatique en cas de plantage d'un ordinateur exécutant votre application.
  • Il s'adapte automatiquement : votre application peut gérer de gros volumes de trafic et réduit automatiquement son empreinte lorsqu'elle n'est pas utilisée.
  • minimise vos coûts en ne vous facturant pas les ressources que vous n'utilisez pas. Vous n'êtes facturé que pour les ressources consommées lors de la réponse au trafic.
  • est accessible via un nom de domaine personnalisé : vous disposez d'une solution en un clic pour attribuer un nom de domaine personnalisé à votre service.
  • offre un excellent temps de réponse. Les démarrages à froid sont raisonnablement réactifs, mais vous pouvez les affiner en spécifiant une configuration d'instance minimale.
  • accepte le chiffrement de bout en bout à l'aide de la sécurité Web SSL/TLS standard : lorsque vous déployez un service, vous bénéficiez sans frais et automatiquement du chiffrement Web standard et des certificats requis correspondants.

En déployant votre application sur Google Cloud Run, vous bénéficiez de tous les avantages ci-dessus et plus encore. Le composant de base pour partager votre application avec Cloud Run est un conteneur.

Les conteneurs nous permettent de créer une boîte modulaire dans laquelle exécuter une application avec toutes ses dépendances regroupées. Comme les conteneurs peuvent être utilisés sur presque tous les serveurs virtuels ou réels, cela nous permet de déployer votre application où vous le souhaitez, du serveur sur site au cloud, et même de déplacer votre application d'un fournisseur de services à un autre.

Pour en savoir plus sur les conteneurs et leur fonctionnement dans Google Cloud Run, consultez l'atelier de programmation Passer du développement à la production en trois étapes faciles avec Cloud Run.

Déployer votre application sur Cloud Run

Cloud Run est un service régional. Cela signifie que l'infrastructure qui exécute vos services Cloud Run est située dans une région spécifique et gérée par Google pour être disponible de manière redondante dans toutes les zones de cette région. Pour plus de simplicité, nous utiliserons la région codée en dur us-central1 dans cet atelier.

Nous allons utiliser un buildpack pour générer automatiquement votre conteneur. Créez un fichier nommé Procfile dans l'éditeur Cloud et insérez cette ligne de texte :

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Cela indique au système de buildpacks comment exécuter votre application dans le conteneur généré automatiquement. Ensuite, exécutez la commande suivante dans le terminal Cloud Shell (à partir du même répertoire quiz-generator) :

gcloud run deploy quiz-generator  \
    --source .                    \
    --region us-central1          \
    --allow-unauthenticated

Cela indique à la commande gcloud que vous souhaitez qu'elle utilise des buildpacks pour créer votre image de conteneur, en fonction des fichiers sources qu'elle trouve dans le répertoire actuel (le dot dans --source . est une abréviation pour le répertoire actuel). Étant donné que le service s'occupe implicitement de l'image de conteneur, vous n'avez pas besoin de spécifier d'image dans cette commande gcloud.

Patientez quelques instants jusqu'à la fin du déploiement. En cas de réussite, la commande gcloud affiche l'URL du nouveau service :

Building using Buildpacks and deploying container to Cloud Run service [quiz-generator] in project [YOUR_PROJECT] region [YOUR_REGION]
OK Building and deploying new service... Done.                                                                          
  OK Creating Container Repository...                                                                                   
  OK Uploading sources...                                                                                               
  OK Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/0cf1383f-35db-412d
  -a973-557d5e2cd4a4?project=780573810218].                                                                             
  OK Creating Revision...                                                                                               
  OK Routing traffic...                                                                                                 
  OK Setting IAM Policy...                                                                                              
Done.                                                                                                                   
Service [quiz-generator] revision [quiz-generator-00001-xnr] has been deployed and is serving 100 percent of traffic.
Service URL: https://quiz-generator-co24gukjmq-uc.a.run.app

Vous pouvez également récupérer l'URL de votre service à l'aide de cette commande :

gcloud run services describe quiz-generator  \
  --region us-central1                       \
  --format "value(status.url)"

Vous devriez obtenir un résultat semblable à celui-ci :

https://quiz-generator-co24gukjmq-uc.a.run.app

Ce lien est une URL dédiée, avec sécurité TLS, pour votre service Cloud Run. Ce lien est permanent (tant que vous n'avez pas désactivé votre service) et peut être utilisé n'importe où sur Internet. Il n'utilise pas le mécanisme de proxy de Cloud Shell mentionné précédemment, qui dépendait d'une machine virtuelle temporaire.

Cliquez sur le Service URL en surbrillance pour ouvrir un onglet de navigateur Web sur votre application en cours d'exécution. Vérifiez que le résultat est le même que celui que vous avez vu dans votre environnement de développement. Vérifiez également que vous pouvez ajuster le quiz généré en fournissant des paramètres à la fin de l'URL.

Félicitations ! Votre application s'exécute désormais dans le cloud de Google. Votre application est disponible publiquement, avec un chiffrement TLS (HTTPS) et une mise à l'échelle automatique pour gérer des niveaux de trafic incroyables.

9. Rassembler tous les éléments

9927db1725bcd5d6.png

Dans cette dernière étape, nous allons exécuter votre générateur de quiz dans l'application Quizaic. Accédez à l'URL Quizaic, connectez-vous à votre compte Google, puis accédez à l'onglet Create Quiz. Sélectionnez le type de générateur Custom, collez votre URL Cloud Run dans le champ URL, remplissez les autres champs obligatoires, puis envoyez le formulaire.

328ee05579ea05f9.png

Au bout de quelques instants, vous devriez voir un nouveau quiz (voir "Mon nouveau quiz" dans l'image ci-dessous), avec une vignette générée par l'IA. Vous pouvez le modifier, y jouer, le cloner ou le supprimer à l'aide des boutons correspondants. Ce nouveau quiz a été créé à l'aide du service Web que vous venez de déployer en fonction de votre requête basée sur un modèle.

1719169140978b63.png

10. Nettoyage

c1592d590c563428.png

Bien que le service Cloud Run ne soit pas facturé lorsqu'il n'est pas utilisé, il se peut que des frais vous incombent pour le stockage de l'image de conteneur générée.

Afin d'éviter que des frais ne vous soient facturés, vous pouvez soit supprimer votre projet GCP, ce qui interrompra la facturation de toutes les ressources qui y ont été utilisées, soit supprimer votre image de conteneur en exécutant la commande suivante :

gcloud config set artifacts/repository cloud-run-source-deploy
gcloud config set artifacts/location us-central1
gcloud artifacts docker images list

# Note image tag for resulting list

gcloud artifacts docker images delete <IMAGE-TAG>

Pour supprimer votre service Cloud Run, utilisez cette commande :

gcloud run services delete quiz-generator --region us-central1 --quiet

11. Bravo !

910162be58c0f6d6.png

Félicitations ! Vous avez créé un prompt LLM et déployé un microservice Cloud Run à l'aide de ce prompt. Vous pouvez désormais programmer en langage naturel et partager vos créations avec le monde entier.

Je voudrais vous laisser avec une question importante :

Une fois votre application opérationnelle dans votre environnement de développement, combien de lignes de code avez-vous dû modifier pour la déployer dans le cloud, avec tous les attributs de qualité de production offerts par Cloud Run ?

La réponse est bien sûr zéro. :)

Autres ateliers de programmation à consulter :

Documents de référence...

12. Incitation à l'action

Si vous avez apprécié cet atelier de programmation et que vous souhaitez passer plus de temps à utiliser Google Cloud, rejoignez Google Cloud Innovators dès aujourd'hui !

498cab7d87ec12d3.png

Google Cloud Innovators est sans frais et inclut :

  • Discussions en direct, sessions AMA et interventions dédiées à la feuille de route pour découvrir les dernières actualités directement auprès des Googleurs
  • les dernières actualités Google Cloud directement dans votre boîte de réception ;
  • Badge numérique et arrière-plan de visioconférence
  • 500 crédits d'ateliers et de formations sur Skills Boost

Cliquez ici pour vous inscrire.