Создавайте многоагентные системы с помощью 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 Cloud.

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

Включить выставление счетов

Обменяйте 5 долларов США на кредиты Google Cloud (по желанию)

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

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

Теперь вы подключены к пробному платёжному аккаунту Google Cloud Platform.

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

Создайте личный платежный аккаунт.

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

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

Несколько замечаний:

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

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

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

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

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

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

Для взаимодействия с моделями, размещенными на Vertex AI, из вашего приложения на Python вам понадобится SDK Vertex AI для 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 devrel-demos-multiagent-lab
    
    Флаг --depth 1 клонирует только последнюю версию, что работает быстрее.
  2. В терминале переместите папку, относящуюся к данной лабораторной работе, в свой домашний каталог и переименуйте её в соответствии с ожидаемой структурой папки.
    mv devrel-demos-multiagent-lab/ai-ml/build-multiagent-systems-with-adk/adk_multiagent_systems ~
    
  3. В терминале перейдите в правильную рабочую директорию для этой лабораторной работы ( adk_multiagent_systems ).
    cd ~/adk_multiagent_systems
    

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

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

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

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

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

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

  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 ~/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.
    Всплывающее окно смены порта, в текстовое поле которого введен порт 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

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

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

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

Диаграмма многоагентной системы команды, занимающейся разработкой концепции фильма.

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

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

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

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

Система многоагентного взаимодействия команды разработчиков концепции фильма, шаг 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 ~/adk_multiagent_systems
    adk web --reload_agents
    
  4. В терминале Cloud Shell нажмите кнопку «Предварительный просмотр веб-интерфейса» и выберите «Изменить порт». Чтобы открыть веб-интерфейс в новой вкладке, нажмите кнопку « Предварительный просмотр веб-интерфейса» и выберите «Изменить порт» .
    Меню предварительного просмотра веб-страниц
  5. Введите номер порта 8000 и нажмите «Изменить и просмотреть» . Откроется новая вкладка браузера с пользовательским интерфейсом разработчика ADK.
    Всплывающее окно смены порта, в текстовое поле которого введен порт 8000.
  6. В раскрывающемся списке «Выберите агента» выберите workflow_agents .
  7. Начните разговор со слов: hello . Сотрудник greeter , ответит.
  8. При появлении запроса введите имя исторической личности. Вы можете использовать одно из перечисленных имен или свое собственное:
    • Чжан Чжунцзин
    • Ада Лавлейс
    • Марк Аврелий
  9. Теперь управление перейдет SequentialAgent . Вы не увидите никаких промежуточных сообщений. researcher , screenwriter и file_writer будут выполняться один за другим. Агент ответит только после завершения всей последовательности.
    Если это не удастся, вы можете нажать кнопку «+ Новая сессия» в правом верхнем углу и попробовать снова.
  10. После того как агент подтвердит запись файла, найдите и откройте новый файл .txt в каталоге movie_pitches в редакторе Cloud Shell, чтобы увидеть результат.
  11. В пользовательском интерфейсе разработчика ADK щелкните по значку последнего агента в истории чата, чтобы открыть представление событий .
  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 не решит, что он готов. Это также помогает агенту обрабатывать более расплывчатые пользовательские запросы (например, «древний врач»), позволяя ему исследовать и дорабатывать идею.

Система многоагентного взаимодействия команды разработчиков концепции фильма, шаг 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. Создайте объект writers_room LoopAgent . Он будет содержать трех агентов, которые будут работать в цикле.
    Вставьте следующий код над определением агента 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. Обновите SequentialAgent film_concept_team , чтобы использовать новый цикл 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 и нажмите кнопку «+ Новая сессия» в правом верхнем углу.
  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 ) «собирает» результаты.

Команда разработчиков концепции фильма, многоагентная система, шаг 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 и нажмите + Новая сессия .
  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 для рабочих процессов, которые не соответствуют стандартным шаблонам. Попробуйте создать, например, такой рабочий процесс, который запускает агент только при наличии определенного ключа в состоянии сессии.