Transcription
Здорово, катаны. Просто бомбический материал я для вас сегодня подготовил. Крайне рекомендую смотреть до конца тем, кто занимается разработкой, тем, кто профессионально пишет программное обеспечение.
Значит, сразу спойлер. Мы тут не будем хайповать по поводу того, что искусственный интеллект может писать код, что это якобы, значит, изменит мир разработки, программном обеспечени, что это избавит бизнес от необходимости найма программистов, бла-бла-бла. Вот вообще здесь речь не об этом. За всем этим хайпом король голый стоит, потому что те люди, которые профессионально будут разрабатывать программное обеспечение, в том числе при помощи больших языковых моделей, о боже, они по-прежнему будут называться программистами. Просто к необходимости владеть тем, теми знаниями и тем технологическим стеком, который есть у программистов сейчас, добавится необходимость владения ещё одним инструментом и не более того, дорогие друзья.
Но, значит, э, в теме искусственного интеллекта и больших языковых моделей есть что-то куда более интересное, что-то куда более глубокое и куда более важное, что-то, что действительно изменит разработку и даст новые возможности. И это иагенты. Что это такое? Значит, говоря по-простому, иагент - это система на основе большой языковой модели, которая способна сама решать задачу, взаимодействуя с внешним миром, самостоятельно принимать решения. То есть есть моделька, которая понимает человеческий язык. Она тупенькая, но понимает человеческий язык и обладает некоторыми базовыми знаниями о мире, о том, что Земля круглая, а функции в Питоне определяются при помощи слова деф. Этой модельке мы даём конкретные инструменты для решения нашей задачи. То есть, по сути, мы даём ей возможность вызывать наш конкретный код, который мы этой модельке предоставим. И моделька, внимание, сама решает, когда вызвать наш код и какие параметры в этот код передать. Какие аргументы нашу функцию передать? Ещё раз, уже не мы пишем if else для того, чтобы определить, какую функцию вызвать, а сама моделька принимает решение и в нужный момент вызывает нужную функцию с нужными параметрами. Прикиньте, что и это, на самом деле, огромная смена парадигмы. И это то, что уже сейчас работает. Я дальше покажу, как это работает и как этим пользоваться на практике.
Но давайте с вами попробуем осмыслить, что вообще на самом деле происходит, что на самом деле даёт вот эта смена парадигмы и является ли это вообще сменой парадигмы. Да, по сути, что такое программы, которые мы до недавнего времени писали вот последние 80 лет. По разным данным, первая программа была написана, исполнена на компьютере то ли в 943, 1943, то ли в 1944 году. Ну вот 80 лет. Первая вообще программа, которая была написана, была написана в X веке, а Lovel, но негде было эту программу исполнить, поэтому мы берём программы, которые вот были написаны и были исполнены, да, это вот 80 лет программированию. И по сути эти 80 лет мы пишем программы, которые не так ужбы сильно друг от друга отличаются. Все эти программы построены на трёх базовых возможностях, да?
Возможность первая - это возможность хранить и изменять данные. То есть мы хотим иметь возможность в ячейку памяти что-нибудь записать, что-нибудь оттуда считать и изменить то, что там хранится, да? Возможность вторая - это делать видвление логики. То есть if else. Если условие выполнено, мы вызываем один код. Если условие не выполнено, мы вызываем другой код. Ветввление логики. И возможность третья - это возможность сделать повтор логики, например, через циклы, через go to или другие любые возможности. И всё. Этого достаточно. Вот вот этих трёх простейших совершенно возможностей достаточно для того, чтобы написать любую алгоримизируемую задачу, да? То есть любой язык программирования, который даёт эти возможности, является тюринг полным языком программирования и позволяет реализовать любую алгоритмическую задачу. Тут нет сложных типов данных, как вы можете заметить, да? Нет сложных структур данных, нет функций, нет объектноориентированного программирования, нет, значит, вкусного синтаксического сахара, да? Но, используя три этих базовых возможности, всё, что можно алгоритмически решить, можно реализовать при помощи вот этих трёх базовых возможностей. То есть можно написать любую программулечку, да, безусловно, были созданы ээ более высокоуровневые, более удобные м языки программирования, на которых можно быстрее писать, да, на которых разрабатывать программы легче, на которых многие возможности уже реализованы, подключены все необходимые библиотеки, да, там большое количество синтаксического сахара, но внутри всё это реализовано и всё это базируется на трёх вот этих совершенно ээ базовых возможностях. возможность хранить и изменять данные в памяти, возможность делать ветвление логики и, возможно сделать повтор логики, например, через циклы или э другими аналогичными способами через goto и так далее, да?
И что же во всей этой модели может изменить появление больших языковых моделей? На самом деле это может изменить многое, дорогие друзья, может изменить многое. Фактически у нас появился болванчик, который понимает обычный человеческий язык. Слово понимает я здесь использую в контексте, конечно, большой языковой модели. Просто надо понимать опять же, что такое большая языковая модель. Большая языковая модель - это механизм продвинутого автодополнения текста. Такой продвинутый - это девять. Окей, это грубая аналогия, но давайте ей всё-таки воспользуемся, да? Большая языковая модель LLM LGE language model - это инструмент, который подбирает наиболее релевантное следующее слово, затем подбирает наиболее релевантное следующее слово, затем следующее слово и так далее. Да, безусловно, с учётом семантики, да, токены LLM - это не совсем слова. Да, безусловно, есть масса оговорок, но в целом, грубо это так. Это просто подбор наиболее релевантного следующего текста на основе предыдущего текста. Так вот, с этими оговорками назовём, что LLM понимает обычный человеческий язык на русском или на английском языке. Да, это как ребёнок, который не очень силён в каком-то сложном виде деятельности, но он тебя понимает, когда ты ему скажешь, что пожалуйста, дружок, дай мне вилку или закрой двери или спросишь, как у него дела, он тебя поймёт, и он сможет интерпретировать правильным образом твои слова и сделать то, что ты от него просишь. А с какими-то более сложными вещами ты можешь попросить его звать тебя, понимаешь? То есть, если ребёнок чего-то не умеет, ты можешь сказать ему: "Дружок, вот когда тебе вот это понадобится, ты меня, пожалуйста, позови, да, и я приду и это сделаю". Понимаете? И вот это звать тебя - это может быть вызовом вашего кода, вообще любого произвольного кода на любом языке программирования, например, на Python. И этот код может делать что угодно, да? Модель будет знать о существовании этого кода. Вы в комментариях к этому коду, прямо реально в комментариях в догстринге поясняете, что этот код делает, что этот код принимает на вход, что этот код отдаёт на выход. И модель понимает эту информацию, потому что она понимает обычный человеческий язык, да? И затем модель сама запросит необходимые данные. Опять же, она их может запросить у пользователя в чате, она их может запросить у другой вашей Python функции, совершенно без проблем, да, и в нужный момент она вызовет ваш Python код, передаст в него необходимые аргументы и решит ту задачу, которую вы ээ перед этой системой ставите. То есть вы можете буквально написать, например, на Python или, на самом деле, повторюсь, на любом другом языке программирования код, который что-то делает, то, что вам нужно, вот ровно по тем алгоритмам, которые в 80 лет существуют, с теми же самыми ifs, хранением, изменением данных и циклами. И эта функция принимает на вход какие-то аргументы. Они могут быть сложных типов. Это может быть какой-то вложенный дата-класс. Эта функция может что-то возвращать, что-то тоже сложное, тоже какие-то дата-классы с какой-то структурой данных и так далее. и моделька всё это поймёт, и она будет знать, когда необходимо вызвать ваш код, с какими аргументами необходимо ваш код вызвать и сделает это. Да.
И что же это тогда получается? Получается, что так вот, если маленечко-то подумать, получается, что уже не вы витвите логику с if else, да, в вашем замечательном языке программирования, а сама модель внутри себя витвит логику, сама модель внутри себя принимает решение, что ей делать, да? Спросить недостающие данные у вас или у какой-то другой вашей Python-функции, уточнить что-то, сходить куда-то за данными, э, собрать необходимые данные для того, чтобы вызвать ваш код. и вызовет ваш код тогда, когда это будет необходимо. Да.
Значит, э я сейчас покажу, как это на практике работает. Я предприниматель и мне часто нужно готовить бухгалтерские документы, счета, акты, там, отчёты для разных клиентов и так далее. Брать помощников штат на такие задачи я пока не считаю, э, правильным для себя. Не уверен, что я смогу этого помощника на э 40 часов рабочих в неделю загрузить, но кто-то должен эти задачи делать, и их сейчас делаю я. Не бог весь какая сложная работа, но она достаточно тупенькая, достаточно нудная. И я подумал, а что, если я напишу и агента, который поможет мне это делать? Как это происходит? Значит, мне кто-то на почте присылает реквизиты, и мне нужно по этим реквизитам выставить, например, счёт на оплату или подготовить акт о выполнении каких-то работ. Да, реквизиты присылаются в разных форматах. Иногда это PDF-документ, иногда это docx документ вордовский, иногда это Иксеелька, иногда реквизиты просто пишутся в тексте письма. И всё это в разных форматах. где-то в таблице, где-то текстом, где-то через запятую, вообще вообще в полном расколбаси. И мне нужно, соответственно, вручную оттуда ээ разные кусочки этих реквизитов выбрать, да, вырезать из этого документа и вставить в свой шаблон там счёта, акта или любого другого документа и на выходе собрать пдфчку, эту пдфчку куда-то куда-то передать. Я подумал, а бахну-ка я и агента под эту задачу, чтобы он сам доставал, значит, из этого произвольного документа реквизиты, передавал их в мою Python функцию, моя Python функция генерила пдфку. Здесь, безусловно, можно сделать так, чтобы и сама языковая модель генерила пдфку. Но, во-первых, я хочу контролировать эту историю, чтобы шаблон использовался строго мой. А во-вторых, я хочу контролировать мои реквизиты. Я хочу, чтобы мои реквизиты были правильными. Если я выставляю там счёт на оплату, например, да, то я хочу быть уверенным в том, что в конечном документе, который я куда-то там передам, будут строго мои реквизиты, потому что, ну, моделька всё-таки это моделька, да, и это вероятностная история. Она может где-то нафкапить, да, если она ошибётся в реквизитах контрагента. Ну, в этом типа большой проблем не будет, да? А мои реквизиты я хочу, чтобы были точными, да. Поэтому я хочу, чтобы пдфку генерирола всё-таки моя функция. Моя функция будет принимать на вход значит реквизита контрагента и внутри себя будет генерить красивую замечательную пдфочку с моими правильными реквизитами и реквизитами контрагента, которые она получила от большой языковой модели. И в качестве модели я решил использовать Сберовский гигачат. Open AI модели запроса с российских апишников даже на платных аккаунтах обрабатывать не хочет. А я не хочу решать эту проблему, заморачиваясь с VPN, прокси там и так далее. Ну и, конечно, мне было интересно, справится ли российская моделька с этой моей задачей. Те, кто уже тянется: "А я всё вижу, я всё нахрен вижу, да, тянется написать, что это реклама". Да, конечно, ребята, это реклама. Ну, блин, а типа как вы как вы хотели? Типа я за этот видос заработаю кучу денег. Да, тут реклама Сбера, безусловно. Тут реклама. Значит, что у нас тут есть? Huawei, да? Вот реклама Huawei. Значит, тут реклама снова Huawei. Обратите внимание, да? Это это Huawei. Значит, тут у меня реклама вот тоже Huawei, безусловно. Значит, что у нас ещё? Реклама реклама Woop, бренд, значит, браслетов, реклама Pенерай. Значит, реклама Logitech, да, реклама это вот этот Хендерсон. Реклама Хендерсон. Ну, ещё я почти в каждом видосе рассказываю про питон. Гвидаро мне, безусловно, тоже за это добро отчисляет. Вот поэтому ээ завидуйте, завидуйте. Молча, дорогие друзья. Вот. Хотя на самом деле вот то, как это происходит на практике, если вам интересно, я потратил несколько дней на разработку этого видоса и заработаю с него ровно 0 руб. и 0 коп. Я его записываю сейчас вот в субботу, полночь, кстати, вот, ну, 2359 сейчас, да. Поэтому обвинения в рекламе мне всегда, так сказать, очень приятно. Вот, ребятушки, One love. One love. Да, на самом деле, большое искреннее спасибо тем, кто покупает у меня обучение, образовательные программы. У меня есть курс хардкорная веб-разработка. И вот те, кто туда приходит учиться, ребятушки, вот вот это это всё благодаря вам. Спасибо вам большое. Да, ссылка есть что в описании к этому видео. Можете тоже посмотреть, возможно, вас это заинтересует.
Ну, так вот, кстати говоря, про гигачат. Это единственная чисто российская обучная моделька на текущий момент. Ну, во всяком случае, вот насколько я погуглил, поизучал, да, она раньше называлась RU GPT, а сейчас она называется Гигачат. И её обучали на сберовском суперкомпьютере Кристофари внезапно, который так назван в честь первого владельца сберегательной книжки аж в XIX веке, да? Яндекс GPT пятой версии вроде как используют Н в какой-то там степени, да, Теньковская моделька вроде как тоже на Квен. Есть какая-то лмка от МТС, вроде как своя, но я так понял, что она наружу не продаётся, она используется внутри в каких-то своих ээ своих инструментах. Есть ещё ВК в прошлом году какую-то свою лмку сделали, но, я так понял, они тоже её не публичат и внутри себя используют для каких-то задач большой информации у меня о них нет. Ну так вот, используем, значит, гигачат. Давайте сделаем и агента, который будет весело и бодро за меня решать задачу создания бухгалтерских документов по моему шаблону с вызовом моего кода. Значит, будем использовать гигачата с их продвинутой моделькой GGчаat 2 Max. Это актуальная, самая мощная модель у Гигачата на вот текущий момент, на там типа середину мая. Вот после регистрации там даётся 50.000 токенов бесплатно. Затем можно докупить миллион токенов за 1.950 руб. Мне на разработку и тесты вот первоначальной версии хватило первых бесплатных 50.000 токенов, но потом я себе купил пакет для дальнейшего использования. Значит, исходники все натхабе того, что у меня получилось. Ссылочка, безусловно, в описании. Можете посмотреть сразу. А я покажу более-менее пошагово, как я это делал. Это интересно.
Создаём директорию, переходим в неё. Делаем UV init vcs Git. У нас произошла инициализация, в том числе GitРпозитория. в новую версии UV. Почему-то теперь надо передавать вот VCSG для того, чтобы сразу инициализировался, в том числе Gitрепозиторий. Ну, как бы о'кей. Добавляем сразу, э, необходимые пакеты LChain, Landchain Gigat, Land Graph и Python. Для того, чтобы принимать м конфиденциальные данные из переменных окружения. Открываем main.pвляем сюда, значит, необходимые импорты. Так, давайте сразу активируем виртуальное окружение, чтобы мой VMAS сразу всё подцепил. Отлично. Значит, здесь необходимые импорты, которые мы сейчас будем использовать в процессе нашей разработки. Загружаем переменное окружение и создаём вот модельку гигачата. Берём самую мощную модельку Gigча 2 Max. Чётенько. Также давайте, значит, создадим файл dof и в него вставим э криенлы для гигачата, то есть IP ключик. Gгача credentials я назвал, и вот сюда вставляем ваш замечательный ключик. Справа здесь это, кстати, тот акт, который у нас на выходе должен получиться, да? То есть здесь вставляется вот здесь заказчик, который берётся из реквизитов контрагента, да? Вот это всё реквизиты контрагента, там кто кто подписывает эту историю. Ну и мои реквизиты, они зашиты в шаблон этого документа. И здесь может быть они одна или несколько строчка с работами. Соответственно, все вся стоимость суммируется и в конечном итоге здесь прописывается в финале этого документа.
Дальше нам нужно создать функцию, которая принимает на вход реквизиты контрагента и создаёт на выходе пфочку, записывает её куда-нибудь на диск. Значит, пдфочку я буду создавать с инструментом Type ST. Это такая современная замена латех. Расскажу о ней подробнее в отдельном видео. Вообще классный инструмент. Очень мне понравился для набора и вёрстки текста инструмент. Да, можно это, конечно, всё сделать и с чистопитоновскими библиотеками, там PP PDF, и огромное количество других библиотек есть для работы с пдфками. Но мне удобнее пользоваться сейчас удобнее для решения задачи Types, поэтому я буду пользоваться именно types. Поэтому здесь я создаю директорию types. В директории Types у меня будет несколько а несколько документов. Ну давайте я вам покажу, что что там находится в этой директории. Значит, основное - это аct тотиtтип, да? Это это шаблон документа, по которому будет создаваться пдфоочка. Это пдфочка кушает данные из Jonмента. И задача моя пойтай функции будет собрать этот жечик. Вот такой, ну, по сути, джейсончик просто вот с данными контрагента и его банковскими реквизитами. Вот. Ну, используется здесь одна а ещё библиотечка, написанная в types, потому что в Types есть даже встроенный скриптовый язык программирования внезапно. Вот это, значит, касательно types.
Далее для работы нашей замечательной функции создадим дата-классы, структуру данных. Да, у нас есть банковский реквизиты. У банковского банковских реквизитах есть название банка. Вот, пожалуйста. Да, по Обербанк есть там Биг, есть расчётный счёт, корреспондентский счёт, есть кастомер - это наш контрагент, да, у него есть название, полное юридическое название ОГРН, адрес подписант и банк. Это это тоже дата-класс, вложенный, да, по соответствующей структуре банка. Вот. И есть джоб. Джобов может быть несколько, да. Это вот те проекты, которые мы включаем в счёт либо акт. Ну, в данном случае у нас готовим, а, готовим создание акта. Накидаем рыбу функции, которая будет генерить нам в будущем эти пдфки. Я её называю generate pdf act. Безусловно, название функции должно быть понятным, чтобы в том числе моделька его поняла, да? Функция принимает на вход customмер, типа кастоom, и моделька тоже это поймёт. Безусловно, потому что она будет вызывать эту функцию, и она должна понимать, что что ей на вход надо передать, да? И она принимает список джобов для формирования вот этой таблички с работами. Она ничего не возвращает. И обратите внимание в комменте я вот здесь прямо всё пишу, да, генерирует PDF-факт, в котором заполнены данные клиенты, его банковские реквизиты, а также выполненные задачи. Ну и какие аргументы каких типов, что возвращает. И здесь пока сейчас просто принт, да, потом в будущем мы реализуем, значит, вызов необходимой нам логики. Сейчас давайте сделаем так, чтобы моделька уже сейчас вызывала нашу функцию, и мы могли в этом убедиться через вот этот замечательный принт. Для этого я накидал вот такой код класс LM agent, функция main, которая общается с LM-агентом. И вот здесь она, значит, запускается. Чуть попозже посмотрим, как этот код работает. А сейчас давайте просто проверим его работу, дорогие друзья. Да, здесь ещё нужна ей переменная requisites file. Это файлик, в котором лежат замечательные реквизиты. Да, я сюда загрузил вот такой файлик. Реквизиты PO MTS. Давайте я вам покажу, как этот файлик выглядит. Открою этот замечательный документ. Вот таким вот образом этот файлик выглядит, да? Это обычный вордовский документ с реквизитами PAО MTS. Они покупали у меня курс. И, собственно, у меня сохранился этот файлик с реквизитами. Как раз я готовлю сейчас для них акт. Ну, готовил акт, когда разрабатывал эту систему. А, да, замечательно. Значит, давайте вызовем эту историю. Un main.pi. Unmain.pi. Хопаньки. А, requestes fil, собственно, да, надо прописать. Файлик с реквизитами прописали и вызываем. Лмка нам говорит: "Уточните, пожалуйста, какие работы необходимо включить в акт". Напишите наименование задач и их стоимость. Ну давайте напишем. Разработка CRM системы 200. Ну давайте два 2,5 млн. Вот так напишем. Вот так. И наша функция вызвалась. Обратите внимание. То есть вот этот print generate PDF act он вызывается из нашей замечательной функции, которую мы здесь и написали. Вот он, пожалуйста. Вот вот этот принт работал. То есть сейчас llлмка вызвала нашу функцию generate pdf act, которую мы здесь написали. Вот он, пожалуйста, print. Обратите внимание, она вызвалась вот с такими аргументами, да, то есть передался дата-класс правильной структуры, да, то есть она реально прочитала тот файл вордовский, который я вам показал, и реально достала оттуда правильные все реквизиты по мобильное телесистемы, адрес, да, все банковские реквизиты и так далее. И вот мои, значит, данные, которые я сюда задал. Разработка сервим системы прайс 2,5 млн. Она правильно всё отсюда выбрала. А давайте отсюда выйдем по Ctrl C. Программа даже печатает досвидули. Какая вежливая, хорошая программа, да?
И давайте посмотрим более подробно на тот код, который я накидал. Ну, точка входа в программу If name равно main, да? Главная функция - это main. Давайте перейдём в неё. Модельку, кстати говоря, вверху теперь уже создавать не обязательно. Это там старая версия. Значит, здесь задаётся системпромт, системный промт. То есть это промт, с которым наша штука запускается, да? Твоя задача сгенерировать акт. Для этого тебе надо взять реквизиты контрагента из приложенного файла, а также запроси работы для включения в акт, наименование задачи, их стоимость. Работ может быть несколько. Никакие данные не придумывай. Всё необходимое и строго запроси у пользователя. Имя и отчество подписанта сокращаем до одной буквы, например, Иванов АЕ. Название компании оборачиваем в кавычки ёлочка, например, ОО рога и копыта. То есть до названия компании ставим открывающую ёлочку и после названия ставим закрывающую ёлочку. Модель точно также такая же, которую мы создавали до этого, да? Gгачат 2 Max. А моделька, в принципе, может быть любая, да? То есть здесь инструмент используется LCAin, да, и там может быть и Open AI, и deps всё что угодно. У всего этого есть опишки и коннекторы к этому инструменту LCIN. А значит, здесь создаётся наш класс LLM агент. Давайте в него провалимся, посмотрим, что здесь происходит, да? Она на вход принимает этот класс на вход принимает модельку и принимает tools. Что есть tools? Tools - это инструменты, которые мы даём модельки для выполнения наших задач. В данном случае мы даём один инструмент generate PDF act, то есть, э-э, функция, которая генерирует pdf, но в данном случае пока просто печатает. Дальше там мы напишем непосредственну генерацию, это уже несложно. Это и так понятно, как это происходит, да. Значит, этот класс LM агент сохраняет внутри себя модул, создаёт агент через встроенную функцию в Landgraph create React agent, передаёт туда на вход модель, передаёт тулзы и передаёт чекпоинте для того, чтобы у нас все сообщения, которые в этом чате есть, для того, чтобы они у нас сохранялись. В данном случае они сохраняются in memory. Для prodдак использования, конечно, нужно сохранять контекст, то есть историю коммуникации в чате конкретном, ну, куда-то в постгрос. Опять же, там есть коннекторы для сохранения истории в Погс. Это всё без проблем можно использовать. И в конфих, который будет передаваться дальше в чате, передаётся идентификатор этого чата, да, потому что моделька для того, чтобы она использовала предыдущую коммуникацию в этом чате, должна доступ к этой коммуникации иметь и именно к этой коммуникации, а не какой-то другой, да. Поэтому каждая коммуникация, каждый чатик, да, который вы создаёте там вот в веб-интерфейсе работы с моделькой, которую вы наверняка видели, эти интерфейсы, да, там в chт GPT и так далее, вот у каждого чатика есть есть свой идентификатор. В данном случае у нас при каждом выпуске просто генерится UIT четвёртой версии. И в рамках работы этой сессии, то есть в рамках запуска вот этого скрипта, этот идентификатор будет один, потому что он вот здесь вот сохранён в selfcfig. У этого lmнта есть несколько методов, ну, по сути всего два метода, да. Метод первый uploadлодиed файл, то есть загружает файл, э, с локального компьютера в LM модель, в данном случае в гигачат. И Invoke - это вызов, э, опишки для получения ответа, то есть вызов отправка сообщения в чат и получение ответа, да. Функция Invote. Invoke, она создаёт message в этот месседж опциональные передаются атачменты, если они есть. Роль usеer, от кого отправка сообщения, да, и контент - это тот контент, который мы просим в модельку отправить. получается сообщение и в виде строки, значит, да, отдаётся отдаёт снаружи. Совершенно простенький элементарный класс, да, соответственно, задали системный промт в основной функции создали модельку, инициализировали агент, заплодили файл, да, который я вам сейчас показывал, да, это вордовский, значит, вордовский документ requestes file. А, и потом вызываем туда, передаём в эту модельку системный промт с этим файлом. И моделька нам отвечает, что типа веди введи реквизиты, да? И потом Wild True у нас идёт коммуникация с чатом. Причём эта коммуникация, она может быть любой. То есть мы, в принципе, можем там создать акт, а потом спросить чего-нибудь ещё, да, и, ну, да, эта коммуникация, она будет с учётом предыдущих коммуникаций. То есть, э, первое сообщение о подготовке акта, они могут иметь какое-то влияние на будущую коммуникацию, но я к тому, что это обычный обычная лмка, гигачат, и можем общаться, в общем-то, в том числе на другие темы. Вот поэтому чат здесь вот реализован именно как, как бесконечный цикл. До тех пор, пока мы не выйдем в целом покий interupt из из чатика, всё будет всё будет работать, и мы можем продолжать коммуникацию с этим замечательным чатом. А также здесь где-то задаётся температура, да, вот она задаётся температура по умолчанию 0,1. Значит, для того, чтобы моделька фантазировала больше, нужно задать большую температуру. Для того, чтобы моделька
выдавала более детерминированные ответы, нужно поставить меньшее значения, например, 0,1. В данном случае я не хочу, чтобы она фантазировала, да, я хочу, чтобы ответы были наиболее детерминированными, поэтому я устанавливаю температуру небольшую 01.
Так, ну, собственно, и всё. Давайте реализуем теперь функцию э generate act. Вот такая вот у неё реализация совершенно несложная, да. Мы просто, значит, формируем jonчик. Jсучик пишем в filt.jonjson. В этом джесоне лежат данные контрагенты, его банковские реквизиты. И затем просто через subпроcess вызываем types для компиляции, то есть для генерации PDF-документа. И и, собственно, всё, у нас появляется PDF-документ.
Да, давайте, давайте запустим эту историю ещё раз, а, и посмотрим, посмотрим, как она будет работать. Укажите, пожалуйста, какие работы необходимо включить в акт. Укажите наименование задач и их стоимость. Ну, давайте разработка ERP системы. А давайте вот так напишем. 2 млн руб. Так. И давайте я вот здесь открою именно тот пдфнинничек, который у нас сгенерился. Он лежит в директории Types. Обратите внимание, разработка ERP системы 2 млн руб. Общая стоимость работы 2 млн руб. Всё совершенно замечательным образом работает именно так, как мы и хотели.
Но, дорогие друзья, а это же лэмка, и на самом деле мы можем использовать её более сложным образом. Да, добавь ещё, а один проект на 1,5 млн руб. Э- доработка системы телефонии. Посмотрим, как моделька с этим справится. Справа у нас будет обновлённый PDF-документ, потому что он запишется сюда же. Обратите внимание, доработка системы телефонии 1,5 млн руб. Он понял, что 1,5 млн- это это вот столько, да? А и здесь всё правильно посчиталось. 3,5 млн. Всё замечательным образом работает. Убери из акта первую первую работу, да? Первая работа - это разработка ERP системы. Вторая работа - это доработка системы телефонии. Давайте посмотрим, как моделька с этим справится. Всё замечательно справилась, да? Доработка системы телефонии. А измени стоимость работы на там у нас сейчас полтора млна на миллион. Давайте вот так напишем. Измени стоимость работы на миллион. Поймёт модель нас или нет? Обратите внимание, нас поняла. Было полтора млна, стал миллион. Да и это всё, ну, типа, работает. Вот вот так вот элементарно всё работает.
Дорогие друзья, прикиньте, прикиньте, что скажите классно. А скажите классно. И это именно те возможности, которые даёт нам LLM, да? То есть возможность понимать обычную человеческую речь и в нужный момент вызывать наш код, который делает наши задачи, необходимые нам, с правильными параметрами, которые моделька взяла у пользователя или у другой нашей Python функции. Прикиньте, прикиньте, и это то, что меня действительно воодушевляет, это действительно смена парадигмы. Это действительно даёт новые возможности, потому что не мы пишем if else, а моделька принимает решение, когда нужно вызвать наш код, с какими параметрами, и это делает. И это делает очень красиво.
Когда я эту штуку сделал, я размышлял о том, какие возможности это даёт, и подумал о следующем: а почему бы мне не попросить агента найти файл с реквизитами самостоятельно? Потому что сейчас я даю этот файл ему сам, да, он лежит, э, у меня на диске, я даю путь до этого файла, и, соответственно, у моделя не возникает э вопрос о том, где взять реквизиты. Я прямым текстом прошу, возьми реквизиты в файле, да, но реквизиты лежат у меня где-то на почте. Что если попросить модельку сходить на мою почту, в мой почтовый email-ящик, да, и найти там реквизиты? Вот прямо так. Найди там реквизиты для генерации акта. Я задался такой задачей и подумал, как её делать. Да, что для этого нужно? Для этого нужно написать э две дополнительные функции. Функция первая. Это функция в Питоне, которая сходит в мой почтовый ящик, заберёт за какое-то количество последних дней письма с моего почтового ящика и отдаст в виде списка дата-классов. В этом дата-класе будут, соответственно, необходимые данные по каждому имейлу, да, это subject тема письма, да, это текст письма и это атачменты. Все атачменты надо скачать к себе на локальный компьютер, там где выполняется этот Python код. И путь до этого файла необходимо тоже вернуть в этом дата-классе, да? А, и нужно реализовать ещё одну тулзу, ещё одну Python функцию, которая аплоудит файл с локального компьютера на ээ сервера большой языковой модели, да? То есть нужно доделать, сделать ещё два тулза. Вот сейчас у нас одна тулза, которую мы передаём нашему иагенту. Эта тулза генерит PDF акт. Вот нужно сделать ещё две тулзы. Одна тулза сходит на почту, заберёт письма, а вторая тулза будет выгружать какой-то из атачментов на, собственно говоря, сервера большой языковой модели. Давайте это сделаем. Я покажу, как это работает.
Что я здесь сделал? Я здесь добавил файл mail.p. Это файлик, который отвечает за коммуникацию с имейлом. Собственно говоря, что здесь происходит? Здесь у нас есть аopostupport Яндекспочта. Здесь не нужны. Это для дебага я использовал. Это можно всё убрать. Значит, у нас есть датакласс email. Список этих дата-класов будет возвращаться из нашей функции, которая забирает забирает почту, да? У нас есть subject, body, attachments, список файлнеймов локальных, да, и дата письма. Вот несколько служебных функций для работы с датами насервере, да, несколько эксепшнов, опять же понятно названных. Incorrect variables. Здесь используется переменное окружение для получения, значит, криншилов на на почту, да? Они не передаются на вход этой функции, потому что эта функция должна знать эти данные внутри себя. Ну либо любых здесь можно просто задать, да, переменными, либо просто внутри функции получать эти эти данные, да. Создаётся пустой массив имейлов. Ну и просто мы идём, короче говоря, на почту и за указанное, переданное в функцию количество дней, да, вот здесь равно 3, вот за эти 3 дня или за эти 4 дня, 5 дней, с каким параметром мы вызовем эту функцию, у нас, э, забираются забираются письма и просто вот они возвращаются, да, мы формируем массив emails, в котором, значит, добавляем email, да, subject, body, attachments и data. И возвращаем эти имейлы. Это касательно, значит, вот этого файла mail.p. Из этого файла mail.p PH recent emails. Да, загрузить последние имейлы сюда. А, и обратите внимание, у нас мы передавали в агент одну тулуate PDF act, а сейчас мы передаём два дополнительных тула. Да, первый тул - это FCH recent emails, для получения последних сообщений с почты. И вторая тула upload, email attachment, file to llm для того, чтобы загрузить файл в, значит, лмочку. Причём те файлы, которые загружаются в ломочку, я их здесь принтую для того, чтобы посмотреть, какие файлы загрузятся в лэмочку, потому что атачментов там, на самом деле, а несколько. Атачментов там, на самом деле, несколько. А, дорогие друзья, ну, собственно говоря, давай давайте мы принтанём эту историю тоже, чтобы вы в этом убедились. Ну, вот здесь в mail.py, Когда у нас есть файл name, я его запринтчу, что у нас есть такой-то атачмент, просто чтобы мы видели, какое количество атачментов есть на почте, и сравнили это с теми файлами, которые моделька решит выгрузить к себе. Это интересно. Это интересно, как как это будет работать.
Промт мы здесь, безусловно, тоже изменили. Старый промт я закомментирую. Закомментировал. Можно его брать. Значит, новый промт системный, да? Твоя задача сгенерировать акт. Для этого тебе надо найти реквизиты компании, контрагента на моей почте. Они там могут быть в тексте письма или в прикреплённом файле. Мои реквизиты не ищи и не запрашивай, они есть в моём коде. Для акта надо запросить работы, наименование задач и их стоимость. Работ может быть несколько. Никакие данные не придумываем. Всё необходимое строго запроси у пользователя. Имя, отчество, подписанта. Точно также сокращаем до одной буквы. А название компании оборачиваем в кавычки ёлочкой. Ну, собственно, так как это и было до этого. А, и и, собственно говоря, всё. И, собственно говоря, всё. То есть мы просто дописали, дописали два тула, немножко изменили системный промт и и всё. Давайте посмотрим, как эта история будет работать. Пидячку я пока здесь закрыл.
Для начала мне нужно получить доступ к вашей электронной почте, чтобы извлечь необходимые реквизиты компании Котрагента. Укажите количество, укажите, пожалуйста, за сколько последних дней вам нужно просмотреть почту, также сообщить, какие именно работы. А, 4 дня. А, 4 дня а работы. А, ну, например, создание ERP системы 3 млн руб. Хопаньки. Посмотрим. А, 4 дня задано, да? Найдено 17 писем за последние 4 дня. Он понимает, что тут вот 1 2три несколько есть атачментов, и он выгружает к себе, обратите внимание, аплодит только файл с реквизитами. Вот вот этот файлик картинки он не выгружает, то есть он понимает, что вот в этом письме, значит, есть вероятно мм реквизиты, да, и он выгружает для анализа только вот этот файлик с реквизитами, да, давайте давайте откроем, посмотрим, что там за пидка случилась. Хопаньки, да, создание ERP системы 3 млн руб. Да, всё совершенно великолепно, дорогие друзья. Однако, дорогие друзья, я вижу, что здесь реквизиты неправильные. Подписант Иванов там подписант не Иванов в файле с реквизитами и почему-то показывается Unicredit BН там не Unicredit Bank. То есть мы видим здесь классическую проблему галлюцинации. Классическую проблему галлюцинации. Поэтому надо значит э пояснить модельки, чтобы он ни в коем случае не придумывал э реквизиты. Реквизиты строго брал только из файла на почте.
Так, короче говоря, прямо в момент записи мы с вами поймали галлюцинацию. модельки неправильны были реквизиты, которые моделька просто выдумала, да? неправильная была фамилия мечество своего подписанта и так далее. Короче говоря, я сейчас, поизучал и понял, что если в рамках одного и агента происходит много действий, то есть в рамках одного агента и поиск, значит, письма и выгрузка этого письма на сервера модельки и анализ реквизитов из этого письма, из из этого файла выгруженного, да, и генерация ПД-факта, то модель начинает галлюцинировать. Мне не удалось оставить такой промпт, который в рамках одного и агента решил бы эту задачку. Поэтому я разбил просто задачку на на два иагента, которые последовательно отрабатывают. Задача первого иагента найти, значит, файлик с реквизитами на почте, а задача второго агента сгенерить правильный акт с реквизитами, взятыми уже из локального файла, и второй агент ничего не знает, откуда этот файл взялся. И в такой конфигурации это замечательным образом работает, дорогие друзья.
Ха, короче, как это работает, да? У нас есть первый агент, его пром такой. Твоя задача найти файл, содержащий реквизиты компании в одном из писем. на почте найди имя этого файла и выведи его ответом. В ответе только имя файла или слова нет, если не нашёл. Соответственно, моделька точно точно такая же. Ээ создаём первого агента. У него доступен только один tool. Это fch resent emails, да? То есть просто выгрузка последних последних писем. Он даже не получает возможности выгрузить какой-то файл к себе для анализа. Просто смотрит письма и по ним ищет реквизиты. мы получаем ответ и сохраняем его сразу в файл name, потому что мы попросили модельку отвечать или именем файла, или словом нет, если не нашёл. Если, соответственно, вернулось слово нет, то мы выходим, ничего не получилось, не получилось найти реквизиты на почте, да. В противном случае, значит, мы создаём, ээ, нового агента, да, то есть это второй агент, у которого, собственно говоря, доступно доступно только generate PDF act, только функция генерации PDF-акта. Вот, соответственно, мы в этого агента уже выгружаем тот файлик, который мы получили из первого агента. Вот он файл name, да? И, собственно, всё, задаём уже новый промт. Это ровно тот самый промт, который у нас был до этого. Твоя задача генерировать ак. Для этого тебе надо взять реквизиты контрагента из приложенного файла, да? Соответственно, приотачиваем файлик к этому промпту, который до этого был загружен. И таким образом всё работает.
Дорогие друзья, давайте давайте запустим эту историю и посмотрим а и посмотрим, как она будет работать. anmain.p найдено 17 писем за последние 3 дня. Сейчас он что-то даже не стал меня спрашивать, за сколько дней выгрузить письма. Ну о'кей. Состав работ, допустим, разработка ERP. Ну вот сколько-то там рублей, много-много рублей. Акт успешно создан. Разработка ERP 10 млн руб. Всё чётенько, дорогие друзья. Измени стоимость на 2 млн. Причём сейчас реквизиты правильные, да? Чараева. Это правильный подписант, правильный банк, МТСБанк и так далее. Ну вот 2 млн руб. у нас, э, здесь стоимость изменилось. То есть два иагента замечательным образом решили эту задачу, хотя один иагент почему-то не решал, да? То есть мы можем делать цепочки из иагентов. Каждый из иагентов делает какую-то свою простенькую задачку, но суммарная эта история может быть вполне себе сложной.
Дое друзья, кавчик, каефчик. Ну то есть вы просто вдумайтесь в ту штуку, которую мы сейчас сделали. Мы сделали и агента, который ходит на почту, ищет там реквизиты и из этих реквизитов создаёт нам автоматический акт. Прикиньте, что, ну, как вот мы эту задачу решали бы на ифлсах, дорогие друзья, как мы эту задачу решали бы на ифлсах. А, и агенты дают нам такую возможность. Прикиньте, что прикиньте, что то есть, по большому счёту, мы здесь описываем бизнес-логику обычным русским языком, а наш код пишем в формате коннекторов, да, там может быть любая логика. Это может быть и сложная логика, но в данной задаче это просто коннекторы к внешнему миру. То есть и агент должен взаимодействовать с внешним миром, чтобы какую-то пользу э практическую нести, чтобы решать какую-то практическую задачку, а не просто быть чатиком, да. И мы, соответственно, пишем, э, наш Python код для коннекторов к внешнему миру, а бизнес-логика описывается фактически просто обычным, обычным русским языком. Значит, были раньше такие системы BPM системы, но не были. Есть система Business Process Management, система систем управления бизнес-процессами. И есть даже такая нотация BPMN, Business Process Management Notation, наверное, да, там такие всякие схемки рисуются, да, и вот при помощи этих историй мы можем автоматизировать бизнес-процессы, да, и BPM-система будет вызывать внутри себя те самые коннекторы к внешнему миру, да, там создать совещание, пингануть сотрудника, попросить approve какого-то документа у руководителя и так далее. Вот по большому счёту сейчас с лэмками у нас есть возможность всё это дело выкинуть и просто описывать бизнес-логику обычными словами. Обычными словами, просто по-русски или там по-английски, как нам удобнее. А те самые коннекторы какому-то внешнему миру точно так же будут написаны там на Питоне или на каком-то привычном для нас языке программирования. И это первая мысль.
Вторая мысль в том, что обратите внимание, мы здесь не создавали никакого интерфейса. интерфейсом является чат, но за счёт того, что в основе чатика у нас вот такой вот болванчик, который понимает обычный язык, э, он может служить интерфейсом, да? То есть ещё раз, да, добавь э ещё одну работу. Разработка CRM, ну, допустим, 3 млн. И он сейчас это сделает. И он сейчас сделает, то есть он добавит ещё один проект. У нас был один проект разработка ERP. Сейчас сюда добавится ещё один проект разработка CRM. Обратите внимание, 3 млн. Вот суммарная суммарная стоимость, там 5 млн получилась, а мы не писали для этого никакого интерфейса. Что если нам бы пришлось сейчас писать под это интерфейс? Ну а как этим добром пользоваться-то ещё? Ну типа интерфейс какой-то нужен, да? Соответственно, нам нужен был бы фнENД. Э на фронтде нужен был какой-то дизайн. О'кей, мы могли бы взять какой-то готовый темпate, но об этом надо думать. Готовый мплейт тоже надо искать. Там буotstraap, не буotstraap, что там сейчас модно, да? нужна бы была бы какая-то JavaScript обвязка, как бы мы туда добавляли добавляли вот эти работы, вот эти товары, да? То есть нужна какая-то кнопочка будет добавить добавить товар, нажать эту кнопочке, появляется какая-то формочка. В этой формочке мы вводим наименование товара и стоимость этого товара. Э товары можно редактировать, да, то есть после добавления эту информацию нужно редактировать. То есть на фронтде должна быть кнопочка какая-то редактирования ещё, да? Должна быть какая-то кнопочка удаления. Если мы хотим удалить отсюда товар, то здесь мы просто пишем текст удали какую-нибудь строчку, да, и он это удалит. А на фронтенде это всё нужно будет писать. Нужно будет писать под это фронendд, то есть джаваскриптовый код, безусловно, там на реакте, не на реакте, на чём угодно. И нужно будет писать бэкэндерские ручки, которые будут обрабатывать эту историю, которые будут принимать там создание, удаление, апдейт и так далее. А здесь нам ничего этого не нужно делать. Мы просто получаем фактически фронт в виде чата. И он просто работает. Причём вот эта штука, она, ну, здесь генерит просто акты, но мы можем сделать и агента, который генерит и акты, и счета. Например, один иагентик будет генерить акты, другой счета, а третий будет координировать их работу, например, да? И тогда мы можем попросить тот агент, который координирует работу, сделать сразу и акт, и счёт. Да? А и нам ещё раз, нам для этого не нужно будет делать ничего, потому что у нас уже есть агент, который делает акт, есть агент, который делает счёт. И наш агент координирующий просто сначала вызовет один один иагент, потом вызовет второй иагент, и мы получим результат. А на фронтенде нам опять же пришлось бы под это дело делать какую-то логику, делать какой-то фронт, какую-то кнопочку, потому что у нас есть кнопочка создать акт, отдельная кнопочка создать счёт, и нужна тогда будет какая-то третья кнопочка создать счёт и акт. А здесь ничего этого делать не нужно. Здесь мы просто на русском языке э делаем всё, что нам надо. При этом обратите внимание, допустим, по какой-то причине, да, вот мы создали акта, нам оттуда отвечают: "Блин, извините, но подписант неправильный в наших реквизитах подписант там не Чераева Ювен, а - Пупсик Иван Васильевич, да? На нашем интерфейсе такой логики может не быть, ну не заложили мы её. Ну не заложили, да, ну типа нафига? Данные откуда-то берутся, что человек ввёл, то то и будет там, да? А здесь нам даже не надо это закладывать, мы просто можем это заменить. Замени под писанта на пуп Сик Иван Васильевич. Хопаньки. И эта история сейчас, судя по всему, заменит. Да, действительно. Вот Пупсик Иван Васильевич здесь появился. Ну, скажите, классно. Скажите, классно. И это действительно даёт новые возможности. Это действительно даёт новые возможности. Да.
Речь не о том, что искусственный интеллект может писать код. Ещё раз, это всё вот вообще дело десятое, это всё ерунда. А вот это круто, это круто, это полезно. И если вы ээ послушаете выступление там Цукерберга, послушаете выступление главы Nvidia, то все они говорят, что в ближайшие годы нас ожидает а тотальнейший бум и агентов. К там двадцать что ли году ожидается, что количество иагентов, которые разработаны и которые функционируют, их количество будет больше, чем количество людей, проживающих на нашей с вами планете. И я легко в это верю. Я легко в это верю, потому что это та штука, которая действительно даёт новые возможности, действительно изменяет парадигму, в которой мы создаём программно обеспечение и в которой мы создавали программное обеспечение фактически все последние 80 лет. Теперь это можно делать э при помощи и агентов и получать те самые новые возможности. М, кафчик.
Да. Ещё одну штуку хочу вам показать, дорогие друзья, что эта штука работает нормальным образом с разными документами. Вот у меня тут есть куча реквизитов компании, э, с которыми я недавно работал, которым я выставлял счета. Вот там Яндекс, э, сотрудник у меня учится, Rosбиitch Astra, разработчик Linux Astra, у меня учится, Промстандарт, RTК ИБ, ВК цифровые технологии, МТН интеграция, МТС, вот на котором я показывал. Все эти компании оплачивали обучение сотрудников у меня на курсе хардкорная веб-разработка. Вы, кстати говоря, своего руководителя можете тоже попросить свою компанию оплатить, оплатить курс и прийти ко мне поучиться, если вдруг хотите. А, ну так вот, да, давайте проверим, что это всё будет нормально работать с этими файлами, что нигде эта история не споткнётся и всё будет хорошо. Для этого я откатил правки с поиском, значит, реквизитов на имейле. И просто, да, берём берём файлик значит, который у нас лежит в константеesфайл и работаем с ним, с этим замечательным а файликом. Ну вот давайте попробуем RTB. Это у нас тоже docxфайлик. Давайте я открою, покажу, как он выглядит. Ну вот, Ростлеком. Компания группа Ростлеком РТК информационная безопасность. Давайте проверим на этом файлике, будет ли у нас всё чётенько работать. Чётенько работать. UV run. А потому что Doc X я что-то не скопировал. Docx, да. Всё, вот так. Uvrunmain. Запускаем. Ну давайте. Обучение студента 170.000. Обучение сотрудника надо написать. Ну ладно, неважно. Замечательно. ОРТК и Б Нестер и НН угрн. Всё замечательным образом подцепилось. Запустим с этим файлом. Ну давайте отсюда я просто скопирую. Акт успешно сформирован. Вот ООПМ стандарт Кочеткова по Сбербанку. Всё замечательным образом тоже а сработало. Дальше идём. Ядролапс. Давайте проверим на ядре обучение сотрудника. Да, замечательно. Ядролапс маршин. Всё. великолепным образом сработало биттехастра. Давайте проверим. Ну то есть, видите, здесь разные прямо doc, doc x, pdf, да, всё, всё замечательным образом работает. И реквизиты выдираются правильным образом. Скажите классно. Скажите классно. Причём формат этих документов, он, ну, типа разный вообще. То есть там по-разному информация представлена во всех этих файлах, но при этом всё замечательным образом работает. Вот, например, биitтех. Давайте посмотрим, как реквизиты здесь здесь вот в такой табличке, да, а предыдущий файлик, который мы разбирали, э, вот, вот в такой таблички, да, а пдфоочка с банком точка, да, вот такая табличка, да, там промстандарт, ээ, вот вот такая какой-то файлик, да, здесь в таком виде, но при этом со всеми этими форматами всё замечательно замечательно работает. Вот Rosбиit Astra, пожалуйста. Всё, всё, тоже красота. Ну давайте в Вике ещё попробуем. Вкантосик. Сработает ли с Вантосиком? Всё, чётенько. Давайте проверим. Хопаньки, хопаньки. Перезапустим. Что? Какие у нас там реквизиты у ВКонтосика? Давайте, значит, Багудина Елена Енадьевна, подписант и ИН. Вот такой скопируем. Да, Багудина и Инноочка правильная. Ну, то есть замечательным образом всё работает ровно так, как мы хотим. Каефчик.
Вот такие вот замечательные и агенты, изменяющие в реальном времени практически вот здесь и сейчас наш мир. И вы этим можете пользоваться, это доступно вам. Вы вы можете реально уже сейчас этим пользоваться. Представляете? Подумайте, где вы это можете применить. Подумайте, что вы можете с этим сделать. Какой петпроект вы можете с этим замутить? Что вы можете добавить свой гитхаб, что вы можете добавить своё резюме, а может быть и какой-то бизнес вы замутите с этой историей. Тут, на самом деле, возможности огромное количество. И подумайте, подумайте. Спасибо, что посмотрели, и останемся на связи. До следующих выпусков. Пока-пока. Пока-пока.