📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Parallel AI Agents vs Sequential: Which Actually Works? | Agentic Orchestra

Code with Ahsan27:04

Transcription

Давайте, давайте пойдем. Вы уже выпили свой кофе. Так что вы >> Я выпил свой кофе, так что мы в порядке. >> Отлично. >> Добро пожаловать всем обратно. >> Спасибо. Спасибо. Хорошо, давайте начнем. >> Хорошо, я собираюсь начать делиться своим экраном. Э-э, отлично. Потрясающе, все. Итак, 20 минут, и к концу этого выступления вы поймете, как мы можем объединить несколько ИИ-агентов в систему, которая, я бы сказал, более способна, чем система с одним агентом. Например, э-э, мы перейдем от нуля к своего рода полному оркестру. И я также поделюсь с вами некоторыми ссылками. Я уже вижу, что некоторые люди >> получили их, но те из вас, кто не получил, вот QR-код. Так что я хочу, чтобы вы просто достали свои телефоны >> отсканировали его. Э-э, забавный факт заключается в том, что все эти реакции, которые вы видите, на самом деле исходят из этого милого маленького расширения, которое я создал, которое сейчас работает только в локальном хосте, где, по сути, умирают все наши проекты. Но >> отсканируйте это, и это будет содержать все ссылки на все ресурсы, которые я упомяну. Отлично. Давайте двигаться дальше. Итак, быстрый вопрос. Кто здесь любит ИИ? И вы можете просто написать в чате "я" или, знаете, поднять руку. Я вижу, что поступает много реакций. Отлично. Кто-то сказал "нет", мне придется найти вас и, возможно, поговорить с вами. Кто здесь использует ИИ только для кодирования? Я бы сказал, ничего другого. Хорошо. Итак, я быстро расскажу вам, для чего я использую ИИ большую часть времени, когда я свободен. И это один из таких случаев. Но я >> не буду вас обманывать. Это не ИИ. Это >> десятилетний опыт рисования на камнях и листьях, а затем я отточил этот навык. Но я не хотел этого просто так. Я хотел, чтобы это было с ИИ. Так что я дал ему запрос. Я сказал: "Хорошо, давайте сгенерируем суперреалистичное изображение программиста, использующего этот рисунок, и мы хотим максимально сохранить странную позу". Так что вот что мы получили, и вы можете видеть >> как все идет. Я думаю, это, вероятно, то, куда мы движемся. >> Мне это не нравится. Я думаю, это болезненно, но это не было близко ко мне. Так что я сказал: "Нет, нет, нет, нет. Я хочу свой рисунок с запросом, а также с собой". И тогда вот что >> это выдало. Так что вы можете видеть, я счастлив. >> это болезненно, но я хотел вторую версию. Так что вот что я получил. И я сказал: "Какого черта здесь происходит?" И это именно то, что произойдет, когда у вас есть агент, у которого нет правильных инструментов для запросов. И у нас были хорошие выступления сегодня, чтобы понять, почему это так. Так что проблема с одним большим агентом, и я почти могу сказать, что с >> в аудитории тоже, представьте или вы пытались >> запихнуть все в массивный системный запрос, потому что это обычный инстинкт. У нас есть агент, мы пытаемся дать ему самый большой запрос, чтобы он сделал все, как и это также причина, по которой многие агенты разочаровывают на практике. И давайте поговорим о том, почему. Например, здесь я говорю, знаете ли, >> спланируйте маркетинговую кампанию для моего нового приложения, исследуйте тенденции, напишите сообщения, составьте текст, предложите визуальные эффекты и оформите краткое описание. Здесь так много всего происходит. Так что один запрос, одна модель, и это просто один выстрел. И вопрос будет: "Что может пойти не так?" И вы уже можете представить своего агента таким. И я думаю, это, вероятно, гораздо лучшая версия, чем то, что агент сможет сделать, потому что вы не можете ожидать, что агент сделает все это, потому что дело в том, что у нас возникает много проблем, и каждая из тех, о которых я сейчас говорю, это реальный производственный сбой. Так что модель переполнится контекстом. Она начнет галлюцинировать. Она забудет вещи. Более ранние инструкции, которые вы ей дали, будут забыты. Вы не сможете по-настоящему протестировать один шаг за раз, когда даете один единственный запрос. И когда он ломается, вы понятия не имеете, почему это произошло, потому что один единственный запрос делал все это. И тогда вы не сможете действительно заменить часть исследования, не переписывая все. Например, если один агент делает пять вещей одновременно, и вы хотели просто обновить >> то, что он делает, вам придется обновить весь запрос. И решение не в лучшем запросе. Вот откуда берется много сбоев. Решение то же самое, что и в программной инженерии 40 лет назад. Это разложить проблему. Нам нужно разбить ее на части. Так что, когда мы смотрим на оркестровую ментальную модель, то, что я представляю сегодня, по сути, и это не моя оригинальная идея. Это то, что уже существует в индустрии. Так что мы не хотим одного гигантского агента. Мы не хотим одного огромного запроса, и, очевидно, не надеяться на лучшее, имея все эти вещи. Мы хотим оркестр. Мы хотим специализированных агентов. Это, по сути, как когда у вас есть оркестр, скрипачи не играют на барабанах. Знаете, дирижер не играет >> играет на инструменте. Так что каждый раздел превосходен в одной конкретной вещи, и Google ADK, по сути, дает нам эти вещи, на которых мы можем строить. Так что такое Google ADK или комплект для разработки агентов? Это открытый исходный код. Это основанный на коде фреймворк для создания производственных агентов, и он действительно очень интуитивно понятен. Мне нравится тот факт, что после того, как я закончил с агентом, когда я смотрю на строки кода, это как >> так минимально. Это как 100 строк кода, и действительно очень мощно. Так что он питает собственные пространства агентов Google. Он был анонсирован где-то около 2025 года публично, и >> его действительно просто установить. Вы просто делаете pip install Google ADK, и это, по сути, все. Но, конечно, вам также придется запустить ADK web или ADK run, когда вы тестируете его, и мы посмотрим на это >> через мгновение. Теперь есть четыре строительных блока, которые я хочу быстро обсудить с вами. Все в ADK, по сути, является базовым агентом. Так что, используете ли вы >> последовательного агента, параллельного агента, циклического агента, все, по сути, находится >> в корне, это просто базовый агент. Когда вы смотрите на этот LLM-агент или который также имеет псевдоним просто агент в коде, это, по сути, то, что рассуждает. Это тот, кто общается с моделью. Так что есть разница между LLM-агентом и рабочим агентом. LLM-агенты общаются с моделью. Рабочие агенты не общаются напрямую с моделью. Они там для оркестрации. Так что вы можете иметь последовательного рабочего агента, вы можете иметь параллельного рабочего агента, вы можете иметь циклического рабочего агента, и они будут решать и оркестрировать, как агент должен работать. Так как агенты общаются друг с другом? Существует три механизма, и как только вы узнаете, как они работают или что они делают, вы сможете принять обоснованное решение о том, какой из них выбрать. Первый - это обмен состоянием сессии. Так что у нас есть возможность для агентов, когда они работают последовательно, например, передавать информацию вперед. Так что они передают вещи вперед, как у нас есть эта, я не знаю, стометровка, где люди просто >> бегут с палкой, а затем передают ее следующему человеку, а затем человек несет ее дальше, это, по сути, то, что вы могли бы сделать с палкой, тогда у вас также есть родительская большая языковая модель, которая может решить, с каким под-агентом работать, как будет происходить общение от родителя к ребенку в этом случае, а затем у нас также есть инструменты, где вы можете обернуть агента как вызываемый инструмент, и родитель вызывает его как функцию. Так что мы не будем охватывать все возможности, конечно, я здесь, чтобы просто дать вам основы, чтобы вы могли исследовать больше самостоятельно, но мы посмотрим на несколько хороших примеров. Так что, когда вы смотрите на сам код, это большой языковой агент или LLM-агент, и есть несколько важных вещей, которые вы должны увидеть, и мы подробно рассмотрим их через мгновение. Так что у нас есть имя здесь, у нас есть модель здесь, у нас есть описание, у нас есть инструкция для нее, и у нас также могут быть некоторые инструменты. Теперь это параметры, и это важные. Так что имя будет уникальным идентификатором в дереве агентов. Так что, если у вас есть куча агентов, вы будете смотреть на >> какой агент есть какой, тогда вы также используете модели. Я обычно выбираю flash latest >> потому что у меня обычно есть кредиты, так что я просто выбираю это, но, по сути, вы можете использовать разные модели здесь. Затем у вас есть инструкция. Это системный запрос. Это то, что скажет агенту, как работать, по сути, что ему нужно делать, и обычно хорошей практикой является размещение здесь информации о том, какие инструменты у него уже есть. чтобы дать ему знания, модель, которую вы ему даете, знания, хорошо, у вас есть такие инструменты, которые вы можете использовать, у вас есть такая переменная состояния, которую вы можете использовать, и вам нужно делать это, это, это, и вам нужно избегать этого, этого, этого, всего такого рода вещей, тогда у вас также есть описание, и это то, что, по сути, говорит фреймворку ADK, что делает этот агент, чтобы он знал, какого агента вызвать, когда в этом случае, тогда у вас также есть эти инструменты, и обычно это просто функции Python, или если вы используете ADK с TypeScript, это функции TypeScript, или вы используете, например, инструменты MCP, и так далее. Затем у вас также есть под-агенты. Мы рассмотрим это, но это самое важное. Я бы сказал, что этот ключ вывода здесь - это то, что передает информацию от одного агента к другому. Так что вы можете сказать, например, если у нас есть агент-исследователь, который сейчас исследует с помощью Google Search, он выведет или выдаст свое исследование следующему агенту, и следующий агент сможет увидеть, хорошо, где это значение? Мне нужно просто прочитать его и продолжить оттуда. И мы увидим пример. Как я уже упоминал, инструменты - это просто функции. Так что это инструмент, который вы можете дать большой языковой модели или агенту, и вы увидите эти термины, такие как "через интернет" в Twitter и т. д., когда мы смотрим на агента, агент - это не просто большая языковая модель или это не просто модель. Это модель плюс то, что мы сейчас начинаем называть "оборудованием", например, которое может содержать инструменты, которое может содержать хорошие запросы, доступ к среде, множество других вещей. Но когда мы говорим просто об инструментах, вы можете рассматривать их как >> если у вас есть агент, у которого модель является мозгом, то инструменты - это его руки. Так что он знает, как получить информацию и >> что с ней делать. Так что я собираюсь двигаться дальше. И ключ вывода - самый важный. И мне это нравится. Вот где большой языковой агент скажет: "Хорошо, мне нужно найти столицу Франции, например". И тогда я выведу свой ответ как этот ключ, столицу. Затем следующий агент B сможет получить его, используя эти фигурные скобки. И в его инструкции мы просим его посмотреть на эту переменную в состоянии. И поскольку этот уже выдает ее, то этот агент имеет к ней доступ. И вы можете представить себе поток агента или оркестрации, где может быть, скажем, 10 разных агентов. Все они имеют возможность читать этот конкретный ключ, что удивительно. Теперь быстро двигаясь дальше, первый в области рабочих агентов - это последовательный агент. Так что это пример, где у нас есть последовательный агент, где у нас есть писатель, который будет писать код. Затем у нас будет агент-рецензент, который будет рецензировать код, а затем у нас будет агент-рефактор, который будет читать код и рецензию и рефакторить, если потребуется. Теперь я уже запускаю ADK или я не запускаю ADK здесь, но я могу быстро запустить этот ADK web. И теперь я собираюсь перейти к комплекту для разработки агентов здесь. И здесь мы видим последовательный конвейер. И мы создаем новую сессию и говорим: "Напиши функцию, которая вычисляет простые числа", скажем. >> И когда мы делаем это, вы увидите, что у нас будут разные, разные >> Я видел комментарий "арка", кстати. Точно. Так что здесь у нас есть кодовый писатель, который написал код. Затем он выдал эту переменную состояния, которая называется сгенерированный код, верно? Так что в нашем примере писатель выдал выходной код, по сути, с этим конкретным ключом состояния. Так что здесь, если вы посмотрите на это, это называется сгенерированный код. Затем у нас есть другой агент, который является рецензентом кода, и здесь вы можете видеть, что рецензент кода прочитал код и сказал: "Серьезных проблем не найдено, хорошо". И здесь тогда рефактор вступит в дело, и он рефакторит все, что нужно сделать. Так что он рефакторил что-то, я бы сказал, вероятно, просто добавил кучу комментариев, которые я обычно удаляю, если это так. Но здесь вы можете видеть, что происходит. Вы также можете поручить ему просто оставить код и не добавлять комментарии без необходимости и т. д. Так что вы можете улучшить запрос. Так что вот как работает последовательный агент в целом. У нас есть писатель, работающий, затем у нас есть рецензент, а затем у нас есть рефактор. Последовательность не может быть изменена. Я имею в виду, когда вы запускаете ADK, вот как будет работать рабочий процесс, если вы не зайдете в код и, по сути, не измените все, не измените последовательность. Так что мы уже посмотрели, как это работает. Теперь вот как выглядит код. Так что у нас есть модель прямо здесь. Первый агент - это этот писатель. Он, по сути, имеет инструкцию: "Напиши реализацию Python для спецификации пользователя". И здесь он затем выдает ее. Затем здесь вы можете видеть, что ключ вывода - это сгенерированный код. Следующий агент, который является рецензентом кода. Он говорит: "Просмотри этот код, и вот переменная состояния". Так что вы можете видеть, что мы предоставляем это в отформатированном виде, как бы в блоке кода Python, а затем он читает сгенерированный код. Он перечисляет любые проблемы или говорит: "Серьезных проблем не найдено", что, по сути, он и сделал, а затем мы, по сути, переходим к рефакторингу, и затем он рефакторит его. Так что довольно >> базовые определения агентов прямо здесь, но это на самом деле суть дела. Здесь у нас есть последовательный агент, который мы используем. Мы называем его "кодовый конвейер", и это последовательность. Так что в массиве вы должны иметь слева направо определенную последовательность. Так что писатель идет первым, затем рецензент, затем рефактор, и вот как работает последовательный конвейер. Теперь >> я собираюсь перейти к следующему. Теперь мы смотрим на параллельного агента, и это то, что вы могли бы назвать "веером" или "собирателем". В этом случае вы будете использовать параллельного агента или под-агентов, когда они не зависят друг от друга. Например, вы можете запустить три исследовательских агента по теме. Теперь все эти три исследователя не должны зависеть друг от друга. Так что они могут начаться одновременно. Но когда они закончат, вы используете синтезатор. Так что, даже если вы сейчас видите только параллельного агента и синтезатор за ним, вы все равно можете представить, что есть последовательный агент, который сначала запускает параллельного агента, все эти три запускаются параллельно, а затем в последовательности он запускает синтезатор прямо здесь. Так что, например, если я пойду >> и посмотрю на код здесь, вы можете видеть, что у нас есть этот возобновляемый исследователь. Так что он ищет возобновляемую энергию здесь и выдает двухпредложенное резюме прямо здесь. Затем у нас есть другой >> агент, называемый EV-исследователем. Теперь здесь значения жестко запрограммированы, но, конечно, вы можете взять их как ввод от пользователя, и тогда, когда у нас есть агент один, агент два, агент три, и они закончены параллельно прямо здесь. Так что этот параллельный агент содержит все эти три исследователя: возобновляемый, EV и углеродный. Затем это синтезатор. Это автономный агент. Так что это параллельный агент. Это вы можете назвать это >> это агент номер один, который запускает три под-агента. Это агент номер два, который является синтезатором, и это последовательность в конце. Так что сначала мы запускаем исследовательскую команду. Исследовательская команда состоит из трех разных под-агентов. Все они работают вместе, а затем, когда они закончат, они идут к синтезатору, а затем он берет вывод от всех трех: возобновляемый результат, результат EV и результат углерода. Так что все три переменные состояния используются в синтезаторе. Теперь у нас есть проблема, которая является подводным камнем, который обычно возникает при работе с параллельными агентами. И дело в том, что, поскольку все они начинаются одновременно, у них у всех одинаковое состояние при запуске. Если два агента начнут писать в один и тот же ключ, один молча выиграет в этом случае. Например, у вас есть два исследовательских агента, которые поступают одновременно, и оба они имеют один и тот же ключ вывода, который может быть "результат". Тогда какой бы агент ни >> закончил последним, он перезапишет ключ. Так что у нас должны быть не одинаковые ключи в параллельных агентах, а всегда уникальные ключи. Так что "результат А", "результат Б" вместо "результат". Так что это просто мелочь, но такое случается. И давайте быстро посмотрим на параллельных агентов в этом случае. Так что, если я пойду к параллельному исследованию один, я просто пойду сюда и скажу "идти", и тогда он запустит эти три агента, которые мы только что видели. Так что давайте посмотрим, и я надеюсь, что у меня не будет никаких 42 29, которые являются >> да, проблемы с квотами с Gemini. Так что здесь у нас есть углеродный исследователь. Этот закончил первым, и вы можете видеть, что он использует инструмент Google Search прямо здесь. Затем вторым был EV-исследователь. Он закончил согласно своим результатам. И вы можете видеть, что первый результат - это углеродный результат. Второй результат - это результат EV. И третий агент, который был возобновляемым исследователем. Это результат от него. И, наконец, у нас есть синтезатор, который, по сути, синтезирует или собирает все результаты и затем выдает вывод пользователю. Так что вот насколько круто это становится, когда параллельные и последовательные агенты работают вместе. Так что, отлично. Теперь мы также можем посмотреть на пару вещей. Ой, не это. Теперь мы смотрим на циклического агента. И цикличный агент - это забавный. Он очень мощный, но у него также есть свои особенности, о которых нужно подумать. Например, если вы хотите, чтобы агент что-то делал, пока что-то не произойдет. И действительно хороший пример был бы, например, я >> с Gemini. Gemini пишет код, и я говорю: "Нет, это не выглядит хорошо. Пожалуйста, сделай это снова". И тогда он делает это снова. И тогда я говорю: "Нет, пожалуйста, сделай это снова". И тогда вы продолжаете и продолжаете делать это. Но когда это остановится? Так что это первая подводная камня. Так что вам придется, когда вы запускаете циклического агента, вы можете, по сути, поручить агенту выполнять что-то повторяющееся, пока что-то не произойдет, а затем он выйдет из этого цикла. Так что вы можете определить максимальное количество итераций. Например, скажем, если бы у меня был рецензент кода, и я прошу его рецензировать код, я могу сказать: "Рецензируй код несколько раз", и это может быть так, что он рецензирует код, агент генерирует код, а затем он продолжает делать это бесконечно. Так что я бы сначала установил максимальное количество итераций. Я бы сказал: "Сделай это максимум пять раз". Второе - это выход из цикла, который нам нужен. И обычно, как мы это делаем, мы устанавливаем эскалацию родителя в true. Что означает, что этот цикличный агент скажет своему родительскому агенту: "Хорошо, я просто >> остановись", и тогда это сделано. Так что это то, что мы обычно делаем. Так что мы посмотрим на пример здесь. Здесь вы можете видеть, что мы >> используем ту же модель Gemini flash latest. Это функция выхода из цикла. Так что мы делаем выход, который мы видели здесь, в собственной функции, и эта функция становится инструментом. Так что здесь вы можете видеть, что вы делаете здесь, мы говорим tool context.actions.calate set to true. Всякий раз, когда эта функция будет вызвана, цикл завершится. Так что, если агент находится в постоянном цикле рецензирования кода и предоставления рецензии и обратной связи агенту, а агент пишет его снова, то цикл повторяется. Если >> рецензент кода удовлетворен кодом, он вызовет эту конкретную функцию или инструмент, и тогда он выйдет отсюда. Так что здесь у нас есть пример писателя. Так что здесь вы можете видеть, что он говорит: "Улучшить документацию в состоянии". Так что, какую бы документацию мы ни предоставляли, он ее улучшит. Затем у нас есть этот конкретный критик. Теперь этот критик >> модель, которая критикует фактическую документацию, она, по сути, будет делать циклическую работу. Так что здесь вы можете видеть, что мы говорим: "Критикуй этот документ". Если он ясен и полон, вызови выход из цикла. Вы можете видеть, что это идет в инструкции. Очень важно, чтобы ваш запрос >> был очень конкретным и подробным, и вы помещаете это в инструкцию, что вам нужно вызвать выход из цикла, потому что у вас есть доступный инструмент. Так что простое наличие инструмента здесь недостаточно, так сказать. Вам также нужно инструктировать его, иначе выдайте два-три конкретных улучшения. И здесь вы можете видеть, что у нас есть целый цикличный агент прямо здесь, который запускает цикл. Так что это критик-агент. Это цикличный агент. Теперь у нас есть этот цикл доработки, который имеет максимум пять итераций на данный момент. И здесь вы можете видеть, что под-агенты - это писатель и критик. Так что он будет идти вперед в >> в первом агенте, который является писателем. Он увидит документацию. Затем он перейдет к критику, затем вернется к агенту, затем перейдет к критику, и как только функция будет вызвана, он выйдет. И мы посмотрим на это через мгновение. Теперь, прежде чем перейти к подводным камням, давайте фактически перейдем к циклу доработки. И здесь я также скажу: "Давайте сделаем это". И посмотрим, что получится. Я не помню, был ли у меня там жестко запрограммированный документ или нет. Давайте посмотрим. Хорошо. Так что здесь вы можете видеть, что архитектура контента и цифровое управление. Да, именно так. Это то, что я туда поместил. Теперь здесь у нас есть текущая документация, которую нужно пересмотреть. Теперь приходит критика. Он говорит: "Укрепить аспект цифрового управления в плане". Так что он возвращается к писателю. Так что у нас есть писатель, который был раскритикован критиком. Затем он снова перешел к писателю, и на этот раз, когда он вернулся к критику, здесь вы можете видеть, что был вызван вызов функции выхода из цикла, что означает, что этот конкретный агент, критик, не нашел много вещей для улучшения. Так что он вышел из цикла, и тогда вы можете видеть, что это >> по сути, закончилось здесь. Если я уберу выход из цикла отсюда, это будет продолжаться бесконечно, и, конечно, это обойдется вам довольно дорого. Так что мы не хотим этого. Теперь снова, мы не хотим ситуации, когда у вас проходит первый проход вашего агента или весь ваш рабочий процесс, и выходите из него на первом проходе. Он пройдет как минимум один раз. Так что я хочу сказать, что у нас будет как минимум две итерации. Так что это то, что вы хотите сделать. И вам также придется сделать эту критику необязательным параметром. Если критики нет, то первый агент должен пройти через нее, потому что у вас есть первый агент, который должен работать над критикой, второй агент должен критиковать. Если второй агент не критикует, то первый агент ничего не должен делать. Так что вам придется сделать ваши запросы именно такими. И этот вопросительный знак делает его необязательным. Это, я думаю, самый простой способ, которым я могу это выразить. Теперь, собрав все вместе, у нас есть оркестр контента прямо здесь. Так что здесь у нас есть последовательный агент, который сначала запускает три параллельных агента, затем он запускает очертатель, затем составитель, а затем переходит к циклическому агенту, который пересматривает окончательный вывод и затем выходит из цикла. Так что здесь я могу дать этому конкретному агенту любую тему, и тогда он сделает все это с ней. Так что, скажем, если я пойду к этому конкретному агенту, который является оркестром, если я скажу, скажем, MCP или важность инструментов MCP для разработчиков ИИ в 2026 году, верно? Так что это тема, которую я ему дал. Теперь он запустит эти три исследователя первыми, затем очертатель, затем составитель, а затем он войдет в цикл. Так что давайте посмотрим, как это работает. Это исследователь тенденций, который сейчас работает. И здесь мы получили тенденции, используя Google Search. Затем мы получили исследовательскую аудиторию, и здесь мы получили результат для аудитории. Затем мы получили исследовательскую конкуренцию, и здесь мы получили результат. И теперь у нас должен быть составитель и т. д. Так что очертатель и составитель. Так что здесь вы можете видеть, это очертатель. Он создал структуру статьи. Это составитель, который создал черновик самой статьи или поста, так сказать. И теперь он должен перейти в цикл, где, если потребуется критика или пересмотр, он, по сути, сделает это. Так что здесь вы можете видеть, если я прокручу немного вверх. Так что здесь мы получили черновик. Здесь был первый черновик, а затем он, по сути, не критиковал его, потому что, я думаю, он был настолько хорош, что сказал: "Хорошо, это хорошо, не нужно". Так что это как бы мощный механизм, работающий прямо сейчас. И если вы посмотрите на код этого тоже, вы увидите, что он как бы супер интересный. Если я пойду к файлу Python агента оркестра контента здесь, и если я пойду к последнему файлу, это как бы даже менее 200 строк кода, и большая часть этого - просто запрос, как это, по сути, английский, и большая часть этого - комментарии. Так что здесь вы можете видеть, что в таком небольшом количестве кода у нас есть выход из цикла. У нас есть эта суперсложная и, я бы сказал, запутанная архитектура агентов, которая дает нам требуемый вывод. И это супер круто. Так что я быстро перейду дальше, так как я также слежу за временем. Так что, когда вы захотите иметь последовательный конвейер? Когда, очевидно, у вас есть фиксированный порядок, у вас есть каждый шаг, который выдает что-то для следующего. у вас будет веер или собиратель или параллельный агент, когда у вас есть независимые задачи, которые на самом деле не >> зависят друг от друга. Хороший пример, который я обычно использую для этого, это когда мне нужно создать контент >> я сначала провожу исследование, которое является последовательной частью, но затем, если я провел исследование с помощью агента и хочу создать пост для LinkedIn, Facebook, и, скажем, для Instagram, и я >> в настоящее время подписан, я бы сказал, около 180 000 человек в социальных сетях. Так что я стараюсь создавать контент за минимальное время. Так что вот где вы будете использовать параллельного агента, потому что как только у вас есть исследование, ваш контент для LinkedIn не зависит от вашего контента для Instagram, а ваш контент для Instagram не зависит от контента для Facebook. Так что они могут быть сделаны параллельно. >> И затем, когда вам нужно провести итеративное уточнение, у вас есть цикличный агент прямо там, и затем есть множество других шаблонов. Так что, чтобы не вдаваться в слишком много деталей. Теперь некоторые распространенные ошибки, которые мы обычно совершаем, это мы забываем ключ вывода, и, как правило, мы >> мы забываем эти фигурные скобки. Так что мы не должны забывать их. Иногда мы также >> неправильно передаем функцию обратного вызова. Так что многое из этого - просто опечатки. Иногда описание агентов отсутствует или отсутствуют под-агенты. Как я уже сказал, инструкции для агентов - это то, что и как они должны делать. Описание для Google ADK, чтобы знать, какого агента копировать. Так что это ключевое отличие между этими двумя вещами. Так что вам нужно дать правильное описание для ваших моделей или ваших агентов. Так что ADK знает, кого вызвать. Наконец, у нас есть условие гонки в параллельных процессах. Так что может быть так, что у вас есть один и тот же ключ, который выдается для >> двух разных агентов, и тогда, очевидно, будет условие гонки. Если вы используете циклического агента, вы забываете либо максимальное количество итераций, либо вы, по сути, забываете о выходе из цикла в этом случае. И, наконец, у вас может возникнуть ситуация, когда вы ищете переменную, которая может существовать, а может и не существовать. Для этого, очевидно, нужно использовать вопросительные знаки. Так что в этом случае он не выходит из строя. Так что я бы сказал, что дальше вы можете посмотреть на >> вы можете посмотреть на обратные вызовы. И у меня есть плейлист на YouTube об этом, о том, как вы можете использовать обратные вызовы с Google ADK. Так что, например, перед агентом, после агента, перед моделью, после модели >> и также посмотрите на набор инструментов MCP, у нас есть действительно действительно хороший >> кодовый лабораторный курс с ADK. >> Это о использовании или создании агента для путешествий с помощью инструмента Open BNB MCP. И мне это очень нравится. Мне нравится вывод, который он дает. Так что посмотрите на инструменты MCP, как вы можете их использовать. Также посмотрите на агентский инструмент, где вы можете обернуть агента как инструмент, и бета-версия ADK 2.0 доступна. >> если вы >> как я, кто действительно нуждается в обновлении и >> просто посмотрите, что выходит, вы можете посмотреть на ADK 2. O beta, есть много вещей, таких как графовые рабочие процессы и т. д. >> но, по сути, если вы хотите создать что-то, что вы хотите развернуть в производстве, используйте подход Cloudr run или вы можете также использовать движок агентов Vertx, где у вас есть управляемые сессии, так что вы не теряете эти данные. Наконец, все ресурсы >> как я уже упоминал ранее, можно найти здесь. Так что те из вас, кто реагирует прямо перед окончанием выступления, найдут все ссылки там как ресурсы. Я был бы очень признателен, если бы вы дали обратную связь о том, как прошла сессия, потому что тогда я всегда могу ее улучшить и, очевидно, предоставить больше ценности. Но прежде чем мы закончим, я также хочу сказать вам, что >> я буду там лично, и я также раздаю несколько экземпляров одной из моих последних книг, которая называется Angular. Если вы фронтенд-разработчик, который ищет >> я бы сказал, хорошую книгу по Angular, посмотрите на эту. И мы начинаем >> розыгрыш сегодня. Так что я хочу, чтобы вы сделали, это >> когда вы перейдете по этой ссылке, вы увидите что-то вроде этого. Вы переходите к ресурсам, а затем переходите к этой штуке под названием "розыгрыш книги". Когда вы откроете ее >> вы увидите здесь быструю форму. Когда вы заполните форму, вы, по сути, присоединитесь к розыгрышу, в котором я просто выберу >> или я просто нажму кнопку в моей административной панели, и она случайным образом выберет человека. >> Так что кто бы ни >> был выбран, я свяжусь с вами. Я также сообщу организаторам. Так что я могу встретиться с вами там, и я могу дать вам, надеюсь, подписанный экземпляр >> моей последней книги с Angular. И >> кстати, каждая книга, которая у меня есть сейчас, я думаю, что у нее более 4,2 звезд на Amazon >> или выше. Так что людям очень, очень нравятся и наслаждаются ими. >> С учетом сказанного, я думаю, очень важно помнить, что агенты - это не магия. >> И это все еще, я бы сказал, очень наивно чувствовать, и многие компании делают на это ставку, что агенты настолько улучшатся, что все будет >> супер гладко. Это не так. Я бы сказал, что это просто специализированные функции, и у вас есть модель в качестве среды выполнения. Так что они будут только настолько хороши, насколько хорошее оборудование, то есть инструменты с ними, запрос с ними, как вы структурируете и проектируете эти движки. Так что используйте последовательного агента, параллельного агента и циклического агента, когда это необходимо, и вы можете комбинировать все три. С учетом сказанного, я думаю, >> я просто закончу. Так что спасибо, и >> вы можете найти мои социальные сети по ссылке обратной связи. И если у вас есть какие-либо вопросы, не стесняйтесь задавать их. >> Потрясающе. Потрясающе. Потрясающий материал. Опять же, раздел вопросов и ответов доступен. Так что, если у вас есть какие-либо вопросы к Мухаммеду, просто не стесняйтесь задавать их, и тогда он сможет ответить на них здесь. Или, как он сказал, он будет с нами >> в субботу. Так что вы также можете спросить его тогда. >> Также, также не забудьте оставить отзыв о его выступлении.