Мульти-агентские сетки ИИ для разработки шаблонов ZennoPoster

LaGir

Client
Joined
Oct 1, 2015
Messages
230
Reaction score
948
Points
93
Всем привет! :-)
В предыдущей своей статье, посвящённой использованию LLM в задачах для Zenno, я в общих чертах упоминал 2 «продвинутых» способа улучшения ответов от нейронных сетей: Retrieval Augmented Generation (RAG) и Fine-tuning. В этой статье я расскажу об ещё одном способе «прокачать» использование LLM в ваших задачах, а именно о построении так называемых мульти-агентских сетей.

Сразу предупрежу, что статья носит технический и в большей мере теоретический характер (т.е. без конкретного шаблона или решения под отдельную задачу). Цель – рассказать понятным языком о мульти-агентских сетях искусственного интеллекта, дать пищу для размышлений «на подумать», как вы могли бы имплементировать и применить этот инструмент в ваших проектах. Соответственно, статья главным образом ориентирована на продвинутых разработчиков шаблонов для ZennoPoster. Тем не менее, новый идеи и схемы вполне могут почерпнуть любые пользователи продуктов ZennoLab.

Зачем нужны мульти-агентские сети?

Прежде чем перейти к тому, что такое мульти-агентские сети, полезно будет вспомнить про некоторые особенности того, как вообще нейросети решают задачи (отвечают на ваши запросы).
В силу своих архитектурных особенностей, они это делают с «нахрапа», т.е. устроены так, чтобы тут же выдать ответ, без какого-либо анализа запроса и размышлений.
И в этом заключается проблема. Люди, например, всегда имеют возможность подумать, «прокрутить» в мыслях вопрос, порассуждать, ничего при этом не говоря, просто погрузившись мысленно в вопрос – и только после этого сказать итоговый ответ. Внутреннее же устройство текущих поколений нейросетей такое, что времени «на подумать» у них нет, они работают так, что сразу выдают ответ. Формально они «думают» пока «печатают» ответ (т.к. время приёма и выдачи токенов – грубо говоря, как раз время операции «мышления»). Это выглядит примерно так, как если бы какой-нибудь умный, начитанный человек отвечал на чьи-либо вопросы сразу, как сплошной поток сознания. Понятно, что каким бы гениальным в плане знаний и интеллекта этот человек ни был, на часть ваших вопросов он не мог бы сходу толком ответить, т.к. «пауза на подумать» – полезная и нередко необходимая вещь для нормального ответа на сложные, комплексные вопросы/запросы.

Проблема понятная, и в той или иной мере люди придумывают для неё решения.
Есть техники «цепочки мыслей» (CoT, Chain of Thought) и схожие, которые дают чуть больше пространства для маневра. Как правило, она заставляет прописывать нейронку все шаги решения перед окончательным ответом, что одновременно даёт ей что-то вроде «дополнительного времени» для рассуждений.

CoT.png

(источник картинки: гайд по промптингу)

Есть семейство моделей «o1» от OpenAI, принцип работы которых схожий, только «рассуждают» они в большей мере «про себя», используя для время этого время инференса. На момент написания этого текста такие модели есть только у OpenAI, но уже точно известно, что конкуренты разрабатывают аналогичные модели (Anthropic, Google), т.к. эта проблема действительно очень важная, а подход к решению вполне себе хорош.

Также люди заметили, что предварительно разбивать исходный сложный запрос к нейросети на несколько отдельных вопросов или подзадач – хороший подход, и даёт лучшие результаты. Если сделать запрос более подробно, раздробить его на более мелкие задачки и вопросы – почти наверняка вы получите от LLM результат лучшего качества. Тут можно провести аналогию с составлением ТЗ – чем лучше, осмысленнее и подробнее вы опишите свою задачу для исполнителей, тем больше шансов, что результат работы будет качественнее и достигнут в меньшие сроки (или же меньше времени и усилий всех сторон уйдёт на уточнение этого самого ТЗ).

Всё это напрямую имеет отношение к целесообразности мульти-агентских сеток искусственного интеллекта, поэтому наконец возвращаемся к тому, что же это всё-таки такое.

Что такое мульти-агентские сетки ИИ

Первое ключевое слово в данном случае – «агент». Под агентом в сфере использования нейросетей понимают разное в зависимости от контекста, в нашем же случае агентом можно назвать отдельный «инстанс» запущенной нейросети, у которого задан определённый системный промпт (роль + инструкции) под строго определённую узкую задачу. Для примера, если вы общаетесь с ChatGPT с предзаданным системным промптом, то вашу собеседницу-нейронку можно назвать агентом. Если вы создаёте или переходите в другую вкладку чата с другим системным промптом – это уже другой агент.
Мульти-агентская сеть – соответственно, набор таких экземпляров («запущенных выделенных диалогов») ИИ, которые взаимосвязаны и общаются не с вами (или не только с вами), а между собой, в целях выполнения поставленной задачи.

Чаще всего такую сеть иллюстрируют и создают как команду специалистов (например, разработчиков). Например, возьмём одну из самых простых схем-составов:
  • Проджект-менеджер;
  • Программист;
  • Ревьювер кода.
На основе этого состава и строим команду ИИ-агентов: первому прописываем роль PM’а и составляем ему соответствующий системный промпт с чисто его задачами, то же самое по аналогии проделываем с вторым и третьим согласно их ролям.
Далее в коде имплементируем их взаимосвязь – например, агент-PM общается только с человеком, а дальше передаёт задачу агенту-программисту, тот в свою очередь пишет свой ответ, но опять же не человеку, а агенту-ревьюверу (код на проверку, если он написан) или обратно PM'у (если нужно что-то уточнить).

Agents_and_arrows.png


По сути, у нас получается воронка, которая декомпозирует исходную задачу, она выполняется поэтапно и с уточнениями/доработками на каждом шаге. Причём «команду» можно легко расширять, добавляя экземпляры нейронки с другими полезными ролями, например программистов с узкими специализациями, тестеров, тим-лида и т.д.

Результат как правило сильно лучше для сложных задач, если не использовать сеть, а только один «экземпляр» нейронки. Примерно, как лучше будет результат от команды специалистов-людей, нежели одного универсального специалиста-человека. И, согласитесь, создать пайплайн из команды нейронок явно проще, чем собрать команду из людей для решения задачи.

Простой пример устройства мульти-агентской сетки

Для закрепления понимания, давайте рассмотрим пример той команды из 3 агентов чуть ближе к контексту Zenno.

Представьте, что вам для шаблона нужен C#-сниппет, в котором должен быть заход на некий сайт, потом проверка наличия капчи и решение её в случае обнаружения, потом заполнение и отправка некоей формы. И у вас есть эта самая мульти-агентская сеть, состоящая из 3 инстансов ИИ: проджект-менеджер, программист и ревьювер кода. Рассмотрим пошагово, как может работать обращение с задачей к этой системе агентов.
  1. Вы описываете задачу агенту-менеджеру своими словами.
  2. Поскольку у этого агента в системном промпте описано, что он должен делать со входящей задачей как PM, он отвечает вам соответствующим образом – запрашивает необходимые подробности и дополнительные данные, чтобы лучше узнать задачу и её особенности. Например, какие сервисы должны использоваться для разгадки капчи и т.д. и т.п.
  3. По завершению уточнений отдельным «потоком» экземпляр агента-менеджера на основе всего вашего диалога составляет детальный план для реализации (чтобы передать его дальше агенту-программисту), разбитый на подзадачи.
  4. Агент-менеджер начинает «диалог» с агентом-программистом, предоставляя ему необходимую информацию по проекту и ставя конкретную (первую) задачу на реализацию.
  5. Агент-программист пишет код для данной ему задачи, и передаёт его агенту-ревьюверу, вместе с описанием выполненной задачи и необходимыми данными. Для решения задач конкретно под Zenno ему можно подгружать в контекст заранее сохраненную документацию по API ZennoPoster, с инструкцией в системном промпте использовать её при написании кода.
  6. Агент-ревьювер, получив код, опять же согласно своему персональному системному промпту проверяет, оценивает и критикует полученный код, при необходимости отправляет агенту-программисту обратно на доработку.
  7. После успешного «аппрува» ревьювером кода для конкретной задачи, агент-ревьювер даёт об этом знать агенту-менеджеру, код сохраняется отдельно.
  8. Агент-менеджер ставит следующую подзадачу агенту-программисту, шаги 5-7 повторяются уже для неё.
  9. По истечению списка задач код собирается в одно (при необходимости дополнительно анализируется ревьювером на случай ошибок в компоновке или ещё чего-нибудь) и выдаётся на выход вам как заказчику.
Agents_and_prompts.png


При этом сложность этого алгоритма можно увеличивать на свое усмотрение, тестировать разные варианты. Например, опять же, увеличить число сотрудников и ролей, уточнять их промпты. По промптам – например, каждому агенту прописать в инструкции, что если он считает, что ему для реализации нужно больше информации, то он должен обратиться с соответствующим запросом «вверх по цепочке», т.е. к предыдущему агенту за уточнениями.

В виду особенностей ZennoPoster и, в частности, ProjectMaker, сложнее всего организовать тестирование создаваемого агентами кода. Тем не менее, способы тестирования можно придумать.
Например, завести агента-тестера, который будет иметь доступ к планировщику ZennoPoster, чтобы запускать в нём специальный тестовый шаблон с созданным кодом.
Способность запускать шаблон агенту-тестеру можно дать с помощью function calling (т.е. написать код нужных функций и прописать возможность нейронке вызывать их при необходимости). Для простого понимания – например, способность ChatGPT ходить гуглить что-то, обращаться к DALL-E за генерацией картинок – как раз реализована с помощью function calling.

«Засунуть» код в тестовый шаблон можно через блок «Общий код», в котором есть галочка загрузки кода из файла.

OwnCode.png


В итоге – агент-тестер с помощью function calling:
  • Помещает подготовленный и оформленный код в специальный файл;
  • Запускает в ZP тестовый шаблон, в котором автоматически грузится этой файл в «Общий код»
  • Ждёт окончания выполнения шаблона в списке задач ZP. Если выполнение было прервано по ошибке, значит код точно надо возвращать на доработку агенту-программисту «вверх по цепочке».

Пару слов об позиционировании и оценке мульти-агентских сетей

Как мы выяснили из предыдущей главы, мульти-агентские сети дают очень приличный буст в решении сложных, комплексных задач, на которые не получить решения, просто задав вопрос условному ChatGPT.
Какие это сложные задачи? По нынешний день чаще всего это то же программирование, а именно сравнительно крупные проекты. Если у вас кодовая база на тысячи строк кода, единичный ИИ-агент или ассистент мало чем сейчас может помочь (даже если размер контекстного окна позволяет засунуть в него весь репозиторий с кодом, документацией и дополнительными данными). Как правило, хорошо помогать у них получается только с простыми и рутинными задачами.

Всё, что сложнее - для базовых моделей становится проблемным. И при использовании в таком виде зачастую можно столкнуться с ситуацией из мема:
cat_ai_coding.jpg


Также современные нейронки «из коробки» мало чем смогут помочь для написания с 0 более-менее крупной программного проекта, опять же условно на тысячи строк кода со сложной структурой.

Мульти-агентские сетки же показывают себя довольно хорошо и многообещающе в этом плане.

Существует бенчмарк для нейросеток под названием SWE-bench, который построен на куче сложных задач, которые решают люди-программисты в своей обычной работе (SWE – сокращение от software engineer).
Лидерборд очень показателен в том плане, насколько современные нейронки «из коробки» ещё далеки от того, чтобы начать заменять программистов. Почти все модели в нём с высокими результатами – не просто нейронки, а системы из различных вспомогательных тулов, в том числе мульти-агентские системы. Кстати, хоть и до 100% бенчамарка ещё далеко, прогресс идёт достаточно бодро. На моей памяти, в начале 2024 года ещё не было систем, пробивающих 10%, а к концу года уже есть те, которые смогли пробить 50%.

Немного о способах реализации

Всё вышесказанное нам вполне релевантно, так как разработка шаблонов на ZennoPoster тоже относится к программированию (кубики тоже в общем относятся к визуальному программированию, low-code или no-code).
Однако, есть некоторые проблемы, особенно когда надо не просто написать сравнительно сложный сниппет или шаблон в общем коде.
Если вы занимаетесь разработкой на Zenno, скорее всего вы хотя бы немного понимаете C#-код, он вам знаком, или по крайней мере привычно подключать внешние dll-библиотеки и пользоваться чем-то сторонним. В случае же с нейронками – большинство полезных инструментов и фреймворков написаны на Python. На C# тоже есть всякое полезное и уже готовое, но опять же сделано всё под современные версии .NET, которые ZennoPoster в настоящее время не поддерживает. Надежда только на ZP8, в котором и .NET обещали актуализировать, и питон возможно добавят, но она выйдет пока неизвестно когда.
Поэтому, разработать и закодить мульти-агентскую сетку в настоящее время значительно проще будет с помощью внешних инструментов на питоне, а не в рамках привычного окружения ZennoPoster.
Из хорошего – Python сравнительно прост для вхождения и базового использования, освоить его для юзания модулей для нейронок по готовому коду из интернета (или от самих нейронок), можно достаточно быстро и без особых усилий.

Ещё от себя в этом случае порекомендую посмотреть в сторону Jupiter Notebook и гугловский Colab (аналог юпитера в облаке) в качестве сред для запуска кода на питоне. Это не классические IDE, а т.н. интерактивные среды, по использованию и механике работы очень много похожего с разработкой и тестированию шаблонов в ProjectMaker.
Плюсом, вот несколько полезных ссылок на фреймворки и материалы для построения мульти-агентских систем.
Статья-исследование с примером мульти-агентской системы
Пример мульти-агентского фреймворка:
Ещё один фреймворк для построение мульти-агентской сети:
И ещё один, под локальную лламу:
Статья про создание системы с CrewAI и Ollama:

Function calling и прочие тулсы на C# - Semantic Kernel и Microsoft.Extensions.AI

Пример-задание напоследок: автоматизированный подбор путей XPath

Если вы добрались до этого места в статье, и вам всё ещё интересна тема мульти-агентских систем, предлагаю в общих чертах рассмотреть ещё один пример в контексте Zenno – и, как домашнее задание для желающих закрепить на практике, попробовать реализовать его самостоятельно :-)

Перейдём к постановке задачи. В большинстве шаблонов для ZennoPoster нужно взаимодействовать с HTML-элементами (ссылками, кнопками, формами и т.д.), а для этого их сначала надо найти. Один из наиболее эффективных и широко используемых способов – поиск элементов по путям XPath.
Иными словами, составление путей XPath – распространённая и знакомая многим рутинная задача в рамках создания шаблонов. Почему бы ради практики не взять такую задачу для реализации небольшой мульти-агентской системы?

Давайте прикинем состав агентов, их роли, примерные инструкции и что они будут делать.

  • Составитель XPath путей.
На вход агенту должны подаваться следующие вещи:
  1. Исходный код (или DOM) страницы;
  2. HTML-код (свойство OuterHTML) элемента, к которому должен быть составлен путь XPath.
  3. Необходимое количество совпадений составляемого пути (точное, максимальное или минимальное).
В системном промпте должно быть отражено:
  • Роль агента, т.е. что он специалист по XPath и HTML-разметке;
  • Те 3 вещи, которые ему будут подаваться на вход пользователем (если пользователь предоставил не всё – агент должен запросить недостающую информацию)
  • Правила написания хорошего XPath-пути (краткость, низкая зависимость от других элементов, независимость от случайных названий атрибутов и т.п.)
  • Необходимость использовать только правила XPath 1.0 (т.к. ZennoPoster поддерживает только его).
  • После написания – сохранение пути (или нескольких) XPath в отдельный файл или передача его напрямую агенту-ревьюверу вместе с исходными данными.
  • Переписывание путей, если от агента-ревьювера пришёл негативный фидбек, с учётом этого самого фидбека.
  • Переписывание путей, если от агента-тестера пришёл фидбек о том, что элементы не найдены (или найдены не в нужном количестве).
А также в качестве контекста можно подгружать документацию по XPath, если базовая моделька маленькая или простая.

  • Ревьювер.
В инструкции для ревьювера должно быть:
  • Указание проверки полученных путей на соответствие синтаксису XPath 1.0;
  • Указание оценки полученных путей на соответствие правил хорошего написания;
  • Указание возвращения путей на доработку агенту-составителю, если допущены ошибки, с описанием этих самых ошибок.
  • Указание передавать валидные пути агенту-тестеру.
Так же, как и составителю, можно подгружать в контекст документацию по XPath.

  • Тестер.
Для агента-тестера в идеале реализовать function calling, чтобы он мог программно проверить находимость элементов по путям в исходнике HTML-странички.
В рамках Zenno и C#, например можно написать микро-шаблон, который будет проверять количество совпадений путей на указанной страничке, и сохранять где-нибудь в файлик на диске. Безбраузерно можно сделать с помощью библиотечки HtmlAgilityPack. Агент-тестер может запускать просто батником этот шаблон, а потом читать файлик с результатами.
Если решите попрактиковаться с Python, полностью аналогичную задачу можно сделать с помощью библиотечки lxml – там всё ничуть не сложнее, чем с HtmlAgilityPack.
В системном промпте агента-тестера, соответственно, должно быть прописано:
  • Его задача получения исходных данных и путей, проверка последних с помощью запуска function calling;
  • Если элементы на тесте не нашлись (0 совпадений), или нашлось количество вне допустимого изначальными условиями диапазона, нужно сообщить агенту-составителю о необходимости переписать пути XPath.
  • Если тест пройден полностью корректно, отправить валидные пути в результирующий файл или диалог/чат.

Agents_XPath.png


Троих основных агентов для данной задачи может быть достаточно, но вы, конечно, можете добавить ещё по своему усмотрению. Например, отдельного агента-маршрутизатора/оркестратора, для того чтобы более понятно и надежно построить взаимодействие и обмен информацией между основными агентами.

Как можно заметить, формулировать саму задачу «а-ля напиши мне XPath» даже необязательно, т.к. в системном промпте агента на входе можно сразу прописать, что ему будут подаваться входные данные, а его задача на основе них написать пути. Необязательно и подавать вам лично входные данные каждый раз. Можно, например, заранее пройтись по страничкам сайтов и записать их исходники и целевые OuterHTML, а затем написать код цикличного скармливания их агентской системе. А если пойти ещё дальше, можно написать отдельного агента, который будет получать GET-запросом исходник и сам искать нужные OuterHTML по вашим «человеческим» описаниям а-ля «найди все поля для ввода имени и телефона, а также кнопку в тех местах страниц, где они встречаются в рамках одной формы». ;-)

Резюмируя, с помощью дополнительного инструментария и техник навроде мульти-агентских сеток, уже сейчас можно создавать на основе нейросетей очень мощные системы на около человеческом уровне способностей, для разработки шаблонов на ZennoPoster и не только. :-)
 

radv

Client
Joined
May 11, 2015
Messages
3,837
Reaction score
2,046
Points
113
Спасибо за интересную статью, :az:особенно за картинку о представлении кодинга с ИИ :D действительно так бывает, и гоняет одни и те же ошибки по кругу, приходится самому дорабатывать код. :-)
 
  • Thank you
Reactions: LaGir

smartmail

Client
Joined
Apr 18, 2015
Messages
390
Reaction score
202
Points
43
грамотная статья
надеюсь, разработчики Zenno8 смотрят в эту сторону и делают шаги в правильном направлении)
 
  • Thank you
Reactions: LaGir

Lest

Client
Joined
Mar 20, 2020
Messages
78
Reaction score
81
Points
18
Так заморачиваться с созданием сеток под определённую задачу для улучшения выдачи LLM наверное имеет смысл, только если пилишь на потоке однотипные шаблоны, регеры, парсеры. Создавать сетки, если делаешь какой-то один большой проект, смысла не много. Только если зашёл в тупик и нужны варианты выхода из него, а другие простые способы их найти не подкинули идей.
 

Vasilijvg

Client
Joined
Oct 24, 2018
Messages
339
Reaction score
157
Points
43
отличная идея! сейчас у меня ИИ работает в линейной связке типа: сбор материала (смешено), генерация(ИИ), постобработка (спинтакс). Но вот действительно можно такую отлаженную коробочку доращивать модельками.
 
Last edited:
  • Thank you
Reactions: LaGir

LaGir

Client
Joined
Oct 1, 2015
Messages
230
Reaction score
948
Points
93
Так заморачиваться с созданием сеток под определённую задачу для улучшения выдачи LLM наверное имеет смысл, только если пилишь на потоке однотипные шаблоны, регеры, парсеры. Создавать сетки, если делаешь какой-то один большой проект, смысла не много. Только если зашёл в тупик и нужны варианты выхода из него, а другие простые способы их найти не подкинули идей.
Не совсем так. Речь не идёт о заточке под отдельную задачу, приведённые в статье узкие примеры сделаны примитивными умышленно для простоты понимания, и только. При использовании же в проде - смысл построения таких сеток в том, чтобы ИИ мог решать (или помогать эффективнее решать) те сложные/композитные задачи, с которыми плохо справляются (или не справляются вовсе) базовые модели и копайлоты. Иными словами, в статье я предлагаю потренироваться на известной всем простой задаче по XPath, и, если зайдёт, следующий логичный шаг - создание для себя универсальной-сетки помощника под API и документацию ZennoPoster/ZennoDroid.
О полном аутсорсе тоже речь не идёт, если что. Да, с простыми шаблонами хорошо построенная сетка будет куда лучше справлятся в среднем, чем базовые модели, но это не значит, что для этого они только и годятся. По крайней мере, конкретно я говорю о мульти-агентских сетках как об инструменте общего увеличения отдачи от ИИ при разработке.
 

zarufakis

Client
Joined
Mar 22, 2019
Messages
1,790
Reaction score
1,181
Points
113
Есть семейство моделей «o1» от OpenAI, принцип работы которых схожий, только «рассуждают» они в большей мере «про себя», используя для время этого время инференса. На момент написания этого текста такие модели есть только у OpenAI, но уже точно известно, что конкуренты разрабатывают аналогичные модели (Anthropic, Google), т.к. эта проблема действительно очень важная, а подход к решению вполне себе хорош.
Claude без дополнительных промптов прекрасно справился с этой задачей.
А так да, нейросети плохо считают логические задачи, в которых нужно вести рассуждение, но это постепенно уходит в прошлое.
Уже Алиса правильно считает вторники ))

129018
 
  • Thank you
Reactions: k1nop and LaGir

Vasilijvg

Client
Joined
Oct 24, 2018
Messages
339
Reaction score
157
Points
43
не забывайте что скорость апдейта моделей настолько высока, что сказать кто в моменте лучший - инфа, устаревающая каждый 3 месяца. А с LM студия и 48+GB видеопамяти - вообще горизонты творчества безлимитны
 
Last edited:
  • Thank you
Reactions: LaGir
Joined
May 26, 2020
Messages
524
Reaction score
175
Points
43
А с LM студия и 48+GB озу - вообще горизонты творчества безлимитны
Можешь развернуть это подробнее? Ибо имею серв с 64 гигами оперативы на борту, и через студию тестил некоторые модели, тормозят жутко, работают медленно, и это без рабочих задач, и на этапе "напиши код игры змейки" может уйта на полчаса в аут...
Я так понимаю, нужно понимать, как правильно модельку подобрать для своих задач...
 

Vasilijvg

Client
Joined
Oct 24, 2018
Messages
339
Reaction score
157
Points
43
Можешь развернуть это подробнее? Ибо имею серв с 64 гигами оперативы на борту, и через студию тестил некоторые модели, тормозят жутко, работают медленно, и это без рабочих задач, и на этапе "напиши код игры змейки" может уйта на полчаса в аут...
Я так понимаю, нужно понимать, как правильно модельку подобрать для своих задач...
привет!

дело в том что для локально запущенной ИИ модели критическое значение имеет объем видеопамяти (памяти в видео карте) а не ОЗУ, отсюда и тормоза (я поправил в своем посту на 48+GB видеопамяти, начальный вариант вводил в смуту)

чтоб подобрать более менее что то для освоения материала, нужны видеокарты с минимум 16 ГБ памяти, а лучше 24, вот на них и будет какой то толк, далее уже и освоишься.
 
Last edited:
Joined
May 26, 2020
Messages
524
Reaction score
175
Points
43
нужны видеокарты с минимум 16 ГБ памяти
Эх, ждем, когда запилят нейросетку, работающую в оперативе без видяхи )))
 

Vasilijvg

Client
Joined
Oct 24, 2018
Messages
339
Reaction score
157
Points
43
Эх, ждем, когда запилят нейросетку, работающую в оперативе без видяхи )))
разумной использовать сервисы которые уже сейчас дают большой потенциал для творчества.
В наш век ожидание равно выходу из гонки
 

Users Who Are Viewing This Thread (Total: 2, Members: 1, Guests: 1)