Учимся делать мультиагентную систему за 1 вечер
Продолжаем погружаться в мир AI агентов 😎
Это продолжение курса по созданию агентов. Серия 1.3. (нумерацию упростил). Создаем мультиагентную систему на ADK.
Теория.
Мультиагентная система — это система состоящая из нескольких агентов, и имеющая следующие характеристики:
- Агенты в системе автономны. Каждый из них в своей зоне ответсвенности может принимать независимые решения.
- Агенты коммуницируют с помощью текста, символов, данных и тд., чтобы координировать свои усилия.
- Система имеет правила взаимодействия агентов, чтобы избегать конфликтов.
Я также рекомендую почитать пост про лучшие практики по созданию мультиагентной системы от Anthropic.
И также рекомендую освежить (или прочитать если пропустили) пост про то, как делать нельзя, чтобы не слить деньги на ветер при создании мультиагентной системы.
Есть три основных архитектуры мультиагентной системы:
- Централизованная — есть агент-координатор, который разбивает запрос юзера на подзадачи и отдает другим агентам-исполнителям
- Децентрализованная — агенты действуют независимо и общаются между собой. В таком случае необходимо четко определять правила взаимодействия, чтобы все это не вылилось в хаос
- Гибридная — смесь первых двух в разных пропорциях и формах. Например, несколько агентов-координаторов между собой взаимодействуют децентрализованно. Но у каждого есть своя "команда", которую они координируют
Теперь прыгаем в код.
Практика.
По аналогии с ноутбуком из прошлой серии — копируем себе новый Kaggle ноутбук. И галочку напротив GOOGLE_API_KEY в Secretes нужно снова включить.
Секция 1 ноутбука просто сетапит его по аналогии с первой серией.
В секции 2 начинается мякотка. Сначала мы сделаем централизованную систему из двух агентов: рисерчера (он будет гуглить в интернете) и суммаризатора.
- Создаем агента рисерчера. Процесс идентичен тому, как мы создавали агента в предыдущей серии. Но есть нюанс. Теперь мы прописываем "output_key". Этот ключ поможет нам дальше найти результаты работы этого агента другим агентам в рамках сессии взаимодействия
- Дальше создается агент суммаризатор. Точно также, только с другой инструкцией
- Далее нам нужен агент-координатор, чтобы управлять двумя этими красавцами. Создаем опять агента. Но в инструкции мы прописываем ему пошаговый процесс с вызовом других агентов: вызови рисерчера, дальше вызови суммаризатора, верни саммари от него юзеру". И в тулы этого агента мы ставим других агентов вот таким образом: tools=[AgentTool(research_agent), AgentTool(summarizer_agent)]. Обратите внимание, что координатор через такое указание тулов получит доступ к имени и описанию, которые мы написали для каждого агента в пунктах 1 и 2. Поэтому от качества нейминга и описания напрямую зависит, как хорошо координатор будет их вызывать. Не пожалейте времени, чтобы качественно тут все описать.
- Запускаем любой запрос — получаем ответ от нашего координатора
Ура, вы только что сделали простейшую мультиагентную систему!
Дальше уже для самостоятельного изучения прокликайте ноутбук до конца.
Секция 3 расскажет о Sequential Workflow — иногда вы не хотите полагаться на ризонинг агента-координатора. Вам нужно просто последовательно вызвать ряд субагентов (это называется Pipeline). В ADK это решается через SequentialAgent
Секция 4 расскажет про Parallel Workflows — когда агентам нет смысла делать работу последовательно, вы можете запускать их работать одновременно, а в конце суммаризовать их результаты. Для этого в ADK есть ParallelAgent
Секция 5 расскажет про Loop Workflows — используется, когда нужно добиться вполне конкретного результата. И до его достижения останавливать работу агентов вы не хотите. Здесь будет двухуровневая обертка через LoopAgent, который сам упакован в SequentialAgent. Хороший брейнтизер!
That's all guys! Stay tuned — в следующий разберем детальнее тулы и MCP (уж сколько раз он вам точно уши мозолил!)
Подписывайтесь на Telegram Заместители. Там будем дальше разбирать процесс создания AI агентов и систем на базе