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. Sie verwenden eine andere Programmiersprache als zuvor: Englisch!

Aufgaben

  • Sie erstellen einen Prompt, der anhand bestimmter 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 umzuwandeln, der anhand bestimmter Eingabeparameter Quizze erstellt.
  • Sie werden sehen, wie einfach es ist, den Dienst zum Generieren von Quizfragen mit Google Cloud Run in der Cloud bereitzustellen.
  • Zum Schluss konfigurieren Sie eine echte App ( quizaic.com) für die Verwendung des bereitgestellten Quizgenerators. Basierend auf den Ergebnissen können Sie dann an Live-Quizzen teilnehmen.

Lerninhalte

  • Anleitung zum Erstellen eines Vorlagen-Prompts für ein Large Language Model (LLM).
  • Eine einfache Webserveranwendung in Python erstellen.
  • Hier erfahren Sie, wie Sie Ihrer Webanwendung Unterstützung für LLM von Google hinzufügen.
  • Hier erfahren Sie, wie Sie Ihre Anwendung in der Cloud bereitstellen, damit jeder Ihre neue Kreation ausprobieren kann.
  • Hier erfahren Sie, wie Sie Ihren Quizgenerator in eine größere App integrieren.

Du brauchst...

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

Dieses Lab richtet sich an Entwickler aller Stufen, auch 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 werden alle Schritte behandelt, die für den Einstieg in dieses Lab erforderlich sind.

Umgebung für das selbstbestimmte Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. 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 Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf deine Projekt-ID verweisen, die üblicherweise als PROJECT_ID bezeichnet wird. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts erhalten.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab ist kostengünstig. Sie können die von Ihnen erstellten Ressourcen oder das Projekt löschen, um Ressourcen herunterzufahren, um zu vermeiden, dass über diese Anleitung hinaus Kosten anfallen. Neue Google Cloud-Nutzer haben Anspruch auf das kostenlose Testprogramm mit 300$Guthaben.

Cloud Shell starten

In diesem Lab arbeiten Sie in einer Cloud Shell-Sitzung, einem Befehlsinterpreter, der von einer virtuellen Maschine in der Cloud von Google gehostet wird. Sie können diesen Abschnitt genauso einfach lokal auf Ihrem Computer ausführen, aber mit Cloud Shell erhalten alle Zugriff auf eine reproduzierbare Version in einer einheitlichen Umgebung. Sie können diesen Abschnitt nach dem Lab gerne auf Ihrem eigenen Computer wiederholen.

4a95152439f0159b.png

Cloud Shell aktivieren

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

5c1dabeca90e44e5.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.

9c92662c6a846a5c.png

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

9f0e51b578fecce5.png

Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt, wodurch die Netzwerkleistung und Authentifizierung erheblich verbessert werden. Viele, wenn nicht sogar alle Arbeiten 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 eingestellt 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 sehen Sie, wo diese Dienste benötigt werden (und warum). Führen Sie vorerst diesen 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 – Programmierung in natürlicher Sprache

92f630373224ead8.png

Wir beginnen mit dem Entwickeln eines Prompts für ein Large Language Model. Google Cloud Console aufrufen > Vertex AI > Vertex AI Studio (Sprache). Sie sollten eine Seite wie die folgende sehen:

bfe5706041ae6454.png

Klicken Sie unter Generate Text auf die Schaltfläche Text Prompt. Geben Sie im nächsten Dialogfeld einen Prompt ein, von dem Sie denken, dass er unter Berücksichtigung der folgenden Anforderungen ein Quiz erstellen könnte:

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

Klicken Sie auf die Schaltfläche „Senden“, um sich das Ergebnis anzusehen.

Wie im folgenden Screenshot gezeigt, können Sie im rechten Steuerfeld das gewünschte Modell auswählen und einige der Einstellungen optimieren:

8aa89a1970ea9335.png

Diese Einstellungen sind verfügbar:

  • Die Region ist der Ort, an dem die Generierungsanfrage ausgeführt werden soll.
  • Model wählt aus, welches Large Language Model Sie verwenden möchten. Bleiben Sie für dieses Codelab bei „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 Streamingantworten wird ausgewählt, ob Antworten gedruckt werden sollen, während sie generiert oder gespeichert werden, und angezeigt, wenn sie abgeschlossen sind.
  • Der Grenzwert des Sicherheitsfilters passt an, wie wahrscheinlich es ist, dass potenziell schädliche Antworten angezeigt werden.

Sobald Sie einen Prompt haben, der ein sinnvolles Quiz gemäß den oben genannten Anforderungen generiert, können wir dieses Quiz mit benutzerdefiniertem Code parsen. Wäre es 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 sind ein Array von Objekten, wobei jedes Objekt eine Frage, eine Reihe möglicher Antworten auf diese Frage und eine korrekte Antwort enthält. So sieht die JSON-Codierung für Quizze in diesem Lab aus:

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

    ...
]

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

  1. Gib in Worten genau an, nach welchem Format du suchst (z.B. den kursiv formatierten Satz oben).
  2. Fügen Sie Ihrem Prompt ein Beispiel für das gewünschte JSON-Format hinzu.

Sobald Ihr Prompt Quizze gemäß der gewünschten Spezifikation generiert, klicken Sie rechts oben auf der Seite auf die Schaltfläche GET CODE, um Python-Code aufzurufen, mit dem Sie Ihren Prompt programmatisch an ein Vertex AI-LLM senden können. Wenn Sie an der Verwendung einer anderen Programmiersprache als Python interessiert sind, sehen Sie sich https://cloud.google.com/vertex-ai/docs/samples?text=generative an.

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 jedoch als Mikrodienst funktionieren, der einen Dienst zur Quizgenerierung für andere Apps bereitstellt. Dazu müssen wir einen einfachen Webserver erstellen und öffentlich verfügbar machen. Dazu führen wir die folgenden Schritte aus.

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 ähnlich wie Visual Studio Code, in der Sie Projekte erstellen, Quellcode bearbeiten, Ihre Programme ausführen usw.

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

8dea35450851af53.png

Mit den Schaltflächen Open Editor und Open Terminal können Sie zwischen Editor und Terminal wechseln. Versuchen Sie jetzt, zwischen diesen beiden Umgebungen zu wechseln.

Erstellen Sie als Nächstes einen Ordner, in dem Ihre Arbeit für dieses Lab gespeichert werden soll. 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 namens Flask, (die google-cloud-aiplatform-Clientbibliothek) und ein Webserver-Framework namens gunicorn. Klicken Sie im Dateinavigationsbereich 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, vom Gunicorn-Webserver und von der Clientbibliothek google-cloud-aiplatform sowie die zugehörigen Versionen abhängig ist.

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

Sie müssen diese Datei nicht explizit speichern, da der Cloud-Editor Änderungen automatisch für Sie speichert.

Erstellen Sie mit derselben Technik eine weitere neue Datei mit dem Namen main.py. Dies wird die Hauptdatei (und einzige) Python-Quelldatei Ihrer Anwendung sein. Achten Sie auch hier darauf, dass sich die neue Datei im Ordner quiz-generator befindet.

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 dem folgenden 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 nun Ihre App, indem Sie diesen Befehl im Terminal ausführen:

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

Zu diesem Zeitpunkt wird Ihre Anwendung auf der virtuellen Maschine ausgeführt, die für Ihre Cloud Shell-Sitzung vorgesehen ist. Cloud Shell enthält einen Proxy-Mechanismus, mit dem Sie von überall im globalen Internet auf Webserver (wie den von Ihnen gerade gestarteten) auf Ihrer virtuellen Maschine zugreifen können.

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. Generierungsmethode mit Parameterparsen hinzufügen

Jetzt möchten wir eine Unterstützung für die Felderstellung einer neuen Methode namens generate hinzufügen. Dazu fügen Sie eine Importanweisung hinzu, um die HTTP-Anfrage zu bearbeiten und die Hauptroute zum Parsen der Anfrage und den Druckparametern wie folgt zu ändern:

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. Dieses Mal sollten Sie den "Quiz-Generator" zusammen mit einem Suchparameter sehen, der automatisch Ihrer URL (authuser) hinzugefügt wurde. Fügen Sie zwei zusätzliche Parameter hinzu, indem Sie die Zeichenfolge "`&param1=val1&param2=val2`" an das Ende der URL in der Adressleiste Ihres Browsers an und aktualisieren Sie die Seite. Es sollte Folgendes angezeigt werden:

6e223ca358e4e009.png

Nachdem wir gesehen haben, wie Abfrageparameter in einer URL gesendet und geparst werden, fügen wir Unterstützung für die spezifischen Parameter hinzu, die wir unseren Quizgenerator senden möchten. Diese lauten 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
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 in etwa die folgende Webseite 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 die Adressleiste ein:

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 vorherigen Schritt mit Vertex Generative AI Studio entwickelt haben, aber ändern Sie die hartcodierten Werte für Thema, Anzahl der Fragen und Schwierigkeitsgrad mit diesen 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. Die Anzeige sollte in etwa so aussehen:

3c2b9dfcfba86b7a.png

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

7. Vertex AI-Clientbibliothek hinzufügen

Jetzt können Sie mit der Vertex AI Python-Clientbibliothek Ihr Quiz generieren. Dadurch werden die interaktiven Aufforderungen aus Schritt 3 automatisiert und Ihr Generator-Dienst programmatischen Zugriff auf die LLM-Funktionen von Google erhalten. Aktualisieren Sie Ihre main.py-Datei 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

Versuche, die URL zu ändern, um ein anderes Quizthema, eine andere Anzahl von Fragen und ein anderes Schwierigkeitsniveau anzufordern.

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

8. In die Cloud!

67c99bf45a7b7805.png

Nachdem Sie nun Ihren eigenen Quizgenerator erstellt haben, können Sie ihn mit dem Rest der Welt teilen. Es ist an der Zeit, ihn in der Cloud bereitzustellen. Aber Sie möchten mehr tun, als es nur zu teilen. Achten Sie dabei auf Folgendes:

  • läuft zuverlässig – Sie erhalten automatische Fehlertoleranz, falls ein Computer, auf dem Ihre App ausgeführt wird, abstürzt.
  • wird automatisch skaliert – deine App kann 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. Ihnen werden nur die Kosten in Rechnung gestellt, die während der Reaktion auf Traffic verbraucht wurden.
  • ist über einen benutzerdefinierten Domainnamen zugänglich – Sie haben Zugriff auf eine Ein-Klick-Lösung, mit der Sie Ihrem Dienst einen benutzerdefinierten Domainnamen zuweisen können.
  • bietet eine hervorragende Reaktionszeit – Kaltstarts reagieren relativ schnell, aber Sie können dies durch Festlegen einer Mindestinstanzkonfiguration optimieren.
  • unterstützt Ende-zu-Ende-Verschlüsselung mit standardmäßiger SSL/TLS-Websicherheit. Wenn Sie einen Dienst bereitstellen, erhalten Sie kostenlos und automatisch die Standard-Webverschlüsselung sowie die entsprechenden erforderlichen Zertifikate.

Wenn Sie Ihre Anwendung in Google Cloud Run bereitstellen, erhalten Sie alle oben genannten und weitere Funktionen. Der grundlegende Baustein für die Freigabe Ihrer Anwendung für 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 realen Server verwendet werden können, haben wir die Möglichkeit, Ihre Anwendung an jedem beliebigen Ort bereitzustellen – vom lokalen Standort in die Cloud – und sogar von einem Dienstanbieter zu einem anderen zu verschieben.

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

Anwendung in Cloud Run bereitstellen

Cloud Run ist ein regionaler Dienst. Das bedeutet, dass sich die Infrastruktur, in der Ihre Cloud Run-Dienste ausgeführt werden, in einer bestimmten Region befindet und von Google verwaltet wird, damit sie in allen Zonen innerhalb dieser Region redundant verfügbar ist. Der Einfachheit halber verwenden wir in diesem Lab die hartcodierte Region us-central1.

Wir verwenden ein sogenanntes Buildpack, um Ihren 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

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

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

Dadurch wird dem Befehl gcloud mitgeteilt, dass er Buildpacks verwenden soll, um das Container-Image anhand der Quelldateien zu erstellen, die er im aktuellen Verzeichnis findet. dot in --source . ist die Abkürzung für das aktuelle Verzeichnis. Da der Dienst sich implizit um das Container-Image kümmert, müssen Sie bei diesem gcloud-Befehl kein Image angeben.

Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Bei Erfolg zeigt der Befehl gcloud die URL des neuen Dienstes an:

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)"

Die Anzeige sollte in etwa so aussehen:

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

Dieser Link ist eine dedizierte URL mit TLS-Sicherheit für Ihren Cloud Run-Dienst. Dieser Link ist dauerhaft (solange Sie Ihren Dienst nicht deaktivieren) und irgendwo im Internet verwendbar ist. Dabei wird nicht der zuvor erwähnte Proxymechanismus von Cloud Shell verwendet, der von einer vorübergehenden virtuellen Maschine abhängt.

Klicken Sie auf das hervorgehobene Symbol Service URL, um die laufende App in einem Webbrowser-Tab zu öffnen. Prüfen Sie, ob das Ergebnis mit dem Ergebnis übereinstimmt, das Sie in Ihrer Entwicklungsumgebung gesehen haben. Prüfen Sie außerdem, ob Sie das generierte Quiz anpassen können, indem Sie am Ende der URL Parameter angeben.

Glückwunsch! Ihre Anwendung wird jetzt in der Cloud von Google ausgeführt. Sie müssen sich keine Gedanken mehr darüber machen, dass Ihre App öffentlich verfügbar ist, mit TLS-Verschlüsselung (HTTPS) und der automatischen Skalierung auf schwindelerregende Traffic-Ebenen.

9. Zusammensetzen aller Teile

9927db1725bcd5d6.png

Im letzten Schritt führen wir den Quizgenerator als Teil der Quizanwendung aus. Rufen Sie die Quiz-URL auf, melden Sie sich in Ihrem Google-Konto an und rufen Sie den Tab Create Quiz auf. 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

In wenigen Augenblicken sollten Sie ein neues Quiz (siehe „Mein neues Quiz“ im Bild unten) mit einer KI-generierten Miniaturansicht haben, die Sie über die entsprechenden Schaltflächen bearbeiten, abspielen, klonen oder löschen können. Dieses neue Quiz wurde mit dem Webdienst erstellt, den Sie gerade anhand Ihrer Prompt-Vorlage erstellt haben.

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.

Sie können entweder Ihr GCP-Projekt löschen, um Gebühren zu vermeiden, wodurch die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beendet wird, oder einfach das Container-Image mit folgendem Befehl 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>

Verwenden Sie den folgenden Befehl, um den 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 erfolgreich einen LLM-Prompt erstellt und mit diesem Prompt einen Cloud Run-Mikrodienst bereitgestellt. Jetzt können Sie in natürlicher Sprache programmieren und Ihre Kreationen mit der Welt teilen!

Ich möchte Ihnen noch eine wichtige Frage stellen:

Nachdem Sie Ihre Anwendung in Ihrer Entwicklungsumgebung eingerichtet 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 wahrscheinlich mehr Zeit mit Google Cloud verbringen werden, sollten Sie noch heute am Google Cloud Innovators-Programm teilnehmen.

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
  • aktuelle Google Cloud-News direkt in Ihrem Posteingang
  • Digitales Logo und Hintergrund für Videokonferenzen
  • 500 Credits für Labs und Lerninhalte auf Skills Boost

Klicken Sie hier, um sich zu registrieren.