Agents Week 2026 | Семинар 3 AI Agent Workflow Multi-Agent Systems Multimodality — Transcript
Full transcript
- 1:11Всем привет. И мы продолжаем наш третий
- 1:14день. Сегодня на семинаре мы более
- 1:17подробно рассмотрим на практике темы
- 1:20агентского workкфлоу и наших
- 1:22мультиагентных систем. Мы разберём наш
- 1:25тауцикл, посмотрим, как выглядит
- 1:28реализация реактагентов, рассмотрим
- 1:31иерархическую мультиагентную систему и в
- 1:33конце добавим для неё критика. После
- 1:36этого сравним разные подходы, их плюсы,
- 1:39минусы, а, и как они будут у нас
- 1:42работать на, а, схожих примерах. С чего
- 1:45мы начнём- это с настройки окружения.
- 1:49Настраиваем мы всё аналогично прошлым
- 1:52семинаром. Устанавливаем зависимости, а,
- 1:55и проверяем, что мы можем выполнить
- 1:59запрос КЛM. Указываем
- 2:02свой ключ. И запустив этот блок, мы
- 2:06должны увидеть а результат ответа в
- 2:10формате одного слова yes. Если мы
- 2:12получили ответ от LM, всё хорошо, мы
- 2:15можем работать дальше.
- 2:17Так,
- 2:19теперь давайте
- 2:21рассмотрим наши тулы, с которыми мы
- 2:24будем работать внутри наших агентов. Они
- 2:27аналогичны тому, а что мы уже
- 2:29использовали на предыдущих занятиях, а,
- 2:33и мы немного их расширим. А по самому
- 2:36составу, а, источников данных, с
- 2:39которыми мы будем работать, у нас
- 2:40остаётся база, а, наших
- 2:44рейсов. мы будем иметь четыре э рейса, с
- 2:49которыми будут работать наши агенты.
- 2:50Дальше, э, идёт база с бронированием и
- 2:54источник данных про политики
- 2:56авиакомпании. Это определённые правила
- 3:00для кейсов, например, ребукинга, отмены
- 3:04и проезда с багажом.
- 3:07А после этого мы добавим все наши
- 3:11источники данных для работы и увидим
- 3:16полное количество того, что будет внутри
- 3:20них, чтобы проверить, что они прироли.
- 3:22Теперь давайте перейдём к самим тулам,
- 3:24которые будем использовать. У нас будет
- 3:27тул для поиска рейсов, когда мы будем
- 3:32передавать на вход наш источник
- 3:35назначения, место, откуда мы вылетаем, и
- 3:38дату.
- 3:39А дальше мы можем заполучить с помощью
- 3:42тула getails
- 3:45более расширенную информацию о нашем
- 3:48рейсе, передав на вход его номер.
- 3:51Следующий - это get booking. Он
- 3:54принимает на вход бронирования и выдаёт
- 3:59нам информацию о самом бронировани.
- 4:02Следующий аналогичный getс. Передаём на
- 4:06вход сам тип политики. А, и уже
- 4:10возвращаем конкретную информацию о ней.
- 4:13И последний, более сложный тул - это
- 4:16обновить бронирование. Тут мы на вход
- 4:19передаём наше ID бронирование, наш рейс,
- 4:22на который мы хотим сменить, и дату
- 4:25этого рейса, на который мы, а, планируем
- 4:28перенести наше бронирование.
- 4:31А дальше собираем из всех наших тулов
- 4:34один единый список и можем приступать к
- 4:39реализации наших агентов. А первый
- 4:42агент, которого мы с вами реализуем -
- 4:44это простой одиночный агент в формате
- 4:47React. Как мы помним по лекции, React
- 4:51agent чередует FD Action Observation,
- 4:54вызывает тулы и с помощью этого уже
- 4:58получает финальный, а результат а
- 5:03работы, который можно дать пользователю.
- 5:05Сначала зададим его системный промт. Как
- 5:08мы помним, стратегия React агентов по
- 5:12формату размышления задаётся именно на
- 5:15уровне промтинга. мы явно укажем нашему
- 5:17агенту, что он должен проанализировать,
- 5:20выполнить и вызвать, а, ряд тулов, а, и
- 5:25после этого обработать финальный
- 5:26результат и понять, а, можем ли мы
- 5:30ответить на запрос, пользовате ли. А
- 5:33также в промте мы, а, укажем общее, а,
- 5:37правило для работы нашего агента и
- 5:39перечислим список тулов, чтобы он
- 5:40понимал, что в каких кейсах он мог бы
- 5:43вызывать. Теперь давайте перейдём к
- 5:48самой реализации агента.
- 5:51Реализуем функцию create react agent,
- 5:54которая будет принимать на вход список
- 5:56тулов и наш системный промт. Вначале
- 6:00проверим, что не список тулов, а если он
- 6:05у нас до этого не был определён,
- 6:07определённого тулами, которые мы
- 6:09посмотрели до этого.
- 6:11и создаём системный промт в формате
- 6:14системного промкта, который у нас был
- 6:17рассмотрен ранее. Теперь давайте
- 6:20проициализируем саму LM, с которой мы
- 6:22будем работать внутри нашего агента. А
- 6:24передадим ей сюда список тулов, а и
- 6:28кроме этого зададим специальный флаг
- 6:30отключения параллельной работы, чтобы
- 6:33более детально и наглядно посмотреть наш
- 6:35фотоцикл. После этого а мы реализуем
- 6:39ноды нашего агента. Основная нода - это
- 6:43агентно. Она принимает состояние, а, и в
- 6:47рамках него уже будем делать вызов нашей
- 6:50LLM. Сначала мы, а, должны будем
- 6:53составить само, а, сообщение, с которым
- 6:55мы будем делать этот вызов. А для этого
- 6:58мы проверяем, есть ли у нас уже наш
- 7:01системный промт в рамках сообщения. Если
- 7:03нет, мы его добавляем. А, и обращаемся с
- 7:08сообщением которой мы инициализировали
- 7:10до этого. Теперь мы смотрим, есть ли у
- 7:14нас какие-либо а в ответе от LM а вызовы
- 7:20тулов. А если м мы понимаем, что они
- 7:24есть, для а отображения нашего шага фото
- 7:28мы сделаем небольшой
- 7:30мм хак для более наглядного отображения
- 7:34всего цикла. Как мы уже с вами видели и
- 7:37обсуждали, что некоторые модели с
- 7:39встроенным фнкшн коллингом, а они могут
- 7:43шаг фото пропускать. Для этого мы
- 7:46отдельно отследим вызов нашего Тула, а и
- 7:50попросим модель, а объяснить явно, а
- 7:54почему в данном случае был выбран тот
- 7:57или иной инструмент. А также это добавим
- 8:01к нашему итоговому ответу. и вернём
- 8:05результат. Следующая небольшая нода -
- 8:07это как раз sh continue. Механизм,
- 8:11который нам будет нужен в случае
- 8:13обработки тулов. Если мы видим, а что, а
- 8:19последнее сообщение был вызов в тула, то
- 8:21мы возвращаем тул. Если же мы понимаем,
- 8:24что никакой тул же не возвращался,
- 8:26значит, мы находимся на этапе, когда мы
- 8:29готовы дать финальный ответ. И мы
- 8:30возвращаем end. Теперь проициализируем
- 8:33сам граф нашего агента. Зададим граф,
- 8:37зададим ноды, которые мы определили,
- 8:40агентскую ноду передадим тулы и
- 8:44в рамках рёмбера создадим как раз
- 8:48формат, который проговаривали а при
- 8:51разборе Реактгента. Если у нас есть
- 8:53вызовлов, а то мы их вызываем. Если нет,
- 8:56то будет возвращён end, и мы завершим
- 9:00исполнение нашего агента.
- 9:03По самой корчасти Reactта
- 9:07мы реализовали всё, что нужно. Теперь мы
- 9:10можем вызвать саму а функцию create
- 9:14react agent и получить агентом, с
- 9:17которым мы уже дальше будем а работать.
- 9:21Так, теперь давайте реализуем отдельную
- 9:23функцию, которая нам позволит запустить
- 9:26нашего агента и более детально вывести
- 9:29информацию о тау цикле.
- 9:32А в неё мы передаём агент и запрос
- 9:36нашего пользователя, который хотим,
- 9:39чтобы наш агент обработал. Сам вызов
- 9:42агента мы поместим между блоком, который
- 9:45позволит нам замерить время, и на вход
- 9:50передаём крипа параметр, который нам
- 9:52пришёл на вход нашей функции. А после
- 9:55этого, по сути, сама часть с обработкой
- 9:58всего запроса закончена. Дальнейший код,
- 10:01который мы будем рассматривать - это, а,
- 10:03более детальная э визуализация того, что
- 10:07было в нашем тауцикле. Для этого мы
- 10:10пройдёмся как раз по тому, что у нас
- 10:11пришло внутри нашего месседжа. Первым
- 10:14блоком мы посмотрим, если наш месседжп
- 10:17является I message и при этом содержит
- 10:22tool calls, тогда мы понимаем, что
- 10:25начался новый цикл нашего тауцикла. И мы
- 10:30должны а из сообщения получить наш
- 10:35фотшаг. Аналогично мы можем, а, получить
- 10:39то, что у нас было в экшенах. Если же
- 10:42тип нашего сообщение - это tool message,
- 10:46а значит, мы уже, а, перешли к шагу,
- 10:50а, и можем получить на вывод конечный
- 10:54результат работы тула. Если же мы
- 10:57понимаем, что тулы не вызывались и при
- 11:00этом message type - это i message,
- 11:03значит, мы получили наш финальный ответ
- 11:06и можем уже его так и отобразить. По
- 11:10сути, всё. Дальше мы будем рассматривать
- 11:12наши кейсы а по реактнту с помощью этой
- 11:17функции runтс. Давайте рассмотрим
- 11:20сначала наиболее простой пример.
- 11:23Попросим рейсы, которые мы можем
- 11:25получить из Москвы в Париж на
- 11:28определённую дату. А посмотрим, что
- 11:31вернул э наш агент. Мы видим, что у нас
- 11:36прошёл только один степ нашего тауцикла,
- 11:40и этого а нам хватает. Мы видим явно,
- 11:45что агент рассуждает на тему того, что
- 11:48он должен сделать для решения задачи.
- 11:50Видим, что выбирается верная функция м
- 11:53для вызова тула по получению рейсов. И
- 11:57видим, что у нас был получен нужный
- 12:00список наших рейсов. На основе этих
- 12:02данных наш агент как раз идеально и
- 12:05правильно нашёл все необходимые данные.
- 12:08Тут реакт агент нас полностью устроит.
- 12:11Всё хорошо. Давайте теперь попробуем
- 12:14что-то более сложное. Например, а кейс,
- 12:17когда будем ожидать от агента несколько
- 12:20действий, но при этом не слишком его
- 12:24перенагружать и явно укажем по пунктам,
- 12:27что нам нужно сделать, э, и что мы хотим
- 12:31увидеть. А теперь мы видим, что наш
- 12:34агент уже прошёл не один, а три степа
- 12:39тау циклу. И в каждом из этих степов он
- 12:45аналогично получал нужную часть данных
- 12:48для решения финальной задачи и в конце
- 12:52финальном ответе смог нам а предоставить
- 12:55хороший финальный вариант, который нас м
- 12:58также по качеству
- 13:00а устраивает. Теперь, а-э, давайте
- 13:03посмотрим, как бы наш Реакт-тагент
- 13:06работал на ещё более сложном кейсе,
- 13:08когда, а, мы ожидаем, что он выполнит
- 13:12несколько шалов, но при этом явно не
- 13:14указываем ему какую-то
- 13:15последовательность, а только, а,
- 13:17описываем какой-либо, а, образ
- 13:19результата. Что мы видим на этом, а,
- 13:23примере? У нас уже целых четыре, а,
- 13:26степа нашего тауцикла. А, и в каждом из
- 13:30шагов агент
- 13:33верно, а подобрал тулы, верно подобрал
- 13:36параметры, а в целом верно для получения
- 13:39финального ответа, а обработал весь
- 13:43контекст. А, но в данном запросе, кроме
- 13:47самих, а, финальных данных, мы просили
- 13:49ещё и сравнить стоимость, которая у нас,
- 13:53а, будет относительно различных политик.
- 13:56Хоть наш агент
- 13:59эту информацию получил, то есть он
- 14:01видит, что разница 80% информации это у
- 14:04него была, а никакого информации о
- 14:07сравнении в финальном ответе он нам не
- 14:10предоставил. Чуть-чуть он потерялся в
- 14:12контексте и сосредоточился на том, что у
- 14:15нас
- 14:16возвращали а более поздние шаги. Что мы
- 14:19видим на а примере этого реактагента? А
- 14:23мы видим, что с какими-то более простыми
- 14:26задачами он справляется прекрасно, всё
- 14:29хорошо. А также можно обратить внимание
- 14:32на время исполнения самого агента. А это
- 14:36довольно быстро. Почему это быстро? Мы
- 14:39также ещё посмотрим на примере других
- 14:41агентов, а, которые будем рассматривать
- 14:44дальше. Тут основная мысль, которую
- 14:46стоит держать в голове, что если задача
- 14:48простая, хорошо, идём в реакт и получаем
- 14:52быстрый результат, а, с минимальными,
- 14:56мм,
- 14:57с минимальными затратами по разработке.
- 15:01Но если мы хотим более сложные задачи,
- 15:03как в последнем кейсе, это мотивирует
- 15:05нас уже переходить к нашим, а,
- 15:07мультиагентным системам. Теперь давайте
- 15:10рассмотрим нашу вторую часть в теории на
- 15:12лекции. Мы уже более детально разобрали
- 15:15различные подходы. На практике же мы, а,
- 15:18рассмотрим, а, нашу иерархическую
- 15:20систему как самую популярную и посмотрим
- 15:23также, а, принципы, а, мультикетных
- 15:26систем, а, как они ложатся у нас
- 15:29уже в коде во время самой, а, самого
- 15:33процесса разработки нашего агента. И
- 15:36прежде чем перейти к более детальному
- 15:38коду агента, давайте
- 15:40посмотрим небольшой код по тому, что нам
- 15:43будет необходимо для работы с ним.
- 15:45Создадим базовые модели, такие как,
- 15:48например, модель с подзадачи, у которой
- 15:51будет задаваться имя агента, описание э
- 15:56самой задачи, а и у задачи также мы
- 16:00будем уметь ставить приоритет.
- 16:02Следующая модель - это модель уже для
- 16:06результата работы нашего планировщика.
- 16:09У нас будет полерининг, в котором мы
- 16:12укажем в целом, что мы хотим достичь, и
- 16:15будет список наших подзадач, которые для
- 16:17этого нужно выполнить. А следующая
- 16:20моделька финальная - это а модель нашего
- 16:23агентского результата. Тут мы также
- 16:26указываем имя агента, который у нас
- 16:29данный результат выдал.
- 16:30выбираем один из статусов, а и в
- 16:35результате также добавляем, а финальный
- 16:38ответ и список тулов, который был
- 16:40использован.
- 16:42А для примера сама моделька планировщика
- 16:46выгляла бы примерно так. То есть мы
- 16:49задаём конкретно, что мы должны сделать.
- 16:52И в формате уже не текста, а конкретных
- 16:55классов, в формате списка мы будем
- 16:59получать информацию о том, какой агент
- 17:01должен сделать, какую из-подзадач и с
- 17:03каким приоритетом. Давайте рассмотрим а
- 17:07нашу реализацию уже самих агентов. И
- 17:10начнём с агента специализации нашего
- 17:15субагента, который будет выполнять наши
- 17:18подзадачи. у него при его создании мы
- 17:21укажем ему имя, передадим тулы, с
- 17:23которыми он будет работать, и создадим
- 17:26для него граф. А в рамках графа мы также
- 17:29переиспользуем функцию, которая нам
- 17:31позволяет уже создавать и работать с
- 17:34реактагентами. Теперь реализуем саму
- 17:37функцию вызова обработки нашего
- 17:40специализированного
- 17:42агента.
- 17:43А мы обращаемся
- 17:46а к нашему графу. и обращаемся к нему
- 17:50для выполнения запроса с передачей самой
- 17:53задачи, которую мы получили на вход
- 17:55функции процесса.
- 17:57А после этого мы, а, собираем тулы, с
- 18:02который у нас использовались. Опять же,
- 18:05это нам нужно для более детальной
- 18:06отладки и понимания, что у нас
- 18:08произошло. И отдельно получаем, а, наш
- 18:12финальный контент. Теперь всё, что нужно
- 18:16для передачи результата, мы уже имеем и
- 18:18отдаём модельку нашего агентского
- 18:20результата. Также важно уточнить, что
- 18:23обязательно этот блок вызов агента нужно
- 18:27рачивать trйкеch. Так как опять же могут
- 18:31часто падать как обычные сетевые ошибки,
- 18:34так и по вопросам квот, м доступов и так
- 18:38далее. А в случае ошибки мы результат
- 18:41возвращаем, но уже с другими
- 18:43параметрами. Теперь, имея модельку и
- 18:47класс нашего агентаспециалиста, создадим
- 18:50несколько шаблонных агентов, которые
- 18:53будут уметь работать со своей зоной
- 18:56ответственности. Видим, что в отличие от
- 18:58Реакт агента, мы уже не передаём полный
- 19:01список тулов. Каждый агент умеет
- 19:03работать со своим скопом задач и решать
- 19:06свои проблемы более точечно. Всех этих
- 19:08агентов для дальнейшей работы мы
- 19:10поместим вот такую небольшую мапу.
- 19:13И теперь давайте перейдём к новому
- 19:16отдельному типу агентов, которого мы
- 19:18также уже обсуждали в теории. Это агент
- 19:22координатор. Агент-координатор у нас
- 19:26будет получать нашу маппу
- 19:29агентовспециалистов, с которыми он будет
- 19:32дальше работать. Он отдельно а будет
- 19:36иметь свою лмку. Также, а, важно обратим
- 19:40внимание, что мы хотим, чтобы наш
- 19:42координатор возвращал результат своей
- 19:44работы в конкретном, чётком формате,
- 19:47который мы как раз рассматривали до
- 19:49этого в моделях. Поэтому мы используем
- 19:51наш механизм strcturech outpта на
- 19:54практике для решения этой задачки. Кроме
- 19:57того, у самого координатора, как мы
- 19:59помним, после работы всех наших
- 20:01субагентов будет этап, когда ему нужно
- 20:04подвести итоги и суммаризовать,
- 20:07обработать
- 20:09все подшаги. Для этого нам какого-то
- 20:11конкретного, а, и чёткого формата не
- 20:13нужно тут. Поэтому можем использовать
- 20:15обычно Lм без ограничения по модели.
- 20:20Теперь давайте посмотрим, а сами функции
- 20:22нашего планировщика. Во-первых, это,
- 20:25конечно, создание плана. Что мы должны
- 20:29иметь на вход, чтобы создать план? Это
- 20:31запрос пользователя. И как результат
- 20:34работы данного метода, это уже
- 20:36конкретная моделька а плана. А тут всё
- 20:40довольно просто. Мы обращаемся к
- 20:43нашей LLM, которая была создана отдельно
- 20:46для планировщика, и вызываем, передаём
- 20:49запрос нашего пользователя. При этом
- 20:53задаём наш системный промт, на основе
- 20:54которого мы уже хотим планировать и
- 20:57разбивать наши подзадачи.
- 20:59Э, следующая функция - это исполнение
- 21:02плана. Исполнение плана принимает
- 21:04модель, которую мы уже, а, получили на
- 21:07уровне планирования, а, и возвращает
- 21:11список результатов наших агентов. А тут
- 21:14также ещё заметим, что исполнение плана,
- 21:17оно к ЛМ, а по сути напрямую никак не
- 21:22обращается. Мы идём обычным циклам,
- 21:24обычным алгоритмом, который умеет
- 21:27работать с конкретной моделькой
- 21:29координации плана. Мы обращаемся к
- 21:32списку наших, а, задач, которые нам
- 21:35нужно обработать. А, и уже для каждого
- 21:39агента запрашиваем реализацию каждой из
- 21:41этих, а, подзадач. Когда каждый агент
- 21:45уже обработал задачу, мы собираем
- 21:47финальный лист, а, решений, которые
- 21:50каждый из них предоставил. И последняя
- 21:52наша функция - это, а,
- 21:57функция для, а, синхронизации
- 22:00результата, когда мы уже имеем и запрос
- 22:04пользователя, и результат всех
- 22:06подогентов, нам остаётся только, а,
- 22:09правильно его обработать. На этом этапе
- 22:11мы обращаемся к ЛМ, которая умеет
- 22:14сделать нам э вывод, то есть не та,
- 22:16которую вернёт модельку планировщика, а
- 22:18наша вторая. А и задаём системный промт,
- 22:21а плюс передаём на вход а все нужные
- 22:25данные, которые мы собрали на предыдущих
- 22:26шагах. Теперь давайте реализуем функцию,
- 22:30которая у нас позволит работать, а с
- 22:33нашим планировщиком
- 22:35и которая уже запустит полный процесс
- 22:37обработки задачи на вход. Она как раз
- 22:40принимает наш вопрос пользователя. И
- 22:42первый шаг, а, обработки нашего лагента
- 22:46- это, а, будет планирование. Мы
- 22:49вызываем функцию, а, создания плана,
- 22:52передаём запрос пользователя и на выход
- 22:55получаем то, что мы хотим сделать, и
- 22:58список подзадач. После этого мы уже идём
- 23:01на второй шаг. А тут у нас а будет
- 23:04исполнение плана. Когда уже мы исполнили
- 23:08все по части нашего плана, мы запускаем
- 23:10наш финальный шаг. Это синхронизация.
- 23:13Передаём все нужные параметры и успешно,
- 23:16а, получаем наш финальный ответ. Таким
- 23:18образом, мы реализовали нашего
- 23:20агента-координатора, который собой
- 23:23представляет нашу мультиагентную систему
- 23:25и работает в иерархическом формате.
- 23:29Теперь давайте посмотрим, как он у нас
- 23:31будет работать на практике. Давайте
- 23:34попробуем нашему агенту передать ровно
- 23:36тот же пример, на котором мы
- 23:37остановились последним в Реактагенте. А
- 23:41мы видим, что первый этап планирования
- 23:45проходит успешно. Мы, э, определяем, что
- 23:49конкретно мы хотим сделать для решения
- 23:52задачи. И кроме этого разбиваем а эту
- 23:57более комплексную задачу на пять
- 23:59небольших подтасок.
- 24:01После того, как все эти подзадачи будут
- 24:05решены, мы получим финальный ответ. И
- 24:09вот можем обратить внимание на тот
- 24:11пункт, который нас чуть-чуть смутил, а в
- 24:15нашем Реактгенте, то, что данные мы все
- 24:18нужные получили, но какого-то сравнения
- 24:21финального нет. в агенте с
- 24:25мультиагентностью мы это уже аэ смогли
- 24:28получить э-э более точный результат,
- 24:30который мы ожидали. Мы видим, что как
- 24:32раз стоимость поднимается на 80%. И нам
- 24:36данные не просто дали для финального
- 24:39предоставления результата, но и
- 24:41выполнили то, что мы изначально хотели
- 24:42от нашего агента.
- 24:45Теперь давайте ещё один небольшой пример
- 24:47посмотрим. А на этом примере мы можем
- 24:50видеть, как агент работает с задачами,
- 24:53которые не связаны, а просто две разные
- 24:57параллельные задачи, но которые также
- 24:58нужно финально вместе решить. На первом
- 25:01этапе у нас идёт аналогичное
- 25:03планирование, а и потом мы каждую из
- 25:06этих двух задач делегируем нашим
- 25:09отдельным агентам, которые являются
- 25:12специалистами в каждом из этих двух
- 25:13вопросов. После чего видим, что наша
- 25:17мультигентная система в этом кейсе также
- 25:19хорошо справляется и выдаёт результат
- 25:22как по первому, так и второму запросу. А
- 25:25что мы тут видим? Мы видим, что в
- 25:27сравнении с Реактагентом нам уже
- 25:31получилось сделать качество более точным
- 25:34и решить проблему, которая у нас
- 25:37возникала на первом этапе. Кроме того, а
- 25:41мы уже обращаем внимание на то, что сама
- 25:44разработка этого агента занимает чуть
- 25:47больше времени, а и время исполнения
- 25:51[откашливается]
- 25:51аа и решения аналогичной задачи тоже
- 25:54также а возрастает. Теперь давайте
- 25:59перейдём к нашей третьей части и
- 26:02дополним, а, прокачаем нашего агента, а,
- 26:06спланировщиком, нашу мультигентную
- 26:08систему. Добавим в ней этап критика. Как
- 26:11это будет происходить? Э, мы получим
- 26:14аналогично результат по запросу
- 26:17пользователя, но теперь не сразу выведем
- 26:19его, а передадим его на обработку ещё
- 26:22одному агенту критику. Этот агент примет
- 26:26решение, нужно ли его передавать по
- 26:28определённым критериям пользователю.
- 26:30Если да, всё хорошо, мы его передаём.
- 26:33Если нет, то мы можем, а как-либо
- 26:36обрабатывать фолбеки, которые тут могут
- 26:39возникнуть. А в нашем случае также
- 26:42рассмотрим одну из реализаций таких
- 26:44сценариев.
- 26:45И прежде чем перейти к самому флоу
- 26:48приналировщику, также давайте посмотрим,
- 26:50с какими модельками наш м
- 26:53[откашливается] а то есть критик будет
- 26:55работать. Сейчас будем реализовывать
- 26:56самого критика агента. А модель
- 26:59критикафдбек, она как раз будет
- 27:01результатом работы попроверки.
- 27:04Во-первых, мы должны передать флаг, мы
- 27:06передаём или не передаём вопрос
- 27:08пользователю, а дальше оценим наше
- 27:11качество а ответа от нуля до 10. А если
- 27:16есть какие-то проблемы, также выведим
- 27:19это в формате строк. Та кроме самих
- 27:22проблем, предложим сразу варианты
- 27:24решения, которые могут нам помочь их
- 27:26поправить. И отдельно выведем общий
- 27:29статус, что у нас произошло и какой
- 27:31результат проверки по сути видим. Теперь
- 27:34давайте посмотрим самого агента.
- 27:37Передаём ему отдельно при создании lm с
- 27:42strch output и содаём конкретную а
- 27:45модель. А после реализуем нашу функцию
- 27:49review, которая как раз будет
- 27:51запускаться для проверки а ответов. Мы
- 27:54ей на вход будем давать наш
- 27:57пользовательский запрос и с помощью него
- 28:01и дополнительных
- 28:02данных по работе агента оценивать, а как
- 28:07конкретно мы считаем на данном этапе,
- 28:10была ли задача полностью решена а или
- 28:13нет.
- 28:15А, как видим, агент критик не имеет
- 28:18какой-то сложной бизнес-логики в плане
- 28:20алгоритма. Вся
- 28:22его основная задача и качество
- 28:25заключается в том, насколько грамотно
- 28:27мы, а, подобрали на этом этапе сам промт
- 28:30проверки.
- 28:33После мы с самой реализации критика
- 28:37закончили и можем использовать его уже
- 28:40для нашего эксперимента с агентами,
- 28:44которую мы продолжим. Теперь давайте
- 28:46реализуем отдельный класс, который нам
- 28:48как раз а позволит обрабатывать задачи с
- 28:50помощью а нашего критика. Функции процес
- 28:54query vis с критиком. Мы также передадим
- 28:59информацию о том, какой запрос
- 29:02пользователя мы хотим выполнить. Теперь,
- 29:05а-э, начинаем всё аналогично нашей
- 29:08мультигентной системы, которую мы
- 29:10смотрели до этого. Это этап
- 29:12планирования, этап интерегирования
- 29:15работы наших агентов-специалистов, этап
- 29:18сбора синхронизации нашего результата.
- 29:20А, и теперь вместо того, чтобы вернуть
- 29:23наш финальный результат, мы переходим к
- 29:25четвёртому шагу, а, а именно к критику.
- 29:28мы получаем наш фидбэк
- 29:31с помощью результатов функции revw
- 29:37смотрим а на то, что нам пришло в данном
- 29:41фидбэке. Если мы понимаем, что у нас
- 29:45была отклонён наш ответ по той или иной
- 29:48причине, и при этом количество, а,
- 29:52попыток у нас ещё сохранилось, также
- 29:54важно уточнить, что если вы делаете
- 29:56критика, всегда стоит позаботиться о
- 29:58том, чтобы ограничивать количество
- 30:01циклов перепроверки, которые вы хотите э
- 30:05делать. Потому что на этом этапе также
- 30:08можно войти в бесконечный цикл и никогда
- 30:11не получить решение, которое
- 30:13будет полностью нас удовлетворять по
- 30:15качеству. Теперь что мы делаем, если мы
- 30:18готовы к этапу, когда мы можем как-то
- 30:21поработать с нашим фидбэком. Соберём, а
- 30:24наш дополнительный промт, который будет
- 30:27учитывать всю информацию, которую нам
- 30:30хорошо собирает в своём фидбэке критик.
- 30:33Мы учтём все ошибки. Мы также, а,
- 30:38предоставим для обработки наше
- 30:41предложение, а, и попробуем обработать
- 30:46наш запрос заново. После чего мы, опять
- 30:50же, в данном кейсе сделаем только одну
- 30:53попытку перепланирования, но после неё
- 30:55мы для финального результатов э выберем,
- 31:00проверим через критика повторный запрос
- 31:04ещё раз.
- 31:05Когда мы уже получили проверенный и
- 31:09финальный
- 31:10результат, мы его можем возвращать
- 31:12нашему пользователю. Теперь давайте
- 31:15проверим, а что у нас будет происходить,
- 31:19когда мы зададим более хитрый запрос для
- 31:22проверки нашего агента. Мы спросим,
- 31:25какой из ближайших рейсов подходящий нам
- 31:28а доступен для перепланирования. А, но
- 31:31не укажем явно, что нужно сверить
- 31:35политику правил перебронирования,
- 31:38которая у нас внутри себя несёт. А одино
- 31:43условие, которое отсет часть запросов, а
- 31:46именно, что можем перебронировать только
- 31:48на те рейсы, которые имеют один класс,
- 31:51то ли есть с эконома на эконом, а с
- 31:53эконома на бизнес уже у нас нет такой
- 31:55возможности перебронировать.
- 31:57А, итак, попробуем посмотреть, что у нас
- 32:00происходит в итоге. В этом кейсе опять
- 32:04же, когда разрабатывала и тестировала
- 32:08данного агента, смотрела, что хотелось
- 32:12изначально продемонстрировать,
- 32:13как у нас будет идти повторный запрос на
- 32:17нашего критика. Но столкнулась с
- 32:20довольно интересным кейсом, когда наш
- 32:22критик, а при этом зная все, а правила,
- 32:26по которым ему нужно сравнить, сам не
- 32:29нашёл ошибки и выдал результат. э такой,
- 32:32что а он считает, что всё хорошо. А при
- 32:36этом мы понимаем, что ошибка также
- 32:40оставалась. Если рассмотреть ещё прогон
- 32:42аналогичных кейсов из Таубанча, там на
- 32:45части моделей опять же критика этот кейс
- 32:48улавливает. И когда мы дальше пробуем
- 32:51вызвать аналогичный кейс у того же
- 32:53самого критика ниже, а мы увидим, что а
- 32:57на второй попытке он уже его отловит.
- 33:00Это довольно забавный практический
- 33:03пример, который у вас, скорее всего,
- 33:05тоже будет возникать в практике. А
- 33:08конкретно тут причина в том, что мы
- 33:10используем а модель GBT Nana, которая не
- 33:14даёт довольно большого количества, а, по
- 33:16приросту, ну, которая сама не сможет,
- 33:21аэ, с достаточным качеством обработать
- 33:23нашу данную задачу. А, поэтому, опять
- 33:26же, при разработке все эти нюансы стоит
- 33:28учитывать. Возможно, даже когда вы
- 33:30делаете всё теоретически правильно, на
- 33:33практике могут быть самые разные кейсы и
- 33:35может быть но множество параметров,
- 33:36которые будут влиять на финальный а
- 33:40результат. Что мы тут
- 33:42можем опять же подвести как итоги? Мы
- 33:45сейчас реализовали flow критика, а
- 33:48посмотрели, как мы можем дополнительно
- 33:50проверять наших агентов на качество.
- 33:54Также этот шаг мы понимаем, что он будет
- 33:56более долгий, но при этом в части кейсов
- 34:00он нас спасёт от более плохих ответов.
- 34:03Но, как мы посмотрели на практике, в
- 34:05части кейсов даже наличие критика нам
- 34:08может не помочь. И теперь давайте более
- 34:10подробно, а, сравним все наши подходы,
- 34:13которые мы сейчас с вами реализовали на
- 34:15части примерах, и попробуем сделать
- 34:19вывод о том, а когда и что нам может
- 34:23подойти по реализации уже наших
- 34:25собственных агентских систем. Для этого
- 34:28реализуем наши бечмарки, соберём аэ
- 34:32список вопросов, просто дадим им
- 34:34категорию для удобства, будем дальше эту
- 34:37категорию использовать. аа в визуальном
- 34:40отображении статистики, а и
- 34:41дополнительно передадим ещё список
- 34:44ожидаемых тулов. То есть по каждому это
- 34:46запросу мы знаем, по какому флоу может
- 34:48пойти агент. Конкретно у наших текущих
- 34:51агентов флоу простой. Идут какой-то
- 34:53вариации, где он может использовать тот
- 34:55или иной тул. Нет. Поэтому мы можем явно
- 34:58задать ожидаемые тулы, которые нам
- 35:01говорят о том, что агент действительно
- 35:02пошёл по верному пути и как минимум
- 35:05запросил все необходимые для решения ему
- 35:08данные и не сгаллюционировал где-нибудь
- 35:09по пути.
- 35:11А теперь после того, как а сможем
- 35:15собрать все наши дополнительные данные,
- 35:17можем реализовать прогон наших агентов
- 35:21по а самим бачмаркам. мы прогоним, как,
- 35:27ну да, мы, во-первых, реализуем
- 35:30универсальную небольшую функцию, которая
- 35:32прогоняет наших агентов по тесткейсам,
- 35:35которые мы рассмотрели и в итоге может
- 35:40дать нам финальные результаты по
- 35:43бачмаркам, по прогону кейса. И
- 35:47данную функцию заиспользуем уже а для
- 35:51вызова на каждом из трёх подходов. А
- 35:54какие мы рассмотрели и реализовали
- 35:57ранее. То есть наш реакт, одиночный
- 36:01агент, дальше наша иерархическая
- 36:04мультиагентная система Нобискритика. И
- 36:08последний вариант мы уже проверим вместе
- 36:11с критиком. Итак, тут
- 36:14следующий шаг. Мы прогоняем самих наших
- 36:17агентов и подводим некую статистику. на
- 36:21самом скрипте статистики детально
- 36:24останавливаться не будем. Мы по сути
- 36:27просто обрабатываем все результаты,
- 36:30которые прогонов и выводим их в
- 36:33структурированном формате. Тут давайте
- 36:35более детально лучше посмотрим на сам
- 36:38итог прогона и какие инсайды мы можем
- 36:41вынести. Что мы видим? Какое-то среднее
- 36:43время выполнения каждого из агентов.
- 36:46видим, что наш одиночный гент гораздо
- 36:49быстрее работает, чем наша мультигентная
- 36:52система. Он использует
- 36:54меньше тулов в части кейсов. А опять же,
- 36:58это скорее для нас тревожный звоночек,
- 37:00потому что мы понимаем, что где-то он не
- 37:02дозапросил нужных данных, значит, он
- 37:05точно не мог получить нашего финального
- 37:07точно правильного ответа. И аналогично
- 37:09по скоро мы видим вот такую статистику,
- 37:11что средняя оценка для нашего
- 37:13реактагента 6, для мультигендной системы
- 37:17без критика 9,3, что тоже достаточно
- 37:20неплохо. И с критиком мы уже видим
- 37:23десяточку. Теперь давайте посмотрим, что
- 37:25у нас было более детально по каждому из
- 37:27типов проверок. А что мы видим на
- 37:30простых проверках? Тут каждый агент
- 37:33получил отличный скор равный десяти.
- 37:37Время, как мы видим, всё равно всегда
- 37:39отличается. То есть для простых задач в
- 37:42данном кейсе для нас наиболее приятным
- 37:44выглядит наш обычный реактогент.
- 37:49Но когда мы переходим уже к более
- 37:51сложным задачам, мультидоменным, когда
- 37:53нам нужно работать, а, с несколькими
- 37:55подзадачами внутри одного запроса, а тут
- 37:58мы видим другую картину. Критик сразу
- 38:01нашёл ошибки
- 38:04в ответе нашего обычного реактагента.
- 38:09И за счёт этого его скор получился
- 38:12вообще два балла. Мультиагентная
- 38:15система, как с критиком отгс справилась
- 38:19хорошо, всё нашли и полностью
- 38:21удовлетворяли условиям критика. Также
- 38:24видим, что когда у нас нет перепродано,
- 38:26время мультигенной системы с критиком,
- 38:28ну, плюс-минус равно обычной
- 38:30мультиагентной системе.
- 38:33А что дальше? Следующий кейс, самый
- 38:36интересный - это тот самый случай, когда
- 38:39мы м э рассматривали э более сложный
- 38:44вопрос с подвохом на а реализации нашего
- 38:49агента Критика. А что мы видим у нас? А
- 38:53простой Реактагент, тоже интересный
- 38:55момент, что он правильно распознал, а,
- 38:59саму суть задачи, вывел финальный
- 39:02результат, но, как мы видели, он
- 39:04всё-таки потерялся в других контекстах и
- 39:06не вывел, а полное летальное описание
- 39:09всего, что мы от него ожидали. А
- 39:12мультиагентная же система тут запуталась
- 39:14и не учла тот кейс, что на бизнес мы
- 39:17перепророваться не можем. А, и что мы
- 39:19видим? Критик это отловил на уже
- 39:23проверки банчмарок и снизал ей скор. При
- 39:26этом сама мультиагентная система с
- 39:28критиком в этот раз отработала на
- 39:33десяточку. И видим, что а у нас был как
- 39:36раз повторный первый прогон. То есть наш
- 39:38критик отловил ошибку. Мы прогнали флоу
- 39:41во второй раз. Вот как раз в плюс-минус
- 39:43в два раза отличается а время, но а мы
- 39:47получили полностью удовлетворяющий нас
- 39:49по качеству результат. Он и правильный,
- 39:51он и подробный, э, всё, э, в целом нас
- 39:56устраивает. Если акцентировать внимание
- 39:59на семи различиях -э этих проголов, то
- 40:02мы видим, что для нашего простого кейса,
- 40:07а, по результатам качества, а, всё
- 40:10аналогично для всех трёх агентов. Для
- 40:13уже задачки с более сложным сценарием,
- 40:17мы видим, что простой агент посыпался по
- 40:19качеству. К сожалению, вот если мы такие
- 40:22сценарии для себя считаем целевыми, тут
- 40:25он нам уже будет не подходить. При этом
- 40:28критик на этом этапе нам скорее, ну, не
- 40:31обязателен. Это избычно, и нас устроит
- 40:34обычная мультаагентная система. Но на
- 40:36самых сложных, более хитрых сценариев мы
- 40:40можем видеть всю силу и полезность
- 40:43нашего критика. только он смог финально
- 40:46решить задачку, э, чтобы учесть все наши
- 40:50критерии.
- 40:52Если подводить наши результаты, то, а,
- 40:56мы можем сделать следующие выводы. Для
- 41:01каждой задачи стоит подбирать
- 41:03инструмент, который а будет для вас
- 41:07наиболее актуален. А во время семинара
- 41:11мы более детально рассмотрели такие
- 41:13подходы, как реактагент, мультиагентная
- 41:16система иерархическая и мультиагентная
- 41:19система иерархическая с критиком. А если
- 41:25вы понимаете, что ваша задача
- 41:26максимально сложная
- 41:28и хочется
- 41:31отличное качество, то критикам стоит не
- 41:35пренебрегать. Если для нас качество не
- 41:38так критично, но при этом мм задачи
- 41:43более сложные, нам важно их качественно
- 41:45решать, то тут можно смотреть в сторону
- 41:47а обычных мультиагентных систем. Но при
- 41:50этом, если наши задачи а максимально
- 41:53простые, то
- 41:55можно остановиться на Реактагенте. Он
- 41:58классно и что важнее всего, быстрее
- 42:01всего и дешевле всего это сделает. И на
- 42:05этом мы с вами завершаем наш сегодняшний
- 42:08день. Всем большое спасибо. Всем пока.
About this transcript
This page contains the full transcript of Agents Week 2026 | Семинар 3 AI Agent Workflow Multi-Agent Systems Multimodality by Яндекс Образование , generated from the public captions YouTube serves with the video. The transcript has 4,743 words across 825 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.
What you can do with it
Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.
Free YouTube transcript tool
YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.