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

1. Wprowadzenie

Przegląd

W tym module nauczysz się aranżować złożone systemy wieloagentowe za pomocą pakietu 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 wieloagentowe:

  • 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 wykorzystuje „pokój scenarzystów” złożony z automatycznych agentów (takich jak badacz, scenarzysta i krytyk), którzy współpracują w pętli, aby stworzyć pełny film.

Czego się nauczysz

  • Jak tworzyć relacje między agentem nadrzędnym 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ć ikony SequentialAgent w przypadku szczegółowych przepływów pracy.
  • Jak używać LoopAgent do tworzenia cykli iteracyjnego udoskonalania.
  • Jak używać ParallelAgent do równoczesnego uruchamiania niezależnych działań.

Wymagania wstępne

  • Znajomość Pythona i interfejsów wiersza poleceń.
  • Dostęp do projektu Google Cloud z włączonymi płatnościami.
  • Zainstalowane narzędzia CLI: gcloud, uv.

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życiem jednego, monolitycznego prompta:

  • Prostsza konstrukcja: łatwiej jest zaprojektować i zorganizować przepływ małych, wyspecjalizowanych agentów niż opracować 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 stworzeni do jednego przepływu pracy mogą być łatwo wykorzystywani w innych.

Hierarchiczne drzewo agentów

Struktura drzewa przedstawiająca agentów w hierarchii

W ADK agenci są uporządkowani w strukturze drzewa. Ta hierarchia ma kluczowe znaczenie dla kontrolowania przebiegu rozmowy, ponieważ ogranicza, który agent może „przekazać” rozmowę innemu agentowi. 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 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 dwóch agentów o podobnych opisach.

Cała struktura zaczyna się od root_agent. Ten agent działa jako nadrzędny i może mieć co najmniej 1 podrzędnego agenta, który z kolei może być nadrzędny w stosunku do własnych podrzędnych agentów, tworząc drzewo.

3. Konfigurowanie projektu

Konto Google

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

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

Logowanie się w konsoli Google Cloud

Zaloguj się w konsoli Google Cloud, korzystając z osobistego konta Google.

Włącz płatności

Wykorzystaj środki w Google Cloud (opcjonalnie)

Aby przeprowadzić te warsztaty, musisz mieć konto rozliczeniowe z pewną kwotą środków. Aby rozpocząć, użyj środków z banera u góry tego przewodnika. Jeśli masz już połączenie z kontem rozliczeniowym, możesz pominąć ten krok.

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 konsoli Google Cloud.

Uwagi:

Tworzenie projektu (opcjonalnie)

Jeśli nie masz bieżącego projektu, którego chcesz użyć w tym laboratorium, 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ć wszystkie identyfikatory 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 Gemini Enterprise Agent Platform API i wchodzić w interakcje z modelem Gemini, musisz włączyć interfejs API w projekcie Google Cloud.

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

Wprowadzenie do pakietu Google GenAI SDK dla Pythona

Aby wchodzić w interakcje z modelami hostowanymi na platformie Gemini Enterprise Agent z poziomu aplikacji w Pythonie, użyjesz pakietu Google GenAI 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 Google GenAI SDK dla Pythona znajdziesz tutaj: Dokumentacja pakietu Google GenAI SDK.

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 devrel-demos-multiagent-lab
    
    Flaga --depth 1 klonuje tylko najnowszą wersję, co jest szybsze.
  2. W terminalu przenieś folder modułu do katalogu głównego i zmień jego nazwę, aby pasowała do oczekiwanej struktury modułu.
    mv devrel-demos-multiagent-lab/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems ~
    
  3. W terminalu przejdź do odpowiedniego katalogu roboczego na potrzeby tego laboratorium (adk_multiagent_systems).
    cd ~/adk_multiagent_systems
    

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: adk_multiagent_systems/. Kliknij OK.
    Powinna 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_subagents i workflow_agents, gotowa do dalszych działań.
    Panel eksploratora z otwartym folderem adk_multiagent_systems

Aktywowanie środowiska wirtualnego

  1. W terminalu utwórz i aktywuj środowisko wirtualne za pomocą polecenia uv. Dzięki temu zależności projektu nie będą powodować konfliktów z systemowym Pythonem ani innymi projektami.
    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
    

Konfigurowanie zmiennych środowiskowych

  1. Jesteś już w katalogu adk_multiagent_systems. W terminalu utwórz plik .env, w którym będą przechowywane zmienne środowiskowe:
    cloudshell edit .env
    
  2. Wklej w otwartym w edytorze pliku .env ten tekst:
    GOOGLE_GENAI_USE_ENTERPRISE=true
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-3.5-flash"
    
  3. Zastąp [YOUR-PROJECT-ID] rzeczywistym identyfikatorem 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 wyglądać tak:
    Panel eksploratora z otwartym folderem adk_multiagent_systems

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

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

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 subagenta przekazać rozmowę. Początkowo opiera się ona tylko na description podagentów.
    • travel_brainstormer: pomaga użytkownikowi w przeprowadzaniu burzy mózgów na temat miejsc docelowych.
    • attractions_planner: pomaga użytkownikowi w tworzeniu listy atrakcji w danym kraju.
  2. Ustaw travel_brainstormer i attractions_planner jako podagenty agenta root_agent, dodając ten wiersz do tworzenia agenta root_agent:
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. W terminalu porozmawiaj na czacie z agentem:
    cd ~/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 agentowi 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ło kontrolę tylko na podstawie description podwykonawcy.
  6. W terminalu w wierszu poleceń user: wpisz exit i naciśnij ENTER, aby zakończyć rozmowę.
  7. Teraz przejdźmy do konkretów. W agent.py dodaj te elementy do instruction w 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...
    
    Zauważ, że przekierowaliśmy Cię do travel_brainstormer, czyli równorzędnego partnera 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 poznaliśmy podstawy hierarchii agentów i przebiegu rozmowy:

  • Rozmowa zawsze zaczyna się od root_agent.
  • Agent nadrzędny może automatycznie przekierowywać połączenia do agenta podrzędnego na podstawie description.
  • Możesz wyraźnie kontrolować ten proces, przyznając rodzicowi instruction możliwość przekazania sprawy do podrzędnego agenta za pomocą name.
  • Domyślnie agenty mogą przekazywać zgłoszenia do swoich peer agentów (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 stanu sesji. Ten stan jest dostępny dla wszystkich agentów, dzięki czemu idealnie nadaje się do przekazywania informacji między nimi lub utrzymywania danych (np. listy) przez całą rozmowę.

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 wartość 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ącego 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 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 Aby wyświetlić interfejs internetowy w nowej karcie, kliknij przycisk Podgląd w przeglądarce i wybierz Zmień port.
    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 z wpisaną 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 obsługi klienta się z Tobą przywita, 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ź podobna do tej: OK, zapisałem Sfinksa na Twojej liście…
  13. Kliknij pole narzędzia do odpowiedzi (oznaczone symbolem zaznaczenia), aby wyświetlić zdarzenie 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:

  • Zapisywanie stanu: możesz zapisywać dane 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 stanu 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 na karcie Stan.

9. Agenty przepływu pracy

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

Jest to idealne rozwiązanie w przypadku zautomatyzowanych, wieloetapowych zadań, 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 dalszej części tego laboratorium skupimy się na tworzeniu systemu wieloagentowego przy użyciu tych 3 agentów przepływu pracy.

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

Ostatecznie Twój system będzie wyglądać tak:

Diagram systemu wieloagentowego film_concept_team

Będziesz budować ten system krok po kroku, zaczynając od najprostszego przepływu pracy.

10. Tworzenie systemu wieloagentowego za pomocą klasy SequentialAgent

SequentialAgent to agent przepływu pracy, który wykonuje swoje podrzędne agenty w prostej, liniowej sekwencji. Każdy agent na liście sub_agents jest uruchamiany po kolei. 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 od 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 o temat filmu.
  • Następnie połączenie zostanie przekazane do SequentialAgent o nazwie film_concept_team, które:
    1. Uruchom agenta researcher, 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.

Zacznijmy.

  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, co jest sposobem, w jaki funkcje researcher i screenwriter przekazują wyniki swojej pracy.
  3. Wypróbuj agenta. W terminalu uruchom interfejs internetowy z włączonym odświeżaniem na żywo:
    cd ~/adk_multiagent_systems
    adk web --reload_agents
    
  4. W terminalu Cloud Shell kliknij Aby wyświetlić interfejs internetowy w nowej karcie, kliknij przycisk Podgląd w przeglądarce i wybierz Zmień port.
    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 z wpisaną w polu tekstowym wartością 8000
  6. W menu Wybierz agenta kliknij workflow_agents.
  7. Rozpocznij rozmowę od: hello. Odpowie greeter.
  8. Gdy pojawi się prośba, wpisz imię i nazwisko postaci historycznej. Możesz użyć jednej z tych opcji lub własnej:
    • Zhang Zhongjing
    • Adrianna Kowalska
    • Marek Aureliusz
  9. Teraz SequentialAgent przejmie kontrolę. Nie zobaczysz żadnych wiadomości pośrednich. researcher, screenwriter i file_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 wydarzenia.
  12. Widok zdarzeń przedstawia wizualny wykres drzewa agentów. Możesz zobaczyć, jak greeter wywołał film_concept_team, który następnie wywołał po kolei każdego ze swoich podagentów.wykres internetowy ADK
  13. Możesz kliknąć karty Żądanie i Odpowiedź przy dowolnym agencie na wykresie, aby sprawdzić dokładne przekazane dane, w tym stan sesji.

Podsumowanie sekcji

W tej sekcji dowiesz się, jak korzystać z 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 „proces”, ponieważ użytkownik rozmawia z root_agent, który następnie przekazuje pracę do wykonania SequentialAgent.
  • Podagenci w sekwencji używają 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 warunku, np. osiągnięcia liczby max_iterations lub wywołania wbudowanego narzędzia exit_loop przez subagenta.

Przydaje się w przypadku zadań, które wymagają iteracyjnego dopracowywania. Dodasz ten znak LoopAgent, aby utworzyć „pokój scenarzystów” dla agenta, który będzie promować Twój pomysł na film. 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”), ponieważ może on przeprowadzać badania i ulepszać pomysły.

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, wywołuje funkcję 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ą pracować 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 researcher i screenwriter 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 deweloperskiego ADK i w prawym górnym rogu kliknij + Nowa sesja.
  6. Rozpocznij nową rozmowę z: hello
  7. Gdy pojawi się odpowiedni komunikat, podaj agentowi 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 wykonywać działania w pętli. W interfejsie ADK Dev UI zobaczysz dzienniki, 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 deweloperskim, aby zobaczyć strukturę pętli.

Podsumowanie sekcji

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

  • LoopAgent to agent przepływu pracy, który powtarza sekwencję subagentów, tworząc „wewnętrzną pętlę” dla zadań iteracyjnych.
  • Agenci w pętli używają stanu sesji, aby przekazywać sobie pracę (np. PLOT_OUTLINE) i opinie (np. CRITICAL_FEEDBACK) w kolejnych przebiegach.
  • Pętla może zostać zatrzymana po osiągnięciu max_iterations limitu 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 agenta będzie wyglądać tak:

  1. greeter (root) rozpoczyna czat.
  2. Przekierowuje do film_concept_team (SequentialAgent), która działa:
    • writers_room (LoopAgent) do utworzenia wykresu.
    • Nowa funkcja preproduction_team (ParallelAgent) umożliwia wyszukiwanie informacji o wynikach kasowych i obsadzie w tym samym czasie.
    • 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 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 w film_concept_team SequentialAgent, aby uwzględnić nowy element preproduction_team (między writers_room a file_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 pliku 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. Aby rozpocząć rozmowę, wpisz hello.
  6. Gdy pojawi się prośba, wpisz nowy pomysł na postać. Oto kilka pomysłów:
    • aktorka, która wynalazła technologię Wi-Fi.
    • ciekawy 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 w jednym dokumencie.

Podsumowanie sekcji

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

  • ParallelAgent„Rozgałęzia się” i uruchamia wszystkie podrzędne agenty w tym samym czasie, 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 równoległych agentów są „gromadzone” przez późniejszego agenta. Odbywa się to przez zapisywanie przez agentów równoległych wyników pracy w stanie sesji (za pomocą output_key) i odczytywanie tych kluczy przez agenta końcowego (np. file_writer).

13. Agenty niestandardowych przepływów pracy

Jeśli predefiniowani agenci roboczy SequentialAgent, LoopAgent i ParallelAgent 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 wieloagentowy za pomocą pakietu Google Agent Development Kit (ADK). Przeszliśmy od prostej relacji agenta nadrzędnego i podrzędnego do koordynowania złożonych, zautomatyzowanych przepływów pracy, które mogą wyszukiwać informacje, pisać i ulepszać projekty kreatywne.

Podsumowanie

W tym module:

  • Uporządkowane agenty w hierarchicznym drzewie z relacjami między agentem nadrzędnym a podrzędnym.
  • 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 szablonów kluczy (np. { PLOT_OUTLINE? }) do odczytywania stanu sesji i kierowania promptem agenta.
  • Wdrożono SequentialAgent, aby utworzyć prosty przepływ pracy krok po kroku (badanie –> pisanie –> zapisywanie).
  • Użyto LoopAgent z critic agentem i exit_loop narzędziem 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 eksperymentowanie

Możesz rozwijać swoją wiedzę na wiele sposobów. 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 agenta researcher. 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.