- Регистрация
- 01.10.2015
- Сообщения
- 230
- Благодарностей
- 944
- Баллы
- 93
Всем привет!
В предыдущей своей статье, посвящённой использованию LLM в задачах для Zenno, я в общих чертах упоминал 2 «продвинутых» способа улучшения ответов от нейронных сетей: Retrieval Augmented Generation (RAG) и Fine-tuning. В этой статье я расскажу об ещё одном способе «прокачать» использование LLM в ваших задачах, а именно о построении так называемых мульти-агентских сетей.
Сразу предупрежу, что статья носит технический и в большей мере теоретический характер (т.е. без конкретного шаблона или решения под отдельную задачу). Цель – рассказать понятным языком о мульти-агентских сетях искусственного интеллекта, дать пищу для размышлений «на подумать», как вы могли бы имплементировать и применить этот инструмент в ваших проектах. Соответственно, статья главным образом ориентирована на продвинутых разработчиков шаблонов для ZennoPoster. Тем не менее, новый идеи и схемы вполне могут почерпнуть любые пользователи продуктов ZennoLab.
Прежде чем перейти к тому, что такое мульти-агентские сети, полезно будет вспомнить про некоторые особенности того, как вообще нейросети решают задачи (отвечают на ваши запросы).
В силу своих архитектурных особенностей, они это делают с «нахрапа», т.е. устроены так, чтобы тут же выдать ответ, без какого-либо анализа запроса и размышлений.
И в этом заключается проблема. Люди, например, всегда имеют возможность подумать, «прокрутить» в мыслях вопрос, порассуждать, ничего при этом не говоря, просто погрузившись мысленно в вопрос – и только после этого сказать итоговый ответ. Внутреннее же устройство текущих поколений нейросетей такое, что времени «на подумать» у них нет, они работают так, что сразу выдают ответ. Формально они «думают» пока «печатают» ответ (т.к. время приёма и выдачи токенов – грубо говоря, как раз время операции «мышления»). Это выглядит примерно так, как если бы какой-нибудь умный, начитанный человек отвечал на чьи-либо вопросы сразу, как сплошной поток сознания. Понятно, что каким бы гениальным в плане знаний и интеллекта этот человек ни был, на часть ваших вопросов он не мог бы сходу толком ответить, т.к. «пауза на подумать» – полезная и нередко необходимая вещь для нормального ответа на сложные, комплексные вопросы/запросы.
Проблема понятная, и в той или иной мере люди придумывают для неё решения.
Есть техники «цепочки мыслей» (CoT, Chain of Thought) и схожие, которые дают чуть больше пространства для маневра. Как правило, она заставляет прописывать нейронку все шаги решения перед окончательным ответом, что одновременно даёт ей что-то вроде «дополнительного времени» для рассуждений.
(источник картинки: гайд по промптингу)
Есть семейство моделей «o1» от OpenAI, принцип работы которых схожий, только «рассуждают» они в большей мере «про себя», используя для время этого время инференса. На момент написания этого текста такие модели есть только у OpenAI, но уже точно известно, что конкуренты разрабатывают аналогичные модели (Anthropic, Google), т.к. эта проблема действительно очень важная, а подход к решению вполне себе хорош.
Также люди заметили, что предварительно разбивать исходный сложный запрос к нейросети на несколько отдельных вопросов или подзадач – хороший подход, и даёт лучшие результаты. Если сделать запрос более подробно, раздробить его на более мелкие задачки и вопросы – почти наверняка вы получите от LLM результат лучшего качества. Тут можно провести аналогию с составлением ТЗ – чем лучше, осмысленнее и подробнее вы опишите свою задачу для исполнителей, тем больше шансов, что результат работы будет качественнее и достигнут в меньшие сроки (или же меньше времени и усилий всех сторон уйдёт на уточнение этого самого ТЗ).
Всё это напрямую имеет отношение к целесообразности мульти-агентских сеток искусственного интеллекта, поэтому наконец возвращаемся к тому, что же это всё-таки такое.
Первое ключевое слово в данном случае – «агент». Под агентом в сфере использования нейросетей понимают разное в зависимости от контекста, в нашем же случае агентом можно назвать отдельный «инстанс» запущенной нейросети, у которого задан определённый системный промпт (роль + инструкции) под строго определённую узкую задачу. Для примера, если вы общаетесь с ChatGPT с предзаданным системным промптом, то вашу собеседницу-нейронку можно назвать агентом. Если вы создаёте или переходите в другую вкладку чата с другим системным промптом – это уже другой агент.
Мульти-агентская сеть – соответственно, набор таких экземпляров («запущенных выделенных диалогов») ИИ, которые взаимосвязаны и общаются не с вами (или не только с вами), а между собой, в целях выполнения поставленной задачи.
Чаще всего такую сеть иллюстрируют и создают как команду специалистов (например, разработчиков). Например, возьмём одну из самых простых схем-составов:
Далее в коде имплементируем их взаимосвязь – например, агент-PM общается только с человеком, а дальше передаёт задачу агенту-программисту, тот в свою очередь пишет свой ответ, но опять же не человеку, а агенту-ревьюверу (код на проверку, если он написан) или обратно PM'у (если нужно что-то уточнить).
По сути, у нас получается воронка, которая декомпозирует исходную задачу, она выполняется поэтапно и с уточнениями/доработками на каждом шаге. Причём «команду» можно легко расширять, добавляя экземпляры нейронки с другими полезными ролями, например программистов с узкими специализациями, тестеров, тим-лида и т.д.
Результат как правило сильно лучше для сложных задач, если не использовать сеть, а только один «экземпляр» нейронки. Примерно, как лучше будет результат от команды специалистов-людей, нежели одного универсального специалиста-человека. И, согласитесь, создать пайплайн из команды нейронок явно проще, чем собрать команду из людей для решения задачи.
Для закрепления понимания, давайте рассмотрим пример той команды из 3 агентов чуть ближе к контексту Zenno.
Представьте, что вам для шаблона нужен C#-сниппет, в котором должен быть заход на некий сайт, потом проверка наличия капчи и решение её в случае обнаружения, потом заполнение и отправка некоей формы. И у вас есть эта самая мульти-агентская сеть, состоящая из 3 инстансов ИИ: проджект-менеджер, программист и ревьювер кода. Рассмотрим пошагово, как может работать обращение с задачей к этой системе агентов.
При этом сложность этого алгоритма можно увеличивать на свое усмотрение, тестировать разные варианты. Например, опять же, увеличить число сотрудников и ролей, уточнять их промпты. По промптам – например, каждому агенту прописать в инструкции, что если он считает, что ему для реализации нужно больше информации, то он должен обратиться с соответствующим запросом «вверх по цепочке», т.е. к предыдущему агенту за уточнениями.
В виду особенностей ZennoPoster и, в частности, ProjectMaker, сложнее всего организовать тестирование создаваемого агентами кода. Тем не менее, способы тестирования можно придумать.
Например, завести агента-тестера, который будет иметь доступ к планировщику ZennoPoster, чтобы запускать в нём специальный тестовый шаблон с созданным кодом.
Способность запускать шаблон агенту-тестеру можно дать с помощью function calling (т.е. написать код нужных функций и прописать возможность нейронке вызывать их при необходимости). Для простого понимания – например, способность ChatGPT ходить гуглить что-то, обращаться к DALL-E за генерацией картинок – как раз реализована с помощью function calling.
«Засунуть» код в тестовый шаблон можно через блок «Общий код», в котором есть галочка загрузки кода из файла.
В итоге – агент-тестер с помощью function calling:
Как мы выяснили из предыдущей главы, мульти-агентские сети дают очень приличный буст в решении сложных, комплексных задач, на которые не получить решения, просто задав вопрос условному ChatGPT.
Какие это сложные задачи? По нынешний день чаще всего это то же программирование, а именно сравнительно крупные проекты. Если у вас кодовая база на тысячи строк кода, единичный ИИ-агент или ассистент мало чем сейчас может помочь (даже если размер контекстного окна позволяет засунуть в него весь репозиторий с кодом, документацией и дополнительными данными). Как правило, хорошо помогать у них получается только с простыми и рутинными задачами.
Всё, что сложнее - для базовых моделей становится проблемным. И при использовании в таком виде зачастую можно столкнуться с ситуацией из мема:
Также современные нейронки «из коробки» мало чем смогут помочь для написания с 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.
Плюсом, вот несколько полезных ссылок на фреймворки и материалы для построения мульти-агентских систем.
Если вы добрались до этого места в статье, и вам всё ещё интересна тема мульти-агентских систем, предлагаю в общих чертах рассмотреть ещё один пример в контексте Zenno – и, как домашнее задание для желающих закрепить на практике, попробовать реализовать его самостоятельно
Перейдём к постановке задачи. В большинстве шаблонов для ZennoPoster нужно взаимодействовать с HTML-элементами (ссылками, кнопками, формами и т.д.), а для этого их сначала надо найти. Один из наиболее эффективных и широко используемых способов – поиск элементов по путям XPath.
Иными словами, составление путей XPath – распространённая и знакомая многим рутинная задача в рамках создания шаблонов. Почему бы ради практики не взять такую задачу для реализации небольшой мульти-агентской системы?
Давайте прикинем состав агентов, их роли, примерные инструкции и что они будут делать.
В рамках Zenno и C#, например можно написать микро-шаблон, который будет проверять количество совпадений путей на указанной страничке, и сохранять где-нибудь в файлик на диске. Безбраузерно можно сделать с помощью библиотечки HtmlAgilityPack. Агент-тестер может запускать просто батником этот шаблон, а потом читать файлик с результатами.
Если решите попрактиковаться с Python, полностью аналогичную задачу можно сделать с помощью библиотечки lxml – там всё ничуть не сложнее, чем с HtmlAgilityPack.
В системном промпте агента-тестера, соответственно, должно быть прописано:
Троих основных агентов для данной задачи может быть достаточно, но вы, конечно, можете добавить ещё по своему усмотрению. Например, отдельного агента-маршрутизатора/оркестратора, для того чтобы более понятно и надежно построить взаимодействие и обмен информацией между основными агентами.
Как можно заметить, формулировать саму задачу «а-ля напиши мне XPath» даже необязательно, т.к. в системном промпте агента на входе можно сразу прописать, что ему будут подаваться входные данные, а его задача на основе них написать пути. Необязательно и подавать вам лично входные данные каждый раз. Можно, например, заранее пройтись по страничкам сайтов и записать их исходники и целевые OuterHTML, а затем написать код цикличного скармливания их агентской системе. А если пойти ещё дальше, можно написать отдельного агента, который будет получать GET-запросом исходник и сам искать нужные OuterHTML по вашим «человеческим» описаниям а-ля «найди все поля для ввода имени и телефона, а также кнопку в тех местах страниц, где они встречаются в рамках одной формы».
Резюмируя, с помощью дополнительного инструментария и техник навроде мульти-агентских сеток, уже сейчас можно создавать на основе нейросетей очень мощные системы на около человеческом уровне способностей, для разработки шаблонов на ZennoPoster и не только.
В предыдущей своей статье, посвящённой использованию LLM в задачах для Zenno, я в общих чертах упоминал 2 «продвинутых» способа улучшения ответов от нейронных сетей: Retrieval Augmented Generation (RAG) и Fine-tuning. В этой статье я расскажу об ещё одном способе «прокачать» использование LLM в ваших задачах, а именно о построении так называемых мульти-агентских сетей.
Сразу предупрежу, что статья носит технический и в большей мере теоретический характер (т.е. без конкретного шаблона или решения под отдельную задачу). Цель – рассказать понятным языком о мульти-агентских сетях искусственного интеллекта, дать пищу для размышлений «на подумать», как вы могли бы имплементировать и применить этот инструмент в ваших проектах. Соответственно, статья главным образом ориентирована на продвинутых разработчиков шаблонов для ZennoPoster. Тем не менее, новый идеи и схемы вполне могут почерпнуть любые пользователи продуктов ZennoLab.
Зачем нужны мульти-агентские сети?
Прежде чем перейти к тому, что такое мульти-агентские сети, полезно будет вспомнить про некоторые особенности того, как вообще нейросети решают задачи (отвечают на ваши запросы).
В силу своих архитектурных особенностей, они это делают с «нахрапа», т.е. устроены так, чтобы тут же выдать ответ, без какого-либо анализа запроса и размышлений.
И в этом заключается проблема. Люди, например, всегда имеют возможность подумать, «прокрутить» в мыслях вопрос, порассуждать, ничего при этом не говоря, просто погрузившись мысленно в вопрос – и только после этого сказать итоговый ответ. Внутреннее же устройство текущих поколений нейросетей такое, что времени «на подумать» у них нет, они работают так, что сразу выдают ответ. Формально они «думают» пока «печатают» ответ (т.к. время приёма и выдачи токенов – грубо говоря, как раз время операции «мышления»). Это выглядит примерно так, как если бы какой-нибудь умный, начитанный человек отвечал на чьи-либо вопросы сразу, как сплошной поток сознания. Понятно, что каким бы гениальным в плане знаний и интеллекта этот человек ни был, на часть ваших вопросов он не мог бы сходу толком ответить, т.к. «пауза на подумать» – полезная и нередко необходимая вещь для нормального ответа на сложные, комплексные вопросы/запросы.
Проблема понятная, и в той или иной мере люди придумывают для неё решения.
Есть техники «цепочки мыслей» (CoT, Chain of Thought) и схожие, которые дают чуть больше пространства для маневра. Как правило, она заставляет прописывать нейронку все шаги решения перед окончательным ответом, что одновременно даёт ей что-то вроде «дополнительного времени» для рассуждений.
(источник картинки: гайд по промптингу)
Есть семейство моделей «o1» от OpenAI, принцип работы которых схожий, только «рассуждают» они в большей мере «про себя», используя для время этого время инференса. На момент написания этого текста такие модели есть только у OpenAI, но уже точно известно, что конкуренты разрабатывают аналогичные модели (Anthropic, Google), т.к. эта проблема действительно очень важная, а подход к решению вполне себе хорош.
Также люди заметили, что предварительно разбивать исходный сложный запрос к нейросети на несколько отдельных вопросов или подзадач – хороший подход, и даёт лучшие результаты. Если сделать запрос более подробно, раздробить его на более мелкие задачки и вопросы – почти наверняка вы получите от LLM результат лучшего качества. Тут можно провести аналогию с составлением ТЗ – чем лучше, осмысленнее и подробнее вы опишите свою задачу для исполнителей, тем больше шансов, что результат работы будет качественнее и достигнут в меньшие сроки (или же меньше времени и усилий всех сторон уйдёт на уточнение этого самого ТЗ).
Всё это напрямую имеет отношение к целесообразности мульти-агентских сеток искусственного интеллекта, поэтому наконец возвращаемся к тому, что же это всё-таки такое.
Что такое мульти-агентские сетки ИИ
Первое ключевое слово в данном случае – «агент». Под агентом в сфере использования нейросетей понимают разное в зависимости от контекста, в нашем же случае агентом можно назвать отдельный «инстанс» запущенной нейросети, у которого задан определённый системный промпт (роль + инструкции) под строго определённую узкую задачу. Для примера, если вы общаетесь с ChatGPT с предзаданным системным промптом, то вашу собеседницу-нейронку можно назвать агентом. Если вы создаёте или переходите в другую вкладку чата с другим системным промптом – это уже другой агент.
Мульти-агентская сеть – соответственно, набор таких экземпляров («запущенных выделенных диалогов») ИИ, которые взаимосвязаны и общаются не с вами (или не только с вами), а между собой, в целях выполнения поставленной задачи.
Чаще всего такую сеть иллюстрируют и создают как команду специалистов (например, разработчиков). Например, возьмём одну из самых простых схем-составов:
- Проджект-менеджер;
- Программист;
- Ревьювер кода.
Далее в коде имплементируем их взаимосвязь – например, агент-PM общается только с человеком, а дальше передаёт задачу агенту-программисту, тот в свою очередь пишет свой ответ, но опять же не человеку, а агенту-ревьюверу (код на проверку, если он написан) или обратно PM'у (если нужно что-то уточнить).
По сути, у нас получается воронка, которая декомпозирует исходную задачу, она выполняется поэтапно и с уточнениями/доработками на каждом шаге. Причём «команду» можно легко расширять, добавляя экземпляры нейронки с другими полезными ролями, например программистов с узкими специализациями, тестеров, тим-лида и т.д.
Результат как правило сильно лучше для сложных задач, если не использовать сеть, а только один «экземпляр» нейронки. Примерно, как лучше будет результат от команды специалистов-людей, нежели одного универсального специалиста-человека. И, согласитесь, создать пайплайн из команды нейронок явно проще, чем собрать команду из людей для решения задачи.
Простой пример устройства мульти-агентской сетки
Для закрепления понимания, давайте рассмотрим пример той команды из 3 агентов чуть ближе к контексту Zenno.
Представьте, что вам для шаблона нужен C#-сниппет, в котором должен быть заход на некий сайт, потом проверка наличия капчи и решение её в случае обнаружения, потом заполнение и отправка некоей формы. И у вас есть эта самая мульти-агентская сеть, состоящая из 3 инстансов ИИ: проджект-менеджер, программист и ревьювер кода. Рассмотрим пошагово, как может работать обращение с задачей к этой системе агентов.
- Вы описываете задачу агенту-менеджеру своими словами.
- Поскольку у этого агента в системном промпте описано, что он должен делать со входящей задачей как PM, он отвечает вам соответствующим образом – запрашивает необходимые подробности и дополнительные данные, чтобы лучше узнать задачу и её особенности. Например, какие сервисы должны использоваться для разгадки капчи и т.д. и т.п.
- По завершению уточнений отдельным «потоком» экземпляр агента-менеджера на основе всего вашего диалога составляет детальный план для реализации (чтобы передать его дальше агенту-программисту), разбитый на подзадачи.
- Агент-менеджер начинает «диалог» с агентом-программистом, предоставляя ему необходимую информацию по проекту и ставя конкретную (первую) задачу на реализацию.
- Агент-программист пишет код для данной ему задачи, и передаёт его агенту-ревьюверу, вместе с описанием выполненной задачи и необходимыми данными. Для решения задач конкретно под Zenno ему можно подгружать в контекст заранее сохраненную документацию по API ZennoPoster, с инструкцией в системном промпте использовать её при написании кода.
- Агент-ревьювер, получив код, опять же согласно своему персональному системному промпту проверяет, оценивает и критикует полученный код, при необходимости отправляет агенту-программисту обратно на доработку.
- После успешного «аппрува» ревьювером кода для конкретной задачи, агент-ревьювер даёт об этом знать агенту-менеджеру, код сохраняется отдельно.
- Агент-менеджер ставит следующую подзадачу агенту-программисту, шаги 5-7 повторяются уже для неё.
- По истечению списка задач код собирается в одно (при необходимости дополнительно анализируется ревьювером на случай ошибок в компоновке или ещё чего-нибудь) и выдаётся на выход вам как заказчику.
При этом сложность этого алгоритма можно увеличивать на свое усмотрение, тестировать разные варианты. Например, опять же, увеличить число сотрудников и ролей, уточнять их промпты. По промптам – например, каждому агенту прописать в инструкции, что если он считает, что ему для реализации нужно больше информации, то он должен обратиться с соответствующим запросом «вверх по цепочке», т.е. к предыдущему агенту за уточнениями.
В виду особенностей ZennoPoster и, в частности, ProjectMaker, сложнее всего организовать тестирование создаваемого агентами кода. Тем не менее, способы тестирования можно придумать.
Например, завести агента-тестера, который будет иметь доступ к планировщику ZennoPoster, чтобы запускать в нём специальный тестовый шаблон с созданным кодом.
Способность запускать шаблон агенту-тестеру можно дать с помощью function calling (т.е. написать код нужных функций и прописать возможность нейронке вызывать их при необходимости). Для простого понимания – например, способность ChatGPT ходить гуглить что-то, обращаться к DALL-E за генерацией картинок – как раз реализована с помощью function calling.
«Засунуть» код в тестовый шаблон можно через блок «Общий код», в котором есть галочка загрузки кода из файла.
В итоге – агент-тестер с помощью function calling:
- Помещает подготовленный и оформленный код в специальный файл;
- Запускает в ZP тестовый шаблон, в котором автоматически грузится этой файл в «Общий код»
- Ждёт окончания выполнения шаблона в списке задач ZP. Если выполнение было прервано по ошибке, значит код точно надо возвращать на доработку агенту-программисту «вверх по цепочке».
Пару слов об позиционировании и оценке мульти-агентских сетей
Как мы выяснили из предыдущей главы, мульти-агентские сети дают очень приличный буст в решении сложных, комплексных задач, на которые не получить решения, просто задав вопрос условному ChatGPT.
Какие это сложные задачи? По нынешний день чаще всего это то же программирование, а именно сравнительно крупные проекты. Если у вас кодовая база на тысячи строк кода, единичный ИИ-агент или ассистент мало чем сейчас может помочь (даже если размер контекстного окна позволяет засунуть в него весь репозиторий с кодом, документацией и дополнительными данными). Как правило, хорошо помогать у них получается только с простыми и рутинными задачами.
Всё, что сложнее - для базовых моделей становится проблемным. И при использовании в таком виде зачастую можно столкнуться с ситуацией из мема:
Также современные нейронки «из коробки» мало чем смогут помочь для написания с 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
Пример мульти-агентского фреймворка:
GitHub - geekan/MetaGPT: The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming
The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming - geekan/MetaGPT
github.com
Multi-Agent Orchestrator framework | Multi-Agent Orchestrator
Manage multiple AI agents and handle complex conversations
awslabs.github.io
Introducing llama-agents: A Powerful Framework for Building Production Multi-Agent AI Systems — LlamaIndex - Build Knowledge Assistants over your Enterprise Data
LlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterprise data.
www.llamaindex.ai
How to Build Multi-Agent System with CrewAI and Ollama?
Build agents and Multi-Agent System with CrewAI and Ollama, using local LLMs like Llama2, Llama3, and LLaVA.
www.analyticsvidhya.com
Function calling и прочие тулсы на C# - Semantic Kernel и Microsoft.Extensions.AI
Предоставление машинного кода агентам | Microsoft Learn
Узнайте, как добавлять и вызывать машинный код в качестве подключаемых модулей в семантического ядра.
learn.microsoft.com
semantic-kernel/dotnet/README.md at main · microsoft/semantic-kernel · GitHub
Integrate cutting-edge LLM technology quickly and easily into your apps - microsoft/semantic-kernel
github.com
Introducing Microsoft.Extensions.AI Preview - Unified AI Building Blocks for .NET - .NET Blog
We are excited to introduce the Microsoft.Extensions.AI package available in preview today. This new package provides a unified abstraction layer that enables you to integrate AI services into your .NET applications.
devblogs.microsoft.com
Пример-задание напоследок: автоматизированный подбор путей XPath
Если вы добрались до этого места в статье, и вам всё ещё интересна тема мульти-агентских систем, предлагаю в общих чертах рассмотреть ещё один пример в контексте Zenno – и, как домашнее задание для желающих закрепить на практике, попробовать реализовать его самостоятельно
Перейдём к постановке задачи. В большинстве шаблонов для ZennoPoster нужно взаимодействовать с HTML-элементами (ссылками, кнопками, формами и т.д.), а для этого их сначала надо найти. Один из наиболее эффективных и широко используемых способов – поиск элементов по путям XPath.
Иными словами, составление путей XPath – распространённая и знакомая многим рутинная задача в рамках создания шаблонов. Почему бы ради практики не взять такую задачу для реализации небольшой мульти-агентской системы?
Давайте прикинем состав агентов, их роли, примерные инструкции и что они будут делать.
- Составитель XPath путей.
- Исходный код (или DOM) страницы;
- HTML-код (свойство OuterHTML) элемента, к которому должен быть составлен путь XPath.
- Необходимое количество совпадений составляемого пути (точное, максимальное или минимальное).
- Роль агента, т.е. что он специалист по XPath и HTML-разметке;
- Те 3 вещи, которые ему будут подаваться на вход пользователем (если пользователь предоставил не всё – агент должен запросить недостающую информацию)
- Правила написания хорошего XPath-пути (краткость, низкая зависимость от других элементов, независимость от случайных названий атрибутов и т.п.)
- Необходимость использовать только правила XPath 1.0 (т.к. ZennoPoster поддерживает только его).
- После написания – сохранение пути (или нескольких) XPath в отдельный файл или передача его напрямую агенту-ревьюверу вместе с исходными данными.
- Переписывание путей, если от агента-ревьювера пришёл негативный фидбек, с учётом этого самого фидбека.
- Переписывание путей, если от агента-тестера пришёл фидбек о том, что элементы не найдены (или найдены не в нужном количестве).
- Ревьювер.
- Указание проверки полученных путей на соответствие синтаксису XPath 1.0;
- Указание оценки полученных путей на соответствие правил хорошего написания;
- Указание возвращения путей на доработку агенту-составителю, если допущены ошибки, с описанием этих самых ошибок.
- Указание передавать валидные пути агенту-тестеру.
- Тестер.
В рамках Zenno и C#, например можно написать микро-шаблон, который будет проверять количество совпадений путей на указанной страничке, и сохранять где-нибудь в файлик на диске. Безбраузерно можно сделать с помощью библиотечки HtmlAgilityPack. Агент-тестер может запускать просто батником этот шаблон, а потом читать файлик с результатами.
Если решите попрактиковаться с Python, полностью аналогичную задачу можно сделать с помощью библиотечки lxml – там всё ничуть не сложнее, чем с HtmlAgilityPack.
В системном промпте агента-тестера, соответственно, должно быть прописано:
- Его задача получения исходных данных и путей, проверка последних с помощью запуска function calling;
- Если элементы на тесте не нашлись (0 совпадений), или нашлось количество вне допустимого изначальными условиями диапазона, нужно сообщить агенту-составителю о необходимости переписать пути XPath.
- Если тест пройден полностью корректно, отправить валидные пути в результирующий файл или диалог/чат.
Троих основных агентов для данной задачи может быть достаточно, но вы, конечно, можете добавить ещё по своему усмотрению. Например, отдельного агента-маршрутизатора/оркестратора, для того чтобы более понятно и надежно построить взаимодействие и обмен информацией между основными агентами.
Как можно заметить, формулировать саму задачу «а-ля напиши мне XPath» даже необязательно, т.к. в системном промпте агента на входе можно сразу прописать, что ему будут подаваться входные данные, а его задача на основе них написать пути. Необязательно и подавать вам лично входные данные каждый раз. Можно, например, заранее пройтись по страничкам сайтов и записать их исходники и целевые OuterHTML, а затем написать код цикличного скармливания их агентской системе. А если пойти ещё дальше, можно написать отдельного агента, который будет получать GET-запросом исходник и сам искать нужные OuterHTML по вашим «человеческим» описаниям а-ля «найди все поля для ввода имени и телефона, а также кнопку в тех местах страниц, где они встречаются в рамках одной формы».
Резюмируя, с помощью дополнительного инструментария и техник навроде мульти-агентских сеток, уже сейчас можно создавать на основе нейросетей очень мощные системы на около человеческом уровне способностей, для разработки шаблонов на ZennoPoster и не только.