- BrainTools - https://www.braintools.ru -
Это первая статья из цикла о том, как при четкой формулировке задачи и описании целевой архитектуры получилось собрать для self-hosted инфраструктуры MVP сервис по анализу алертов мониторинга с участием LLM.
В процессе написания статья разрослась до неимоверных размеров, поэтому пришлось поделить ее аж на 4 части (ссылки буду добавлять по мере выпуска, а т.к. основной материал готов и осталось только оформить – постараюсь загружать раз в одну-две недели).
Часть 1: Вводная и формирование ТЗ (Вы здесь)
Часть 2: Выбор локальной LLM
Часть 3: Формирование HLD и немного LLD
Часть 4: Что из этого вышло
В очередной раз по пути домой с работы я ловлю на почту очередной алерт Zabbix от моей домашней лаборатории, что, дескать, на порту коммутатора изменилась скорость и это очень-очень (прямо наверняка!) важно.
Тонкая настройка мониторинга – не наш путь, нужно что-то более автоматизированное и “интеллектуальное”. Так и родилась идея развернуть локально LLM , прикрутить к системе мониторинга для принятия решения о тушении некоторого “шума” и, как бонус, выдачи предположений почему так получилось со списком кратких команд диагностики события.
Так как навыки программирования у меня на уровне чуть выше начального, а времени разбираться недостаточно, пришла идея применить свои знания и навыки по построению архитектуры, обернуть в ТЗ, составить HLD и LLD и заставить уже коммерческую нейросеть поэтапно готовить решения.
Собственно, все части – это путь от составления архитектуры до применения решения.
Со времени появления LLM появились два противоположных мнения:
Мнение 1 – “Архитекторы/программисты/инженеры/{вставьте нужное} не нужны, все сделает ИИ”.
Мнение 2 – “ИИ постоянно галлюцинируют, ничего серьезного они предложить не способны”.
На практике же оба тезиса неверны. Если подойти к вопросу в стиле “сделай красиво”, то на выходе действительно получится примерно то же самое, что обычно получается от плохо сформулированного технического задания: набор домыслов, недопонимания, галлюцинаций и вообще противоречащих идей. Эдакий “разговор слепого с глухим”.
С другой стороны, если отдать нейросети не рассуждения о кнопке “сделать хорошо”, а декомпозированную задачу, разработанную человеком, то картина резко меняется и, по большей части, нейросеть начинает придерживаться заданной проектной логики, потому что:
есть цель;
есть ограничения;
есть требования;
есть архитектура;
есть детализация.
То есть имеется все необходимое для пошаговой реализации.
Именно такой подход использовался мной для этого домашнего пет-проекта: надстройка над Zabbix, которая умеет принимать алерты, обогащать их контекстом, делать триаж, строить советы по исправлению, отправлять уведомления и постепенно превращаться в что-то похожее на аккуратный AIOps-пайплайн.
В этой статье не будет описаний ни FastAPI, ни Redis, ни Matrix, ни Ollama (о них немного в следующих выпусках). Здесь речь про зависимость качества ответа нейросети от поставленной задачи.
По опыту [1] инженера-архитектора ИТ-инфраструктуры могу сказать, что в реальной жизни (работе и не только) проблемы возникают не потому, что кто-то не знает синтаксиса языка программирования или забыл элемент на диаграмме, а в осознании цели и конечного результата.
Например, формулировки вида:
“Придумай мне, чтобы алерты стали умнее и мне не мешали”
в предметном переложении на текущую задачу, содержат не более вводных, чем:
“Сделай мне кнопку Быстро сделать хорошо”
То есть задача не содержит никаких полезных вводных информационных данных, на основе которых можно было бы спроектировать решение и прикинуть объем работ даже для опытного архитектора и толпы сеньоров-программистов, не то, что для нейросети.
В таком формате нейронка размывает задачу еще сильнее, словно разговорчивый генератор неопределенности, постоянно галлюцинируя и отдавая в корне неверные ответы, так как не может сама уточнить у вас нужные параметры, как опытный инженер или архитектор.
Поэтому, даже взаимодействуя с нейросетью, необходимо точно и четко формулировать свои мысли и задачи, если хочется извлечь что-то полезное:
сформировать ТЗ;
описать HLD.
Только после этих шагов задуматься о реализации.
Звучит, как очередное бумагомарательство, но эта последовательность как раз и позволит из нескольких запросов к нейросети получить рабочую заготовку.
В самом начале статьи уже было описано, как родилась идея. Проясню более детально.
При эксплуатации системы мониторинга, связанной с инфраструктурой, быстро приходит понимание, что “получить алерт” и ответить на вопрос “как быстро понять причину и диагностировать” — это не одно и то же.
Алерт только декларирует:
“Событий X произошло, отметка времени Y, важность события Z”.
Инженеру же важнее быстро понять:
это действительно важно?
это симптом или первопричина?
куда смотреть в первую очередь?
надо ли будить по этому поводу кого-то живого ночью в выходной?
Вот тут идея начала обрастать деталями – нужно собрать над Zabbix отдельный слой обработки событий, который не сломает сам мониторинг, но сможет:
принимать webhook-события;
складывать их в надежный пайплайн;
тянуть дополнительный контекст;
подавлять информационный шум;
использовать LLM там, где это действительно полезно (обогащение, предположения, рекомендации, подавление шума);
формировать более содержательные уведомления;
вести аудит принятых решений.
В таком виде задача уже начинает походить на проект, но все равно недостаточно для эффективного ТЗ.
Чтобы не идеализировать процесс, необходимо детальнее раскрыть как и почему будет выглядеть плохой вариант взаимодействия.
Например запрос:
“Сделай мне умную систему над Zabbix, чтобы она понимала важность алертов, сама их анализировала, не создавала лишний шум, а важные сразу объясняла и давала рекомендации”.
В данном запросе нет фиксации и понимания:
где заканчивается система и где начинаются внешние сервисы;
кто принимает финальное решение;
что делать, если LLM недоступна;
какие алерты можно подавлять, а какие нельзя;
какие каналы уведомлений нужны;
как отслеживать взаимодействие;
насколько системе можно доверять в части корреляции
и т.д.
Да нейросеть ответит на такой запрос, и даже предложит решение, но тут выяснятся первые проблемы – что в вашем решении будут отсутствовать или вам не подойдет:
логика [2] маршрутизации;
логика доставки;
логика аудита
логика корреляции
и т.д.
А нейронка будет полностью уверена в своей правоте, давая все более далекие от реальности реализации.
В итоге получится не решение задачи, а набор архитектурных долгов.
В первую очередь необходимо зафиксировать периметр, потому что вся система не должна быть новым Zabbix, а всего лишь прослойкой обработки событий, то есть отдельным внешним модулем для системы мониторинга.
прием webhook-событий из Zabbix;
нормализация событий;
асинхронная обработка;
хранение состояния по событиям и решениям;
обогащение событий через Zabbix API;
триаж событий с низкой важностью;
предоставление рекомендаций по уведомлениям;
корреляция;
отправка в Matrix и по email (для меня);
audit trail.
управление инцидентами;
автоматическое выполнение рекомендуемых команд;
обучение [3] собственной модели;
движок по определению корневых причин на все случаи жизни.
С определением границ периметра решения нейросеть уже с меньшей вероятностью будет съезжать в галлюцинации и начнет двигаться в нужном направлении.
Однако это еще не все.
Для нейронки ТЗ не должно выглядеть, как оформленный по ГОСТ документ с подписями участников процесса согласования. Оно должно грамотно формулировать постановку задачи.
Для моего проекта базовая версия требований выглядела следующим образом:
1. Система должна надежно принимать события из Zabbix.
webhook должен быть защищен токеном;
payload должен валидироваться;
при сбое тяжелой обработки событие не должно теряться.
2. Система должна разделять прием и обработку
Потому что обогащение данными, графики, триаж и составление рекомендаций могут занимать приличное время.
3. Для критичных событий (High, Disaster) нельзя полностью полагаться на LLM, т.к. риск ошибки [4] модели высок.
4. Для событий уровня Average оставить возможность настройки за инженером– либо доставка, по аналогии с критичными событиями, либо по логике событий с низкой критичностью.
5. События с низкой критичностью (Warning и ниже) передаются для триажа и проводится анализ LLM для вынесения вердикта об уведомлении инженера.
6. Для всех событий проводится анализ о корневых причинах появления алерта (RCA по шаблонам или, в отсутствии оных, рассуждением LLM) с последующими рекомендуемыми шагами только для диагностики (чтение статистики и т.д.) от LLM без внесения изменений (как моделью, так и в указаниях инженеру).
7. Использование audit log, доступного, как отдельный сервис, с возможностью получения информации:
о поступившем событии;
прохождении этапов обработки;
решении политики;
решении LLM;
используемым каналам доставки и содержимом.
8. Кратковременное хранение состояния для принятия решений о:
подавлении оповещения о событии;
обнаружении флапа в заданный инженером период;
обнаружении восстановления после события;
построении корреляции в заданном инженером промежутке времени;
выполнении дедупликации событий;
хранении информации для построения audit log.
9. Работа системы в локальном контуре.
10. Иметь возможность создания детерминированной логики для корреляции поступающих событий и определения корневых причин.
11. Выполнение LLM корреляции событий в отсутствии детерминированной логики.
12. Независимость от используемой ОС для возможности переноса на другие хосты и системы ( использование Docker).
Выше описаны основные идеи из сформированного ТЗ. На самом деле на его составление ушло больше двух недель (и это только для пет-проекта для домашней лаборатории) и составило оно в Obsidian более 2-х тысяч слов.
Во-первых: вы сами для себя уже определяетесь, что именно вы хотите получить от системы, выставляете осязаемые границы решения, распределяете зоны ответственности за процесс обработки входных данных.
Во-вторых: вы уже можете сами понять, из каких модулей система будет состоять, их интеграцию, взаимодействие с системой от пользователя и приблизитесь вплотную к пониманию и составлению HLD.
Соответственно нейросети не надо будет фантазировать насчет ваших желаний, а работать в предметном пространстве, что существенно уменьшит количество галлюцинаций и ошибок в получаемом решении.
В данной статье был пройден самый тяжелый и наименее интересный подготовительный этап, насыщенный исключительно требованиями и правилами к будущему решению, фиксацией границ решения и зоны ответственности LLM.
На выходе появилась не реализация, но более важная вещь на старте проекта – четко поставленная задача.
В следующей статье перейдем к другому важному этапу: составлению требований к LLM, критериям выбора и, собственно, выбору модели.
Затем перейдем к формированию HLD и LLD (совсем немного), и, в заключительной части, описание реализации и результата.
Автор: it_zoobik
Источник [5]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/29785
URLs in this post:
[1] опыту: http://www.braintools.ru/article/6952
[2] логика: http://www.braintools.ru/article/7640
[3] обучение: http://www.braintools.ru/article/5125
[4] ошибки: http://www.braintools.ru/article/4192
[5] Источник: https://habr.com/ru/articles/1031140/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1031140
Нажмите здесь для печати.