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

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
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
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113
Спасибо за интересную статью, :az:особенно за картинку о представлении кодинга с ИИ :D действительно так бывает, и гоняет одни и те же ошибки по кругу, приходится самому дорабатывать код. :-)
 
  • Спасибо
Реакции: LaGir

smartmail

Client
Регистрация
18.04.2015
Сообщения
390
Благодарностей
202
Баллы
43
грамотная статья
надеюсь, разработчики Zenno8 смотрят в эту сторону и делают шаги в правильном направлении)
 
  • Спасибо
Реакции: LaGir

Lest

Client
Регистрация
20.03.2020
Сообщения
76
Благодарностей
78
Баллы
18
Так заморачиваться с созданием сеток под определённую задачу для улучшения выдачи LLM наверное имеет смысл, только если пилишь на потоке однотипные шаблоны, регеры, парсеры. Создавать сетки, если делаешь какой-то один большой проект, смысла не много. Только если зашёл в тупик и нужны варианты выхода из него, а другие простые способы их найти не подкинули идей.
 

Vasilijvg

Client
Регистрация
24.10.2018
Сообщения
337
Благодарностей
153
Баллы
43
отличная идея! сейчас у меня ИИ работает в линейной связке типа: сбор материала (смешено), генерация(ИИ), постобработка (спинтакс). Но вот действительно можно такую отлаженную коробочку доращивать модельками.
 
Последнее редактирование:
  • Спасибо
Реакции: LaGir

LaGir

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

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 737
Благодарностей
1 130
Баллы
113
Есть семейство моделей «o1» от OpenAI, принцип работы которых схожий, только «рассуждают» они в большей мере «про себя», используя для время этого время инференса. На момент написания этого текста такие модели есть только у OpenAI, но уже точно известно, что конкуренты разрабатывают аналогичные модели (Anthropic, Google), т.к. эта проблема действительно очень важная, а подход к решению вполне себе хорош.
Claude без дополнительных промптов прекрасно справился с этой задачей.
А так да, нейросети плохо считают логические задачи, в которых нужно вести рассуждение, но это постепенно уходит в прошлое.
Уже Алиса правильно считает вторники ))

129018
 
  • Спасибо
Реакции: LaGir

Vasilijvg

Client
Регистрация
24.10.2018
Сообщения
337
Благодарностей
153
Баллы
43
не забывайте что скорость апдейта моделей настолько высока, что сказать кто в моменте лучший - инфа, устаревающая каждый 3 месяца. А с LM студия и 48+GB озу - вообще горизонты творчества безлимитны
 
  • Спасибо
Реакции: LaGir

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)