ym104432846
Вставьте ссылку на видео из Youtube, Rutube, VK видео
Задайте вопрос по видео
Что вас интересует?
00:00:16
Мастер-класс по созданию агентов:
  • 1. В Сбербанке проведут мастер-класс по созданию реальной нейросетевой системы, решающей задачи и работающей с данными
  • 2. Участники мастер-класса смогут самостоятельно разработать рабочий проект нейросети после мероприятия
  • 3. Созданный проект участники смогут продемонстрировать друзьям либо включить в своё профессиональное портфолио
00:01:03
Использование GigaChat API и библиотеки Ланч:
  • 1. Команда Giga Chain разрабатывает библиотеки для интеграции API GigaChat, позволяющие разработчикам внедрять GigaChat в собственные приложения
  • 2. В рамках мастер-класса планируется демонстрация процесса создания простых агентов с использованием QR-кода для получения доступного программного кода
  • 3. Современные языковые модели (LLM), используемые в приложениях, обладают ограничениями знаний, однако благодаря специальным инструментам способны влиять на внешние события и запускать программный код
00:03:19
Создание простого агента на Python:
  • 1. Создадут простого агента на Python на основе GigaChat с первыми встроенными инструментами
  • 2. Разработают чистый агент, после чего унифицируют его стандартом Эмсипи-модал, контекст, протокол
  • 3. Установят библиотеки Ланкен и Ланграф для работы с LLM и создания агентов, будут использовать библиотеку Ланч для интеграции GigaChat в экосистему Ланч
00:05:07
Работа с GigaChat API и настройка ключа доступа:
  • Создан проект для работы с сервисами разработчика от Сбера, включая использование GigaChat API
  • 2. Разработан механизм получения ключа доступа к GigaChat API и сохранения его в защищенном месте (Google Collaborator)
  • 3. Написан минимальный рабочий код для обращения к GigaChat и получения ответа от большой языковой модели
00:15:34
Реализация инструментов для агента:
  • Разработана структура программного обеспечения, объединяющая большую языковую модель и внешние инструменты (функции), работающие с погодой и качеством воздуха
  • Реализованы два инструмента: один для определения погоды, другой для получения показателей качества воздуха, использующие координаты городов
  • Создан прототип агента, способного обрабатывать запросы пользователей, вызывая соответствующие инструменты и формируя ответы на основе полученных данных
00:33:08
Протокол Model Context Protocol (MCP):
  • 1. Разработан и принят стандарт протокола «model-контекст», созданный компанией Антропия
  • 2. Стандарт поддерживается значительным количеством агентов и инструментов
  • 3. Внедрение стандарта включает выведение отдельных процессов из программного кода и возможность использования нескольких источников инструментов
00:34:09
Организация работы клиента и сервера в MCP:
  • 1. Разработан механизм работы с серверами и инструментами через отдельные сущности «эмсипи», где возможно использование как готового приложения, так и самописного кода
  • 2. Рассмотрены два варианта реализации взаимодействия клиента и сервера: локальное взаимодействие (клиент и сервер на одной машине) и удалённое взаимодействие (на разных компьютерах)
  • 3. Обсуждены транспортные протоколы для обмена сообщениями между клиентом и сервером: стандартная библиотека Python (stdlib) и стриминговый протокол ASTIPI
00:37:13
Установка и использование библиотек для работы с MCP:
  • 1. Для реализации проекта понадобятся две дополнительные библиотеки: lancher emsi adapter и библиотека uv (менеджер пакетов)
  • 2. Разработчики будут использовать Python и менеджер пакетов pip, либо юви (npm), в зависимости от типа используемых менеджеров пакетов
  • 3. Исходный код эмсипи-сервера планируется сохранить в отдельный файл с помощью команды `write file`, а служебные логи сервера выделить в отдельный поток для исключения засорения стандартного канала вывода
00:41:16
Создание и интеграция эмсипи-сервера и клиента:
  • Необходимо создать клиент-агент на основе простого реакта, обернув его в оболочку Emscripten (эмсипи)
  • Требуется реализовать дополнительный лайфхак с помещением ключа авторизации для GigaChat в переменную окружения
  • Планируется использовать заранее подготовленные Emscripten-серверы (эти сервера уже созданы ранее)
00:46:08
Запуск и тестирование эмсипи-агента:
  • Разработана и протестирована система взаимодействия агента с внешними инструментами (получение времени, погоды и качества воздуха)
  • Создан универсальный агент «Гига Эйджент», использующий готовые UI и субагенты, позволяющий распределять задачи между разными агентами
  • Представлены рекомендации по дальнейшему изучению темы разработки агентов, включая использование открытых курсов и документации Ланчена
0: Теория это круто, но давайте не будем останавливаться, только на ней. Самое время попробовать сделать что-то своими руками. Готовы? Сергей Трощенков, главный инженер гигае?
1: В Сбере проведёт мастер класс степ бай степ. Как создать своего 1 эйай, агента не абстрактного, а реального, который будет что-то делать, решать задачи, взаимодействовать с данными. Это тот самый момент.
2: Момент, когда вы переходите от, я что-то читал про нейросети к я создал свою 1 систему. Берите ноутбуки, Сергей покажет все пошагово. После этого мастер класса у вас будет работающий проект.
3: Который можно будет показать своим друзьям или положить в портфолио.
4: Всем привет, наша команда гига чейн занимается разработкой библиотек для подключения GigaChat апи, с её помощью разработчики могут создавать свои приложения, встраивая в них.
5: GigaChat в том числе могут создавать и агентов, и поэтому хочется показать мастер класс по созданию простых агентов вот на экране вам доступен QR-код, через него вы можете получить весь.
6: Листинг того программного кода, который будет сегодня использоваться и в интерактивном режиме, вместе со мной пройтись в рамках этого мастер класса по шагам. Почему же мы будем с вами обсуждать тему и агент
7: Многие эксперты сходятся на том, что мы вообще находимся в начале эпохи ii агентов. Уже большое количество пользователей активно использует ллм, то есть большие языковые модели в.
8: Своей повседневной жизни для личных целей, для работы. Но при этом большинство не подозревает, что под капотом у современных приложений на основе ллм уже не просто чис.
9: М. А. Часто и агенты чистая ллм может галлюцинировать. У неё есть ограничения по тем знаниям, которыми она обладает, а за счёт специального структурированного ответа, который
10: Современные модели могут выдавать. Существует возможность этот ответ использовать для включения различных инструментов, то есть на самом деле программного кода и вот за счёт использования
11: Этих инструментов, которые до обогащают большие языковые модели на входе и позволяют им даже воздействовать на какие-то внешние обстоятельства. Например, взять и поставить встречу в ваш календарь.
12: Или ещё что-нибудь такое сделать, запустить, выполнить какой-то программный код мы и имеем дело с ii агентами, то есть переход от просто больших языковых моделей к ii агентам, и на самом деле мы с вами сегодня.
13: Тоже попробуем создать простого и агента на основе GigaChat на основе пайтона, и он будет обладать несколькими инструментами сперва.
14: Мы сделаем его в чистом виде, а потом попробуем унифицировать с помощью специального стандарта. Он называется эмсипи модал, контекст, протокол для того, чтобы в дальнейшем те наработки, которые у нас сегодня появятся, можно было переис.
15: Использовать в других проектах. Но давайте перейдём к практике. Для этого нам потребуется установить несколько библиотек. Я начинаю запускать ячейки с кодом. Нам потребуется библиотека ланкен это
16: 1 из топовых вместе с другой библиотекой Ланграф фреймворков для работы с ллм. Приложениями и создания и агентов, и мы также с вами используем библиотеку ланчей.
17: GigaChat это как раз разработка нашей команды, которая позволяет в экосистему ланчей на ландграфа встроить наш GigaChat, ну и также у нас здесь будет библиотека для визуализации.
18: Rich просто для того, чтобы на экране все более выразительно выглядело дальше, нам предстоит ещё кое-какие манипуляции совершить, а именно мы сходим по внешней ссылочке.
19: На такой ресурс девелоперс Сбер ру это ресурс для разработчиков. Личный кабинет. 1 раз. Чтобы туда попасть, необходимо пройти авторизацию. Нужно указать свой номер телефона.
20: Вы попадаете в своё, в итоге личное пространство, где можно подключать различные сервисы для разработчиков от Сбера. В частности, здесь есть GigaChat апи, вот он нам и понадобится для того, чтобы мы могли от
21: Запросы к большой языковой модели. У меня этот проект уже создан у вас. Если вы 1 раз здесь оказались, его изначально нет. Вот можно после того, как создали этот проект, зайти.
22: Внутрь. И что нас здесь будет интересовать? Здесь много разной информации о доступных вам токенах. Расход использования большой языковой модели оценивается в токенах физиче.
23: Лицам доступен бесплатный пакет в 1000000 токенов, большую часть из которого составляют младшая модель лайт, но есть также и возможность попользоваться некоторым количеством токенов.
24: От модели Макс и про, но нас сейчас больше всего будет интересовать вот этот раздел с настройками. Мы перейдём в настройки api, и здесь нужно будет получить ключ доступа. Вот.
25: Сейчас я нажму получить новый ключ, поскольку у меня уже есть, но я его перевыпущу и буду использовать новый ключ. Нажимаю получить. Мне вылезает предупреждение о том, что в итоге старый ключ потеряется.
26: И, соответственно, я скопирую и попробую перейти снова в наш блокнот, где находится наш код. Давайте мы вот этот скопированный ключ, по сути, строчку из символа.
27: Достаточно длинную мы сохраним в специальном разделе нашего google collaboratori, нашего сервиса среды, разработки сохраним для того, чтобы тот код, который
28: У нас здесь есть, чтобы им все могли пользоваться. А ключи все-таки остались исключительно у меня. Вы можете поступить точно также и после этого своим кодом тоже обмениваться. У меня правда, здесь уже есть такая
29: Запись с ключом предыдущим. Но поскольку я выпустил новый, я могу текущий ключ уже удалить и вместо этого создать новый. Так давайте я тот ключ, который у меня хранится, помещу.
30: И нужно сделать название. Ну вот давайте у меня в ячейке кода уже название прописано, я просто его скопирую и вставлю сюда, чтобы все точно работало. Вот таким образом, ключ хранится в безопасном месте.
31: Нигде не светится в коде, хотя будет он светиться у нас в коде, но это так и задумано, и можно запускать код. Дальше. Дальше. Собственно, идёт у нас ячейка кода для того, чтобы вот этот ключ авторизации
32: Передать в качестве переменной в нашу программу. Давайте я запущу соответствующую ячейку. Он 1 раз спросит разрешение использовать этот ключ. Вот мы видим, что засветилась соответствующая
33: Галочка, значит, все у нас работает, в принципе, больше нам эти ключи не понадобятся, поэтому раздел этот закроем, чтобы он нам не мешал. И, соответственно, мы 1 раз можем обратиться программным образом к
34: GigaChat. Для этого нам понадобится уже упомянутая мной библиотека ланчен, GigaChat, из неё мы возьмём класс GigaChat и создадим объект этого класса для того, чтобы в дальнейшем
35: К нему обращаться. Это будет такой своего рода клиент для того, чтобы наш программный код взаимодействовал с api гига чата. Ну и тут некоторые другие моменты в коде есть, вот как я говорил.
36: Средство для красивой визуализации. И на самом деле вот здесь у нас будет происходить 1 запрос к большой языковой модели. Мы попросим простыми словами объяснить, что такое искусственный интеллект и в сыром ви.
37: Виде, выведем непосредственно получающийся ответ. Вот я запущу код, он несколько секунд подумает, постарается на самом деле достаточно подробно написать, что же такое искусственный интеллект в его понимании. Ну поскольку мы никакого
38: Другого контекста не дали. Он может по своему усмотрению выбрать то или иное определение, и вот мы получили ответ. Ответы от GigaChat прокидываем её через
39: Интерфейс Ланграф или ланчей, а выглядит вот примерно так. Здесь есть, собственно, ответ от большой языковой модели, он в виде текстового сообщения в поле конте.
40: И есть некоторые метаданные. Это, например, информация о потраченных токенах. И также информация о том, по какой причине завершилась генерация. Вот здесь мы видим, что генерация завершилась по причине стоп. Это значит, что моделька
41: Закончила свой ответ, считает, что все закончилось логично, и поставила специальный токен, который как раз-таки отвечает за прерывание дальнейшего дальнейшей генерации. Соответственно, вот можно нас поздравить. Мы впервые обра,
42: Обратились к api гига чата, мы написали код, который обращается к GigaChat, и передаёт ему некоторую информацию и получает информацию в ответ. Что будем делать со всем этим дальше.
43: Это очень простой код у нас получился, и он представляет из себя отдельные запросы. Дело в том, что, наверное, взаимодействуя с большими языковыми моделями, мы привыкли через веб интерфейс.
44: Вести какие-то длительные диалоги с большой языковой моделью. А вот в таком формате, как я сейчас показал, мы будем получать ответ только исходя из 1 единственного сообщения вот той текстовой
45: Строчки, которые мы отправили в данном случае про искусственный интеллект. Если мы хотим построить какую-то диалоговую систему, нам нужно передавать каждый раз весь контекст. Дело в том, что каждый раз, когда вы отправляете очеред,
46: Запрос в диалоге к языковой модели происходит следующее. Отправляется весь диалог, то есть все предыдущие ваши запросы. Если это вот в рамках 1 диалога происходит предыдущие запросы.
47: Также на самом деле может присутствовать какая-то системная информация, системное сообщение, но про это мы тоже сейчас скажем. Соответственно, в рамках лангена у нас есть несколько типов сообщений, которые мы будем
48: Использовать. Вот они здесь представлены в импорте мы будем использовать human месседж эйай, месседж, хьюман, месседж. Это будут наши запросы. Эйай, месседж будут обозначаться, и мы видели уже в одиночном запросе. Это обозначаются.
49: Ответ языковой модели. Ну и системное сообщение нам потребуется. Если мы захотим задать роль нашему ии захотим как-то его предварительно проинструктировать, будем использовать
50: Системное сообщение в остальном, что нам потребуется, мы будем держать переменную в виде такого списка, в который мы будем помещать отдельные сообщения. И этот список у нас будет удлиняться. И каждый раз
51: Мы будем его отправлять в языковую модель. Ну, давайте посмотрим, как это выглядит в программном коде. Здесь вот у меня для этого реализован простенький бесконечный цикл, который прервётся, только если мы определённого рода сообщение. Пустое сообщение.
52: Туда отправим и давайте попробуем что-нибудь написать нашей большой языковой модели. Пока что это ещё не агент. Давайте мы ей напишем привет. Меня зовут Сергей.
53: Отправим.
54: И у нас уже будет здесь некий диалог. То есть нам модель отвечает. Мы можем спросить, как меня зовут.
55: И она будет знать правильный ответ, но при этом это по прежнему просто болталка в плане того, что если мы попросим указать какую-то актуальную информацию про окружающую действительность, она нам ничего не подскажет. Ну да.
56: Давайте в этом убедимся, спросим, какая сейчас погода.
57: И вот мы видим, что GigaChat нам отвечает, что у него нет данных о текущей погоде, соответственно, ничего на эту тему он нам ответить не может, чтобы он получил возможность отвечать на подобного рода вопросы, мы должны превратить его.
58: В настоящего агента. Ну, это будет у нас на следующем шаге. Если что, я здесь также оставил несколько примеров разных системных сообщений. Вы можете самостоятельно поэкспериментировать с этими системными сообщениями и
59: Смотреть, как в зависимости от вот этих инструкций будет меняться поведение ллм. Для того, чтобы мы перешли к агенту, нам нужно создать собственно инструменты, которыми будет пользоваться
60: Этот агент прокинуть ему в контекст информацию о том, как пользоваться этими инструментами и вообще о наличии этих инструментов. Ну и вот этим мы сейчас займёмся шаг за шагом мы
61: Разобрались, что у нас есть 3 типа сообщений, у нас ещё появится 4 сообщение to massage, но об этом давайте посмотрим чуть дальше. Я предлагаю в рамках нашего мастер класса сделать 2 инструмента.
62: 1 будет выдавать информацию о погоде, a2 информацию о качестве воздуха. Ну, все будет связано с окружающей средой, скажем так, информацию эту будем брать от внешних.
63: Источников, если что, вы можете перейти по ссылочкам, которые есть в блокноте, и посмотреть, какие ресурсы были использованы для того, чтобы реализовать этот программный код, если говорить про качество воздуха.
64: На самом деле много различных параметров мы будем смотреть с вами только 2 из них это pm 2 с половиной и пм 10 это показатели наличия взвешенных частиц в воздухе.
65: Мелких и покрупнее. Обычно именно эти показатели используются для вот такой первичной оценки состояния качества воздуха. Ну и как будут выглядеть наши инструменты? Наши инструменты будут выглядеть как просто
66: Функции, написанные на пайтоне, в данном случае это обращение к внешним сервисам. Ну вот давайте посмотрим на примере 1 функции, которая определяет погоду, что это функция, в которую нужно передать название населённого пункта.
67: Который мы будем смотреть. Этот населённый пункт подставляется в некий адрес, и этот адрес через get запрос будет отправляться на внешний сервис, и вернувшийся оттуда ответ будет обработан в плане
68: Вытащены оттуда необходимые кусочки информации и возвращён в виде некой такой строки. Это наш 1 инструмент. Все сделано на простых запросах из ланчей, а мы дополнительно возьмём только
69: Инструмент под названием инструмент tool мы будем использовать его как некий декоратор, заворачивая в него наши функции вот таким образом собачка тулс собачка Туул это значит 1 у нас.
70: Инструмент, ну и 2 с качеством воздуха, он немножко посложнее. Там под капотом 2 запроса будет происходить. Мы в 1 запросе отправляем название населённого пункта, там по ссылочке в ответ на название населён.
71: Пункта. К нам возвращается информация о широте и долготе. И уже широта и долгота подставляется в ещё 1 запросе. Чтобы получить информацию о качестве воздуха. На самом деле ллм достаточно не
72: Плохо знакомы с географией. И, в принципе, если их попросить сказать, какая там широта долгота у того или иного города на больших городах, они работают очень даже неплохо, но
73: Для того, чтобы убрать неопределённость, мы вот реализовали этот инструмент таким образом, вообще лучше, если вы можете что-то реализовать в рамках кода, да, если что-то укладывается в жёсткую логику и
74: В принципе, не требует обращения к большой языковой модели. Лучше программируйте таким образом, чтобы вот оно было на жёсткой логике. Так вот, мы реализуем 2 вот таких функции, помещаем их в список. Это будут
75: Будет список наших инструментов. И этот список инструментов мы в дальнейшем будем подставлять в нашего агента. Но прежде чем мы перейдём к созданию непосредственно агента, давайте мы ещё 1 экспериментик сделаем мы
76: Просто привяжем средствами ланчей, а привяжем инструменты к языковой модели. То есть это не будет полноценный агент, но это будет связка из модели и инструментов для того, чтобы модель увидела эти
77: Инструменты и показала нам своё поведение, когда она вот эти инструменты видит в ответ на релевантный запрос. То есть мы таким образом посмотрим, как выглядят ответы большой языковой модели, когда её просят вызвать тот или иной
78: Инструмент, а дальше вот понаблюдав это, мы уже сможем непосредственно перейти к созданию агента. Вот каким-то таким образом у нас выглядит давайте смотреть я вывел здесь на экран
79: Вообще вот эту сущность, связку большой языковой модели и инструментов на ланкене это получается вот такая структура. Здесь вот как раз виден мой авторизационный ключ. Не переживай.
80: Давайте я его после записи мастер класса поменяю и описание вот тех инструментов, которыми агент сможет пользоваться. Здесь есть информация о тех аргументах, которые нужно передавать.
81: Как называется и описание функций, да, чуть не забыл. Очень важно подробно описывать инструменты. Вот это происходит обычно в докстрингах сразу.
82: Вслед за названием функции идёт вот это вот описание это классический подход, да, в пайтоне, но обычно вот это описание никак не влияет на функционирование кода и многие не делают
83: Подробных хороших описаний, хотя тоже, наверное, стоит. А здесь это прямо критично, потому что именно вот это описание, оно в итоге попадает в контекст модели и опираясь на это описание, модель выбирает тот или иной инструмент. Поэтому
84: Не ленитесь, всегда расписывайте, как запускать инструменты. Подробно. Хорошо. Значит, вот мы посмотрели, как выглядит связка, и посмотрим, как выглядит ответ модели. Вот у нас здесь
85: Мы видим, что возвращается эйай месседж. Да, это стандартное сообщение, ответ модели. Но он отличается от того, который мы видели раньше. Мы видим здесь, что контент у нас
86: Пустой пустые кавычечки, зато зато что у нас есть есть дополнительные параметры в виде function Кола есть описание вот у нас было передано 2 instrumentals, get weather, да и вот посмотреть-ка.
87: Воздуха мы в рамках запроса здесь обратились к модели по поводу погоды в Нижнем Новгороде, поэтому модель поняла, что нужно вызывать именно инструмент, связанный с погодой.
88: И указала, какой именно город нужно посмотреть в аргументе сити. Все нормально. Соответственно, вот такими сообщениями бросается в нас большая языковая модель, когда нужно
89: Вызвать тот или иной инструмент и в ответ будет приходить сообщение от этого инструмента и, опираясь уже на ответы инструмента, большая языковая модель будет формировать, а точнее уже агент.
90: Будет формировать ответ на запрос пользователя. Ну вот давайте посмотрим, как это будет выглядеть на практике. Для этого. Для этого нам понадобятся ещё кое-какие абстракции мы будем использовать.
91: Готового, ну, агента. Готовый шаблон под создание агентов. Он находится в библиотечке ланчен в модуле. Agents называется криейт эйджент, и он
92: Позволяет создавать так называемые реакт агенты. Это простейший паттерн, обладающий максимальной свободой. То есть мы отдаём выбор последующих Шагов для решения той или иной задачи.
93: Непосредственно модели, мы её минимально здесь контролируем, просто снабжая изначально инструкциями о том, как пользоваться инструментами. Ну давайте, чтобы было нагляднее, я запущу вот этот код.
94: Здесь специально получившегося агента я вывел на экран для того, чтобы было видно в такой формате схемы, что он из себя представляет. Он из себя представляет несколько вот таких узлов. То есть, ну,
95: Можно сказать, что это тоже как питонически функции. Можно сказать, что это такие блоки в коде, отвечающие за определённые этапы работы агента, что мы здесь видим? Мы здесь видим ноду, да.
96: Или вот узел эджент это непосредственно там, где происходит обращение к языковой модели и она выдаёт ai месседж в ответ. Этот ai месседж может иметь вызов функции может не иметь, если он будет иметь.
97: Функции, то по условному переходу мы оказываемся в узле тулс узел тулс содержит собственно программный код и запускает ту или иную функцию.
98: Функцию. Затем ответ возвращается снова в языковую модель, и она дальше принимает решение вызвать ещё какой-то инструмент. Возможно, задача какая-то комплексная или уже достаточно, и можно выдать ответ.
99: Пользователю. Тогда мы пойдём в узел n. Причём, если мы спросим просто у большой язык, ну, у агента как дела, то он не будет вызывать точно никакие инструменты, а просто ответит нам текстом.
100: И работа агента на этом закончится. Ну давайте попробуем посмотреть, как это работает в действии. Здесь у меня опять бесконечный цикл для этого, в рамках которого мы будем использовать, опять же, вот этот
101: Method invoke, с которым уже сталкивались, но теперь применительно к вот этому агенту, закидывая в него пользовательский запрос давайте попробуем поэкспериментировать, спросим что-нибудь типа того, что какая
102: Погода.
103: И состояние воздуха.
104: В Москве.
105: Знак вопроса и дай рекомендации.
106: Стараюсь не узко задавать какие-то рамки.
107: Посмотрим, на что способен наш реакт агент. Здесь обработка будет подольше, потому что он точно пойдёт в инструменты, дождётся от них ответов. Но вот мы уже видим полученный ответ. Давайте внимательно проанализируем.
108: Что вот мой запрос, он в виде human. Месседжа ушёл. Дальше вернулся эйай месседж в виде запроса на вызов функции погоды функция погоды вызвалась и
109: Вернулась с сообщением тул месседж о том, что сейчас дождь достаточно сильный, да и температура + 8 градусов. Также после этого мы видим, что был запрос на качество
110: Воздуха и вернулся ответ о том, какое содержание частиц на метр кубический мелкой взвеси, более крупной взвеси и в соответствии с полученной информацией.
111: Уже последним месседжем агент решил выдать ответ, опираясь вот на эту информацию. То есть это он уже берет не из своих знаний, а на основании анализа тех сведений, которые получил от внешних
112: Инструментов. Ну и давайте ещё посмотрим, как он будет действовать, если мы спросим его. А в Питере мы про Москву спросили, спросим про петербург.
113: Посмотрим, какой ответ мы получим. Смотрите, какой ответ мы получили. Он запросил погоду и качество воздуха в петербурге, но уже не выдал никаких нам рекомендаций, почему так произошло. А потому что
114: Сейчас наш агент работает подобно тому, как до этого мы делали одиночные запросы просто к модели. У него есть связь между сообщениями и общий контекст в рамках 1 пользовательского запроса. Но вот мы уже отпра.
115: 2 запрос и 1 запроса в контексте нету, поэтому агент ничего про это не знает. Ну вот, чтобы совсем в этом убедиться, мы спросим, сравни, подразумевая, что нужно сравнить информацию полученную
116: Про Москву и петербург, но мы видим, что агент не понимает, что мы у него хотим спросить, поэтому просит уточнений. Вот так работает агент. Но как видите, это пока что агент у нас без памяти, то есть
117: Нет общей цепочки диалога между запросами пользователя. Давайте мы это исправим. Сделаем реакт агента с памятью. Для этого у нас есть следующий блок кода, он почти не отличается от предыдущего. Что
118: Нас здесь нового, мы добавляем специальный чекпоинте. То есть это такая абстракция, которая хранит состояние агента, и мы будем указывать специальный идентификатор каждый диалог.
119: Таким образом, вот когда вы общаетесь с большой языковой моделью, он, как правило, имеет свой идентификатор и сохраняет вот эти наборы сообщений от запроса к запросу. Вот нечто подобное будет у нас здесь существует.
120: Много вот этих чек поинтеров, то есть абстракций, предназначенных для хранения сообщений различными способами, мы будем использовать простейший он называется memory saver. Это подразумевает, что мы для простоты экспериментов храним.
121: Все в оперативной памяти. То есть, если мы сейчас перезагрузим все перезагрузим нашего агента, ничего не сохранится, но в рамках наших простых экспериментов этого будет вполне достаточно. А так, есть специальные чекпоинте для хранения
122: В полноценных базах данных эскьюэль, различные другие. Соответственно, можно использовать для настоящих проектов. Такие, для нашей демки пойдёт хранение в оперативной памяти. Вот.
123: Что мы видим, что будет происходить, когда мы просим выполнить запрос к агенту, к языковой модели. Мы видим, что здесь, помимо сообщения, мы ещщще пробрасываем конфигурацию, которая содержит
124: Специальное поле, тред id. Ну и здесь можно любой набор каких-то символов бывает, используют генераторы вот случайных айдишников. Ну поскольку у нас простой эксперимент, я впишу конкретное значение и
125: Давайте запустим этот код и проведём точно такой же эксперимент, но посмотрим, что теперь наш агент помнит контекст между запросами. Давайте спросим какая
126: Погода и воздух в Москве.
127: Тоже попросим дать рекомендации. Дай рекомендации.
128: Так, пошёл у нас запрос, ждём ответа.
129: Ждём ответа. Вот вернулся наш ответ. Ну, здесь вряд ли что-то изменилось. Конечно, рекомендации, поскольку все-таки вероятностная природа больших языковых моделей подразумевает, что
130: Ответ модели он может отличаться от запроса к запросу, но теперь мы спросим а в Питере?
131: И вот сейчас в ответ на наш запрос агент должен дать и информацию о погоде и качестве воздуха, и рекомендации. Ну вот видим, да, и если мы попросим, сравни
132: Сравни.
133: Мы увидим, что сравнение выполняется по всему набору собранных в ходе работы агента данных так работают и агенты с памятью это наш 1 агент.
134: Он вполне себе функциональный. Если вы захотите, вы сможете написать какие-то свои функции даже в рамках тех сервисов, к которым обращались мы сейчас, мы использовали далеко не
135: Все данные о погоде и состоянии воздуха можете попробовать поэкспериментировать, но это каждый раз самописные функции и давно уже разработчики агентов задумались о том,
136: Как переиспользовать и агентов, и инструменты, и как сделать так, чтобы написанные в рамках разных проектов инструменты и агенты на разных, может быть, языках программирования?
137: Даже можно было бы использовать с минимальными усилиями итак, родился протокол стандарт, который называется model контекст, протокол изначально его разработали в компании антропия.
138: Они поделились, и в целом сообщество активно поддержало, и сейчас очень большое количество агентов поддерживают работу с этим протоколом и огромное количество инструментов существует, готовых которых можно подклю.
139: Ключать к своему агенту. Ну вот давайте разберёмся, как это все работает. Как я уже сказал, что это такой стандарт. Он предполагает, что самое в нём главное и интересное, что мы инструменты
140: Берём и из нашего программного кода выносим в отдельный процесс этот отдельный процесс, который мы запускаем. Точнее даже процессы это могут быть, поскольку мы можем использовать инструменты более чем из 1 источника.
141: Мы так с вами и сделаем. Выносится в отдельную сущность, которая называется эмсипи. Серверы. На самом деле в рамках этих серверов могут быть не только инструменты, но и некоторые другие сущности, но в рам
142: Нашего мастер класса мы займёмся только инструментами, и на самом деле максимальный фокус в целом сообщества сосредоточен именно на них, потому что именно это меняет окружающий мир и наш агент.
143: Это может быть вот самописный код, это может быть какое-то готовое приложение. Например, сейчас есть специальные среды разработки, которые используют тоже протокол. Эмсипи используют агента.
144: Для того, чтобы ускорять разработку программного кода, какой-нибудь курсор, например, вот это пример агента в терминологии эмсипи. Это называется клиент. То есть у нас есть серверы, в которых находятся инстру.
145: У нас есть клиенты, и они разнесены в разные сущности, запускаются как разные процессы в рамках вот этого взаимодействия клиента и сервера. Нужен какой-то транспортный протокол, нужен какой
146: Канал связи, по которому они будут между собой общаться. Есть несколько вариантов, как это можно реализовать. Но 2 главных мы сейчас их обсудим. Это стд айо, это локальный способ рабо.
147: Агента с инструментами. То есть предполагается, что и клиент, и сервер находятся на 1 компьютере. По сути, что происходит, как будто бы клиент запускает в командной
148: В консоли отдельный процесс и тем самым поднимает вот этот эмсипи сервер и дальше как будто в консольных командах общается с ним, получая ответ через ту же консоль. И вот таким образом, как будто это происходит.
149: Только это происходит как бы под капотом. Мы часто это не видим. И есть 2 распространённый протокол, он называется стримол аштитипи. Там суть, в чем там могут находиться и клиент сервер на
150: 1 машине могут находиться на разных машинах, но в любом случае происходит соединение по определённому адресу, и это соединение длительное, то есть оно не прерывается после пере.
151: Скидывание каждого сообщения, это поднимается как бы такой канал, который какое-то продолжительное время существует и сообщения летают по мере необходимости в рамках этого канала. Вот это 2 основных подхода к
152: Взаимодействию серверов и клиентов мы в рамках нашего мастер класса поднимем простые стд айо сервера и будем использовать именно этот подход для того,
153: Того, чтобы это все реализовать, нам понадобится ещё парочка библиотек. Это ланчен эмсипи адаптер. Эта библиотечка нужна для того, чтобы наш ланчей овый код было легко.
154: Использовать для создания эмсипи, то есть наш агент, он будет воспринимать вот эти инструменты, которые находятся в каких-то других сущностях, как просто свои инструменты, то есть он не будет видеть
155: Разницы между нашими инструментами локальными и какими-то другими удалёнными да разработанными сторонними программистами. И 2 библиотечка, которая нам
156: Понадобится, поскольку большинство эмсипи серверов разрабатываются с использованием вот этой библиотеки. Это uv, это менеджер пакетов. Я думаю, что если вы с питоном
157: Хорошо знакомы вы часто используете пип инсталл команды какие-нибудь, вот там менеджер пакетов pip, но сейчас все больше стараются использовать юви не только в рамках эмсипи, но и в рамках других современных проектов.
158: Соответственно, большинство эмсипи серверов поднимаются с помощью вот этого менеджера пакетов юви, или если менеджеры пакетов написаны на джаваскрипте, то тогда
159: Нам понадобится но gs с npm. Но это я просто делюсь с вами общей информацией в рамках нашего демо мы будем использовать эмсипи, написанные на пайтоне. Мы возьмём наши инстру.
160: Менты вот те 2 функции, которые мы уже реализовали и завернём их в mcp сервер. Как нам это реализовать, для этого мы используем класс фаст эмсипи из вот этой библиоте.
161: Которую я упомянул. Создадим сущность этого класса и возьмём исходный код тех же наших инструментов. Просто завернём их не в
162: Просто tools, как у нас было из лангена, а здесь вот тоже декоратор с, значит, методом тулс, но он
163: Должен указывать тот сервер, к которому он относится. Ну и на самом деле, что будет происходить, когда клиент запустит вот этот процесс в виде отдельного файла у нас
164: Поднимется эмсипи сервер, который будет работать с вот этими инструментами. То есть все максимально удобно, все сложности с работой взяли на себя разработчики, в данном случае ланчей. А ну и антропка.
165: Которые изначально разрабатывали этот стандарт для того, чтобы мы могли сосредоточиться именно на логике нашего приложения для, поскольку в google collaboratori не так просто запускать несколько процессов одновременно.
166: Мы сохраним исходный код вот этого нашего эмсипи сервера, сейчас в отдельный файл с помощью специальной команды, write file, ну и тут есть ещё 1 лайфхак, связанный именно с google.
167: Лаборатории, мне пришлось служебные логи, эмсипи, сервера, а по сути, это вот сервер, да, отдельный процесс. Он иногда там выкидывает какие-то свои сообщения пришлось вынести в отдельный поток для того,
168: Чтобы оно не забивало вот этот стд ао канал. В остальном ничего тут сложного нету. Запускаем эту ячейку кода она ничего не делает, кроме того, как записывает.
169: Файл вот в google коллаборатор, есть своя файловая система. Вы видите, что сейчас, когда я выполнил эту ячейку кода, у меня появился файл с mcp сервером. Это наш эмсипи сервер и его на самом деле можно будет
170: Переиспользовать при желании вы сможете этот эмсипи сервер подключить, не знаю, там к тому же курсору, не знаю зачем вам это, но мне кажется прикольно, что вот таким образом мы можем переиспользовать инструменты.
171: Кроме того, нам нужно создать клиента, да, вот наш тот агент, простой реакт агент, который мы создавали прежде. Нужно тоже завернуть в оболочку эмсипи. Для этого нам
172: Придётся ещё 1 лайфхак сделать в плане того, что наш ключ авторизации для гига чата, его нужно будет поместить в переменную окружения у
173: Гига чата, есть ряд стандартных переменных окружения и ключи авторизации принимаются по вот Такому названию GigaChat креденшелс это предварительная операция, а
174: Дальше нам нужно будет создать файлик с непосредственно клиентом. Тут какие особенности, по сути, у нас внутри там будет тот же самый реакт агент. Вот криейт агент, но
175: Его нужно поместить внутрь асинхронной мейн функции, в которой прописать конфигурацию. Вот она выглядит следующим образом. Это такой словарик, в который мы впишем на
176: Наши эмсипи серверы в качестве эмсипи серверов. Я использую вот тот эмсипи сервер 1, который создал и 2 эмсипи сервер, который мы здесь задействуем. Это будет не нами написанный.
177: Это доступный, стандартно вынесенный в отдельную как бы тоже такую библиотечку, он называется эмсипи сервер тайм, то есть его можно с pypi тоже скачать при
178: Желании. Ну а в рамках нашего проекта мы его автоматически подтянем за счёт того, что мы прописали его в конфигурации и что здесь в конфигурации, нужно указывать название каждого из серверов, указывать транспорт, по которому будут
179: Общаться между собой. Клиент и сервер у нас это стд ао и команда, с помощью которой будет запускаться тот или иной сервер. Вот мы здесь прописываем пайтон, да, и название нашего файла. Ну,
180: То есть, по сути, там в конфиге прописана вот такая команда, что с её помощью мы поднимем, как бы в командной строке отдельный процесс, немножко сложнее с mcp сервер time, потому что тоже нужно там погасить.
181: Править в отдельный поток. Вот эти все служебные логи, чтобы они нам не мешались. Поэтому команда немножко сложнее. Мы используем вот эту вот библиотечку юви для того, чтобы скачать и запустить тут же сходу
182: Это, эту библиотеку, этот сервер. Ну и для того, чтобы оно не отправляло, куда не нужно сообщение, вот у нас команда будет выглядеть вот так это так она бы выглядела, если бы мы её реально вживую записывали в командную строку.
183: Но поскольку мы это прописываем в конфиге, вот она выглядит таким образом. В остальном, в остальном, что у нас здесь ещё добавляется, ну, я на всякий пожарный добавил логирование, добавил логирование.
184: Процессов, связанных с агентом, мы там увидим, как он обращается к GigaChat и что нам дальше нужно есть в рамках все той же библиотеки для работы с mcp в лангене есть.
185: Специальный класс мультисервер эмсипи клаент, в который мы вот этот вот эту описанную конфигурацию передадим. И с помощью метода get тулс мы получим, по сути, тот же список инструментов для того, чтобы передать их
186: В агента и, собственно, дальше мы создаём клиента для общения с GigaChat м. Создаём агента и передаём ему инструменты и дальше все тот же цикл общения с
187: Ну, давайте посмотрим, как это будет работать. Как мы видим, сейчас код никакой не выполнился. Это мы тоже записали все в отдельный файлик, вот он появился, и нужно будет этот файлик как будто бы в командной.
188: Запустить. Для этого есть у нас здесь возможность через восклицательный знак прописывать команды. Ну вот, я напишу python, эмсипи, клаент, соответственно, он запустит вот весь этот описанный код.
189: А этот код, в свою очередь, запустит те серверы, которые мы описали выше. Ну давайте запустим и проверим, что все работает точно так же, как простой реакт агент, даже несмотря на то, что вся логика у нас
190: Вынесено в отдельные процессы и в отдельные файлы. Это займёт немножко больше времени, потому что там нужно подтянуть юви всякие зависимости для работы с mcp, ну.
191: И вот мы видим, что агент у нас уже запустился. Ну давайте мы какой-то комплексный запрос зададим для того, чтобы было видно, что все инструменты видны агенту и всеми он, в принципе может пользоваться. Давайте попросим, дай.
192: Сводку по, ну, например, Иркутску.
193: Иркутску сообщи время.
194: Сообщи время, погоду и воздух.
195: И запустим. Ну и, соответственно, наш агент должен совершить несколько запросов к разным инструментам и вернуться с обобщённой информацией. Вот то логгирование, которое я добавил в
196: Клиента. Мы видим, что оно происходит вот здесь у нас, если посмотреть, на самом деле идёт запрос GigaChat апи на авторизацию, а вот это уже запросы непосредственно на
197: Генерацию ответа от модели. 1 запрос, скорее всего, с, ну а мы можем видеть, какие тут запросы были. 1 запрос это на определение времени. Вот мы получили информацию по
198: Времени в Иркутске. Так, у меня не очень хочет прокручиваться. Ага, все, справился. Дальше мы получаем погоду от Иркутска. Это вот следующий запрос происходил дальше.
199: Мы получаем качество воздуха, должны получать это ещё запрос и последний запрос. Это именно на формирование ответа итогового ответа от нашего агента. Вот мы видим время. Вот мы видим
200: Погоду и мы видим качество воздуха. Все запросы у нас случились, и в конце агент решил, что уже никакие инструменты ему вызывать не надо и он готов дать ответ пользователю. Вот ответ пользовате.
201: О том, какое сейчас время в Иркутске и что там с состоянием погоды и воздуха. Вот таким образом наш реакт агент стал настоящим эмсипи, агентом.
202: Можно сказать, эмсипи клиента, и его можно использовать, а наши инструменты, которые мы создали, собственноручно, их можно переиспользовать в других агентах, подключая их подобным. Вот образом, как
203: Описано было в файле клиента, там везде, какой бы клиент вы не взяли, как правило, в виде вот таких словариков или джейсончиков нужно прописывать. Ну вот на этом.
204: Практически наш мастер класс подходит к своему завершению все, что мы хотели сделать, а именно просто выполнить несколько запросов к большой языковой модели, сделать диалоговую систему, но не агент.
205: И агента с инструментами, и даже агента с инструментами для дальнейшего переиспользования. Мы реализовали это уже неплохой задел для того, чтобы начать разбираться в теме агентов. Достаточно неплохо. А если вы хотите погрузить
206: Ещё больше в эту тематику, то я вам советую познакомиться с разработкой нашей команды универсальным агентом гига эйджент. В его основе тоже находится реакт агент, но там много
207: Различных инструментов, готовых есть готовый ui, и есть также субагенты. То есть вот в рамках мастер класса мы не посмотрели, а с помощью универсального агента вы сможете посмотреть, что
208: В качестве инструментов у нас могут выступать не только функции, написанные на пайтоне, но и другие агенты. И таким образом какие-то задачки могут раскидываться по разным агентам. Посмотрите решение опенсорсное.
209: Можно скачать, есть инструкции, можно развернуть локально на своём компьютере, можно на каком-нибудь сервере, удалённом. Для всего есть описание, как сделать работает с моделью гига чат.
210: 2 max хорошо, но если хотите, поскольку все написано на ланчен Ланграф, можно использовать и другие большие языковые модели, также советую следить.
211: За нашими обновлениями у нас есть достаточно обширный кукбук с различными примерами по созданию ллм приложений и агентов. Также почитайте.
212: Поподробнее про агентов в наших статьях от команды на хабре, ну и знакомьтесь, если захотите прям погрузиться в ланчен Ланграф с курсами.
213: От компании ланчен, у них открытые курсы по этим фреймворкам, там информация из первых уст о том, как создавать современных агентов. Я опять же
214: Показываю QR-код всего кода, который мы только что посмотрели, сохраните себе поэкспериментируйте и я надеюсь, что тема и агентов вас заинтересует и вы реши.
215: Развиваться в этом направлении сейчас достаточно много вакансий, много возможностей, много научных проектов, учебных проектов. Дерзайте. Спасибо вам большое. Надеюсь вам понравилось.