Quizgenerator mit GenAI und Cloud Run erstellen

1. Einführung

In diesem Lab erstellen Sie einen Webdienst, mit dem Quizfragen generiert und in eine unterhaltsame, funktionierende App eingebunden werden. Dabei verwenden Sie eine andere Programmiersprache als zuvor: Englisch.

Ihre Aufgaben:

  • Sie erstellen einen Prompt, der anhand einer Reihe von Kriterien ein Quiz generiert.
  • Sie erstellen eine einfache Webanwendung und prüfen, ob sie in Ihrer Entwicklungsumgebung wie erwartet ausgeführt wird.
  • Sie fügen Ihrer Webanwendung schrittweise Logik hinzu, um sie in einen API-Server zu verwandeln, der Quizze anhand einer Reihe von Eingabeparametern generiert.
  • Sie sehen, wie einfach es ist, Ihren Quiz-Generator mit Google Cloud Run in der Cloud bereitzustellen.
  • Schließlich konfigurieren Sie eine echte App ( quizaic.com), um Ihren bereitgestellten Quiz-Generatordienst zu verwenden. Auf Grundlage der Ausgabe können Sie dann Live-Quizze spielen.

Sie lernen…

  • So erstellen Sie einen Prompt mit Vorlage für ein Large Language Model (LLM).
  • So erstellen Sie eine einfache Webserver-Anwendung in Python.
  • So fügen Sie Ihrer Webanwendung die Unterstützung für LLM von Google hinzu.
  • Hier erfahren Sie, wie Sie Ihre App in der Cloud bereitstellen, damit jeder Ihre neue Kreation ausprobieren kann.
  • Wie Sie Ihren Quiz-Generator in eine größere App einbinden.

Voraussetzungen

  • Chrome-Webbrowser
  • Ein Google-Konto
  • Ein Cloud-Projekt mit aktivierter Abrechnung

Dieses Lab richtet sich an Entwickler aller Erfahrungsstufen, einschließlich Anfänger. Obwohl Sie Python verwenden, müssen Sie nicht mit der Python-Programmierung vertraut sein, um zu verstehen, wo das Problem liegt, da wir Ihnen den gesamten Code erklären werden.

2. Einrichtung

a08aa5878e36b60c.png

In diesem Abschnitt erfahren Sie, was Sie für den Einstieg in dieses Lab tun müssen.

Einrichtung der Umgebung im eigenen Tempo

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es ist ein Zeichenstring, der von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und kann nach der Festlegung nicht mehr geändert werden. In der Cloud Console wird automatisch ein eindeutiger String generiert. In der Regel spielt es keine Rolle, wie er lautet. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (normalerweise als PROJECT_ID gekennzeichnet). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige generieren. Alternativ können Sie Ihr eigenes Konto ausprobieren und prüfen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs verwenden zu können. Dieses Codelab ist kostengünstig. Wenn Sie die Ressourcen deaktivieren möchten, um Kosten nach Abschluss dieser Anleitung zu vermeiden, können Sie die von Ihnen erstellten Ressourcen oder das Projekt löschen. Neuen Google Cloud-Nutzern steht das kostenlose Testprogramm mit einem Guthaben von 300 $ zur Verfügung.

Cloud Shell starten

In diesem Lab arbeiten Sie in einer Cloud Shell-Sitzung. Das ist ein Befehlszeileninterpreter, der von einer virtuellen Maschine gehostet wird, die in der Google-Cloud ausgeführt wird. Sie können diesen Abschnitt auch lokal auf Ihrem eigenen Computer ausführen. Mit Cloud Shell haben alle Nutzer jedoch Zugriff auf eine reproduzierbare Umgebung. Nach dem Lab können Sie diesen Abschnitt auf Ihrem eigenen Computer noch einmal wiederholen.

4a95152439f0159b.png

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

3c1dabeca90e44e5.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung angezeigt. Klicken Sie in diesem Fall auf Weiter.

9c92662c6a846a5c.png

Die Bereitstellung und Verbindung mit Cloud Shell sollte nur wenige Minuten dauern.

9f0e51b578fecce5.png

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

Einige APIs aktivieren

In späteren Schritten erfahren Sie, wo und warum diese Dienste erforderlich sind. Führen Sie jetzt den folgenden Befehl aus, um Ihrem Projekt Zugriff auf Cloud Build, Artifact Registry, Vertex AI und Cloud Run zu gewähren:

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

Die erfolgreiche Meldung sollte in etwa so aussehen:

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

3. Prompts – Programmieren in natürlicher Sprache

92f630373224ead8.png

Zuerst lernen wir, wie ein Prompt für ein Large Language Model entwickelt wird. Rufen Sie die Google Cloud Console > Vertex AI > Vertex AI Studio (Sprache) auf. Sie sollten eine Seite wie diese sehen:

bfe5706041ae6454.png

Klicken Sie unter Generate Text auf die Schaltfläche Text Prompt. Geben Sie im nächsten Dialogfeld einen Prompt ein, der Ihrer Meinung nach für die Erstellung eines Quiz geeignet ist. Beachten Sie dabei die folgenden Anforderungen:

  • Thema: Weltgeschichte
  • Anzahl der Fragen: 5
  • Schwierigkeitsgrad: Mittel
  • Sprache: Englisch

Klicken Sie auf die Schaltfläche „Senden“, um die Ausgabe zu sehen.

Wie im folgenden Screenshot zu sehen, können Sie im rechten Bereich das gewünschte Modell auswählen und einige Einstellungen optimieren:

8aa89a1970ea9335.png

Diese Einstellungen sind verfügbar:

  • „Region“ gibt an, wo Ihre Generierungsanfrage ausgeführt werden soll.
  • Mit „Modell“ wählen Sie aus, welches Large Language Model Sie verwenden möchten. Verwenden Sie für dieses Codelab „gemini-1.0-pro-001“.
  • Die Temperatur bestimmt den Grad der Zufälligkeit bei der Tokenauswahl. Niedrigere Temperaturen eignen sich gut für Prompts, die eine wahre oder richtige Antwort erwarten, während höhere Temperaturen zu unterschiedlichen oder unerwarteten Ergebnissen führen können.
  • Das Tokenlimit legt die maximale Textmenge fest, die für einen Prompt ausgegeben wird. Ein Token besteht aus etwa vier Zeichen. Der Standardwert ist 1.024.
  • Der Wert „Top-K“ ändert, wie das Modell Tokens für die Ausgabe auswählt. Ein „Top-K“ von 1 bedeutet, dass das ausgewählte Token das wahrscheinlichste unter allen Tokens im Vokabular des Modells ist (auch als „Greedy Decoding“ bezeichnet). Ein „Top-K“ von 3 bedeutet dagegen, dass das nächste Token aus den 3 wahrscheinlichsten Tokens ausgewählt wird (mithilfe der Temperatur). Der Standardwert von „Top-K“ ist 40.
  • Der Wert „Top-P“ ändert, wie das Modell Tokens für die Ausgabe auswählt. Tokens werden vom wahrscheinlichsten bis zum am wenigsten wahrscheinlichen Token ausgewählt, bis die Summe ihrer Wahrscheinlichkeiten dem Wert von „Top-P“ entspricht.
  • „Max. Antworten“ ist die maximale Anzahl von Modellantworten, die pro Prompt generiert werden.
  • Eine Stoppsequenz ist eine Reihe von Zeichen (einschließlich Leerzeichen), die die Antwortgenerierung stoppt, wenn das Modell darauf stößt.
  • Mit der Option „Streamingantworten“ können Sie festlegen, ob Antworten ausgedruckt werden sollen, sobald sie generiert werden, oder ob sie gespeichert und angezeigt werden, sobald sie fertig sind.
  • Mit dem Schwellenwert für Sicherheitsfilter können Sie die Wahrscheinlichkeit anpassen, dass für Sie Antworten angezeigt werden, die möglicherweise schädlich sind.

Sobald Sie einen Prompt haben, der ein vernünftiges Quiz gemäß den oben genannten Anforderungen generiert, können wir dieses Quiz mit benutzerdefiniertem Code parsen. Wäre es aber nicht besser, wenn das LLM das Quiz in einem strukturierten Format generiert, das wir direkt in unser Programm laden können? Für das Programm, mit dem wir später in diesem Lab Ihren Generator aufrufen, müssen Quizze im JSON vorliegen. Dies ist ein beliebtes sprachübergreifendes Format zur Darstellung strukturierter Daten.

Die Quizze in diesem Lab werden als Array von Objekten dargestellt, wobei jedes Objekt eine Frage, ein Array möglicher Antworten auf diese Frage und eine richtige Antwort enthält. Hier ist die JSON-Codierung für Quizze in diesem Lab:

[
    {
        "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"
    },

    ...
]

Sehen Sie nach, ob Sie Ihren Prompt so ändern können, dass das Quiz jetzt im erforderlichen JSON-Format ausgegeben wird.

  1. Geben Sie in Worten das genaue Format an, das Sie suchen (z.B. den kursiven Satz oben).
  2. Fügen Sie in Ihren Prompt ein Beispiel für das gewünschte JSON-Format ein.

Sobald der Prompt Quizze gemäß Ihrer gewünschten Spezifikation generiert, klicken Sie rechts oben auf der Seite auf die Schaltfläche GET CODE. Daraufhin wird Python-Code angezeigt, mit dem Sie den Prompt programmatisch an ein Vertex AI-LLM senden können. Wenn Sie eine andere Programmiersprache als Python verwenden möchten, rufen Sie https://cloud.google.com/vertex-ai/docs/samples?text=generative auf.

4. Einfachen Webserver erstellen

c73008bb8a72b57b.png

Da Sie jetzt einen funktionierenden Prompt haben, möchten wir ihn in eine größere App integrieren. Natürlich könnten wir Ihren Prompt in den Quellcode der größeren App einbetten. Ihr Generator soll aber als Mikrodienst funktionieren, der einen Dienst zum Generieren von Quizfragen für andere Apps bietet. Dazu müssen wir einen einfachen Webserver erstellen und öffentlich zugänglich machen. Das machen wir in den folgenden Schritten.

Klicken Sie zuerst oben im Cloud Shell-Bereich auf die Schaltfläche Open Editor. Sie sieht so aus:

e2a06b5304079efc.png

Sie befinden sich dann in einer IDE-Umgebung, die Visual Studio Code ähnelt, in der Sie Projekte erstellen, Quellcode bearbeiten, Programme ausführen usw. können.

Wenn der Bildschirm zu klein ist, können Sie die Trennlinie zwischen der Konsole und dem Bearbeitungs-/Terminalfenster vergrößern oder verkleinern, indem Sie die horizontale Leiste zwischen diesen beiden Bereichen ziehen, die hier hervorgehoben ist:

8dea35450851af53.png

Sie können zwischen dem Editor und dem Terminal wechseln, indem Sie auf die Schaltflächen Open Editor und Open Terminal klicken. Wechseln Sie jetzt zwischen diesen beiden Umgebungen hin und her.

Erstellen Sie als Nächstes einen Ordner, in dem Sie Ihre Arbeit für dieses Lab speichern können. Klicken Sie dazu auf die Schaltfläche „Ordner hinzufügen“ 5f4e64909bc15e30.png, geben Sie quiz-generator ein und drücken Sie die Eingabetaste. Alle Dateien, die Sie in diesem Lab erstellen, und Ihre Arbeit in Cloud Shell finden Sie in diesem Ordner.

Erstellen Sie jetzt eine requirements.txt-Datei. Dadurch weiß Python, von welchen Bibliotheken Ihre Anwendung abhängt. Für diese einfache Webanwendung verwenden Sie ein beliebtes Python-Modul zum Erstellen von Webservern, die Flask, google-cloud-aiplatform-Clientbibliothek, und ein Webserver-Framework namens gunicorn. Klicken Sie im Navigationsbereich für Dateien mit der rechten Maustaste auf den Ordner quiz-generator und wählen Sie den Menüpunkt New file aus.

613eb3de4b9b750a.png

Wenn Sie nach dem Namen der neuen Datei gefragt werden, geben Sie requirements.txt ein und drücken Sie die Eingabetaste. Achten Sie darauf, dass sich die neue Datei im Projektordner quiz-generator befindet.

Fügen Sie die folgenden Zeilen in die neue Datei ein, um anzugeben, dass Ihre Anwendung vom Python-Paket flask, dem Webserver gunicorn und der Clientbibliothek google-cloud-aiplatform sowie den zugehörigen Versionen abhängt.

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

Sie müssen diese Datei nicht explizit speichern, da Änderungen im Cloud-Editor automatisch gespeichert werden.

Erstellen Sie mit derselben Technik eine weitere neue Datei mit dem Namen main.py. Dies ist die Haupt- und einzige Python-Quelldatei Ihrer App. Achten Sie darauf, dass die neue Datei im Ordner quiz-generator landet.

Fügen Sie den folgenden Code in diese Datei ein:

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)

Wechseln Sie zurück zum Terminal und wechseln Sie mit diesem Befehl in den Projektordner:

cd quiz-generator

Führen Sie den folgenden Befehl aus, um die Projektabhängigkeiten zu installieren:

pip3 install -r requirements.txt

Nach der Installation der Abhängigkeiten sollte die Ausgabe so enden:

Successfully installed flask-3.0.0

Starten Sie jetzt die App mit dem folgenden Befehl im Terminal:

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

Ihre Anwendung wird derzeit auf der virtuellen Maschine ausgeführt, die Ihrer Cloud Shell-Sitzung zugewiesen ist. Cloud Shell enthält einen Proxymechanismus, mit dem Sie von überall im Internet auf Webserver (wie den, den Sie gerade gestartet haben) zugreifen können, die auf Ihrer virtuellen Maschine ausgeführt werden.

Klicken Sie auf die Schaltfläche web preview und dann auf den Menüpunkt Preview on Port 8080:

7f938c0bc1b4154c.png

Daraufhin wird ein Webbrowser-Tab für Ihre laufende Anwendung geöffnet, der ungefähr so aussehen sollte:

aaaf366f9bf74a28.png

5. Methode zum Generieren mit Parameter-Parsing hinzufügen

Jetzt möchten wir die Unterstützung für eine neue Methode namens generate hinzufügen. Fügen Sie dazu eine Importanweisung hinzu, um die HTTP-Anfrage zu manipulieren, und ändern Sie die Hauptroute, um diese Anfrage zu parsen und Parameter zu drucken, wie hier gezeigt:

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)

Aktualisieren Sie nun den Tab Ihres Webbrowsers, um die Ergebnisse zu sehen. Diesmal sollte der „Quiz-Generator“ zusammen mit einem Suchparameter angezeigt werden, der Ihrer URL automatisch hinzugefügt wurde (authuser). Fügen Sie zwei weitere Parameter hinzu, indem Sie den String „&param1=val1&param2=val2“ an das Ende der URL in der Adressleiste Ihres Browsers anhängen. Aktualisieren Sie die Seite und Sie sollten ungefähr Folgendes sehen:

6e223ca358e4e009.png

Nachdem wir nun gesehen haben, wie Abfrageparameter in einer URL gesendet und geparst werden, fügen wir Unterstützung für die spezifischen Parameter hinzu, die wir an unseren Quiz-Generator senden möchten:

  • topic – das gewünschte Quizthema
  • num_q: die Anzahl der gewünschten Fragen
  • diff: der gewünschte Schwierigkeitsgrad (leicht, mittel, schwer)
  • lang: die gewünschte Quizsprache
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)

Aktualisieren Sie nun den Tab Ihres Webbrowsers, um die Ergebnisse zu sehen. Es sollte eine Webseite wie die folgende angezeigt werden:

15eed60f6a805212.png

Ändern Sie die URL, um Werte für verschiedene Parameter festzulegen. Verwenden Sie beispielsweise das Suffix „?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French“ am Ende der URL in der Adressleiste:

f629dba5fa207cef.png

6. Prompt hinzufügen und formatieren

Als Nächstes fügen wir Unterstützung für die spezifischen Parameter hinzu, die wir unseren Quizgenerator senden möchten. Diese sind wie folgt:

  • topic – das gewünschte Quizthema
  • num_q: die Anzahl der gewünschten Fragen
  • diff: der gewünschte Schwierigkeitsgrad (leicht, mittel, schwer)
  • lang – die gewünschte Quizsprache

Kopieren Sie den Prompt, den Sie in einem früheren Schritt mit Vertex Generative AI Studio erstellt haben, ändern Sie aber die hartcodierten Werte für Thema, Anzahl der Fragen und Schwierigkeitsgrad durch diese Strings:

  • {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)

Aktualisieren Sie nun den Tab Ihres Webbrowsers, um die Ergebnisse zu sehen. Es sollte eine Webseite wie die folgende angezeigt werden:

3c2b9dfcfba86b7a.png

Ändern Sie die URL, um diese vier Parameter zu ändern.

7. Vertex AI-Clientbibliothek hinzufügen

Jetzt können wir mit der Vertex AI Python-Clientbibliothek ein Quiz erstellen. Dadurch werden die interaktiven Prompts, die Sie in Schritt 3 erstellt haben, automatisiert und Ihr Generatordienst erhält programmatischen Zugriff auf die LLM-Funktionen von Google. Aktualisieren Sie die Datei main.py so:

Ersetzen Sie „YOUR_PROJECT“ durch Ihre tatsächliche Projekt-ID.

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)

Aktualisieren Sie nun den Tab Ihres Webbrowsers, um die Ergebnisse zu sehen. Dieser Vorgang kann einige Sekunden dauern, da Sie jetzt eine LLM-Anfrage stellen. Es sollte in etwa die folgende Webseite angezeigt werden:

f43d3ba5102857b8.png

Ändern Sie die URL, um ein anderes Quizthema, eine andere Anzahl von Fragen und einen anderen Schwierigkeitsgrad anzufordern.

Damit ist Ihr Mikrodienst fertig. Herzlichen Glückwunsch! Im nächsten Schritt erfahren Sie, wie Sie Ihren Dienst in der Cloud bereitstellen, damit jeder von überall darauf zugreifen kann.

8. Auf in die Cloud!

67c99bf45a7b7805.png

Jetzt, da Sie Ihren eigenen Quiz-Generator erstellt haben, möchten Sie diese tolle Sache mit der Welt teilen. Es ist also an der Zeit, ihn in der Cloud bereitzustellen. Aber Sie möchten mehr damit tun, als es nur zu teilen. Sie möchten sichergehen, dass

  • zuverlässig ausgeführt wird – Sie erhalten eine automatische Fehlertoleranz, falls ein Computer, auf dem Ihre App ausgeführt wird, abstürzt
  • wird automatisch skaliert – deine App wird mit hohem Traffic-Aufkommen Schritt halten und ihre Kapazität bei Nichtnutzung automatisch reduzieren.
  • Ihre Kosten werden minimiert, da Ihnen keine Ressourcen in Rechnung gestellt werden, die Sie nicht verwenden. Sie zahlen nur für Ressourcen, die beim Beantworten von Traffic verbraucht werden.
  • über einen benutzerdefinierten Domainnamen zugänglich ist – Sie können Ihrem Dienst mit nur einem Klick einen benutzerdefinierten Domainnamen zuweisen.
  • bietet eine hervorragende Reaktionszeit – Kaltstarts reagieren relativ schnell, aber Sie können dies durch Festlegen einer Mindestinstanzkonfiguration optimieren.
  • unterstützt die End-to-End-Verschlüsselung mit standardmäßiger SSL/TLS-Websicherheit. Wenn Sie einen Dienst bereitstellen, erhalten Sie standardmäßige Webverschlüsselung und die entsprechenden erforderlichen Zertifikate kostenlos und automatisch.

Wenn Sie Ihre App in Google Cloud Run bereitstellen, profitieren Sie von all diesen Vorteilen und mehr. Der grundlegende Baustein für die Freigabe Ihrer App mit Cloud Run ist ein Container.

Mit Containern können wir eine modulare Box erstellen, in der eine Anwendung mit allen zugehörigen Abhängigkeiten gebündelt ausgeführt wird. Da Container auf fast jedem virtuellen oder physischen Server verwendet werden können, können wir Ihre Anwendung überall bereitstellen, von lokal bis in die Cloud, und sogar von einem Dienstanbieter zu einem anderen migrieren.

Weitere Informationen zu Containern und ihrer Funktionsweise in Google Cloud Run finden Sie im Codelab Von der Entwicklung zur Produktion in drei einfachen Schritten mit Cloud Run.

Anwendung in Cloud Run bereitstellen

Cloud Run ist ein regionaler Dienst. Die Infrastruktur, in der die Cloud Run-Dienste ausgeführt werden, befindet sich demnach in einer bestimmten Region. Aufgrund der Verwaltung durch Google sind die Anwendungen in allen Zonen innerhalb dieser Region redundant verfügbar. Der Einfachheit halber verwenden wir in diesem Lab die hartcodierte Region us-central1.

Wir verwenden ein sogenanntes Buildpack, um den Container automatisch zu generieren. Erstellen Sie im Cloud-Editor eine neue Datei mit dem Namen Procfile und fügen Sie diese Textzeile ein:

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

Dadurch wird dem Buildpack-System mitgeteilt, wie Ihre App im automatisch generierten Container ausgeführt werden soll. Führen Sie als Nächstes im Cloud Shell-Terminal (im selben Verzeichnis quiz-generator) den folgenden Befehl aus:

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

Damit wird dem Befehl gcloud mitgeteilt, dass er Buildpacks verwenden soll, um ein Container-Image anhand der Quelldateien zu erstellen, die er im aktuellen Verzeichnis findet. Das dot in --source . steht dabei für das aktuelle Verzeichnis. Da der Dienst das Container-Image implizit verwaltet, müssen Sie in diesem gcloud-Befehl kein Image angeben.

Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Bei Erfolg wird mit dem Befehl gcloud die URL des neuen Dienstes angezeigt:

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

Sie können die Dienst-URL auch mit diesem Befehl abrufen:

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

Es sollte ungefähr so aussehen:

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

Dieser Link ist eine spezielle URL mit TLS-Sicherheit für Ihren Cloud Run-Dienst. Dieser Link ist dauerhaft gültig (solange Sie den Dienst nicht deaktivieren) und kann überall im Internet verwendet werden. Dabei wird nicht der Proxymechanismus von Cloud Shell verwendet, der auf einer temporären virtuellen Maschine basiert.

Klicken Sie auf die hervorgehobene Service URL, um einen Browsertab mit der laufenden App zu öffnen. Prüfen Sie, ob das Ergebnis mit dem in der Entwicklungsumgebung übereinstimmt. Prüfen Sie auch, ob Sie das erstellte Quiz anpassen können, indem Sie Parameter am Ende der URL angeben.

Glückwunsch! Ihre Anwendung wird jetzt in der Cloud von Google ausgeführt. Ihre App ist öffentlich zugänglich, mit TLS-Verschlüsselung (HTTPS) und automatischer Skalierung für enorme Zugriffszahlen.

9. Alle Teile zusammenfügen

9927db1725bcd5d6.png

In diesem letzten Schritt können Sie Ihren Quiz-Generator als Teil der Quizaic App ausführen. Rufen Sie die Quizaic-URL auf, melden Sie sich in Ihrem Google-Konto an und wechseln Sie zum Tab Create Quiz. Wählen Sie den Generatortyp Custom aus, fügen Sie Ihre Cloud Run-URL in das URL-Feld ein, füllen Sie die anderen Pflichtfelder aus und senden Sie das Formular.

328ee05579ea05f9.png

Nach wenigen Augenblicken sollte ein neues Quiz (siehe „Mein neues Quiz“ im Bild unten) mit einem KI-generierten Thumbnail-Bild angezeigt werden. Sie können es über die entsprechenden Schaltflächen bearbeiten, abspielen, klonen oder löschen. Dieses neue Quiz wurde mit dem Webdienst erstellt, den Sie gerade bereitgestellt haben, basierend auf Ihrem Prompt in der Vorlage.

1719169140978b63.png

10. Bereinigen

c1592d590c563428.png

Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern des erstellten Container-Images möglicherweise in Rechnung gestellt.

Um Gebühren zu vermeiden, können Sie entweder Ihr GCP-Projekt löschen und so die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beenden oder einfach mit dem folgenden Befehl Ihr Container-Image löschen:

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>

Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst zu löschen:

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

11. Du hast es geschafft!

910162be58c0f6d6.png

Glückwunsch! Sie haben einen LLM-Prompt erstellt und mit diesem Prompt einen Cloud Run-Mikroservice bereitgestellt. Jetzt können Sie in natürlicher Sprache programmieren und Ihre Kreationen mit der Welt teilen.

Zum Schluss möchte ich Ihnen noch eine wichtige Frage stellen:

Nachdem Sie Ihre Anwendung in Ihrer Entwicklungsumgebung zum Laufen gebracht haben, wie viele Codezeilen mussten Sie ändern, um sie in der Cloud bereitzustellen – mit allen produktionstauglichen Attributen, die Cloud Run bietet?

Die Antwort lautet natürlich null. :)

Weitere Codelabs

Referenzdokumente…

12. Call-to-Action

Wenn Ihnen dieses Codelab gefallen hat und Sie Google Cloud noch besser kennenlernen möchten, sollten Sie sich jetzt für das Google Cloud-Innovators-Programm registrieren.

498cab7d87ec12d3.png

Google Cloud Innovators ist kostenlos und umfasst:

  • Live-Diskussionen, AMAs und Roadmap-Sitzungen, bei denen Sie das Neueste direkt von Google-Mitarbeitern erfahren
  • die neuesten Google Cloud-Neuigkeiten direkt in Ihrem Posteingang
  • Digitales Kennzeichen und Videokonferenzhintergrund
  • 500 Guthabenpunkte für Labs und Skills Boost

Hier klicken, um dich zu registrieren.