Multi-Agent-Systeme mit dem ADK erstellen

1. Einführung

Übersicht

In diesem Lab erfahren Sie, wie Sie komplexe Multi-Agent-Systeme mit dem Google Agent Development Kit (Google ADK) orchestrieren. Sie gehen von einfachen Agentenhierarchien zur Erstellung automatisierter, kollaborativer Workflows über.

Aufgaben

Sie erstellen zwei verschiedene Multi-Agenten-Systeme:

  • Ein einfacher Reiseplanungs-Agent, der lernt, Unterhaltungen zwischen einem „Brainstorming“-Agenten und einem „Attraktionsplanung“-Agenten zu übertragen.
  • Ein fortschrittlicherer Generator für Filmkonzepte, der einen „Writer’s Room“ mit automatisierten Agenten (z. B. einem Rechercheur, einem Drehbuchautor und einem Kritiker) verwendet, die in einer Schleife zusammenarbeiten, um eine vollständige Filmhandlung zu erstellen.

Lerninhalte

  • So erstellen Sie Beziehungen zwischen übergeordneten und untergeordneten Agents.
  • So schreiben Sie Daten aus einem Tool in die Sitzung state.
  • So lesen Sie Daten aus state mithilfe von Schlüsselvorlagen (z.B. {my_key?}).
  • SequentialAgent für Schritt-für-Schritt-Workflows verwenden
  • LoopAgent verwenden, um iterative Optimierungszyklen zu erstellen.
  • So verwenden Sie ein ParallelAgent, um unabhängige Aufgaben gleichzeitig auszuführen.

2. Multi-Agenten-Systeme

Mit dem Agent Development Kit (ADK) können Entwickler zuverlässigere, komplexere und mehrstufige Verhaltensweisen von generativen Modellen abrufen. Mit dem ADK können Sie anstelle eines komplexen Prompts einen Ablauf aus mehreren, einfacheren Agenten erstellen, die zusammenarbeiten, um ein Problem zu lösen, indem sie die Arbeit aufteilen.

Dieser Ansatz bietet mehrere Vorteile gegenüber der Verwendung eines einzelnen, monolithischen Prompts:

  • Einfacheres Design:Es ist einfacher, einen Ablauf kleiner, spezialisierter Agents zu entwerfen und zu organisieren, als einen großen, komplexen Prompt zu erstellen.
  • Zuverlässigkeit:Spezialisierte Agents sind bei ihren spezifischen Aufgaben zuverlässiger als ein großer, komplexer Agent.
  • Wartungsfreundlichkeit:Es ist einfacher, einen kleinen, spezialisierten Agenten zu korrigieren oder zu verbessern, ohne andere Teile des Systems zu beschädigen.
  • Modularität:Agents, die für einen Workflow entwickelt wurden, können problemlos in anderen Workflows wiederverwendet werden.

Hierarchische Agent-Baumstruktur

Baumstruktur mit hierarchischen Agents

Im ADK organisieren Sie Agents in einer Baumstruktur. Diese Hierarchie ist entscheidend für die Steuerung des Gesprächsverlaufs, da sie einschränkt, welcher Agent das Gespräch an welchen anderen Agenten „übergeben“ kann. Dadurch ist das Verhalten des Systems besser vorhersagbar und die Fehlerbehebung wird einfacher. Die wichtigsten Vorteile:

  • Intuitives Design:Die Struktur ist an echten Teams orientiert, was die Nachvollziehbarkeit erleichtert.
  • Kontrollierter Ablauf:Die Hierarchie ermöglicht eine präzise Steuerung der Aufgabenübertragung, was beim Debuggen hilfreich ist. Die Baumstruktur sorgt beispielsweise dafür, dass der richtige Agent zum Erstellen von Berichten aufgerufen wird, auch wenn Sie zwei mit ähnlichen Beschreibungen haben.

Die gesamte Struktur beginnt mit dem root_agent. Dieser Agent fungiert als übergeordnetes Element und kann ein oder mehrere untergeordnete Agents haben, die wiederum auch übergeordnete Elemente für ihre eigenen untergeordneten Agents sein können. So entsteht der Baum.

3. Projekt einrichten

Google-Konto

Wenn Sie noch kein privates Google-Konto haben, müssen Sie ein Google-Konto erstellen.

Verwenden Sie stattdessen ein privates Konto.

In der Google Cloud Console anmelden

Melden Sie sich mit einem privaten Google-Konto in der Google Cloud Console an.

Abrechnung aktivieren

Google Cloud-Guthaben im Wert von 5 $einlösen (optional)

Für diesen Workshop benötigen Sie ein Rechnungskonto mit Guthaben. Wenn Sie Ihre eigene Abrechnung verwenden möchten, können Sie diesen Schritt überspringen.

  1. Klicken Sie auf diesen Link und melden Sie sich mit einem privaten Google-Konto an.Sie sehen dann etwa Folgendes:Zur Seite „Guthaben“
  2. Klicken Sie auf die Schaltfläche HIER KLICKEN, UM AUF IHR GUTHABEN ZUZUGREIFEN. Sie werden dann auf eine Seite weitergeleitet, auf der Sie Ihr Abrechnungsprofil einrichten können.Seite zum Einrichten des Abrechnungsprofils
  3. Klicken Sie auf Bestätigen.

Sie sind jetzt mit einem Google Cloud Platform-Testrechnungskonto verbunden.

Screenshot der Abrechnungsübersicht

Privates Rechnungskonto einrichten

Wenn Sie die Abrechnung mit Google Cloud-Guthaben eingerichtet haben, können Sie diesen Schritt überspringen.

Klicken Sie hier, um die Abrechnung in der Cloud Console zu aktivieren und ein privates Rechnungskonto einzurichten.

Hinweise:

  • Die Kosten für Cloud-Ressourcen für dieses Lab sollten weniger als 1 $betragen.
  • Sie können die Schritte am Ende dieses Labs ausführen, um Ressourcen zu löschen und so weitere Kosten zu vermeiden.
  • Neuen Nutzern steht die kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.

Projekt erstellen (optional)

Wenn Sie kein aktuelles Projekt haben, das Sie für dieses Label verwenden möchten, erstellen Sie hier ein neues Projekt.

4. Cloud Shell-Editor öffnen

  1. Klicken Sie auf diesen Link, um direkt zum Cloud Shell-Editor zu gelangen.
  2. Wenn Sie heute an irgendeinem Punkt zur Autorisierung aufgefordert werden, klicken Sie auf Autorisieren, um fortzufahren.Klicken Sie, um Cloud Shell zu autorisieren.
  3. Wenn das Terminal nicht unten auf dem Bildschirm angezeigt wird, öffnen Sie es:
    • Klicken Sie auf Ansehen.
    • Klicken Sie auf TerminalNeues Terminal im Cloud Shell-Editor öffnen.
  4. Legen Sie im Terminal Ihr Projekt mit diesem Befehl fest:
    gcloud config set project [PROJECT_ID]
    
    • Beispiel:
      gcloud config set project lab-project-id-example
      
    • Wenn Sie sich nicht mehr an Ihre Projekt-ID erinnern, können Sie alle Ihre Projekt-IDs mit folgendem Befehl auflisten:
      gcloud projects list
      
      Projekt-ID im Cloud Shell Editor-Terminal festlegen
  5. Es sollte folgende Meldung angezeigt werden:
    Updated property [core/project].
    

5. APIs aktivieren

Wenn Sie die Vertex AI API verwenden und mit dem Gemini-Modell interagieren möchten, müssen Sie die Vertex AI API in Ihrem Google Cloud-Projekt aktivieren.

  1. Aktivieren Sie die API im Terminal:
    gcloud services enable aiplatform.googleapis.com
    

Hier finden Sie die aktualisierten Abschnitte, in denen das manuelle Erstellen von Dateien durch Anleitungen zum Klonen des GitHub-Repositorys und Installieren der Abhängigkeiten ersetzt wird.

Einführung in das Vertex AI SDK für Python

Wenn Sie in Ihrer Python-Anwendung mit Modellen interagieren möchten, die auf Vertex AI gehostet werden, verwenden Sie das Vertex AI SDK für Python. Dieses SDK vereinfacht das Senden von Prompts, das Festlegen von Modellparametern und das Empfangen von Antworten, ohne dass die Komplexität der zugrunde liegenden API-Aufrufe direkt berücksichtigt werden muss.

Eine umfassende Dokumentation zum Vertex AI SDK für Python finden Sie unter Einführung in das Vertex AI SDK für Python | Google Cloud.

6. Projektumgebung einrichten

Repository klonen

  1. Klonen Sie im Terminal das Repository mit den Startdateien.
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git
    
    Das Flag --depth 1 klont nur die neueste Version, was schneller geht.
  2. Wechseln Sie im Terminal in das richtige Arbeitsverzeichnis für dieses Lab.
    cd devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    

Virtuelle Umgebung aktivieren

  1. Erstellen und aktivieren Sie im Terminal eine virtuelle Umgebung mit uv:
    uv venv
    source .venv/bin/activate
    
  2. Installieren Sie im Terminal google-adk und die anderen Abhängigkeiten aus der Datei requirements.txt:
    uv pip install -r requirements.txt
    

Dateistruktur überprüfen

Nachdem alle Dateien erstellt wurden, öffnen Sie den Ordner adk_multiagent_systems im Explorer, um die vollständige Struktur zu sehen.

  1. Wählen Sie im Menü des Cloud Shell-Editors Datei > Ordner öffnen… aus. 
    Cloud Shell-Editor-Menü „Datei“ mit ausgewählter Option „Ordner öffnen“
  2. Fügen Sie im Pop-up-Fenster nach Ihrem Nutzernamen die folgenden Ordnerinformationen hinzu: devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems/. Klicken Sie auf OK.
    Das sollte ungefähr so aussehen:
    Dialogfeld „Ordner öffnen“ mit Projektpfad
  3. Der Explorer-Bereich auf der linken Seite wird aktualisiert. Sie sollten nun die vollständige Projektstruktur mit den Unterverzeichnissen parent_and_subagents und workflow_agents sehen.
    Explorer-Bereich mit dem geöffneten Ordner „adk_multiagent_systems“

Umgebungsvariablen einrichten

  1. Sie befinden sich bereits im Verzeichnis adk_multiagent_systems. Erstellen Sie im Terminal eine .env-Datei zum Speichern Ihrer Umgebungsvariablen:
    cloudshell edit .env
    
  2. Fügen Sie Folgendes in die Datei .env ein, die im Editor geöffnet wird:
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. Ersetzen Sie [YOUR-PROJECT-ID] durch Ihre tatsächliche Google Cloud-Projekt-ID. (z.B. PROJECT_ID = "google-cloud-labs")
    Wenn Sie sich nicht an Ihre Projekt-ID erinnern können, führen Sie den folgenden Befehl in Ihrem Terminal aus. Sie sehen dann eine Liste aller Ihrer Projekte und deren IDs.
    gcloud projects list
    
  4. Kopieren Sie im Terminal die Datei .env in die Unter-Agent-Verzeichnisse, damit auch sie auf die Variablen zugreifen können:
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    Die Dateistruktur sollte jetzt so aussehen:
    Explorer-Bereich mit dem geöffneten Ordner „adk_multiagent_systems“

7. Übertragungen zwischen übergeordneten, untergeordneten und gleichrangigen Agenten

Die Unterhaltung beginnt immer mit dem root_agent. Standardmäßig verwendet ein übergeordneter Agent die description seiner untergeordneten Agents, um zu entscheiden, wann die Unterhaltung weitergeleitet werden soll. Sie können diese Übertragungen auch explizit im instruction des übergeordneten Kontos mithilfe der name der untergeordneten Konten steuern.

Probieren wir es aus.

  1. Öffnen Sie im Cloud Shell-Editor die Datei adk_multiagent_systems/parent_and_subagents/agent.py. Beachten Sie die drei Agents in der Datei agent.py:
    • root_agent (mit dem Namen steering): Stellt dem Nutzer eine Frage, um zu entscheiden, an welchen untergeordneten Agenten weitergeleitet werden soll. Anfangs stützt sie sich nur auf die description ihrer untergeordneten Agents.
    • travel_brainstormer: Hilft dem Nutzer, Ideen für Reiseziele zu sammeln.
    • attractions_planner: Hilft dem Nutzer, eine Liste mit Aktivitäten in einem bestimmten Land zu erstellen.
  2. Machen Sie travel_brainstormer und attractions_planner zu Sub-Agents von root_agent, indem Sie die folgende Zeile in die Erstellung von root_agent einfügen:
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. Chatten Sie im Terminal mit Ihrem Agent:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. Geben Sie bei der Eingabeaufforderung [user]: im Terminal Folgendes ein:
    hello
    
    Beispielausgabe (Ihre Ausgabe kann etwas anders aussehen):
    [steering]: Hi there! Do you already have a country in mind for your trip, or would you like some help deciding where to go?
    
  5. Teilen Sie dem Agent im Terminal Folgendes mit:
    I could use some help deciding.
    
    Beispielausgabe (Ihre Ausgabe kann etwas anders aussehen):
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    Beachten Sie das Tag [travel_brainstormer]. Die root_agent-Übertragung basiert nur auf der description des untergeordneten Kundenservicemitarbeiters.
  6. Geben Sie an der Eingabeaufforderung user: im Terminal exit ein und drücken Sie die Eingabetaste, um die Unterhaltung zu beenden.
  7. Sehen wir uns das genauer an. Fügen Sie in agent.py Folgendes zum instruction des root_agent hinzu:
            If they need help deciding, send them to 'travel_brainstormer'.
            If they know what country they'd like to visit, send them to the 'attractions_planner'.
    
  8. Führen Sie den Agent im Terminal noch einmal aus:
    adk run parent_and_subagents
    
  9. Geben Sie bei der Eingabeaufforderung [user]: im Terminal Folgendes ein:
    hello
    
  10. Das solltest du sagen:
    I would like to go to Japan.
    
    Beispielausgabe (Ihre Ausgabe kann etwas anders aussehen):
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    Beachten Sie die Übertragung zu attractions_planner gemäß Ihrer neuen Anleitung.
  11. Antworte jetzt mit:
    Actually I don't know what country to visit.
    
    Beispielausgabe (Ihre Ausgabe kann etwas anders aussehen):
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    Sie wurden an travel_brainstormer weitergeleitet, einen Peer von attractions_planner. Das ist standardmäßig zulässig.
  12. Geben Sie an der Nutzeraufforderung exit ein, um die Sitzung zu beenden.

Zusammenfassung

In diesem Abschnitt haben Sie die Grundlagen der Agent-Hierarchie und des Unterhaltungsablaufs kennengelernt:

  • Die Unterhaltung beginnt immer mit dem root_agent.
  • Ein übergeordneter Agent kann automatisch an einen untergeordneten Agenten übertragen werden, basierend auf seiner description.
  • Sie können diesen Ablauf explizit steuern, indem Sie dem Elternteil instruction geben, um die Übertragung an einen untergeordneten Kundenservicemitarbeiter über name zu ermöglichen.
  • Standardmäßig können Agents an ihre peer-Agents (Geschwister in der Hierarchie) weitergeleitet werden.

8. Sitzungsstatus zum Speichern und Abrufen von Informationen verwenden

Jede ADK-Unterhaltung hat ein Session, das ein Sitzungsstatus-Dictionary enthält. Auf diesen Status können alle Agents zugreifen. Er eignet sich daher ideal, um Informationen zwischen ihnen zu übergeben oder Daten (z. B. eine Liste) während der Konversation beizubehalten.

So fügen Sie dem Status etwas hinzu und lesen daraus:

  1. Zur Datei adk_multiagent_systems/parent_and_subagents/agent.py zurückkehren
  2. Fügen Sie die folgende Funktionsdefinition nach dem # Tools-Header ein:
    def save_attractions_to_state(
    tool_context: ToolContext,
    attractions: List[str]
    ) -> dict[str, str]:
        """Saves the list of attractions to state["attractions"].
    
        Args:
            attractions [str]: a list of strings to add to the list of attractions
    
        Returns:
            None
        """
        # Load existing attractions from state. If none exist, start an empty list
        existing_attractions = tool_context.state.get("attractions", [])
    
        # Update the 'attractions' key with a combo of old and new lists.
        # When the tool is run, ADK will create an event and make
        # corresponding updates in the session's state.
        tool_context.state["attractions"] = existing_attractions + attractions
    
        # A best practice for tools is to return a status message in a return dict
        return {"status": "success"}
    
    Beachten Sie in diesem Code Folgendes:
    • Die Funktion empfängt tool_context: ToolContext. Dieses Objekt ist Ihr Gateway zur Sitzung.
    • In Zeile tool_context.state["attractions"] = ... wird direkt aus dem Status-Dictionary der Sitzung gelesen und in dieses geschrieben. Das ADK erledigt den Rest.
  3. Fügen Sie das Tool dem attractions_planner-Agent hinzu, indem Sie den Parameter tools hinzufügen:
        tools=[save_attractions_to_state]
    
  4. Fügen Sie dem vorhandenen instruction des attractions_planner-Agents die folgenden Aufzählungszeichen hinzu:
            - When they reply, use your tool to save their selected attraction and then provide more possible attractions.
            - If they ask to view the list, provide a bulleted list of { attractions? } and then suggest some more.
    
  5. Starten Sie die Web-UI des Agent Development Kit mit dem folgenden Befehl im Terminal:
    adk web
    
    Ausgabe
    INFO:     Started server process [2434]
    INFO:     Waiting for application startup.
    +-------------------------------------------------------+
    | ADK Web Server started                                |
    |                                                       |
    | For local testing, access at http://localhost:8000.   |
    +-------------------------------------------------------+
    
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    
  6. Klicken Sie im Cloud Shell-Terminal auf die Schaltfläche Webvorschau und wählen Sie Port ändern aus, um die Weboberfläche in einem neuen Tab aufzurufen.
    Menü „Webvorschau“
  7. Geben Sie die Portnummer 8000 ein und klicken Sie auf Ändern und Vorschau. Ein neuer Browsertab mit der ADK Dev UI wird geöffnet.
    Pop-up-Feld zum Ändern des Ports mit 8000 im Textfeld
  8. Wählen Sie links im Drop-down-Menü Agent auswählen die Option parent_and_subagents aus.
  9. Beginne das Gespräch mit: hello
  10. Nachdem der Kundenservicemitarbeiter Sie begrüßt hat, antworten Sie mit:
    I'd like to go to Egypt.
    
    Sie werden zur attractions_planner weitergeleitet und erhalten eine Liste mit Sehenswürdigkeiten.
  11. Wählen Sie eine Attraktion aus, z. B.:
    I'll go to the Sphinx
    
  12. Sie sollten eine Antwort wie Okay, I've saved The Sphinx to your list... (Okay, ich habe die Sphinx auf deiner Liste gespeichert) erhalten.
  13. Klicken Sie auf das Antworttool-Kästchen (mit einem Häkchen markiert), um den Termin aufzurufen, der aus der Antwort des Tools erstellt wurde.
     Beachten Sie, dass es ein Feld actions enthält, das stateDelta mit den Änderungen des Status enthält.
  14. Antworten Sie mit einer anderen Attraktion aus der Liste des Kundenservicemitarbeiters.
  15. Klicken Sie im Navigationsmenü auf der linken Seite auf das „X“, um den Fokus auf das zuvor untersuchte Ereignis zu beenden.
  16. Klicken Sie in der linken Seitenleiste auf den Tab Status. Sie können das attractions-Array jetzt im Status der Sitzung sehen. Es sollte beide ausgewählten Elemente enthalten.Vorschau des Sitzungsstatus in der Web-UI
  17. Senden Sie diese Nachricht an den Kundenservicemitarbeiter:
    What is on my list?
    
    Der Agent sollte jetzt den Status lesen und Ihre Liste zurückgeben.
  18. Wenn Sie mit dem Testen des Agents fertig sind, schließen Sie den Webbrowser-Tab und drücken Sie im Cloud Shell-Terminal STRG + C, um den Server zu beenden.

Zusammenfassung des Abschnitts

In diesem Abschnitt haben Sie gelernt, wie Sie den Status Session verwenden, um Daten freizugeben:

  • Status schreiben: Sie schreiben aus einem Tool in das Status-Dictionary und verwenden dazu das tool_context.state-Objekt (z.B. tool_context.state["my_list"] = [...]) verwenden.
  • Status lesen: Sie fügen Statusdaten direkt in die instruction eines Agenten ein, indem Sie Schlüsselvorlagen verwenden (z.B. Here is your list: {my_list?}) verwenden.
  • Status prüfen: Sie können den Sitzungsstatus live in der ADK Dev UI auf dem Tab „State“ (Status) überwachen.

9. Workflow-Agenten

Bisher haben Sie gesehen, wie ein übergeordneter Agent die Anfrage an einen untergeordneten Agenten weiterleitet und dann auf den Nutzer wartet. Workflow-Agents funktionieren anders: Sie führen ihre untergeordneten Agents nacheinander in einem automatisierten Ablauf aus, ohne auf Nutzereingaben zu warten.

Das ist ideal für automatisierte, mehrstufige Aufgaben wie eine „Plan and Execute“- oder „Draft and Revise“-Pipeline. Das ADK bietet drei integrierte Workflow-Agents, um dies zu verwalten:

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

Im restlichen Teil dieses Labs geht es darum, mit diesen drei Workflow-Agents ein Multi-Agent-System zu erstellen.

Sie erstellen einen Agent, der ein Konzeptdokument für einen neuen Film über eine historische Figur entwickelt. Ihre Agents übernehmen die Recherche, das iterative Schreiben und die Berichterstellung.

Am Ende sieht Ihr System so aus:

Diagramm eines Multi-Agent-Systems für das Filmkonzeptteam

Sie erstellen dieses System Schritt für Schritt und beginnen mit dem einfachsten Workflow.

10. Multi-Agent-System mit einem SequentialAgent erstellen

Ein SequentialAgent ist ein Workflow-Agent, der seine untergeordneten Agents in einer einfachen, linearen Reihenfolge ausführt. Jeder Agent in der sub_agents-Liste wird nacheinander ausgeführt. Das ist ideal für Pipelines, in denen Aufgaben in einer bestimmten Reihenfolge ausgeführt werden müssen, wie beim Agenten für Filmvorschläge, den Sie jetzt erstellen.

Die erste Version ist so strukturiert:

Film_concept_team multi-agent system step 1

  • Ein root_agent (greeter) begrüßt den Nutzer und ermittelt das Filmthema.
  • Die Daten werden dann in ein SequentialAgent mit dem Namen film_concept_team übertragen. Dieses SequentialAgent hat folgende Eigenschaften:
    1. Führen Sie einen researcher-Agent aus, um Fakten aus Wikipedia abzurufen.
    2. Führen Sie einen screenwriter-Agent aus, um diese Fakten zum Schreiben einer Handlung zu verwenden.
    3. Führen Sie einen file_writer-Agent aus, um das endgültige Diagramm in einer Datei zu speichern.

Führen wir die Abfrage aus.

  1. Öffnen Sie im Cloud Shell-Editor die Datei adk_multiagent_systems/workflow_agents/agent.py.
     Lesen Sie diese Agent-Definitionsdatei. Da untergeordnete Agents definiert werden müssen, bevor sie einem übergeordneten Agent zugewiesen werden können, können Sie die Agents von unten nach oben lesen, um die Datei in der Reihenfolge des Unterhaltungsablaufs zu lesen.
  2. Beachten Sie das append_to_state-Tool. Mit dieser Hilfsfunktion können Kundenservicemitarbeiter Daten an eine Liste im Sitzungsstatus anhängen. So übergeben researcher und screenwriter ihre Arbeit.
  3. Probieren Sie den KI-Agenten aus. Starten Sie die Weboberfläche im Terminal mit aktivierter Live-Aktualisierung:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk web --reload_agents
    
  4. Klicken Sie im Cloud Shell-Terminal auf die Schaltfläche Webvorschau und wählen Sie Port ändern aus, um die Weboberfläche in einem neuen Tab aufzurufen.
    Menü „Webvorschau“
  5. Geben Sie die Portnummer 8000 ein und klicken Sie auf Ändern und Vorschau. Ein neuer Browsertab mit der ADK Dev UI wird geöffnet.
    Pop-up-Feld zum Ändern des Ports mit 8000 im Textfeld
  6. Wählen Sie im Drop-down-Menü Agent auswählen die Option workflow_agents aus.
  7. Beginne die Unterhaltung mit: hello. Der greeter-Agent antwortet.
  8. Geben Sie bei Aufforderung eine historische Person ein. Sie können eine dieser Optionen oder eine eigene verwenden:
    • Zhang Zhongjing
    • Ada Lovelace
    • Marcus Aurelius
  9. Die SequentialAgent wird jetzt übernommen. Es werden keine Zwischennachrichten angezeigt. Die researcher, screenwriter und file_writer werden nacheinander ausgeführt. Der Agent antwortet erst, wenn die gesamte Sequenz abgeschlossen ist.
     Wenn das nicht funktioniert, können Sie oben rechts auf + Neue Sitzung klicken und es noch einmal versuchen.
  10. Sobald der Agent bestätigt, dass die Datei geschrieben wurde, suchen Sie die neue .txt-Datei im Verzeichnis movie_pitches im Cloud Shell-Editor und öffnen Sie sie, um die Ausgabe zu sehen.
  11. Klicken Sie in der ADK-Entwickler-UI auf das letzte Agentsymbol im Chatverlauf, um die Ereignisansicht zu öffnen.
  12. In der Ereignisansicht wird ein visuelles Diagramm des Agent-Baums angezeigt. Sie sehen, wie der greeter den film_concept_team aufgerufen hat, der dann seine einzelnen untergeordneten Agents der Reihe nach aufgerufen hat.ADK-Webdiagramm
  13. Sie können für jeden Agenten im Diagramm auf die Tabs Anfrage und Antwort klicken, um die genauen Daten zu sehen, die übergeben wurden, einschließlich des Sitzungsstatus.

Zusammenfassung des Abschnitts

In diesem Abschnitt haben Sie gelernt, wie Sie einen Workflow-Agent verwenden:

  • Ein SequentialAgent führt seine untergeordneten Agents nacheinander aus, ohne zwischen den Schritten auf Nutzereingaben zu warten.
  • Dies ist ein „Workflow“, da der Nutzer mit root_agent spricht, das dann die Arbeit an SequentialAgent übergibt, damit diese abgeschlossen werden kann.
  • Untergeordnete Agents in der Sequenz verwenden den Sitzungsstatus (z.B. { PLOT_OUTLINE? }) aufrufen, um auf die Arbeit vorheriger Kundenservicemitarbeiter zuzugreifen.
  • Mit dem Ereignisdiagramm in der Entwickler-UI können Sie den gesamten Agent-zu-Agent-Workflow visualisieren und debuggen.

11. LoopAgent für iterative Arbeit hinzufügen

Der LoopAgent ist ein Workflow-Agent, der seine untergeordneten Agents nacheinander ausführt und dann wiederholt, beginnend mit dem ersten. Diese „Schleife“ wird fortgesetzt, bis eine Bedingung erfüllt ist, z. B. bis eine bestimmte Anzahl von max_iterations erreicht ist oder ein untergeordneter Agent das integrierte Tool exit_loop aufruft.

Das ist nützlich für Aufgaben, die eine iterative Verfeinerung erfordern. Sie fügen diesen LoopAgent hinzu, um einen „Writer’s Room“ für Ihren Filmkonzept-Agenten zu erstellen. So können ein researcher-, ein screenwriter- und ein neuer critic-Agent in einer Schleife zusammenarbeiten und die Handlung mit jedem Durchlauf verbessern, bis der critic-Agent entscheidet, dass sie fertig ist. So kann der Agent auch vage Nutzereingaben (z. B. „ein alter Arzt“) verarbeiten, da er eine Idee recherchieren und verfeinern kann.

Film_concept_team multi-agent system step 2

So nehmen Sie diese Änderungen vor:

  1. Fügen Sie in adk_multiagent_systems/workflow_agents/agent.py den Import für exit_loop hinzu (in der Nähe der anderen google.adk-Importe):
    from google.adk.tools import exit_loop
    
  2. Fügen Sie den neuen critic-Agent hinzu. Dieser Agent überprüft den Plot. Wenn es gut ist, wird exit_loop aufgerufen. Falls nicht, wird dem Status für den nächsten Schleifendurchlauf Feedback hinzugefügt.
     Fügen Sie die folgende Agent-Definition unter dem Abschnitt # Agents ein:
    critic = Agent(
        name="critic",
        model=model_name,
        description="Reviews the outline so that it can be improved.",
        instruction="""
        INSTRUCTIONS:
        Consider these questions about the PLOT_OUTLINE:
        - Does it meet a satisfying three-act cinematic structure?
        - Do the characters' struggles seem engaging?
        - Does it feel grounded in a real time period in history?
        - Does it sufficiently incorporate historical details from the RESEARCH?
    
        If the PLOT_OUTLINE does a good job with these questions, exit the writing loop with your 'exit_loop' tool.
        If significant improvements can be made, use the 'append_to_state' tool to add your feedback to the field 'CRITICAL_FEEDBACK'.
        Explain your decision and briefly summarize the feedback you have provided.
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        RESEARCH:
        { research? }
        """,
        before_model_callback=log_query_to_model,
        after_model_callback=log_model_response,
        tools=[append_to_state, exit_loop]
    )
    
  3. Erstellen Sie den writers_room LoopAgent. Sie enthält die drei Agents, die in der Schleife verwendet werden.
     Fügen Sie den folgenden Code über der film_concept_team-Agent-Definition ein:
    writers_room = LoopAgent(
        name="writers_room",
        description="Iterates through research and writing to improve a movie plot outline.",
        sub_agents=[
            researcher,
            screenwriter,
            critic
        ],
        max_iterations=5,
    )
    
  4. Aktualisieren Sie die film_concept_team SequentialAgent, um die neue writers_room-Schleife zu verwenden. Ersetzen Sie researcher und screenwriter durch den einzelnen writers_room-Agenten.Ersetzen Sie Ihre vorhandene film_concept_team-Definition durch Folgendes:
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            file_writer
        ],
    )
    
  5. Kehren Sie zum Tab „ADK Dev UI“ zurück und klicken Sie oben rechts auf + Neue Sitzung.
  6. Beginne eine neue Unterhaltung mit: hello
  7. Geben Sie dem Kundenservicemitarbeiter dieses Mal ein allgemeineres Thema an. Hier einige Ideen:
    • ein Industriedesigner, der Produkte für die breite Masse entwarf
    • ein Kartograf (ein Kartenhersteller)
    • der Mann, der dafür sorgte, dass Pflanzen mehr Nahrungsmittel lieferten
    Der Agent durchläuft jetzt die Schleife. In der ADK Dev-Benutzeroberfläche werden die Logs angezeigt, wenn die Agents mehrmals ausgeführt werden (z.B. „[researcher]“, „[screenwriter]“, „[critic]“, „[researcher]“, „[screenwriter]“, „[critic]“ …
  8. Wenn die Schleife abgeschlossen ist, schreibt der Agent die Datei. Sehen Sie sich die generierte Datei im Verzeichnis adk_multiagent_systems/movie_pitches an.
  9. Sehen Sie sich das Ereignisdiagramm in der Entwickler-UI an, um die Schleifenstruktur zu sehen.

Zusammenfassung des Abschnitts

In diesem Abschnitt haben Sie gelernt, wie Sie die LoopAgent verwenden:

  • Ein LoopAgent ist ein Workflow-Agent, der seine Sequenz von untergeordneten Agents wiederholt und so eine „innere Schleife“ für iterative Aufgaben erstellt.
  • Agents innerhalb der Schleife verwenden den Sitzungsstatus, um Aufgaben zu übergeben (z.B. PLOT_OUTLINE) und Feedback (z.B. CRITICAL_FEEDBACK) zueinander.
  • Die Schleife kann durch Erreichen eines max_iterations-Limits oder durch einen Agenten, der das exit_loop-Tool aufruft, beendet werden.

12. ParallelAgent für „Fan-out-and-gather“ verwenden

Der ParallelAgent ist ein Workflow-Agent, der alle seine Sub-Agents gleichzeitig (parallel) ausführt. Das ist nützlich für Aufgaben, die in unabhängige Unteraufgaben unterteilt werden können, z. B. für die Ausführung von zwei verschiedenen Forschungsjobs.

Sie verwenden ein ParallelAgent, um ein „Pre-Production-Team“ zu erstellen, das parallel arbeitet. Ein Kundenservicemitarbeiter recherchiert das Einspielergebnis, während ein anderer gleichzeitig Ideen für die Besetzung sammelt. Dies wird oft als „Fan-out-and-Gather“-Muster bezeichnet: Der ParallelAgent „fächert“ die Arbeit auf und ein späterer Agent (unser file_writer) „sammelt“ die Ergebnisse.

Film_concept_team multi-agent system step 3

Ihr endgültiger Agentenablauf sieht so aus:

  1. Der greeter (Stamm) startet den Chat.
  2. Sie wird an film_concept_team (SequentialAgent) übertragen, die Folgendes ausführt:
    • Die writers_room (LoopAgent) zum Erstellen des Diagramms.
    • Mit dem neuen Feld preproduction_team (ParallelAgent) können Sie gleichzeitig Informationen zu Einspielergebnissen und Besetzung abrufen.
    • Die file_writer, um alle Ergebnisse zu erfassen und die Datei zu speichern.

So nehmen Sie diese Änderungen vor:

  1. Fügen Sie in adk_multiagent_systems/workflow_agents/agent.py das neue ParallelAgent und seine untergeordneten Agents unter der Überschrift # Agents ein.
    box_office_researcher = Agent(
        name="box_office_researcher",
        model=model_name,
        description="Considers the box office potential of this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Write a report on the box office potential of a movie like that described in PLOT_OUTLINE based on the reported box office performance of other recent films.
        """,
        output_key="box_office_report"
    )
    
    casting_agent = Agent(
        name="casting_agent",
        model=model_name,
        description="Generates casting ideas for this film",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        Generate ideas for casting for the characters described in PLOT_OUTLINE
        by suggesting actors who have received positive feedback from critics and/or
        fans when they have played similar roles.
        """,
        output_key="casting_report"
    )
    
    preproduction_team = ParallelAgent(
        name="preproduction_team",
        sub_agents=[
            box_office_researcher,
            casting_agent
        ]
    )
    
  2. Aktualisieren Sie die sub_agents-Liste des film_concept_team SequentialAgent, um die neue preproduction_team (zwischen writers_room und file_writer) einzufügen. Ersetzen Sie die vorhandene film_concept_team-Definition durch Folgendes:
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            writers_room,
            preproduction_team,
            file_writer
        ],
    )
    
  3. Aktualisieren Sie die instruction des file_writer-Agents, damit die neuen Berichte aus dem Status „erfasst“ und der Datei hinzugefügt werden.
     Ersetzen Sie den String instruction für file_writer durch Folgendes:
        instruction="""
        INSTRUCTIONS:
        - Create a marketable, contemporary movie title suggestion for the movie described in the PLOT_OUTLINE.
        If a title has been suggested in PLOT_OUTLINE, you can use it, or replace it with a better one.
        - Use your 'write_file' tool to create a new txt file with the following arguments:
        - for a filename, use the movie title
        - Write to the 'movie_pitches' directory.
        - For the 'content' to write, include:
        - The PLOT_OUTLINE
        - The BOX_OFFICE_REPORT
        - The CASTING_REPORT
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        BOX_OFFICE_REPORT:
        { box_office_report? }
    
        CASTING_REPORT:
        { casting_report? }
        """,
    
  4. Kehren Sie zum Tab „ADK Dev UI“ zurück und klicken Sie auf + New Session (+ Neue Sitzung).
  5. Geben Sie hello ein, um die Unterhaltung zu starten.
  6. Geben Sie bei Aufforderung eine neue Idee für eine Figur ein. Hier einige Ideen:
    • die Schauspielerin, die die Technologie für WLAN erfunden hat
    • ein aufregender Koch
    • wichtige Akteure bei den Weltausstellungen
  7. Wenn der Agent seine Arbeit abgeschlossen hat, sehen Sie sich die endgültige Datei im Verzeichnis adk_multiagent_systems/movie_pitches an. Es sollte nun die Handlung, den Bericht zum Einspielergebnis und den Bericht zur Besetzung in einem Dokument enthalten.

Zusammenfassung des Abschnitts

In diesem Abschnitt haben Sie gelernt, wie Sie die ParallelAgent verwenden:

  • Ein ParallelAgent „fächert“ die Arbeit auf und führt alle untergeordneten Agents gleichzeitig statt nacheinander aus.
  • Das ist sehr effizient für Aufgaben, die nicht voneinander abhängen, z. B. die Recherche zu zwei verschiedenen Themen.
  • Die Ergebnisse paralleler Agents werden von einem späteren Agent „erfasst“. Dazu speichern die parallelen Agents ihre Arbeit im Sitzungsstatus (mit output_key) und ein letzter Agent (z. B. file_writer) liest diese Schlüssel.

13. Benutzerdefinierte Workflow-Agenten

Wenn die vordefinierten Workflow-Agents von SequentialAgent, LoopAgent und ParallelAgent nicht ausreichen, bietet CustomAgent die Flexibilität, neue Workflow-Logik zu implementieren.

Sie können Muster für die Ablaufsteuerung, die bedingte Ausführung oder die Statusverwaltung zwischen untergeordneten Agents definieren. Das ist nützlich für komplexe Workflows, zustandsorientierte Orchestrierungen oder die Integration benutzerdefinierter Geschäftslogik in die Orchestrierungsebene des Frameworks.

Das Erstellen einer CustomAgent ist nicht Teil dieses Labs. Es ist jedoch gut zu wissen, dass sie existiert, falls Sie sie benötigen.

14. Glückwunsch!

Sie haben mit dem Google Agent Development Kit (ADK) ein komplexes Multi-Agent-System erstellt. Sie haben sich von einer einfachen über- und untergeordneten Beziehung zwischen KI‑Agenten zu komplexen, automatisierten Workflows entwickelt, die ein kreatives Projekt recherchieren, schreiben und optimieren können.

Zusammenfassung

In diesem Lab haben Sie Folgendes getan:

  • Organisierte Kundenservicemitarbeiter in einem hierarchischen Baum mit Beziehungen zwischen über- und untergeordneten Kundenservicemitarbeitern.
  • Kontrollierte Agent-zu-Agent-Übertragungen, sowohl automatisch (mit description) als auch explizit (mit instruction).
  • Sie haben ein Tool verwendet, um Daten in das tool_context.state-Dictionary zu schreiben.
  • Schlüsselvorlagen verwendet (z.B. { PLOT_OUTLINE? }), um den Sitzungsstatus zu lesen und den Prompt eines Kundenservicemitarbeiters zu steuern.
  • SequentialAgent implementiert, um einen einfachen, schrittweisen Workflow zu erstellen (Recherche –> Schreiben –> Speichern).
  • LoopAgent mit einem critic-Agenten und dem exit_loop-Tool verwendet, um einen iterativen Optimierungszyklus zu erstellen.
  • Es wurde ein ParallelAgent verwendet, um unabhängige Aufgaben (z. B. Casting und Recherche an der Kinokasse) parallel auszuführen.

Weitere Tests

Es gibt viele Möglichkeiten, auf dem aufzubauen, was Sie gelernt haben. Hier einige Tipps:

  • Weitere Agenten hinzufügen:Fügen Sie Ihrem preproduction_team ParallelAgent einen neuen Agenten hinzu. Sie könnten beispielsweise ein marketing_agent erstellen, das basierend auf dem PLOT_OUTLINE eine Tagline für den Film schreibt.
  • Weitere Tools hinzufügen:Sie können Ihrem researcher-Agent weitere Tools zur Verfügung stellen. Sie könnten ein Tool erstellen, das eine Google Search API verwendet, um Informationen zu finden, die nicht auf Wikipedia verfügbar sind.
  • Labs erkunden CustomAgent :Im Lab wird die CustomAgent für Workflows erwähnt, die nicht den Standardvorlagen entsprechen. Sie können beispielsweise einen Agent erstellen, der nur dann bedingt ausgeführt wird, wenn ein bestimmter Schlüssel im Sitzungsstatus vorhanden ist.