Создавайте многоагентные системы с помощью ADK

1. Введение

Обзор

В этой лабораторной работе вы научитесь организовывать сложные многоагентные системы с помощью Google Agent Development Kit (Google ADK) . Вы перейдёте от простых иерархий агентов к построению автоматизированных совместных рабочих процессов.

Что вы построите

Вы создадите две отдельные многоагентные системы:

  • Простой агент по планированию путешествий , который учится переводить разговоры между агентом по «мозговому штурму» и агентом по «планированию достопримечательностей».
  • Более продвинутый генератор презентаций фильмов , который использует «компанию сценаристов» из автоматизированных агентов (например, исследователя, сценариста и критика), которые работают вместе в цикле для создания полноценного сюжета фильма.

Чему вы научитесь

  • Как создать родительские и субагентские отношения.
  • Как записать данные в state сеанса из инструмента.
  • Как прочитать state , используя шаблоны ключей (например, {my_key?} ).
  • Как использовать SequentialAgent для пошаговых рабочих процессов.
  • Как использовать LoopAgent для создания итеративных циклов уточнения.
  • Как использовать ParallelAgent для одновременного выполнения независимых задач.

2. Многоагентные системы

Набор инструментов для разработки агентов (ADK) позволяет разработчикам создавать более надёжные, сложные и многошаговые модели поведения на основе генеративных моделей. Вместо одного сложного запроса ADK позволяет создать поток из нескольких более простых агентов , которые совместно работают над задачей, разделяя задачи.

Такой подход имеет ряд преимуществ по сравнению с использованием единого монолитного приглашения:

  • Упрощенная конструкция: проще спроектировать и организовать поток небольших специализированных агентов, чем разработать одну большую сложную подсказку.
  • Надежность: Специализированные агенты более надежны при выполнении своих конкретных задач, чем один большой, сложный агент.
  • Поддерживаемость: легче исправить или улучшить небольшой специализированный агент, не нарушая работу других частей системы.
  • Модульность: агенты, созданные для одного рабочего процесса, могут быть легко использованы повторно в других.

Иерархическое дерево агентов

Древовидная структура, показывающая иерархические агенты

В ADK агенты организованы в древовидную структуру . Эта иерархия играет ключевую роль в управлении ходом диалога, поскольку ограничивает возможности агентов «передавать» диалог другим агентам. Это делает поведение системы более предсказуемым и упрощает отладку. Преимущества включают:

  • Интуитивно понятный дизайн: структура вдохновлена ​​реальными командами, что упрощает осмысление.
  • Управляемый поток: иерархия обеспечивает точный контроль над делегированием задач, что облегчает отладку. Например, древовидная структура гарантирует вызов нужного агента для составления отчётов, даже если у вас есть два агента с похожими описаниями.

Вся структура начинается с root_agent . Этот агент выступает в качестве родителя и может иметь одного или нескольких подагентов , которые, в свою очередь, также могут быть родительскими для своих подагентов, образуя дерево.

3. Настройка проекта

Аккаунт Google

Если у вас еще нет личного аккаунта Google, вам необходимо создать аккаунт Google .

Используйте личный аккаунт вместо рабочего или школьного.

Войдите в Google Cloud Console.

Войдите в Google Cloud Console, используя личный аккаунт Google.

Включить биллинг

Получите кредиты Google Cloud на сумму 5 долларов США (по желанию)

Для проведения этого семинара вам понадобится платёжный счёт с определённым балансом. Если вы планируете использовать собственный платёжный счёт, пропустите этот шаг.

  1. Нажмите на эту ссылку и войдите в систему, используя личный аккаунт Google. Вы увидите что-то вроде этого: Нажмите здесь, чтобы перейти на страницу с информацией о титрах
  2. Нажмите кнопку «НАЖМИТЕ ЗДЕСЬ, ЧТОБЫ ПОЛУЧИТЬ ДОСТУП К ВАШИМ КРЕДИТАМ». Это приведет вас на страницу для настройки вашего платежного профиля. Настройка страницы профиля выставления счетов
  3. Нажмите «Подтвердить».

Теперь вы подключены к пробной учетной записи Google Cloud Platform.

Скриншот обзора выставления счетов

Настройте личный платежный аккаунт

Если вы настраиваете оплату с использованием кредитов Google Cloud, вы можете пропустить этот шаг.

Чтобы настроить персональную учетную запись для выставления счетов, перейдите сюда и включите выставление счетов в Cloud Console.

Некоторые заметки:

  • Выполнение этой лабораторной работы обойдется менее чем в 1 доллар США в виде облачных ресурсов.
  • Вы можете следовать инструкциям в конце этой лабораторной работы, чтобы удалить ресурсы и избежать дальнейших расходов.
  • Новые пользователи имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Создать проект (необязательно)

Если у вас нет текущего проекта, который вы хотели бы использовать для этого ярлыка, создайте новый проект здесь .

4. Откройте редактор Cloud Shell

  1. Нажмите эту ссылку, чтобы перейти непосредственно в редактор Cloud Shell.
  2. Если сегодня в какой-либо момент вам будет предложено авторизоваться, нажмите «Авторизовать» , чтобы продолжить. Нажмите, чтобы авторизовать Cloud Shell
  3. Если терминал не отображается внизу экрана, откройте его:
    • Нажмите «Просмотр»
    • Нажмите «Терминал» Откройте новый терминал в Cloud Shell Editor
  4. В терминале настройте свой проект с помощью этой команды:
    gcloud config set project [PROJECT_ID]
    
    • Пример:
      gcloud config set project lab-project-id-example
      
    • Если вы не можете вспомнить идентификатор своего проекта, вы можете перечислить все идентификаторы своих проектов с помощью:
      gcloud projects list
      
      Установить идентификатор проекта в терминале Cloud Shell Editor
  5. Вы должны увидеть это сообщение:
    Updated property [core/project].
    

5. Включите API

Чтобы использовать API Vertex AI и взаимодействовать с моделью Gemini, вам необходимо включить API Vertex AI в вашем проекте Google Cloud.

  1. В терминале включите API:
    gcloud services enable aiplatform.googleapis.com
    

Вот обновленные разделы, заменяющие ручное создание файлов инструкциями по клонированию репозитория GitHub и установке зависимостей.

Введение в Vertex AI SDK для Python

Для взаимодействия с моделями, размещёнными в Vertex AI, из вашего приложения Python вам понадобится Vertex AI SDK для Python. Этот SDK упрощает процесс отправки запросов, указания параметров модели и получения ответов, избавляя от необходимости напрямую обрабатывать сложные вызовы API.

Подробную документацию по Vertex AI SDK для Python можно найти здесь: Введение в Vertex AI SDK для Python | Google Cloud .

6. Настройте среду проекта

Клонировать репозиторий

  1. В терминале клонируйте репозиторий, содержащий стартовые файлы.
    git clone --depth 1 https://github.com/GoogleCloudPlatform/devrel-demos.git
    
    Флаг --depth 1 клонирует только последнюю версию, что быстрее.
  2. В терминале перейдите в нужный рабочий каталог для этой лабораторной работы.
    cd devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    

Активировать виртуальную среду

  1. В терминале создайте и активируйте виртуальную среду с помощью uv :
    uv venv
    source .venv/bin/activate
    
  2. В терминале установите google-adk и остальные зависимости из файла requirements.txt :
    uv pip install -r requirements.txt
    

Проверьте структуру вашего файла

Теперь, когда все файлы созданы, откройте папку adk_multiagent_systems в проводнике, чтобы увидеть полную структуру.

  1. В меню редактора Cloud Shell выберите Файл > Открыть папку... .
    Меню «Файл» редактора Cloud Shell с выбранным пунктом «Открыть папку»
  2. В открывшемся окне добавьте следующую информацию о папке после имени пользователя: devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems/ . Нажмите «ОК» .
    Это должно выглядеть примерно так:
    Диалоговое окно «Открыть папку» с путем к проекту
  3. Панель обозревателя слева обновится. Теперь вы видите полную структуру проекта с подкаталогами parent_and_subagents и workflow_agents , готовую к следующим шагам.
    Панель проводника с открытой папкой adk_multiagent_systems

Настройка переменных среды

  1. Вы уже находитесь в каталоге adk_multiagent_systems . В терминале создайте файл .env для хранения переменных окружения:
    cloudshell edit .env
    
  2. Вставьте следующее в файл .env , который откроется в редакторе:
    GOOGLE_GENAI_USE_VERTEXAI=TRUE
    GOOGLE_CLOUD_PROJECT="[YOUR-PROJECT-ID]"
    GOOGLE_CLOUD_LOCATION=global
    MODEL="gemini-2.5-flash"
    
  3. Замените [YOUR-PROJECT-ID] на фактический идентификатор вашего проекта Google Cloud. (например, PROJECT_ID = "google-cloud-labs" )
    Если вы не можете вспомнить идентификатор своего проекта, выполните следующую команду в терминале . Она покажет вам список всех ваших проектов и их идентификаторов.
    gcloud projects list
    
  4. В терминале скопируйте этот файл .env в каталоги подагентов, чтобы они также могли получить доступ к переменным:
    cp .env parent_and_subagents/.env
    cp .env workflow_agents/.env
    
    Структура файла теперь должна выглядеть так:
    Панель проводника с открытой папкой adk_multiagent_systems

7. Изучите трансферы между родительскими, субагентскими и одноранговыми агентами.

Диалог всегда начинается с root_agent . По умолчанию родительский агент использует description своих подагентов для принятия решения о передаче диалога. Вы также можете явно указать эти передачи в instruction родительского агента, используя name подагентов.

Давайте проверим это.

  1. В редакторе Cloud Shell откройте adk_multiagent_systems/parent_and_subagents/agent.py . Обратите внимание на три агента в файле agent.py :
    • root_agent (с именем steering ) : задаёт пользователю вопрос, чтобы решить, к какому субагенту переключиться. Изначально он полагается только на description своих субагентов.
    • travel_brainstormer : помогает пользователю провести мозговой штурм по выбору направлений.
    • attractions_planner : помогает пользователю составить список мероприятий, которые можно сделать в определенной стране.
  2. Сделайте travel_brainstormer и attractions_planner субагентами root_agent , добавив следующую строку в создание root_agent :
        sub_agents=[travel_brainstormer, attractions_planner]
    
  3. В терминале пообщайтесь со своим агентом:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk run parent_and_subagents
    
  4. В командной строке [user]: терминала введите:
    hello
    
    Пример вывода (ваш может немного отличаться):
    [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. Теперь скажите агенту в терминале :
    I could use some help deciding.
    
    Пример вывода (ваш может немного отличаться):
    [travel_brainstormer]: Okay! To give you the best recommendations, I need to understand what you're looking for in a trip.
    ...
    
    Обратите внимание на тег [travel_brainstormer] . root_agent передал управление только на основе description субагента.
  6. В user: строке терминала введите exit и нажмите ENTER, чтобы завершить разговор.
  7. Теперь давайте будем более явными. В agent.py добавьте следующее к instruction 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. В терминале снова запустите агент:
    adk run parent_and_subagents
    
  9. В командной строке [user]: терминала введите:
    hello
    
  10. Ответить:
    I would like to go to Japan.
    
    Пример вывода (ваш может немного отличаться):
    [attractions_planner]: Okay, I can help you with that! Here are some popular attractions in Japan:
    ...
    
    Обратите внимание на переход на attractions_planner в соответствии с вашими новыми инструкциями.
  11. Теперь ответьте:
    Actually I don't know what country to visit.
    
    Пример вывода (ваш может немного отличаться):
    [travel_brainstormer]: Okay! I can help you brainstorm some countries for travel...
    
    Обратите внимание, что вы перенаправлены на travel_brainstormer , одноранговый ресурс attractions_planner . Это разрешено по умолчанию.
  12. В ответ на приглашение пользователя введите exit чтобы завершить сеанс.

Резюме

В этом разделе вы изучили основы иерархии агентов и потока разговора:

  • Разговор всегда начинается с root_agent .
  • Родительский агент может автоматически переходить к субагенту на основе его description .
  • Вы можете явно контролировать этот поток, давая родительскому агенту instruction передать его субагенту по его name .
  • По умолчанию агенты могут передаваться своим peer агентам (родственным в иерархии).

8. Используйте состояние сеанса для хранения и извлечения информации.

У каждого сеанса ADK есть Session , включающий словарь состояний сеанса. Это состояние доступно всем агентам, что делает его идеальным способом передачи информации между ними или сохранения данных (например, списка) на протяжении всего сеанса.

Чтобы изучить добавление и чтение из состояния:

  1. Вернитесь к файлу adk_multiagent_systems/parent_and_subagents/agent.py
  2. Вставьте следующее определение функции после заголовка # 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"}
    
    В этом коде обратите внимание:
    • Функция получает tool_context: ToolContext . Этот объект — ваш шлюз для сеанса.
    • Строка tool_context.state["attractions"] = ... напрямую считывает и записывает данные в словарь состояний сеанса. ADK берёт на себя всё остальное.
  3. Добавьте инструмент в агент attractions_planner , добавив параметр tools :
        tools=[save_attractions_to_state]
    
  4. Добавьте следующие пункты в существующую instruction агента attractions_planner :
            - 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. Запустите веб-интерфейс Agent Development Kit с помощью следующей команды в терминале :
    adk web
    
    Выход
    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. В терминале Cloud Shell нажмите кнопку Чтобы просмотреть веб-интерфейс в новой вкладке, нажмите кнопку Веб-просмотр и выберите Изменить порт .
    Меню веб-просмотра
  7. Введите номер порта 8000 и нажмите «Изменить и просмотреть» . Откроется новая вкладка браузера с интерфейсом ADK Dev.
    Всплывающее окно изменения порта с введенным в текстовое поле значением 8000
  8. В раскрывающемся списке «Выбрать агента» слева выберите parent_and_subagents .
  9. Начните разговор с: hello
  10. После того, как агент поприветствует вас, ответьте:
    I'd like to go to Egypt.
    
    Вас перенаправят на attractions_planner и предоставят список достопримечательностей.
  11. Выберите достопримечательность, например:
    I'll go to the Sphinx
    
  12. Вы должны получить ответ вроде: Хорошо, я сохранил «Сфинкса» в ваш список...
  13. Щелкните поле инструмента ответа (отмечено галочкой), чтобы просмотреть событие, созданное на основе ответа инструмента.
    Обратите внимание, что он включает поле действий , которое включает stateDelta описывающее изменения состояния.
  14. Ответьте другим интересным предложением из списка агента.
  15. В левом навигационном меню нажмите «X», чтобы выйти из фокуса на событии, которое вы проверили ранее.
  16. На левой боковой панели нажмите вкладку «Состояние» . Теперь вы видите массив attractions в состоянии сеанса, который должен содержать оба выбранных вами элемента. Предварительный просмотр состояния сеанса в веб-интерфейсе
  17. Отправьте это сообщение агенту:
    What is on my list?
    
    Теперь агент должен прочитать ваш список и вернуть его.
  18. Завершив эксперименты с агентом, закройте вкладку веб-браузера и нажмите CTRL + C в терминале Cloud Shell, чтобы остановить сервер.

Обзор раздела

В этом разделе вы узнали, как использовать состояние Session для обмена данными:

  • Запись состояния : запись в словарь состояний выполняется из инструмента с помощью объекта tool_context.state (например, tool_context.state["my_list"] = [...] ).
  • Чтобы прочитать состояние : вы вводите данные о состоянии непосредственно в instruction агента, используя шаблонизацию ключей (например, Here is your list: {my_list?} ).
  • Чтобы проверить состояние : вы можете отслеживать состояние сеанса в реальном времени в пользовательском интерфейсе разработчика ADK, используя вкладку «Состояние».

9. Агенты рабочего процесса

До сих пор вы видели, как родительский агент передаётся подагенту и затем ждёт пользователя. Агенты рабочих процессов работают иначе: они выполняют свои подагенты один за другим в автоматическом режиме, не дожидаясь ввода данных пользователем.

Это идеально подходит для автоматизированных многоэтапных задач, таких как конвейеры «Планирование и выполнение» или «Составление черновиков и редактирование». ADK предоставляет три встроенных агента рабочих процессов для управления этими задачами:

  • SequentialAgent
  • LoopAgent
  • ParallelAgent

Остальная часть этой лабораторной работы будет посвящена созданию многоагентной системы с использованием этих трех агентов рабочего процесса.

Вы создадите агента, который разработает презентацию для нового фильма об историческом персонаже. Ваши агенты будут заниматься исследованиями, итеративным написанием текстов и составлением отчётов.

В конечном итоге ваша система будет выглядеть так:

Схема многоагентной системы film_concept_team

Вы будете создавать эту систему шаг за шагом, начиная с самого простого рабочего процесса.

10. Создайте многоагентную систему с помощью SequentialAgent

SequentialAgent — это агент рабочего процесса , который выполняет свои подагенты в простой линейной последовательности. Каждый агент из списка sub_agents запускается один за другим по порядку. Это идеально подходит для конвейеров, где задачи должны выполняться в определённом порядке, например, для агента для презентации фильма, который вы сейчас создадите.

Первая версия будет иметь следующую структуру:

Film_concept_team многоагентная система шаг 1

  • root_agent ( greeter ) поприветствует пользователя и получит тему фильма.
  • Затем он будет передан SequentialAgent с именем film_concept_team , который выполнит следующие действия:
    1. Запустите researcher агента для получения фактов из Википедии.
    2. Наймите screenwriter , который сможет использовать эти факты для написания сюжета.
    3. Запустите агент file_writer , чтобы сохранить окончательный график в файл.

Давайте запустим его.

  1. В редакторе Cloud Shell откройте adk_multiagent_systems/workflow_agents/agent.py .
    Прочитайте этот файл определения агента. Поскольку подагенты должны быть определены до назначения их родительскому агенту, чтобы читать файл в порядке ведения диалога, вы можете читать агентов снизу вверх.
  2. Обратите внимание на инструмент append_to_state . Эта вспомогательная функция позволяет агентам добавлять данные в список в состоянии сеанса, что позволяет researcher и screenwriter передавать свою работу.
  3. Попробуйте агент. В терминале запустите веб-интерфейс с включённой функцией живой перезагрузки:
    cd ~/devrel-demos/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems
    adk web --reload_agents
    
  4. В терминале Cloud Shell нажмите кнопку Чтобы просмотреть веб-интерфейс в новой вкладке, нажмите кнопку Веб-просмотр и выберите Изменить порт .
    Меню веб-просмотра
  5. Введите номер порта 8000 и нажмите «Изменить и просмотреть» . Откроется новая вкладка браузера с интерфейсом ADK Dev.
    Всплывающее окно изменения порта с введенным в текстовое поле значением 8000
  6. В раскрывающемся списке «Выберите агента» выберите workflow_agents .
  7. Начните разговор с hello . greeter агент ответит.
  8. При появлении запроса введите историческую личность. Вы можете использовать одну из предложенных или свою собственную:
    • Чжан Чжунцзин
    • Ада Лавлейс
    • Марк Аврелий
  9. Теперь управление возьмёт на себя SequentialAgent . Вы не увидите никаких промежуточных сообщений. researcher , screenwriter и file_writer будут запущены один за другим. Агент ответит только после завершения всей последовательности.
    Если попытка не удалась, нажмите кнопку + Новый сеанс в правом верхнем углу и повторите попытку.
  10. Как только агент подтвердит, что файл записан, найдите и откройте новый файл .txt в каталоге movie_pitches в редакторе Cloud Shell, чтобы увидеть вывод.
  11. В пользовательском интерфейсе ADK Dev щелкните значок последнего агента в истории чата, чтобы открыть просмотр событий .
  12. В окне событий отображается визуальный граф дерева агентов. Вы можете видеть, как greeter вызвал команду film_concept_team , которая затем вызвала каждого из своих подагентов по порядку. веб-график adk
  13. Вы можете щелкнуть вкладки «Запрос» и «Ответ» для любого агента на графике, чтобы проверить точные данные, которые были переданы, включая состояние сеанса.

Обзор раздела

В этом разделе вы узнали, как использовать агент рабочего процесса :

  • SequentialAgent выполняет свои подагенты один за другим по порядку, не дожидаясь ввода данных пользователем между шагами.
  • Это «рабочий процесс», поскольку пользователь взаимодействует с root_agent , который затем передает работу SequentialAgent для ее завершения.
  • Подагенты в последовательности используют состояние сеанса (например, { PLOT_OUTLINE? } ) для доступа к работе предыдущих агентов.
  • Вы можете использовать график событий в интерфейсе разработчика для визуализации и отладки всего рабочего процесса «агент-агент».

11. Добавьте LoopAgent для итеративной работы.

LoopAgent — это агент рабочего процесса, который последовательно запускает свои подагенты, а затем повторяет цикл, начиная с самого начала. Этот «цикл» продолжается до тех пор, пока не будет выполнено условие, например, достигнуто max_iterations или подагент не вызовет встроенный инструмент exit_loop .

Это полезно для задач, требующих итеративной доработки. Вы добавите этот LoopAgent , чтобы создать «кабинет сценаристов» для вашего агента, отвечающего за питчинг фильма. Это позволит researcher , screenwriter и новому агенту critic работать в цикле, улучшая сюжет с каждым проходом, пока critic не решит, что он готов. Это также помогает агенту обрабатывать более расплывчатые пользовательские запросы (например, «древний врач»), позволяя ему исследовать и дорабатывать идею.

Многоагентная система Film_concept_team, шаг 2

Чтобы внести эти изменения:

  1. В adk_multiagent_systems/workflow_agents/agent.py добавьте импорт для exit_loop (рядом с другими импортами google.adk ):
    from google.adk.tools import exit_loop
    
  2. Добавьте нового агента critic . Этот агент проверит график. Если всё хорошо, он вызовет exit_loop . Если нет, он добавит обратную связь к состоянию для следующего цикла.
    Вставьте следующее определение агента в раздел # 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. Создайте объект LoopAgent writers_room . Он будет содержать три агента, которые будут работать в цикле.
    Вставьте следующий код над определением агента 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. Обновите определение film_concept_team SequentialAgent , чтобы использовать новый цикл writers_room . Замените researcher и screenwriter одним агентом writers_room . Замените существующее определение film_concept_team следующим:
    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. Вернитесь на вкладку ADK Dev UI и нажмите + New Session в правом верхнем углу.
  6. Начните новый разговор с: hello
  7. Когда появится запрос, на этот раз предложите агенту более общую тему. Вот несколько идей:
    • промышленный дизайнер, создававший продукцию для масс
    • картограф (составитель карт)
    • тот парень, который заставил урожай давать больше еды
    Теперь агент будет работать в цикле. В интерфейсе разработчика ADK вы увидите журналы, отслеживающие многократное выполнение агентов (например, «[исследователь]», «[сценарист]», «[критик]», «[исследователь]», «[сценарист]», «[критик]...»).
  8. После завершения цикла агент запишет файл. Просмотрите сгенерированный файл в каталоге adk_multiagent_systems/movie_pitches .
  9. Изучите график событий в интерфейсе разработчика, чтобы увидеть структуру цикла.

Обзор раздела

В этом разделе вы узнали, как использовать LoopAgent :

  • LoopAgent — это агент рабочего процесса, который повторяет последовательность своих подагентов, создавая «внутренний цикл» для итеративных задач.
  • Агенты внутри цикла используют состояние сеанса для передачи работы (например, PLOT_OUTLINE ) и обратной связи (например, CRITICAL_FEEDBACK ) друг другу при последующих проходах.
  • Цикл может быть остановлен при достижении предела max_iterations или с помощью вызова агентом инструмента exit_loop .

12. Используйте ParallelAgent для «разветвления и сбора»

ParallelAgent — это агент рабочего процесса, который выполняет все свои подагенты одновременно (параллельно). Это полезно для задач, которые можно разделить на независимые подзадачи, например, для выполнения двух разных исследовательских задач.

Вы будете использовать ParallelAgent для создания «команды препродакшена», работающей параллельно. Один агент будет исследовать кассовый потенциал, а другой одновременно продумывать идеи кастинга. Это часто называют шаблоном «развёртывание и сбор»: ParallelAgent «развёртывает» работу, а следующий агент (наш file_writer ) «собирает» результаты.

Film_concept_team многоагентная система шаг 3

Ваш окончательный агентский поток будет следующим:

  1. greeter (root) начинает чат.
  2. Он передается в film_concept_team ( SequentialAgent ), который выполняет:
    • writers_room ( LoopAgent ) для создания сюжета.
    • Новая preproduction_team ( ParallelAgent ) будет заниматься исследованием кассовых сборов и подбором актеров одновременно .
    • file_writer собирает все результаты и сохраняет файл.

Чтобы внести эти изменения:

  1. В adk_multiagent_systems/workflow_agents/agent.py вставьте новый ParallelAgent и его подагенты под заголовком # 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. Обновите список sub_agents объекта film_concept_team SequentialAgent , включив в него новую preproduction_team (между writers_room и file_writer ). Замените существующее определение film_concept_team следующим:
    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. Обновите instruction агента file_writer , чтобы он «собирал» новые отчеты из состояния и добавлял их в файл.
    Замените строку instruction для file_writer на эту:
        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. Вернитесь на вкладку ADK Dev UI и нажмите + New Session .
  5. Введите hello , чтобы начать разговор.
  6. При появлении запроса введите идею нового персонажа. Вот несколько идей:
    • актриса, которая изобрела технологию Wi-Fi
    • захватывающий шеф-повар
    • ключевые игроки на всемирных выставках
  7. Когда агент завершит работу, проверьте итоговый файл в каталоге adk_multiagent_systems/movie_pitches . Теперь он должен содержать сюжет, отчёт о кассовых сборах и отчёт о кастинге — всё в одном документе.

Обзор раздела

В этом разделе вы узнали, как использовать ParallelAgent :

  • ParallelAgent «разветвляет» работу, запуская все свои подагенты одновременно, а не последовательно.
  • Это очень эффективно для задач, которые не зависят друг от друга (например, исследование двух разных тем).
  • Результаты работы параллельных агентов «собираются» последующим агентом. Это достигается путём сохранения работы параллельных агентов в состоянии сеанса (с помощью output_key ) и последующего чтения этих ключей конечным агентом (например, file_writer ).

13. Пользовательские агенты рабочих процессов

Если предопределенных агентов рабочего процесса SequentialAgent , LoopAgent и ParallelAgent недостаточно для ваших нужд, CustomAgent обеспечивает гибкость для реализации новой логики рабочего процесса.

Вы можете определить шаблоны для управления потоками, условного выполнения или управления состоянием между подагентами. Это полезно для сложных рабочих процессов, оркестрации с отслеживанием состояния или интеграции пользовательской бизнес-логики в уровень оркестрации фреймворка.

Создание CustomAgent выходит за рамки данной лабораторной работы, но полезно знать, что он существует, если он вам нужен!

14. Поздравляем!

Вы успешно создали сложную многоагентную систему с помощью Google Agent Development Kit (ADK) . Вы прошли путь от простых отношений родитель-дочерний агент до организации сложных автоматизированных рабочих процессов, позволяющих исследовать, писать и совершенствовать творческий проект.

Резюме

В этой лабораторной работе вы выполнили следующее:

  • Организованные агенты в иерархическом дереве с родительскими и подагентскими отношениями.
  • Управляемые передачи от агента к агенту , как автоматически (с использованием description ), так и явно (с использованием instruction ).
  • Использовал инструмент для записи данных в словарь tool_context.state .
  • Использовал ключевые шаблоны (например, { PLOT_OUTLINE? } ) для чтения состояния сеанса и управления подсказками агента.
  • Реализовал SequentialAgent для создания простого пошагового рабочего процесса (исследование -> написание -> сохранение).
  • Использовал LoopAgent с critic агентом и инструментом exit_loop для создания итеративного цикла уточнения.
  • Использовал ParallelAgent для «разветвления» независимых задач (например, подбора актеров и исследования кассовых сборов), которые выполнялись бы одновременно.

Продолжение экспериментов

Есть много способов развить полученные знания. Вот несколько идей:

  • Добавьте больше агентов: попробуйте добавить нового агента в свою команду preproduction_team ParallelAgent . Например, можно создать marketing_agent , который пишет слоган для фильма на основе PLOT_OUTLINE .
  • Добавьте больше инструментов: предоставьте вашему researcher агенту больше инструментов. Вы можете создать инструмент, использующий API поиска Google для поиска информации, которой нет в Википедии.
  • Изучите CustomAgent : в лаборатории упоминается CustomAgent для рабочих процессов, не соответствующих стандартным шаблонам. Попробуйте создать такой, который, например, будет запускать агент только при наличии определённого ключа в состоянии сеанса.