Как работают AI-агенты: MCP, Function Calling, архитектура и примеры
39:15

Как работают AI-агенты: MCP, Function Calling, архитектура и примеры

Галера Морева 29.12.2025 429 просмотров 28 лайков

Machine-readable: Markdown · JSON API · Site index

Поделиться Telegram VK Бот
Транскрипт Скачать .md
Анализ с AI
Описание видео
Мой Telegram-канал: https://t.me/gmoreva Статья на хабре: https://habr.com/ru/articles/926548/ Ролик на канале Владилена Минина про запуск ИИ-агента на TS: https://youtu.be/9oJIU6A5Z70?si=fsTISnUYHsfbJ0jQ В этом видео я разбираю теоретическую архитектуру AI-агентов и MCP-серверов, без демо, без маркетинга и без «волшебных кнопок». О чём видео: — что такое AI-агент и чем он отличается от обычной LLM — как работает Function Calling / Tool Calling — зачем появился Model Context Protocol (MCP) — почему MCP — это стандарт интерфейса, а не способ “сделать модель умнее” — роль третьей системы-исполнителя между пользователем и LLM — как LLM принимает решение о вызове инструментов — structured output vs Function Calling — как передаётся контекст и история диалога — почему агент — это система, а не промпт Также затрагиваю: — локальный запуск LLM (Ollama, vLLM) — облако vs on-prem — ограничения контекста, токены и стоимость — типовые архитектурные заблуждения вокруг AI-агентов и MCP Видео рассчитано на техническую аудиторию: backend-разработчиков, AI-инженеров, архитекторов и тех, кто проектирует системы с LLM. Таймкоды: 00:00 Начало 01:22 Как работает ИИ? 06:27 Кто такой ИИ-агент? 09:18 Способы реализации ИИ-агента 12:37 Заблуждения про ИИ-агентов 19:19 Что такое MCP? 23:54 Виды MCP и способы общения с ними 27:11 Что нам дает MCP? 27:56 Архитектура с MCP 29:30 Примеры ИИ-агентов 31:55 Как запустить ИИ-агента? 35:20 Ресурсы для локального запуска ИИ-агента 38:06 Полезные ссылки #mcp #mcpservers #modelcontextprotocol #aiagents #llm #functioncalling #toolcalling #aiarchitecture #localai #ollama #vllm #backend #typescript #искусственныйинтеллект #ииагенты

Оглавление (13 сегментов)

Начало

Всем привет. Это Антон Морев. И сегодня я хотел бы вам рассказать такую теоретическую часть того, как происходит у нас работа с созданием MCP серверов. Ну, вернее, мы создаём наших личных и агентов, которые под капотом используют MCP сервера. Я по этой теме давно работаю, запускал кучу агентов для себя, для наших клиентов. И у меня сформировалась некая картина в голове о том, как это может работать в облачных, э, джиптишках и, ну, подобных системах в локальных у себя на видеокартах, поскольку мы и такие, и такие запускали. сделаю краткий обзор того, как это можно сделать, и сначала расскажу большую теоретическую выкладку того, как это в принципе под капотом работает. Кто такой вообще и агент. Я в детстве, когда смотрел фильм Железный человек, у меня вызвало просто какой-то дикий восторг. То, что я увидел в контексте и агента. Это личный помощник этого Тони Старка Джарвис, с которым он голосом разговаривает и говорит ему типа: "Не знаю, Джарвис там, собери костюм, Джарвис, сделай то, сделай сё". И Джарвис его понимал и послушно это выполнял. У меня это вызвало тогда реально, ну, восторг. Думаю, блин, хочу так же. Это был восьмой класс, мне было там, получается, 13-14 лет. В итоге я, когда, ну, стал постарше в универе, начал пытаться делать своих и агентов на базе Google этого Speech Recognition. И в итоге, ну, это был совсем не искусственный интеллект. Это, в принципе, такое маленькое лирическое отступление, которое, ну, просто как бы даёт понять, что я в этом был заинтересован довольно-таки давно. Но давайте мы сейчас не будем говорить про и агента. Давайте сначала откатимся на

Как работает ИИ?

пару шагов назад, как вообще работает и сам по себе искусственный интеллект. Сразу дисклеймер это будет очень упрощённая форма. Это не теоретическая какая-то информация из книжек. То есть это не то, что стоит учитывать для какого-то в будущем дипломной работы. То есть не надо на это опираться. Я простыми словами объясняю тем людям, у которых может быть есть какое-то базовое понимание математики. Вернёмся к математике. Вот вспоминаем математику, седьмой, там восьмой класс, когда мы строили эти прекрасные графики. У нас есть ось X, ось Y. И на этом графике мы с вами строим X². Это парабола. Все прекрасно понимают, как это работает. То есть мы знаем то, что для точки один - это один, для точки 2 - это 4. И в разные стороны расходятся такие кривые линии. Это у нас просто f(x) = x². Давайте теперь подумаем иначе. Представим, что у нас есть какой-то это график. Ну, допустим, давайте напишем график 2x + 5, который выглядит примерно следующим образом. Из цифры 5 на оси Y выходит линия с наклоном 2 наверх и направо. И давайте попробуем предположить то, что нам эта функция неизвестна. Мы не знаем, какой именно последовательность чисел и цифр должно происходить именно в формате вот формула для какого икса какой и соответствует. То есть мы этого не знаем, но нам поставили задачу, нам надо угадать. Мы знаем только, что есть какой-то вид функции серии ax + b. И нам надо понять, чему равны а и чему равны b. Ну и давайте попробуем пойти таким путём. Мы подбираем a = 1, b = 2. Маленькое отступление. Это я сейчас объясняю, как вот примерно работать под капотом нейросети. только на базе очень базового простого примера. Ну, допустим, a = 1, b = 2. Мы рисуем линию и видим, что она, мягко говоря, совсем не совпадает с тем, чего мы хотели бы получить. Мы считаем квадратичные отклонения. То есть мы считаем, как именно в каждой точке у нас отклоняется от точки нашей целевой функции, понимаем, строим функцию именно этого построения отклонения и ищем мини и пытаемся минимизировать это отклонение. То есть под капотом там происходят некоторые термите преобразования. С помощью там производных интегралов мы понимаем то, что, ну, следующее значение полтора и 3 нас приблизит к нашей цели. Рисуем следующую линию и видим то, что о, о'кей, она визуально стала ближе. Считаем математические отклонения, опять же, также их минимизируем. И в итоге мы таким образом постепенно, постепенно, постепенно приходим к тому, что у нас функция становится максимально похожа на то, что мы изначально хотим получить. А теперь давайте представим, что у нас этой функции может быть не маленькая функция с одним параметром x, а именно наша речь, текстовая речи. То есть, привет, как дела? Только это будет функция уже не с одним параметром, а с миллиардами параметров. То есть это как раз-таки те миллиарды параметров, по которым мы привыкли последнее время измерять гениальность нашей нейросети. И мы хотим как раз-таки подобрать эти параметры и дальше эту функцию продолжать. То есть привет, как дела? продолжать в виде такой же линии, которая будет содержать себе хорошо, а у тебя как? Ну, как мы стандартно отвечаем. То есть как раз-таки, если мы сейчас отправим такой запрос чат GPT, мы увидим примерно такой диалог. То, что мы спрашиваем, как у него дела, он говорит: "Всё отлично, спасибо, как у тебя дела". То есть под капотом конкретно происходит следующее: текст превращается в токены или векторные, ну, векторные представления. Дальше это векторное представление по сути просто под капотом продлевается. То есть, ну, у нас под капотом текст превращается в токены, векторные представления. То есть, ну, мы переводим наш текст в такую. получается линию, только она не двухмерная, не трёхмерная, мы её не можем представить, она многомиллиардноя. То есть это такое пространство очень, ну, сложно представимое, но для компьютера это не проблема представить и не проблема это продолжить. И в итоге он продлевает. Если мы говорим там про представление в векторном виде, это называется построение эмбедингов. Сложное слово. Мне, ну, дикция иногда сталкивается с проблемами, когда это слово произношу. Но как разтаки вот у разных моделей, наверное, у всех этих облачных всяких Chat GPT, гигачат и Gemнай у или геми, я не знаю, как правильно его призначить, у них есть, ну, возможность сделать эмбединг для своего текста. То есть она как бы делится тем, как она векторизирует текст, который к вам приходит. Дальше можно, допустим, эти эмбединги использовать для векторной базы данных, чтобы можно было по смыслу искать информацию внутри вашей базы. И в итоге мы получаем то, что и, пока мы забываем про реагентов - это что-то, что превращает контент, который приходит на вход, в контент, который выходит на выход. Контенты может быть как текст, как изображение, как, не знаю, просто набор байтов и битов. Если и заранее Неронку на работе с этим контентом научили как-то интерпретировать эту информацию, её обрабатывать, то она её будет обрабатывать. То есть если с картинки получать картинку или из текста получать текст, не имеет значения. То есть её главная задача - это контент продолжать. И в итоге, если мы говорим про именно Ии не и агентов, это что-то, где можно строить диалог таким образом. Я ему пишу на вход какой-нибудь текст, он мне на вход какой-то текст выдаёт, который он считает максимально подходящим для того вопроса или для того текста, который я ему написал. Там, не знаю, если мы возьмём самый-самый простой и - это ваш Т9 в телефоне, когда вы пишете, ну, там на телефоне сообщения, он подсказывает то, что там привет, и он сразу там, не знаю, ставит следующую точку и ставит как дела. То есть он просто понимает то, что вы 10 раз до этого после этого писали: "Привет, как дела? " Но он сам вам предлагает сразу же написать. Точно так же искусственный интеллект, ну, помогает вам, продлевает свой текст. Теперь

Кто такой ИИ-агент?

давайте возвращаемся к нашему Тони Старку, его Джарвису. Кто же такой и агент? Чем и агент отличается от просто искусго интеллекта? Вот это вот я красиво зачёркивал. Давайте мы это зачёркивание уберём. Давайте теперь представим то, что я ему говорю вот в формате текста то, что, дружище, я сейчас тебе буду кидать текст, а тебе надо будет извлекать из него задачи, но пиши только Джейсон. И вот, да, на скрине написано то, что я ему кидаю: "Напиши отчёт за последнюю неделю учесть детали по платежам". И он вроде бы даёт даже JON, у котором есть task details и как бы можно сказать работает нас и агент запускается. Мы можем этот механизм, этот промт передать нашу систему, которая будет отправлять этот запрос уже непосредственно в чат GPT или там любую другую GPT систему. И эта GPT система будет выдавать нам JSON, который наша система будет парсить. Короче, уже выглядит так, как будто это может прямо работать. И у нас, получается, вспоминаем эту историю с графиком, мы говорим ему о том, что, чувак, если что, при продолжении этого графика создавай Jon там, где это будет уместно, а где неуместно, то Jonт. И в итоге мы говорим создать задачи. Он вот это этот текст продолжает в формате то, что вот у нас есть task, у него tйтle аc. И если мы хотим сказать, кто такой агент - это кто-то, с кем можно вести диалог в формате просьбы чего-то сделать. Он дальше эту просьбу получает, как-то интерпретирует, понимает, достаточно ли у него информации для того, чтобы эту просьбу можно было обработать. То есть, если он понимает то, что я прошу его, не знаю, создать нового пользователя в базе, то он понимает, что информации ему недостаточно, он хочет, например, чтобы я ему сказал, как зовут этого пользователя, какой у него год рождения, то он эту информацию дальше уже дознаёт, то есть пишет сообщения текстовые нашему человеку, то есть там мне или другому пользователю. То, что, дружище, а как ты хочешь этого пользователя назвать? Ну или любой другой вопрос, который будет уместен в контексте той задачи, которую мы поставили. Если информации ему достаточно, то он уже передаёт дальше другой системе задачу. Типа, чувак, вот на, пожалуйста, запусти такую-то команду. И в итоге наша система приступает к реализацию этой команды. И в нашем вот этом графике, где мы рисовали, как мы общаемся с и у нас остаётся также я, искусственный интеллект, и мы с ним общаемся. Только теперь у нас появляется ещё третий участник- это система, мы её назовём. Это что-то, куда и агент может передать какую-то полезную информацию. Допустим, сделай чего-то. И система эта чего-то делает, какую-то конкретную непосредственную задачу, связанную с внешним миром. И дальше яишка говорит: "Пользотели, типа, дружище, твоя задача была выполнена". Не знаю, там пользорь был добавлен, там всё было сделано хорошо, мы вообще тут все молодцы. Чем агент отличается от обычного искусственного интеллекта? С каждым запросом мы агенту говорим, что в принципе он может указать делать нашей системе. Если по контексту информации достаточно, он эту задачу выполняет. Если чего-то недостаточно, то генерится запрос, типа, чувак, дай ещё больше информации. И, ну, дальше мы в формате диалога выясняем, чего хочет пользователь. И дальше мы уже можем это реализовать. Можем ввести прямо диалог, можем просить его создать нового пользователя, потом извлечь логи, которые в контексте этого создания пользователя были, и посмотреть, допустим, сколько место у нас после создания пользователя осталось. Ну просто вот сейчас из главы пример. Какие

Способы реализации ИИ-агента

есть способы реализации и агентов. Есть разные инструменты. За время развития искусственного интеллекта, там с двадцать второго года резкий скачок был, разные способы были. И как бы, ну, я сейчас с вами ими поделюсь. Первое - это указывать формат. то, что мы пишем: "Чувак, пожалуйста, отвечай, Джесон, и ничего более, вообще ничего боль не отвечать, чтобы я мог этот Джейсон распарсить". И иногда выходили такие артефакты из серии: "Конечно, вот твой Джейсон, пожалуйста, забирай. Только если мы эту строку отдадим нашему парсеру, наш парцер на этом сломается". Ну просто потому, что вот это вот конечно, вотвой джесон не устраивает. Можно, конечно, генерить по несколько раз, тратить токены до тех пор, пока он не выдаст именно Jсоon. Следующий способ - это запугивание. Мы можем ещё больше сказать то, что, чувак, ты будешь уволен, удалим весь твой код, там, удалим всю базу данных, типа, вообще твою модель удалим, если ты нам jсо не дашь. Но в итоге он говорит: "Да, о'кей, стало страшно. Вот твой Jсон". Ну, то есть мы как бы сталкиваемся с той проблемой, что у нас всё-таки это текстовая модель, которая научно выдавать текст. Да, мы ей можем выдать разные ограничения, но она как человек чуть-чуть в этом похожа. Она может всё-таки немножко интерпретировать это по-своему. Ну вот. Следующий способ - это структурированный вывод. Это когда мы задаём вместе с текстом ещё формат, структуру ответа, чего мы от него ожидаем. То есть какие поля, что нужно лежать и ничего более. В итоге, да, мы получаем наше агентское поведение, то, что нам гарантированно приходит тот же сон, который мы хотели бы получить, но у него есть небольшой минус, то, что мы в итоге весь диалог должны построить в таком формате. У нас получается лишние токены, поскольку нам же надо понимать то, что искусственный интеллект проинтерпретировал и дал нам какую-то задачу или же он чего-то ещё дознаёт. То есть надо будет какую-то свою велосипедную структуру изобретать для того, чтобы можно было и общение поддерживать, и чтобы можно было получать какие-то задания искусственного интеллекта. И следующий вариант - это tool calling или function calling. По-разному их в разных провайдерах GBT систем называют. Это способ как раз-таки смешать и то, и другое, и получить прекрасный результат. Мы пишем обычный текст, то есть так же обычный, как писали до этого. И рядом с каждым запросом мы передаём массив из тех инструментов, которые можно вызвать. То есть, ну, например, мы можем вот, как в данном примере на экране, мы можем построить график и говорим то, что, дружище, из серии, если вдруг человек отправил тебе задачу: "Построить график такой-то функции, то передай вот отдельным массивом, как в качестве инструментов, которые нужно вызвать, непосредственно функцию, которую нужно вызвать. И тот факт, то, что нужно вызвать функцию. Понятное дело, что звучит это немножко как масло масляное, но смысл таков. Нам агент теперь будет отвечать вместе с обычным текстом ещё инструменты, которые нужно вызвать на стороне нашей системы. Если сравнивать структурированный вывод и function calling, то у факшн коллинга есть масса плюсов, которые делают просто структурироный вывод бесполезным для непосредственно агентских задач. Структурированный вывод, он удобный там, где мы хотим что-то какую-то конкретику одну, вот прямо одну и никую иначе. То есть мы хотим вызвать искусственный интеллект с какими-то параметрами и эти параметры на выход получить. Да, тут эта ситуация может быть более подходящей, но лично я в своей практике уже остановился на том, что мы везде используем function calling. И структурированный вывод у нас используется разве что в задачках из серии распарсить картинку и из картинки извлечь, например, колораж блюда. Ну вот просто в формате эксперимента я делал, да, в таком случае функции не подходят, потому что, ну, нам не нужно различное трактование, что мы хотим. Нам всё надо конкретно. Мы дали картинку на вход, хотим на выходе уже JON с КБЖУ нашего блюда, которое мы приготовили. Тут, да, структурироный вывод подходит. Но если мы говорим про агентские задачи, где мы с си хотим поговорить и хотим, чтобы он из этого и чего-то как-то извлёк, тут, конечно, уже на сцену выходит function

Заблуждения про ИИ-агентов

коing. Прежде чем мы перейдём к MCP серверам и вообще в целом, ну, всем реализациям этих и агентов, я хотел проговорить несколько заблуждений, которые возникают в мозгах у людей, в том числе возникали в мозгах у меня, когда я познакомился с механикой и агентов. Первое заблуждение, то, что искусственный интеллект делает всё сам. То есть я предполагал, что будет примерно так. Есть, я есть мой ноутбук, в котором я отдаю какие-то команды. Ноутбук дальше шлёт этот запрос уже непосредственно в нашу LLM систему. И система под капотом как-то по-умному, по-мудрому делает запрос во внешний сервис. Этот внешний сервис как-то это всё обрабатывает, даёт ответ обратно в Лэмку. Лэмка эта воспринимает, понимает, что хотели, что хотел человек, что сделала система, и дальше уже человеку отвечает, типа вот, да, вся твоя задача была выполнена. Но у меня потом возникал вполне резонный вопрос, как это происходит, учитывая то, что сами модели, они обучены на то, чтобы, ну, жить сами в себе. То есть именно вход контент дал, на выход контент получил. И в итоге оказалось то, что работает всё немножко иначе. Давайте рассмотрим пример на в примере создания пользователя Васию, который мы хотим добавить в нашу систему. Мы говорим нашему компьютеру, ну, там ноутбук - это телефон, это неважно, что угодно, то, что, дружище, надо добавить пользователя Васю. Этот комп под капотом у себя формирует такую запрос клэмке, в которой будет написан наш текстовый запрос создай пользователя Васю. И рядом ещё написан будет список инструментов, среди которого есть инструмент по созданию пользователя, для которого нужно, например, имя и год рождения. Дальше вся эта информация переходит в лэмку. Лмка видит то, что у нас в нашем текстовом запросе есть имя Вася, но нет ни слова про возраст. ЛМ отдаёт текстовую текстовый ответ. Пока ещё никаких команд не говорит вызывать нашему компьютеру, а текст ответ напрямую там человеку через комп передаёт. О'кей, я понял насчёт Васи, но я не понял насчёт года рождения. Скажи, пожалуйста, какой год рождения? Дальше человек говорит, там год рождения, допустим, девяносто четвёртый. Эта информация вместе с историей всей переписки. То есть отправляется ещё один запрос в нашу Мсистему, в которой написано это старая переписка, то что создаю пользователь Васил ЛМК ответила о'кей, создамно в каждый год рождения. И передаём ещё раз ему теперь информацию с про пользователя Васю, про год рождения. И снова список всех функций, которые мы, в принципе, можем вызвать. Передаём. И дальше уже под капотом система понимает: "О'кей, нам пришёл год, нам пришло имя, у нас есть возраст, мы можем её создавать". Отдаёт компу, ну или серверу информацию о том, что, дружище, вот теперь надо создавать пользователю Васю такого-то года рождения. В итоге после этого мы создали всё это. Комп отправляет дальше информацию в лэмку и серии: "Да, вот я создал, всё хорошо". И Лэмка пишет там типа юзер создан, и мы её непосредственно за это благодарим. То есть работает всё немножко иначе, да? Как вы поняли, есть третий участник, есть я, есть лэмка и есть система между нами, которая непосредственно уже команды от Лэмки исполняет, а ЛМК их пытается только проинтерпретировать и дать команду на исполнение. Следующее заблуждение то, что агенты - это какой-то просто крутой лм, как с каким-то крутым промтом. Ну, мы уже про это говорили ещё на этапе, когда я говорил про джейсоны. Ну и давайте ещё обсудим небольшой блок на тему этого создания, допустим, чая. Мы говорим и нашему и агенту: "Сделай чай", как Тони Старк в этом железном человеке. Приходит информация в нашу лмку. И, допустим, мы настроили такой промт: если я прошу тебя сделать чай, то сделай чай. Если нет, то не делай чай. И в итоге, ну, приходит и наше сообщение, и вот этот вот дополнительный промт, и дальше искусственный интеллект под капотом у себя понимает то, что о'кей, надо делать чай, я пошёл делать чай. То есть в целом это можно было бы сделать в формате какого-то длинного дливного промта, где мы описываем всё примерно так же. Но как я говорил ранее, у искусственного интеллекта есть свои артефакты. Он может по-своему разные задачи интерпретировать. И в итоге это получается система, которая не может работать стабильно. А если это стабильно, то это не та система, которую можно операться и за которую можно получать, в конце концов деньги. Поэтому и агенты - это не просто промты, это целая система, построена на правильных запросах и промтах. И в том числе использование лколинга или фнкшн колинга. Это синониму просто в разных провайдерах. По-разному это называется. Дальше заблуждение то, что лмка сама решает, когда и как вызывать инструменты. С одной стороны, да, возвращаемся нашему примеру, чай, но не совсем, потому что у нас, э, может быть несколько подпространств, то есть мы можем закидывать блок задач, связанный с чаем, базой пользователя. И в итоге, получается, лмка может не знать о том, что в целом система умеет выполнять какую-то функцию, если мы этой лмке об этом конкретно не скажем. То есть нам надо абсолютно в каждом запросе передавать абсолютно все варианты задач, которые сейчас Лмка может проинтерпретировать. Потому что можем кинуть: "Сделай чай", а под капотом сделать кинуть вариант задач, только из серии добавь пользователя или там удали лог из нашей базы данных. Ну, это примерно. И тогда элмка в целом сама ничего решить не сможет. И следующее заполучение то, что Лэмка помнит весь контекст как база данных. Если мы будем с ней общаться неправильно, если мы лэмке пишем, допустим, опять же наш пример про этого Васю. Создай пользователю Васю. Он о'кей. Какого года рождения? И мы просто пишем Е9 девяносто четвёртого года. И если мы при этом не передавали всю историю переписки, которую надо всю передавать со всеми вызываемыми функциями, со всеми функциями, которые нужно вызвать, которые можно вызвать, короче, контекст развивается, тонкие токены набираются и как бы стоимость набегает. Если мы не скинем ей всю историю, то она скажет, типа, о чём вообще речь. Типа ты что? Зачем? Зачем ты меня кидаешь девяносто четвёртый год? Я вообще не знаю, о чём мы с тобой до этого раньше говорили, поэтому, ну, пожалуйста, вот тебе дено четвёртый год. Ничего я с этим сделать больше не смогу. Следующее заблуждение - это то, что tool calling - это что-то вроде каких-то плагинов в chat GPT, которые позволяют делать Chat GPT умнее и круче. Этот заблуждение, оно у нас формируется на фоне того, что ещё есть этот гугловский или антроopвский, не помню, гугловский GM, который под капотом может подрубаться к MCP, и выглядит он как будто это просто какая-то такая надстройка, какой-то плагин, работающий с нашей нейросетью. И ещё иногда это потают с продуктом Open GPTS, где можно заранее настроить по заранее заведомому заготовленному промту, там пару кнопок добавить, можно сделать реально себе там какого-то умного помощника, который как-то будет поумнее с вами взаимодействовать, но на самом деле нет. Это не так. Open AGBTS - это просто ещё один продукт, который под капотом может быть использовать и MCP сервера. Может быть, он реализован в виде и агента, но это не то, что мы сами взяли, разработали, это мы просто взяли готовый какой-то продукт, который дальше уже как он настроен, так он реализован, так им можно будет пользоваться. Следующее заблуждение - это изобложение серии то, что MCP делаломки умнее. И теперь мы наконец-таки переходим к непосредственно MCP серверам для того, чтобы можно было вот этот миф, касаемо того, что MCP делает умнее, развеять. С чем вообще этот миф? Ну почему вообще в голове моей он возник? Потому что, если мы открываем YouTube или любую другую там социальную сеть, где делается видеоконтент, мы видим то, что куча людей, куча блогеров пишет про серию, пишет видосы из серии: "Этот MCP сделает из для тебя очень крутого, мощного личного и агента". Он сделает прокачай твой EИ и прочее, там создай своего умного помощника за пару минут, пару кликов, используя MCP-сервера. Примерно

Что такое MCP?

в марте этого года появилась технология MCP, которая подняла немного на уши людей, которые пытаются на этом контенте как-то заработать. И в итоге получается у нас, ну, слегка неверное представление. Давайте теперь перейдём непосредственно к тому, что такое MCP. MCP - это model context protocol. Это получается вот, по-моему, разработчики этот, которые там сделали свой клод этот неросеть, они пришли к тому, что, ребята, а что мы изобретаем каждый раз велосипед? Почему каждый придумывает по-своему, как можно было делать вызовы во внешней системы? Почему бы нам не сделать какой-то стандарт, который будет работать как свагер? То есть получается, каждая система, которая хочет, чтобы искусственный интеллект мог отдавать ей команды и указания, она может по-своему описать информацию о том, как с ней можно работать. И дальше уже искусственный интеллект, понимая этот стандарт, понимая список задач, которые можешь сделать по этому стандарту, она уже будет у себя под капотом непосредственно передавать команды этой системы, и эта система их будет нормально интерпретировать и их выполнять. То есть получается, мы сделаем некий свагер для продуктов, чтобы с ними мог работать искусственный интеллект. И в итоге получается то, что у нас может быть куча разных MCP- серверов, которые просто у себя описывают, как именно их можно вызывать и как они могут работать, какие параметры получаются на вход, выход. Это вам ничего не напоминает? Мне сразу, когда я начал читать про MCP, я такой: "О, так это же свагер". Вот пример свагера, который используется для того, чтобы можно было описать работу ресташки. У нас есть методы пост, допустим, пост для создания нового ээ зверька в нашем магазине. Вот бади, что мы получаем на вход для того, чтобы можно было зверька создать. Есть get для получения этих зверьков, которые мы хотим, ну, как-то получить, интерпретировать и показать. Передаём на вход его айдишник. На выход получаем такой JSON. То есть ровно то же самое у нас под капотом реализуется в mcp серверах. Возвращаемся к нашим анимациям. Мы хотим, чтобы создавался человек Вася. Давайте ускоренно я промотаю эту анимацию, которую я вам уже показывал. И у нас здесь уже под капотом добавляется ещё один участник. Это MCP сервер. То есть у нас есть наш комп или сервак, который общается с MCP сервером и опрашивает его при запуске то, что, дружище, а что ты вообще умеешь делать для того, чтобы я мог потом тебя вызывать? Передаётся уже вместе с командой любой с любым текстом запросом передаётся в лмку уже список инструментов, которые доступны внутри наших MCP серверов, которые подключены к нашей системе. И в итоге дальше лмку уже из этих вариантов функций, которые можно вызвать, выбирает максимально подходящую, передаёт нашему серваку вот вызови в этом MCP сервере такую-то команду и то, что тебе потом MCP сервер в ответ на это отдаст, мне, пожалуйста, вернись, чтобы я мог как-то проинтерпретировать и юзеру информацию про это сказать или, может быть, дать тебе команду на вызов ещё одного MCP-сервера. Всё о'кей. Вот эта вся процедура общения происходит примерно таким образом. И все остаются довольными. И у нас вот в этом я фиолетовый MCP сервер, мы можем туда подсунуть что угодно. То есть, может быть, MCP- сессервер, который написали вообще другие разработчики openсоourсные, как вот, знаете, делают всякие эти библиотеки NPM и прочее, делают разработчики делятся в опоненсе. Есть уже, наверное, сотни, а то может быть и тысячи готовых MCP серверов. Всякие интеграции с Google календарём, интеграция с опишками Яндекса, интеграция с опишками вообще любых там других систем. То есть тут воображение просто разгуливается. Даже есть MCP для работы с вашим браузером. Вы можете запустить браузер и запустить рядом SP серверы, который будет вашим браузером управлять, не знаю, ходить за вас на разные сайты, что-то гуглить, что-то искать или, например, ну, запускать какую-то систему в вебе, её тестировать, смотреть. То есть MCP- сесрвер может уже делать что угодно. Это просто небольшая надстройка. Или, другими словами, MCP - это попытка стандартизации. Причём, я должен сказать, что попытка довольно-таки успешная, потому что стандарты реально пришли в нашу жизнь. Мы уже на базе MCP серверов, ну, продали клиентам несколько агентов, запустили их, они успешно работают. Это очень классно поддерживается, классно работает. И главное то, что очень многие вещи уже были сделаны до нас. Мы можем просто брать готовое, настраивать и использовать, как ровно мы и делали уже последние года, используя open source. Давайте посмотрим, как вот регистрируется, допустим, инструмент внутри нашего MCP-сервера. У нас есть название нашей команды, которой который и искусственный интеллект может вызывать, вернее, который искусственный интеллект может передавать нашему серваку, чтобы он вызвал в MCP сервере. Есть входные параметры, которые нужны для того, чтобы этот обработчик заработал и непосредственно обработчик. То есть всё, вот в рамках, э, сколько здесь строк, строк 20, наверное, можно сделать уже первый инструмент, который будет обрабатывать параметры на вход и выдавать чего-то на выход. И в итоге вот мы это сервер подключаем наш искусственный интеллект, ну, не прямо в него, а в системы, которые интегрируются с искусственным интеллектом, и в итоге всё, наш искусственный интеллект сразу превращается в и агента. Ну, конечно, я понимаю дисклеймер то, что это не Ии превращается в и агента, это просто наша вся система под капотом. используя и под капотом, опять же, да, ну, тавтология, получается, превращается в и агента, который может вызывать разные функции. Эти функции могут быть просто любыми, только ограничиваются вашим воображением и временем и ленью писать разные

Виды MCP и способы общения с ними

интеграции. И теперь мы давайте посмотрим, какие вот виды MCP. Есть MCP из тех, которые мы делали для по управлению пользователями. Есть MCP для аналитики, построения отчётов, появления слабых мест. Есть MCP, которая вообще классная штука, работает. Мы, я использовал у себя под капотом. У нас есть графаны, есть локи, и можно по запросу из локи вытащить информацию о последних логах, допустим, о последних ошибках и, допустим, как него как-нибудь его проинтерпретировать. Можно подключить MCP сервер Гитлаба или Гитхабам, и он будет ходить в ваши эти репозитории, смотреть мрки и даже может оставлять комментарии. То есть уже есть готовый MCP-сервер, который уже может какие-то интеграции базовые или не базовые с вашим Gitрепозиторием делать. Всё это реализуется в виде MCP серверов. То есть они, получается, могут быть разные. В разных и агентах разный набор MCP серверов. Их можно жонглировать, их можно подключать. Есть даже MCP, который определяет, какой MCP вызвать. Ей на вход приходит куча MCPшек, которые нам доступны. И в итоге получается там, ну, немножко двухэтажная система, пото что мы сначала в LM пишем запрос, lm выбирает, какой из MCP серверов нам больше всего подходит. Дальше запрос отправляется ещё раз в Лэмку, и только уже передаются все вещи, которые может сделать MCPшка, которую сама же лмка выбрала. Это делать для того, чтобы каждый раз с каждым запросом там тысячи инструментов не передавать и токены зря не тратить. И в итоге мы получаем уже, ну, целую такую агрегированную MCP-систему. С MCP серверами можно общаться несколькими способами. Вот, допустим, вот есть наш прекрасный продукт, который мы хотим интегрировать с искусственным интеллектом и с используем MCP-сер. Он может реализовывать свой MCP-сервер в формате, допустим, STD in. Это самый простой способ для того, чтобы можно было общаться напрямую. Это всякие личные агенты. Если у нас на компе мы запускаем, мы можем просто вот напрямую то, что лмка запущена, она сразу через этот std in передаёт, запускает какую-то команду, передаёт туда информацию, обрабатывают и получает обратно. Не надо париться с HTP, выводом это в паблик. Всё это работает локально на одном компе или на одном серваке. Можно MCP опубликовать в формате HTP, можно опубликовать в формате websocket, если нужно realта взаимодействие активное очень. Также может быть GRPC, есть уже готовый коннекторы для этого, да, или, может быть, вообще что угодно, не знаю, можно сделать голубиную почту, чтобы, не знаю, Лмка печатала на бумаге, автоматически робот там прикреплял это к какому-то голуб. Голубь там брал бумажку, улетел другой конец земли, бумажка залетала в сканер, там парсон передаётся, запускается. Короче, тут уже вы можете себя ни в чём не ограничивать, как хотите, так и использовать, реализовывать. Ну, мы чаще всего используем STD ио подход, потому что обычная пишка запущена ради рядом с коннектором, с искусственным интеллектом. Но если надо как-то разнести всякие там этот микросервис и прочее, то там уже вебсокеты, JRPC, HTP, что уже в проект завезено, то мы и используем. То есть STD работает таким образом. И дальше уже при запуске мы получаем список инструментов. И теперь уже, когда мы отправляем этот список инструментов непосредственно в лэмку, мы их конвертируем в тот формат, который нужен текущей лэмке. Потому что у Оламы, VLM, гигачата, чат GPT, Gemнай, э, клода, у каждого в опишке могут быть какие-то изменения. могут по-своему называться поля, они сильно не различаются, но всё равно как бы мы в впрямую напрямую конвертируем то, что пришло от MCP сервера в под конкретный провайдер. Один раз написали интеграторы с этими провайдерами, дальше мы их уже везде реиспользуем. Дальше у нас вот эти функции передаются уже непосредственно в запрос, да, вот это пример запроса в этот Open AI. И в итоге у нас там диалог строится прино следующим образом. Мы создаём пользователя Васю, отправляем ему такие-то аргументы, он передаёт нам функцию create user с такими аргументами. Вы мы вызываем и в итоге вот он функция create user вызвана. Всё

Что нам дает MCP?

хорошо, всё здорово и прекрасно. В итоге, что он даёт MCP? Он даёт нам стандарты. Мы теперь, наконец-таки, можем не париться и делать наши сосретачуся на продукте, а не о том, как именно с этим продуктом будет общаться. Ну и, конечно же, ещё стандарты. Ещё раз стандарты. Что нужно для старта нашего и агента? Нужен прототип взаимодействи с искусственным интеллектом. В нашем случае мы используем один из двух вариантов. Это либо консольный, который я показал вам чуть раньше, либо через Telegram бота. То есть вот ровно то же самое, поскольку нам нужно хоть что-то, что может на вход получить текст, на выход текст отдать. Вот мы сделали больши систему в виде CLI и Telegram. Надо под капотом интегрироваться с ОP AI, гигачатом или любой другой системой. У нас под капотом интеграция с оламо VLM для того, чтобы запускать можно было на своих видеокартах. Пара примеров заглушек для того, чтобы можно было дальше уже разработчикам эту штуку развивать. И в нашем случае лёгкий

Архитектура с MCP

запуск на тайпскрипте. И у нас механика теперь вся архитектура строится примерно следующим образом. Есть чат-процессор, который на вход принимает сообщение всею. И просто вот мы понимаем то, что вот идентификатор сессии то, что такой-то пользователь и такой-то от него текстовый запрос. Есть, допустим, там где-то за семью печатми, за семью замками несколько коннекторов с нескольким этим провайдером GPT. И мы уже через коннектор шлём запрос. Коннектор сам опрашивает MCP сервер на предмет того, какие вообще есть варианты взаимодействия. То есть мы давайте добавим здесь сюда MCP. И мы чат-процессором общаемся с MCP. MCP отдаёт и все инструменты, которые доступны, и просто уже чатпроцессор через коннектор передаёт все варианты инструмента, которые можно вызвать. И в итоге всё получается прекрасно. И коннектор, если нужен, на своей стороне уже, потому что у каждого провайдера GBT системы свой формат хранения сессии, то есть, вернее, свой формат предоставления истории сообщения. Поэтому на уровне коннектора мы сохраняем всю историю переписки для того, чтобы можно было дальше уже эту историю переписки поддерживать и развивать. И уже коннектор, получается, отправляет и всю переписку, и результат обработки функции, и все функции, которые можно вызвать. И в итоге это получается такой комбайн механизм, который очень слажно работает и может вести переписку. Там, если у нас контекст длиной 32 Мб, это может быть переписка, не знаю, там неделями переписываться с чатботом и вообще никаких проблем не испытывать в этом плане, потому что раздувается контекст при работе с текстом не так уж и сильно. Там возникает только проблема, когда мы слишком жёстко заваливаем его MCP серверами, получаем там большой список конструмента, который хотим отправить. В таком случае, да, там уже контекст может раздуваться, но тут уже надо с этой проблемой столкнуться, чтобы уже её как-то решать. То есть тут уже всё вариативно и под каждый случай свой

Примеры ИИ-агентов

способ решения проблемы. Давайте закругляться и подходим под примеры и агентов. Первое - это управление пользователями. Я уже показывал, это анализы лог инциден логов при инцидентах. Классная штука. Мы у себя её пробуем запускать. Местами получается, местами нет. Она по контексту логов может понять, что именно сломалось, скорее всего. То есть мы можем понять, что это сломалось что-то внешнее. Допустим, какой-то внешний сервис упал или под капотом доступ к базе упал. Поскольку влогах эта информация всё-таки исчерпывающа появляется. Мы же глазами это видим, мы глазами это понимаем. Значит, и глазами искусственного интеллекта можно тоже эту информацию разбирать. Первичный ревью MR - это посмотреть на тему того, чтобы разработчик там не использовал какие-то не оптимальные алгоритмы, чтобы он там не палил нигде креды. Короче, такой получается некий первичный досмотр для того, чтобы можно было дальше человеку передавать. Управление музыкой - это такой экспериментальный формат, то, что чтобы можно было в формате текста писать ну с управление какой-то командой музыкой. Тут сразу приходит в голову интеграции в Алису. Это те вот голосовые команды, там включи музыку, поставь на паузу там или Включи свет. Это тоже по сути и агент, который под капотом реализован примерно таким же образом. Ну, наверное, я не хочу держать наверняка, потому что я не являюсь сотрудником Яндекса, но предположение такое у меня есть. У нас ещё были идеи сделать контроль дубайского таксопарка. Наш клиент, мы занимаемся автоматизацией его бизнеса по извозу людей в Дубаях. Там разные провайдеры, разные типа способы получения информации о том, где как какой водитель находится. И искусственный интеллект на базе джесонов и представление информации о том, где кто как сейчас находится, он прекрасно может понимать, где ко кто как ливачит. То есть этот Jсон отлично пара кидается ему, он разбирается и может давать какие-то рекомендации. Мы это в формате эксперимента попробовали сделать клиенту предложили, пока клиент эту реализацию у себя запускать не стал. То есть, но механизм в целом, ну, рабочий. Он, э, как в формат черновика работал. И то, где используется тоже активно, это анализ финансовой отчётности. Мы можем передавать информацию о движениях денежных средств. У нас есть клиенты, которые занимаются торговлей на фондовых рынках. Мы можем передавать туда всю эту информацию. Он аналити может делать какие-то рекомендации. Опять же, это не серии сделать свого и помощника, который поможет тебе разбогатеть. Нет, мы этим не занимаемся. Более того, я в это вообще не верю. Это скорее просто анализ того, как происходит обстоят дела сейчас вот в команде, как компании, которая занимается непосредственно финансами. Ну и самый простой, наверное, часто используемый пример - это генератор счетов и документов. Мы себе под капотом его завели. То есть для того, чтобы можно было черновик получить быстренько, мы можем из серии создай счёт. Он дальше опрашивает, какие параметры счёта у нас там есть, и в итоге он выдаёт уже там файл, который дальше можно доредактировать, довести до то до того состояния, которое надо. Но получение черновиков документов это очень оптимизирует. То есть мы быстро

Как запустить ИИ-агента?

получаем, дальше уже с этим как-то работаем. Как его можно было бы запустить прямо здесь сейчас? То есть вы, допустим, всё послушали, такие: "Здорово, думаете, классно, хотим своё сделать". У нас есть несколько способов по тому, как можно было бы работать с нашими провайдерами искусственного интеллекта. Мы можем подключиться к OpenI и гигачат. Это довольно-таки быстро. В случае с open наи в нашем случае это чуть сложнее, потому что надо будет обзавестись либо зарубежной карты, либо через там какие-то посредников купить себе токены. Это быстро, это платно, но это опасно, потому что получается вы какому-то третьему сервису какую-то информацию передаёте, получается, вы, ну, зависите от него. И в некоторых случаях, в нашем случае у нас есть проекты, допустим, с госзаказчиками, и там, конечно, такое использовать нельзя. Это просто, ну, банально опасно, потому что нарушается закон. Если мы говорим про локальный запуск, то мы запускаем Allлаama либо VLM. Если мы говорим про Allлама, это скорее для личных запусков. То есть у меня на компе Олама крутится, она классно работает, она у себя под капотом там загружает, выгружает модели, всё здорово работает. Но иногда бывает такое, что одна модель нагружается на другую и в итоге выпадает в оперативную память компа и всё. Олама из быстро работающего продукта превращается в очень медленно работающее не пойми что. Поэтому ламу можно использовать только для каких-то личных целей, а для запуска в проде уже надо использовать беллам, потому что там можно точечно всё настроить для того, чтобы одна модель выгружалась и она всегда сидела в памяти. То есть контроля гораздо больше, но не очень подходит для того, чтобы быстренько запустить и поиграться. Это довольно довольно-таки медленно. Если мы там говорим про видеокарты, сейчас чуть позже там будет целый слайд про это, а это будет работать гораздо медленнее, чем любой облачный провайдер. Это будет условно бесплатно. Ну, это примерно в 150 раз дешевле, чем запускать в облачном провайдере, потому что вот при пересчёте токен на рубли, если мы считаем именно киловатт энергии, в нашем офисе киловатт там рублей по восемь покупается, вот получается в 150 раз дешеле, чем покупать такие же токены в уму у гигачата либо у Open это безопасно, это всё крутится у вас внутри. То есть в целом ээ я заказал себе вынос внешней видеокарты к ноутбуку. Хочу попробовать в формате эксперимента подключить это. То есть есть, через Type-C подключается внешняя видеокарта. И в итоге получается, вообще я без интернета, без чего угодно могу где угодно получать эту информацию, доступ к этой базе знаний, которые зашиты внутри этой лэмки, которая запускается. Допустим, GPT OS. Она вообще довольно-таки шарёная, умная, она много чего умеет делать и во многих вещах закрывает мои потребности по запросам к искусственному интеллекту. То есть получается, можно будет, вообще, не знаю, уйти ко-нибуд в тайгу и там от паубнка или генератора запуститься без интернета, без ничего. Можно использовать искусственный интеллект и не переживать за то, что данные куда-то утекут. Или же можно арендовать ВПСку с видеокартами. Нормальные ГПУ сервера стоят от 20. 000 руб. в месяц. Это такие вот такие простенькие видеокарты, ну там аля, ну 4070, 4080, то есть такие видеокарты, которые в целом смогут быстро работать, но у них будет маловато памяти, но можно будет уже запускать довольно быстрые решения. Это будет очень платно, да, как видите, 20. 000 руб. в месяц - это уже совсем небюджетно, но это будет достаточно безопасно. Да, конечно, можно сказать то, что вот провайдер имеет доступ к этому к вашему серверу, может что угодно там получить. Но в моём понимании это уже та опасность, которую можно пренебречь. Но деньгами пренебречь это не получается. Если мы возьмём вот этот символ пирог по выбору, как это, оптимальных путей, то мы говорим, вот есть вариант быстрый, про который я говорил, облачный, есть вариант безопасный, это когда мы запускаем локальную у себя и это всё обычно дорого. Если быстро, безопасно, то это дорого. И есть вариант бесплатные запуски на се на сервере. Если это бе безопасно и бесплатно, то это медленно. А если это бесплатно и быстро, то это туповато получается. То есть мы локально у себя запускаем чего-то, и мы запускаем какую-то очень простую модель, которая

Ресурсы для локального запуска ИИ-агента

будет вас, мягко говоря, огорчать. Теперь поговорим про ресурсы для запуска локально. Всё-таки небольшой блок этому решил уделить, потому что мы всё больше и больше используем локальные модели. И я к облачному GPT обращаюсь только в формате кодинга, когда надо непосредственно какие-то советы, какие-то мысли у него узнать, потому что, ну, он всё-таки обучен на передовых данных, он довольно-таки быстрый, умный и он бесплатный, потому что, ну, запускается в формате обычного ча. Ну, а когда мы говорим про разных агентов, то там уже под капотом, конечно, запускается всё локально. Если у вас локальная видеокарта менее меньше 8 гигов, то, скорее всего, вам лучше эту идею бросить, хотел бы я вам сказать. Ну, это обычно видеокарты GTX серии, и мы можем запустить модели типа Гема 4B она или Deepsek R1 7B. Это будет работать, в том числе, медленно. Это будет работать больно, ужасно и вообще эту идею лучше оставить. Ну, вы можете в формате эксперимента запустить, но вы просто запустите, увидите то, что, ну, она работает и медленно, и выдаёт какую-то ерунду. Только разочаруйтесь лишний раз. Поэтому лишний раз лучше не расстраиваться с 8 гигами оперативы лучше идите либо в облачные, либо подождите, когда у вас будет видеокарта с большим количеством памяти. Тут уже вот следующий эшелон у нас менее 16 гигов памяти. Это уже видеокарта из серии RTL X360. Я на такой 2 года сидел. Запускал у себя локальная модель 4B. Там она работала, ну, довольно-таки быстро, знаете, прямо как уча GPT. Она, конечно, туповата, ничего не скажу, но она умела смотреть фотографии. Она могла эти фотографии как-то интерпретировать, и можно какие-то локальные вещи себе в формате эксперимента позаписывать. 27B работала уже, она хотя бы запускалась нам RTX 360, но работала дико медленно. Но опять же, когда мы что-то локально запускаем, поиграться можно потерпеть, но придётся терпеть довольно-таки больно. И переходим в следующий шашлон. Это уже менее 32 гигов оперативы. Это, допустим, видеокарта RTX 3090. Я вообще эту карту обожаю. У меня эта видеокарта стоит у меня в компе. У нас в серваках она стоит, используется. Короче, видеокарта офигенная. Она оптимальная в формате ценакачества. На вторичном рынке она обходится примерно в 50-60. 000 и при этом покрывает практически все кейсы именно запуска искусственного интеллекта. Она отлично с этим всем справляется. Очень быстро работает модель типа 4B. Просто быстро работает GPT OS GMA 27B. То есть всё работает прекрасно быстро. Причём можно даже если мы запускаем VLM, можно даже давать ей нагрузку. Там 30-20 человек одновременно могут с ней работать и даже не замечать того, что не работают одновременно. Там всё под капотом очень оптимально, быстро будет работать. Короче, 3090 очень рекомендую. Я знаю, что есть ещё всякие люди, которые запускают на маках, на процессорах. Честно говоря, не в курсе. Я знаю, что вот эти вот процессоры, там вот это Apple Silлиicon, они там на М3, M4, короче, я даже не знаю их названия, но поскольку я не знаюх даже их названия, вы понимаете степень моей экспертности, я как бы считаю, что я не имею права даже своё мнение по этому поводу говорить. Поэтому я говорю только про видеокарты, поскольку у меня был опыт запуска только на видеокартах. Если у вас есть другое мнение, буду рад его в комментах прочитать, услышать. В общем, ну, пожалуйста, буду рад. увидеть другие

Полезные ссылки

способы запуска неронок. Переходим к полезным ссылкам. Первое, если мы говорим про MCP сервера - это open sourceные серваки, которые можно прямо вот сейчас взять, склонировать, запустить, они будут у вас работать. Это огромные скопление МCпишек, которыми поделилось сообщество. В общем, очень рекомендую. Вы хотя бы, знаете, как это аппетит приходит во время еды, вы, когда будете листать этот список MCP серверов, вы поймёте то, что ни фига себе, как можно много крутых вещей себе сделать. Следующий материал - это моя статья на Хабре про запуск и агента на тайпскрипте. Да, я вам сегодня показывал куски кода с тайпскрипта. И вообще есть отдельный ролик, который я укла выкладывал на канале Владилена Минина, где я уже в формате лайкодинга делаю всё то, о чём я сегодня вам рассказывал. То есть вот в рамках этого контента вы получили теоретическую часть всю для того, чтобы можно было запускать, а в рамках этой статьи или там того ролика вы можете уже посмотреть непосредственно кишки, как это всё запускает, как это всё работает, там прямо всё от начала до конца, как сделать своего Telegram бота, который будет как и агент работать, как сделать своего консольного бота. Короче, изучайте, смотрите, тоже буду рад любой вашей обратной связи. На этом всё. Большое вам спасибо за внимание. С вами был Антон Морев, и это был проект Галера Морева. До новых встреч. y

Другие видео автора — Галера Морева

Ctrl+V

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник