Tworzenie systemów z wieloma agentami za pomocą pakietu ADK

1. Wprowadzenie

Przegląd

W tym module dowiesz się, jak koordynować złożone systemy wieloagentowe za pomocą zestawu Google Agent Development Kit (Google ADK). Przejdziesz od prostych hierarchii agentów do tworzenia zautomatyzowanych przepływów pracy opartych na współpracy.

Co utworzysz

Utworzysz 2 różne systemy z wieloma agentami:

  • Prosty agent do planowania podróży, który uczy się przekazywać rozmowy między agentem „burzy mózgów” a agentem „planowania atrakcji”.
  • Bardziej zaawansowany generator pomysłów na filmy, który korzysta z „pokoju scenarzystów” złożonego z automatycznych agentów (np. badacza, scenarzysty i krytyka), którzy współpracują w pętli, aby stworzyć pełną fabułę filmu.

Czego się nauczysz

  • Jak tworzyć relacje między agentem głównym a podrzędnym
  • Jak zapisywać dane w sesji state za pomocą narzędzia.
  • Jak odczytywać dane z state za pomocą szablonów kluczy (np. {my_key?}).
  • Jak używać SequentialAgent w przypadku przepływów pracy krok po kroku.
  • Jak używać LoopAgent do tworzenia cykli iteracyjnego udoskonalania.
  • Jak używać ParallelAgent do równoczesnego wykonywania niezależnych zadań.

2. Systemy wieloagentowe

Pakiet Agent Development Kit (ADK) umożliwia deweloperom uzyskiwanie bardziej niezawodnych, zaawansowanych i wieloetapowych zachowań modeli generatywnych. Zamiast jednego złożonego prompta ADK umożliwia tworzenie ciągu wielu prostszych agentów, którzy współpracują przy rozwiązywaniu problemu, dzieląc się pracą.

Takie podejście ma kilka zalet w porównaniu z używaniem jednego, monolitycznego prompta:

  • Prostsza konstrukcja: łatwiej jest zaprojektować i zorganizować przepływ małych, wyspecjalizowanych agentów niż stworzyć jeden duży, złożony prompt.
  • Niezawodność: wyspecjalizowani agenci są bardziej niezawodni w wykonywaniu konkretnych zadań niż jeden duży, złożony agent.
  • Łatwość konserwacji: łatwiej jest naprawić lub ulepszyć małego, wyspecjalizowanego agenta bez uszkadzania innych części systemu.
  • Modułowość: agenci utworzeni na potrzeby jednego przepływu pracy mogą być łatwo wykorzystywani w innych.

Drzewo agentów hierarchicznych

Struktura drzewa przedstawiająca agentów hierarchicznych

W ADK agenci są uporządkowani w strukturę drzewa. Ta hierarchia ma kluczowe znaczenie dla kontrolowania przebiegu rozmowy, ponieważ ogranicza to, który pracownik obsługi klienta może „przekazać” rozmowę innemu pracownikowi. Dzięki temu działanie systemu jest bardziej przewidywalne i łatwiejsze do debugowania. Korzyści:

  • Intuicyjna struktura: struktura jest inspirowana prawdziwymi zespołami, co ułatwia jej zrozumienie.
  • Kontrolowany przepływ: hierarchia zapewnia precyzyjną kontrolę nad delegowaniem zadań, co ułatwia debugowanie. Na przykład struktura drzewa zapewnia wywołanie właściwego agenta do pisania raportów, nawet jeśli masz 2 agenty o podobnych opisach.

Cała struktura zaczyna się od root_agent. Ten agent pełni rolę nadrzędną i może mieć co najmniej 1 podrzędnego agenta, który z kolei może być agentem nadrzędnym dla własnych agentów podrzędnych, tworząc w ten sposób drzewo.

3. Konfigurowanie projektu

Konto Google

Jeśli nie masz jeszcze osobistego konta Google, musisz je utworzyć.

Używaj konta osobistego zamiast konta służbowego lub szkolnego.

Logowanie w konsoli Google Cloud

Zaloguj się w konsoli Google Cloud za pomocą osobistego konta Google.

Włącz płatności

Wykorzystaj środki na Google Cloud o wartości 5 USD (opcjonalnie)

Aby przeprowadzić te warsztaty, musisz mieć konto rozliczeniowe z określonymi środkami. Jeśli planujesz używać własnego konta rozliczeniowego, możesz pominąć ten krok.

  1. Kliknij ten link i zaloguj się na osobiste konto Google.Zobaczysz coś takiego:Kliknij tutaj, aby otworzyć stronę środków
  2. Kliknij przycisk KLIKNIJ TUTAJ, ABY UZYSKAĆ DOSTĘP DO ŚRODKÓW. Spowoduje to przejście na stronę, na której możesz skonfigurować profil płatności.Strona konfiguracji profilu płatności
  3. Kliknij Potwierdź.

Twoje konto jest teraz połączone z próbnym kontem rozliczeniowym Google Cloud Platform.

Zrzut ekranu z przeglądem rozliczeń

Konfigurowanie osobistego konta rozliczeniowego

Jeśli skonfigurujesz płatności za pomocą środków w Google Cloud, możesz pominąć ten krok.

Aby skonfigurować osobiste konto rozliczeniowe, włącz płatności w Cloud Console.

Uwagi:

Tworzenie projektu (opcjonalnie)

Jeśli nie masz bieżącego projektu, którego chcesz użyć w tym ćwiczeniu, utwórz nowy projekt.

4. Otwórz edytor Cloud Shell

  1. Kliknij ten link, aby przejść bezpośrednio do edytora Cloud Shell
  2. Jeśli w dowolnym momencie pojawi się prośba o autoryzację, kliknij Autoryzuj, aby kontynuować.Kliknij, aby uwierzytelnić się w Cloud Shell
  3. Jeśli terminal nie pojawia się u dołu ekranu, otwórz go:
    • Kliknij Wyświetl.
    • Kliknij TerminalOtwieranie nowego terminala w edytorze Cloud Shell.
  4. W terminalu ustaw projekt za pomocą tego polecenia:
    gcloud config set project [PROJECT_ID]
    
    • Przykład:
      gcloud config set project lab-project-id-example
      
    • Jeśli nie pamiętasz identyfikatora projektu, możesz wyświetlić listę wszystkich identyfikatorów projektów za pomocą tego polecenia:
      gcloud projects list
      
      Ustawianie identyfikatora projektu w terminalu edytora Cloud Shell
  5. Powinien wyświetlić się ten komunikat:
    Updated property [core/project].
    

5. Włącz interfejsy API

Aby korzystać z interfejsu Vertex AI API i wchodzić w interakcje z modelem Gemini, musisz włączyć interfejs Vertex AI API w projekcie Google Cloud.

  1. W terminalu włącz interfejs API:
    gcloud services enable aiplatform.googleapis.com
    

Oto zaktualizowane sekcje, w których ręczne tworzenie plików zastąpiono instrukcjami klonowania repozytorium GitHub i instalowania zależności.

Wprowadzenie do pakietu Vertex AI SDK dla Pythona

Aby wchodzić w interakcje z modelami hostowanymi w Vertex AI z poziomu aplikacji w Pythonie, użyjesz pakietu Vertex AI SDK for Python. Ten pakiet SDK upraszcza proces wysyłania promptów, określania parametrów modelu i otrzymywania odpowiedzi bez konieczności bezpośredniego obsługi złożonych wywołań interfejsu API.

Pełną dokumentację pakietu Vertex AI SDK dla Pythona znajdziesz tutaj: Wprowadzenie do pakietu Vertex AI SDK dla Pythona | Google Cloud.

6. Konfigurowanie środowiska projektu

Kopiowanie repozytorium

  1. W terminalu sklonuj repozytorium zawierające pliki początkowe.
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git
    
    Flaga --depth 1 klonuje tylko najnowszą wersję, co jest szybsze.
  2. W terminalu przejdź do odpowiedniego katalogu roboczego dla tego modułu.
    cd devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    

Aktywowanie środowiska wirtualnego

  1. W terminalu utwórz i aktywuj środowisko wirtualne za pomocą polecenia uv:
    uv venv
    source .venv/bin/activate
    
  2. W terminalu zainstaluj google-adk i inne zależności z pliku requirements.txt:
    uv pip install -r requirements.txt
    

Sprawdź strukturę pliku

Gdy wszystkie pliki zostaną utworzone, otwórz folder adk_multiagent_systems w Eksploratorze, aby zobaczyć pełną strukturę.

  1. W menu edytora Cloud Shell wybierz Plik > Otwórz folder....
    Menu Plik w edytorze Cloud Shell z wybraną opcją Otwórz folder
  2. W wyświetlonym oknie dodaj po nazwie użytkownika te informacje o folderze: devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems/. Kliknij OK.
    Powinno to wyglądać mniej więcej tak:
    Otwórz okno Folder ze ścieżką projektu
  3. Panel eksploratora po lewej stronie zostanie odświeżony. Powinna być teraz widoczna pełna struktura projektu z podkatalogami parent_and_subagentsworkflow_agents, gotowa do wykonania kolejnych kroków.
    Panel eksploratora z otwartym folderem adk_multiagent_systems

Konfigurowanie zmiennych środowiskowych

  1. Jesteś już w katalogu adk_multiagent_systems. W terminalu utwórz plik .env do przechowywania zmiennych środowiskowych:
    cloudshell edit .env
    
  2. Wklej do pliku .env, który otworzy się w edytorze, ten tekst:
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. Zastąp [YOUR-PROJECT-ID] identyfikatorem Twojego projektu Google Cloud. (np. PROJECT_ID = "google-cloud-labs")
    Jeśli nie pamiętasz identyfikatora projektu, uruchom to polecenie w terminalu. Wyświetli się lista wszystkich Twoich projektów i ich identyfikatorów.
    gcloud projects list
    
  4. W terminalu skopiuj ten plik .env do katalogów podrzędnych agentów, aby oni też mogli uzyskać dostęp do zmiennych:
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    Struktura pliku powinna teraz wyglądać tak:
    Panel eksploratora z otwartym folderem adk_multiagent_systems

7. Poznaj transfery między agentami nadrzędnymi, podrzędnymi i równorzędnymi

Rozmowa zawsze zaczyna się od root_agent. Domyślnie agent nadrzędny używa description swoich agentów podrzędnych, aby zdecydować, kiedy przekazać rozmowę. Możesz też wyraźnie kierować tymi przekazaniami w instruction rodzica, korzystając z name podmiotów zależnych.

Sprawdźmy to.

  1. W edytorze Cloud Shell otwórz plik adk_multiagent_systems/parent_and_subagents/agent.py. Zwróć uwagę na 3 agenty w pliku agent.py:
    • root_agent (o nazwie steering): zadaje użytkownikowi pytanie, aby zdecydować, do którego podagenta przekazać rozmowę. Początkowo opiera się tylko na description podagentów.
    • travel_brainstormer: pomaga użytkownikowi w przeprowadzaniu burzy mózgów dotyczącej miejsc docelowych.
    • attractions_planner: pomaga użytkownikowi w znalezieniu listy rzeczy do zrobienia w danym kraju.
  2. Ustaw travel_brainstormerattractions_planner jako podagenty root_agent, dodając ten wiersz do tworzenia root_agent:
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. W terminalu porozmawiaj na czacie z agentem:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. W wierszu polecenia [user]: w terminalu wpisz:
    hello
    
    Przykładowe dane wyjściowe (Twoje mogą się nieco różnić):
    [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. Teraz powiedz pracownikowi obsługi klienta w terminalu:
    I could use some help deciding.
    
    Przykładowe dane wyjściowe (Twoje mogą się nieco różnić):
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    Zwróć uwagę na tag [travel_brainstormer]. root_agent przekazał kontrolę tylko na podstawie description podwykonawcy.
  6. terminalu w wierszu poleceń user: wpisz exit i naciśnij ENTER, aby zakończyć rozmowę.
  7. Przejdźmy teraz do konkretów. W agent.py dodaj do instruction elementu root_agent:
            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. W terminalu ponownie uruchom agenta:
    adk run parent_and_subagents
    
  9. W wierszu polecenia [user]: w terminalu wpisz:
    hello
    
  10. Odpowiedz:
    I would like to go to Japan.
    
    Przykładowe dane wyjściowe (Twoje mogą się nieco różnić):
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    Zwróć uwagę na przeniesienie do attractions_planner zgodnie z nowymi instrukcjami.
  11. Teraz odpowiedz:
    Actually I don't know what country to visit.
    
    Przykładowe dane wyjściowe (Twoje mogą się nieco różnić):
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    Zwróć uwagę, że przekierowaliśmy Cię do travel_brainstormer, czyli równorzędnej usługi attractions_planner. Jest to domyślnie dozwolone.
  12. W odpowiedzi na prośbę użytkownika wpisz exit, aby zakończyć sesję.

Podsumowanie

W tej sekcji przedstawiliśmy podstawowe informacje o hierarchii agentów i ścieżce rozmowy:

  • Rozmowa zawsze zaczyna się od root_agent.
  • Agent nadrzędny może automatycznie przekazywać połączenie do agenta podrzędnego na podstawie description.
  • Możesz wyraźnie kontrolować ten proces, przekazując rodzicowi instruction do przekazania podmiotowi pośredniczącemu za pomocą jego name.
  • Domyślnie agenci mogą przekazywać zgłoszenia do swoich peer (elementów równorzędnych w hierarchii).

8. Używanie stanu sesji do przechowywania i pobierania informacji

Każda rozmowa ADK ma Session, który zawiera słownik stanów sesji. Ten stan jest dostępny dla wszystkich agentów, dzięki czemu idealnie nadaje się do przekazywania informacji między nimi lub przechowywania danych (np. listy) w trakcie rozmowy.

Aby dowiedzieć się więcej o dodawaniu danych do stanu i ich odczytywaniu:

  1. Wróć do pliku adk_multiagent_systems/parent_and_subagents/agent.py
  2. Wklej tę definicję funkcji po nagłówku # Tools:
    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"}
    
    W tym kodzie zwróć uwagę na:
    • Funkcja otrzymuje tool_context: ToolContext. Ten obiekt to brama do sesji.
    • Wiersz tool_context.state["attractions"] = ... bezpośrednio odczytuje i zapisuje dane w słowniku stanu sesji. Resztą zajmie się ADK.
  3. Dodaj narzędzie do agenta attractions_planner, dodając parametr tools:
        tools=[save_attractions_to_state]
    
  4. Dodaj te punkty do istniejących attractions_plannerinstruction agenta:
            - 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. Uruchom interfejs internetowy pakietu Agent Development Kit, wpisując w terminalu to polecenie:
    adk web
    
    Dane wyjściowe
    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. W terminalu Cloud Shell kliknij przycisk Podgląd w przeglądarce i wybierz Zmień port, aby wyświetlić interfejs internetowy w nowej karcie.
    Menu podglądu w przeglądarce
  7. Wpisz numer portu 8000 i kliknij Zmień i wyświetl podgląd. Otworzy się nowa karta przeglądarki z interfejsem ADK Dev.
    Zmiana wyskakującego okienka portu po wpisaniu w polu tekstowym wartości 8000
  8. W menu Wybierz agenta po lewej stronie wybierz parent_and_subagents.
  9. Rozpocznij rozmowę od: hello
  10. Gdy pracownik zespołu pomocy przywita się z Tobą, odpowiedz:
    I'd like to go to Egypt.
    
    Powinno nastąpić przekierowanie do attractions_planner, gdzie zobaczysz listę atrakcji.
  11. Wybierz atrakcję, np.:
    I'll go to the Sphinx
    
  12. Powinna pojawić się odpowiedź: OK, zapisałem Sfinksa na Twojej liście...
  13. Kliknij pole narzędzia do odpowiadania (oznaczone symbolem zaznaczenia), aby wyświetlić wydarzenie utworzone na podstawie odpowiedzi narzędzia.
    Zwróć uwagę, że zawiera pole actions, które zawiera stateDelta opisujące zmiany stanu.
  14. Odpowiedz, podając inną atrakcję z listy agenta.
  15. W menu nawigacyjnym po lewej stronie kliknij „X”, aby wyjść z widoku zdarzenia, które zostało wcześniej sprawdzone.
  16. Na pasku bocznym po lewej stronie kliknij kartę Stan. W stanie sesji zobaczysz teraz tablicę attractions, która powinna zawierać oba wybrane przez Ciebie produkty.Podgląd stanu sesji w interfejsie internetowym
  17. Wyślij do agenta tę wiadomość:
    What is on my list?
    
    Agent powinien teraz odczytać stan i zwrócić listę.
  18. Gdy skończysz eksperymentować z agentem, zamknij kartę przeglądarki i naciśnij CTRL + C w terminalu Cloud Shell, aby zatrzymać serwer.

Podsumowanie sekcji

W tej sekcji dowiedzieliśmy się, jak używać stanu Session do udostępniania danych:

  • Aby zapisać stan: możesz zapisać stan w słowniku stanu z poziomu narzędzia, używając obiektu tool_context.state (np. tool_context.state["my_list"] = [...]).
  • Odczytywanie stanu: wstrzykujesz dane o stanie bezpośrednio do instruction agenta za pomocą szablonów kluczy (np. Here is your list: {my_list?}).
  • Aby sprawdzić stan: stan sesji możesz monitorować na żywo w interfejsie ADK Dev UI na karcie Stan.

9. Agenci przepływu pracy

Do tej pory omówiliśmy, jak agent nadrzędny przekazuje zgłoszenie agentowi podrzędnemu, a następnie czeka na użytkownika. Agenci przepływu pracy działają inaczej: wykonują swoje podrzędne agenty jeden po drugim w zautomatyzowanym przepływie, bez czekania na dane wejściowe od użytkownika.

Jest to idealne rozwiązanie w przypadku zautomatyzowanych zadań wieloetapowych, takich jak potok „Zaplanuj i wykonaj” lub „Przygotuj wersję roboczą i wprowadź poprawki”. Pakiet ADK udostępnia 3 wbudowane agenty przepływu pracy do zarządzania tym procesem:

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

W pozostałej części tego modułu skupimy się na tworzeniu systemu z wieloma agentami przy użyciu tych 3 agentów przepływu pracy.

Utworzysz agenta, który opracuje dokument z propozycją nowego filmu o postaci historycznej. Agenci zajmą się wyszukiwaniem informacji, iteracyjnym pisaniem i generowaniem raportów.

Ostatecznie system będzie wyglądać tak:

Diagram systemu wieloagentowego film_concept_team

Będziesz tworzyć ten system krok po kroku, zaczynając od najprostszego procesu.

10. Tworzenie systemu z wieloma agentami za pomocą klasy SequentialAgent

SequentialAgent to agent przepływu pracy, który wykonuje swoje podagenty w prostej, liniowej sekwencji. Każdy agent z jego listy sub_agents jest uruchamiany kolejno, jeden po drugim. Jest to idealne rozwiązanie w przypadku potoków, w których zadania muszą być wykonywane w określonej kolejności, np. w przypadku agenta do prezentacji pomysłów na filmy, którego teraz utworzysz.

Pierwsza wersja będzie miała taką strukturę:

Film_concept_team multi-agent system step 1

  • root_agent (greeter) powita użytkownika i zapyta go o temat filmu.
  • Następnie zostanie on przeniesiony na SequentialAgent o nazwie film_concept_team, który:
    1. Uruchom researcher agenta, aby uzyskać informacje z Wikipedii.
    2. Uruchom agenta screenwriter, aby wykorzystać te fakty do napisania fabuły.
    3. Uruchom agenta file_writer, aby zapisać ostateczny wykres w pliku.

Uruchommy go.

  1. W edytorze Cloud Shell otwórz plik adk_multiagent_systems/workflow_agents/agent.py.
     Przeczytaj ten plik definicji agenta. Agenci podrzędni muszą być zdefiniowani, zanim będzie można ich przypisać do agenta nadrzędnego. Aby odczytać plik w kolejności przepływu rozmowy, możesz odczytywać agentów od dołu do góry.
  2. Zwróć uwagę na narzędzie append_to_state. Ta funkcja pomocnicza umożliwia agentom dodawanie danych do listy w stanie sesji. W ten sposób researcherscreenwriter przekazują wyniki swojej pracy.
  3. Wypróbuj agenta. W terminalu uruchom interfejs internetowy z włączonym odświeżaniem na żywo:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk web --reload_agents
    
  4. W terminalu Cloud Shell kliknij przycisk Podgląd w przeglądarce i wybierz Zmień port, aby wyświetlić interfejs internetowy w nowej karcie.
    Menu podglądu w przeglądarce
  5. Wpisz numer portu 8000 i kliknij Zmień i wyświetl podgląd. Otworzy się nowa karta przeglądarki z interfejsem ADK Dev.
    Zmiana wyskakującego okienka portu po wpisaniu w polu tekstowym wartości 8000
  6. W menu Wybierz agenta kliknij workflow_agents.
  7. Rozpocznij rozmowę od: hello. Pracownik obsługi klienta greeter odpowie.
  8. Gdy pojawi się prośba, wpisz postać historyczną. Możesz użyć jednej z tych opcji lub własnej:
    • Zhang Zhongjing
    • Adrianna Kowalska
    • Marcus Aurelius
  9. Teraz przejmie kontrolę SequentialAgent. Nie zobaczysz żadnych komunikatów pośrednich. researcher, screenwriterfile_writer będą uruchamiane kolejno. Agent odpowie dopiero po zakończeniu całej sekwencji.
     Jeśli się nie uda, w prawym górnym rogu kliknij + Nowa sesja i spróbuj jeszcze raz.
  10. Gdy agent potwierdzi zapisanie pliku, znajdź i otwórz nowy plik .txt w katalogu movie_pitches w edytorze Cloud Shell, aby zobaczyć dane wyjściowe.
  11. W interfejsie ADK Dev UI kliknij ostatnią ikonę agenta w historii czatu, aby otworzyć widok zdarzenia.
  12. Widok zdarzeń zawiera wizualny wykres drzewa agentów. Możesz zobaczyć, jak greeter wywołał film_concept_team, który następnie wywołał kolejno każdego z podrzędnych agentów.wykres internetowy ADK
  13. Możesz kliknąć karty ŻądanieOdpowiedź w przypadku dowolnego agenta na wykresie, aby sprawdzić dokładne przekazane dane, w tym stan sesji.

Podsumowanie sekcji

W tej sekcji dowiesz się, jak używać agenta przepływu pracy:

  • SequentialAgent wykonuje swoje podrzędne agenty jeden po drugim, w kolejności, bez czekania na dane wejściowe użytkownika między poszczególnymi krokami.
  • Jest to „przepływ pracy”, ponieważ użytkownik rozmawia z root_agent, który następnie przekazuje pracę do wykonania SequentialAgent.
  • Podagenci w sekwencji korzystają ze stanu sesji (np. { PLOT_OUTLINE? }), aby uzyskać dostęp do pracy poprzednich agentów.
  • W interfejsie programisty możesz użyć wykresu zdarzeń, aby wizualizować i debugować cały przepływ pracy między agentami.

11. Dodawanie LoopAgenta do pracy iteracyjnej

LoopAgent to agent przepływu pracy, który uruchamia swoich podagentów w określonej kolejności, a następnie powtarza ten proces od początku. Ta „pętla” trwa do momentu spełnienia określonego warunku, np. osiągnięcia liczby max_iterations lub wywołania wbudowanego narzędzia exit_loop przez podrzędnego agenta.

Przydaje się w przypadku zadań, które wymagają iteracyjnego dopracowywania. Dodasz ten LoopAgent, aby utworzyć „pokój scenarzystów” dla agenta ds. prezentacji filmu. Dzięki temu researcher, screenwriter i nowy agent critic mogą pracować w pętli, ulepszając fabułę z każdym przebiegiem, dopóki critic nie uzna, że jest gotowa. Pomaga to też agentowi radzić sobie z mniej precyzyjnymi danymi wejściowymi użytkownika (np. „starożytny lekarz”) poprzez umożliwienie mu zbadania i doprecyzowania pomysłu.

Film_concept_team multi-agent system step 2

Aby wprowadzić te zmiany:

  1. W sekcji adk_multiagent_systems/workflow_agents/agent.py dodaj import dla exit_loop (w pobliżu innych importów google.adk):
    from google.adk.tools import exit_loop
    
  2. Dodaj nowego agenta critic. Agent sprawdzi fabułę. Jeśli jest dobra, dzwoni pod numer exit_loop. Jeśli nie, dodaje informację zwrotną do stanu na potrzeby następnej pętli.
    Wklej tę definicję agenta w sekcji # Agents:
    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. Utwórz writers_room LoopAgent. Będzie on zawierać 3 agenty, które będą działać w pętli.
     Wklej ten kod nad definicją agenta:film_concept_team
    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. Zaktualizuj film_concept_team SequentialAgent, aby używać nowej pętli writers_room. Zastąp researcherscreenwriter pojedynczym agentem writers_room.Zastąp istniejącą definicję film_concept_team tym kodem:
    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. Wróć na kartę interfejsu programisty ADK i w prawym górnym rogu kliknij + Nowa sesja.
  6. Rozpocznij nową rozmowę z: hello
  7. Gdy pojawi się odpowiedni komunikat, podaj pracownikowi obsługi klienta szerszy temat. Oto kilka pomysłów:
    • projektant przemysłowy, który tworzył produkty dla mas
    • kartograf (twórca map)
    • ten, który sprawił, że plony dawały więcej żywności.
    Agent będzie teraz działać w pętli. W interfejsie ADK Dev UI zobaczysz logi, gdy agenci będą uruchamiani wielokrotnie (np. „[researcher]”, „[screenwriter]”, „[critic]”, „[researcher]”, „[screenwriter]”, „[critic]...”.
  8. Po zakończeniu pętli agent zapisze plik. Sprawdź wygenerowany plik w katalogu adk_multiagent_systems/movie_pitches.
  9. Sprawdź wykres zdarzeń w interfejsie programisty, aby zobaczyć strukturę pętli.

Podsumowanie sekcji

W tej sekcji dowiesz się, jak używać tych funkcji: LoopAgent

  • LoopAgent to agent przepływu pracy, który powtarza sekwencję subagentów, tworząc „wewnętrzną pętlę” dla zadań iteracyjnych.
  • Pracownicy obsługi klienta w pętli używają stanu sesji do przekazywania pracy (np. PLOT_OUTLINE) i opinie (np. CRITICAL_FEEDBACK) w kolejnych przejazdach.
  • Pętla może zostać zatrzymana po osiągnięciu limitu max_iterations lub przez agenta, który wywoła narzędzie exit_loop.

12. Używanie narzędzia ParallelAgent do „rozsyłania i zbierania”

ParallelAgent to agent przepływu pracy, który wykonuje wszystkie swoje podrzędne agenty w tym samym czasie (równocześnie). Jest to przydatne w przypadku zadań, które można podzielić na niezależne podzadania, np. w przypadku wykonywania 2 różnych zadań badawczych.

Użyjesz ParallelAgent, aby utworzyć „zespół przedprodukcyjny”, który będzie pracować równolegle. Jeden agent będzie badać potencjał kasowy, a drugi jednocześnie będzie wymyślać pomysły na obsadę. Jest to często nazywane wzorcem „rozsyłania i zbierania”: ParallelAgent „rozsyła” pracę, a późniejszy agent (nasz file_writer) „zbiera” wyniki.

Film_concept_team multi-agent system step 3

Ostateczny przepływ pracy agenta będzie wyglądać tak:

  1. greeter (główny) rozpoczyna czat.
  2. Przesiadka na film_concept_team (SequentialAgent), która kursuje:
    • writers_room (LoopAgent) do utworzenia wykresu.
    • Nowy przycisk preproduction_team (ParallelAgent) umożliwia jednoczesne sprawdzanie wyników kasowych i obsady.
    • Kliknij file_writer, aby zebrać wszystkie wyniki i zapisać plik.

Aby wprowadzić te zmiany:

  1. W sekcji adk_multiagent_systems/workflow_agents/agent.py wklej nowy ParallelAgent i jego podmioty pośredniczące pod nagłówkiem # Agents.
    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. Zaktualizuj listę sub_agents SequentialAgent film_concept_team, dodając do niej nowy element preproduction_team (między writers_roomfile_writer).Zastąp dotychczasową definicję film_concept_team tą definicją:
    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. Zaktualizuj file_writer agenta instruction, aby „zbierał” nowe raporty ze stanu i dodawał je do pliku.
     Zastąp ciąg znaków instruction w przypadku file_writer tym ciągiem:
        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. Wróć na kartę interfejsu programisty ADK i kliknij + Nowa sesja.
  5. Wpisz hello, aby rozpocząć rozmowę.
  6. Gdy pojawi się prośba, wpisz nowy pomysł na postać. Oto kilka pomysłów:
    • aktorka, która wynalazła technologię Wi-Fi
    • ekscytujący szef kuchni,
    • kluczowych graczy na wystawach światowych,
  7. Gdy agent zakończy pracę, sprawdź plik końcowy w katalogu adk_multiagent_systems/movie_pitches. Powinien on teraz zawierać fabułę, raport o przychodach z kin i raport o obsadzie – wszystko w jednym dokumencie.

Podsumowanie sekcji

W tej sekcji dowiesz się, jak używać tych funkcji: ParallelAgent

  • ParallelAgent „Rozgałęzia się” i uruchamia wszystkie podrzędne agenty jednocześnie, a nie po kolei.
  • Jest to bardzo wydajne w przypadku zadań, które nie są od siebie zależne (np. wyszukiwanie informacji na 2 różne tematy).
  • Wyniki działania agentów równoległych są „gromadzone” przez późniejszego agenta. W tym celu równolegli agenci zapisują swoją pracę w stanie sesji (za pomocą output_key), a ostatni agent (np. file_writer) odczytuje te klucze.

13. Agenty niestandardowych przepływów pracy

Jeśli predefiniowane agenty przepływu pracy SequentialAgent, LoopAgentParallelAgent nie spełniają Twoich potrzeb, CustomAgent umożliwia wdrożenie nowej logiki przepływu pracy.

Możesz zdefiniować wzorce sterowania przepływem, warunkowego wykonywania lub zarządzania stanem między podrzędnymi agentami. Jest to przydatne w przypadku złożonych przepływów pracy, orkiestracji stanowych lub integrowania niestandardowej logiki biznesowej z warstwą orkiestracji platformy.

Tworzenie CustomAgent wykracza poza zakres tego modułu, ale warto wiedzieć, że taka funkcja istnieje, jeśli jej potrzebujesz.

14. Gratulacje!

Udało Ci się utworzyć zaawansowany system wielu agentów za pomocą pakietu Google Agent Development Kit (ADK). Przeszliśmy od prostej relacji między agentami nadrzędnym i podrzędnym do koordynowania złożonych, zautomatyzowanych przepływów pracy, które mogą wyszukiwać informacje, pisać i ulepszać projekt kreatywny.

Podsumowanie

W tym module:

  • Uporządkowani agenci w hierarchicznym drzewie z relacjami między agentami nadrzędnymi i podrzędnymi.
  • Kontrolowane przekazywanie połączeń między agentami, zarówno automatyczne (za pomocą funkcji description), jak i jawne (za pomocą funkcji instruction).
  • użyto narzędzia do zapisania danych w słowniku tool_context.state;
  • Użyto szablonu klucza (np. { PLOT_OUTLINE? }), aby odczytywać stan sesji i wskazywać agentowi, jak ma odpowiadać.
  • Wdrożono SequentialAgent, aby utworzyć prosty przepływ pracy krok po kroku (wyszukiwanie –> pisanie –> zapisywanie).
  • Użyto LoopAgent z agentem critic i narzędziem exit_loop do utworzenia iteracyjnego cyklu ulepszania.
  • Użyto ParallelAgent do „rozdzielenia” niezależnych zadań (takich jak casting i badanie wyników kasowych) w celu ich równoczesnego wykonania.

Dalsze eksperymenty

Istnieje wiele sposobów na wykorzystanie zdobytej wiedzy. Oto kilka pomysłów:

  • Dodaj więcej agentów: spróbuj dodać nowego agenta do preproduction_team ParallelAgent. Możesz na przykład utworzyć marketing_agent, który na podstawie PLOT_OUTLINE napisze slogan filmu.
  • Dodaj więcej narzędzi: dodaj więcej narzędzi do researcher agenta. Możesz utworzyć narzędzie, które korzysta z interfejsu Google Search API, aby znajdować informacje, których nie ma w Wikipedii.
  • EksplorowanieCustomAgent: w tym module znajdziesz CustomAgent dotyczące przepływów pracy, które nie pasują do standardowych szablonów. Spróbuj utworzyć taki, który np. warunkowo uruchamia agenta tylko wtedy, gdy w stanie sesji występuje określony klucz.