- BrainTools - https://www.braintools.ru -
Это вторая статья из цикла о том, как при правильно поставленной задаче и грамотном подходе к архитектуре можно собрать реализацию self-hosted системы по анализу алертов при помощи локально развернутой LLM с участием нейросети, как исполнителя.
В первой части рассматривалась постановка задачи, формирование ТЗ и пояснения, почему для нейросети лучше ставить правильные, четкие задачи. В этой же части рассмотрим выбор локальной LLM под нашу задачу.
Часть 1: Вводная и формирование ТЗ [1]
Часть 2: Выбор локальной LLM (Вы здесь)
Часть 3: Формирование HLD и немного LLD
Часть 4: Что из этого вышло
Из практического опыта [2] работы, подход к задаче начался не с кода (в целом код был отдан на 99% нейросети, но об этом в следующих статьях), а с привычного для любого инфраструктурного проекта шагов:
ТЗ (в предыдущей части);
критерии выбора локальной LLM;
архитектурное решение приложения (HLD);
детализация (LLD);
реализация.
В моем случае именно такая последовательность дала хороший результат: нейросеть работала внутри заранее заданной конструкции, не подменяя архитектурное мышление [3], при этом обладая максимально полными данными для реализации. Все самое интересное представлю через статью.
Так же, как и во все остальном, выбор модели необходимо строить по обязательным техническим параметрам, отвечающим используемой инфраструктуре, а не только по популярности и отзывам.
Если для пет-проекта подход популярности еще может быть допустим, то для инженерной задачи он будет способствовать только накоплению технического долга в дальнейшей эксплуатации.
Для текущего проекта модель должна быть не просто чатом для общения, а выполнять конкретные функции, указанные в ТЗ (в прошлой статье [1]). То есть выбор должен быть основан так же по определенным критериям.
Обобщенно:
осуществлять триаж событий уровня Warning и ниже (низкая критичность);
осуществлять формирование рекомендаций только для диагностики;
выполнять корреляцию при отсутствии детерминированной логики;
работать в локальном контуре.
Дополнительно можно добавить уже отдельные условия, которые логично [4] вытекают из требований:
получение быстрого ответа на домашнем сервере;
интеграцию через Ollama для упрощения взаимодействия.
Ollama вполне может снижать скорость работы локальной LLM. Например, недавно на Хабре мне попалась вполне достойная статья [5]наглядно показывающая замедление работы в 3 раза. Однако, хоть для описываемого мной кейса это не критично, для уже настоящих проектов необходимо иметь это в виду.
Для указанной задачи в разрезе прикладной инфраструктурной системы были выделены следующие критерии.
Причинами данного решения были:
уведомления и контекст алертов содержать чувствительные инфраструктурные данные (имена, IP-адреса и т.д.);
подход к построению домашней инфраструктуры изначально подразумевал минимальную зависимость от внешних сервисов;
получение воспроизводимой схемы развертывания в другой инфраструктуре в случае отладки или миграции.
От модели требуется:
работать по шаблону;
стабильно отвечать на короткие прикладные запросы;
поддерживать краткую уверенную стилистику;
возвращать структурированный результат.
Другими словами, от модели не требуется написание текстов, моделирование многослойного агентного поведения [6] или генерации кода.
Для триажа и рекомендаций диагностики эти требования будут важнее максимальной общей мощности. Если модель будет прекрасна в абстрактных описаниях, но при этом не сможет держать формат ответа, то для текущей задачи она будет бесполезна.
Один из ключевых моментов, т.к. собиралось для домашнего сервера без выделенного GPU с устаревшими CPU, еще и в Docker внутри ВМ. Модель должна быть не слишком требовательная, при этом давая приемлемый latency для событийного пайплайна, так как параллельно на той же ВМ будут работать и другие проекты в контейнерах.
Даже учитывая использование очереди и основного движка системы, обработка может затягиваться до десятков минут, что резко снижает эффективность ответов. Ведь если триаж, корреляция (fallback, если нет детерминированной логики) и решения по диагностике занимают слишком много времени, то:
растет очередь;
audit log становится бесполезным в реальном времени;
происходят критические задержки до получения результата с потерей актуальности информации.
Таким образом важен баланс между качеством ответа и скоростью подачи.
Модель не должна быть излишне творческой, т.к. задача у нее в проекте не быть чат-бот ассистентом. Соответственно модель не должна:
уходить в длинные рассуждения;
выдумывать что-то за пределами строгих рамок;
менять формат ответа от запроса к запросу;
развертывать ответ за пределами поставленной задачи.
В проекте изначально заложены строгие ограничения, однако и сама модель из коробки должна быть послушна в следовании инструкциям.
Критерий для упрощения развертывания и взаимодействия. Модель должна быть:
доступной по тегу;
без проблем тянуться;
стабильно существовать в локальной системе;
не требовать отдельной сборки;
не требовать кастомной конвертации или runtime.
Чем меньше нестандартных телодвижений – тем проще будет интеграция.
При изучении основных параметров для меня это понятие было самым сложным для понимания, т.к. часто упоминается вскользь. На деле – это так же важный критерий при запуске локально (тем более в домашнем контуре), поэтому рассмотрю квантизацию отдельным подпунктом.
Квантизация — это способ уменьшить размер модели и требования к ресурсам (памяти [7]) за счет представления весов в более компактной форме (температура модели).
Иными словами квантование – это метод снижения вычислительных затрат и затрат памяти на инференс путем представления весов и активаций с помощью типов данных низкой точности.
Мне очень помогла о представлении вот эта статья [8]на Хабре.
Для проекта это будет значить уменьшение потребления ресурсов, порога входа self-hosted среды и повышения общей скорости модели.
Однако существует ряд минусов:
возможна потеря качества;
возможно падение стабильности следования формату.
В локальном проекта квантизация неизбежна, но остается вопрос, насколько модель сохраняет полезность после квантизации.
Для моего пайплайна модель в квантизированном виде должна была остаться полезной для триажа, коротких и структурированных вердиктов, рекомендаций с ограничением на безопасную диагностику, fallback корреляцию (вспоминаем ТЗ).
Для домашнего проекта не самый важный критерий, однако все равно его нельзя игнорировать для дальнейшего использования.
Поэтому необходимо понимать:
правовую возможность тянуть и запускать локально;
ограничения на использование;
актуальность экосистемы вокруг модели.
Суммаризируя все критерии и отсеяв по ним предложения, выбор пал на Qwen3.5-4B.
К моменту публикации кейса уже вышла Qwen3.6, однако, если верить описанию [9]самое главное улучшение относится к кодингу, а также отсутствует 4B версия.
Пройдем по чек-листу
|
Требование |
Соответствие / примечания |
|
Возможность локального запуска без облачной зависимости и API внешнего провайдера |
Соответствует. Ollama официально поддерживает локальный запуск моделей в Docker и через локальный API на localhost:11434; для семейства qwen3.5 в Ollama есть готовый тег qwen3.5:4b, который можно запускать локально командой |
|
Достаточность качества при следовании точным инструкциям и кратком анализе |
Частично соответствует. Для точного тега qwen3.5:4b Ollama не публикует отдельные instruction-following benchmark’и, но саму линейку qwen3.5 позиционирует как family с “utility and performance [10]“, а в официальных материалах [11] Qwen для близких малых instruct-моделей Qwen2.5 видно, что семейство хорошо держится на instruction-following и прикладных задачах по сравнению с моделями сопоставимого класса. Для проекта окончательное подтверждение шло уже практическим пилотом |
|
Требование к ресурсам и размер |
Соответствует. Для qwen3.5:4b в Ollama [12] указан размер модели 4.66B parameters, а размер конкретного тега – 3.4 GB, что хорошо укладывается в локальный self-hosted контур и заметно проще для эксплуатации, чем более крупные open-weight модели. |
|
Скорость инференса |
Частично соответствует. Для exact-тега Ollama не публикует TTFT/tokens-per-second, но на странице qwen3.5:4b [12] прямо указаны “Efficient Hybrid Architecture”, “high-throughput inference” и “minimal latency and cost overhead”. Конечно же – это не гарантия SLA, но приемлемый (для начала) архитектурный индикатор. Однако фактическую пригодность по latency все равно надо подтверждать пилотом на своем железе. |
|
Предсказуемость поведения [13] |
Частично соответствует. Прямого критерия “predictability” в карточке нет, но для прикладного использования важны instruction-following и стабильность structured-output. В официальных Qwen-материалах [11] (да, это снова для 2.5, но исходим из предположения, что мажорная версия не стала хуже) у близких instruct-моделей семейства Qwen видны конкурентные или превосходящие результаты на instruction-following и прикладных тестах, однако для конкретного qwen3.5:4b этот критерий все равно должен подтверждаться уже в собственном пайплайне через промпты, guardrails и audit. |
|
Нормальная работа в Ollama |
Соответствует. Модель доступна как официальный тег в библиотеке Ollama (qwen3.5:4b [12]), запускается через стандартный механизм ollama run, а доступ к ней идет через обычный локальный API Ollama. |
|
Разумная квантизация |
Соответствует. Для тега qwen3.5:4b [12] на странице Ollama явно указана квантизация Q4_K_M, что и делает локальный запуск практичным по памяти и размеру. Дополнительно для семейства Qwen3 есть отдельное эмпирическое исследование квантизации [14], подтверждающее вполне эффективное использование. |
|
Лицензия и практическая доступность |
Соответствует. На странице [12]тега в Ollama указана лицензия Apache 2.0; в официальном репозитории Qwen также сказано, что open-weight модели лицензируются под Apache 2.0. Практическая доступность хорошая: модель есть в библиотеке Ollama, подтягивается стандартным способом и не требует нестандартного рантайма. |
Основная задача была не в выборе лучшей небольшой модели, а наиболее приемлемой для локального пайплайна.
Поэтому в первую очередь сравнение было с близкими по назначению малыми моделями – Llama3.2-3B и Gemma3-4B.
Без преувеличения – для меня это была самая сложная часть, в которую пришлось погрузиться с головой.
Пока готовил материал, уже зарелизилась и gemma4-e4B [15], что может стать фаворитом, так как в бенчмарках [16]показывает прекрасные результаты, да еще и, наконец-то, Apache 2.0 лицензия [17]! Обязательно попробую, но уже после завершения этого цикла.
У Meta в текстовой lightweight-линейке Llama 3.2 доступны 1B и 3B модели. То есть ближайший малый вариант – это 3B, а следующего шага на 4B внутри той же lightweight-линейки просто нет. Официальная карточка [18] прямо указывает, что текстовые Llama 3.2 – это именно 1B и 3B модели с контекстом 128K.
У Gemma 3 линейка шире: 270M, 1B, 4B, 12B и 27B; в Ollama отдельно указано [19], что 4B-модель (так же, как и остальные) относится к multimodal-вариантам с контекстом 128K.
У Qwen3.5 в Ollama [10] размерная линейка выглядит более плавной: 0.8B, 2B, 4B, 9B, 27B, 35B и 122B. На странице тегов Ollama для семейства Qwen3.5 прямо видны эти размеры, а для актуального тега указывается контекст 256K.
Это не доказательство качества той или иной модели, но дает информацию о позиционировании в самом семействе.
Для текущего сценария длинный контекст не является главной причиной выбора. Однако полностью отбрасывать его нельзя, так как при обогащении информацией алерта, audit log, корреляции с соседними событиями (RCA) и пояснениями, промпт может увеличиваться.
У Qwen3.5-4B в официальной карточке на Hugging Face [20] указан default context length 262,144 tokens, и отдельно отмечено, что при OOM можно снижать окно, но для сохранения thinking capabilities рекомендуется держать не менее 128K.
У Gemma 3 4B в Ollama и модельной карточке [19] фигурирует 128K context window.
У Llama 3.2 3B официально указан [18] 128K context length.
Исходя из этого получаем, что Qwen дает запас по контексту среди моделей своего класса.
Qwen3.5-4B в карточке на Hugging Face [20] указана лицензия Apache 2.0.
У Llama 3.2 используется Llama 3.2 Community License [18] – собственная лицензия Meta.
У Gemma модели поставляются с open weights и допускают “ответственное коммерческое использование”, но это отдельный набор условий Google/Gemma Terms of Use [21].
Для пет-проекта это не критично, но глобально Apache 2.0 делает модель более предсказуемой с точки зрения [22] лицензирования при включении в собственный self-hosted стек.
Из 3-х основных требований, по которым проводилось сравнение близких малых LLM мне больше подошла Qwen3.5-4B.
Идеальным вариантом было бы развертывание 3-х моделей с последующим тестированием, однако эту активность откладываю в “долгий ящик”, возможно когда-нибудь опишу тестирование в рамках этого кейса и других моделей. Но сроки реализации дать не могу, т.к. это хобби, на которое не всегда хватает времени.
В данной статье была рассмотрена методология выбора локальной LLM в рамках имеющейся задачи и соответствующий выбор.
Данный шаг я решил выделить до HLD и LLD по нескольким причинам:
у меня до этого не было никакого опыта с локальными LLM и базовые понятия были всего лишь пустым звуком, поэтому необходимо было наверстать упущенное;
необходимо было понять возможности локальных LLM и принцип их работы , чтобы уже полноценно перейти к этапу построения архитектуры задачи.
Изыскания по выбору модели действительно были интересными и дали более полноценное понимание работы этого инструмента.
Раньше я был принципиально против любых видов LLM и считал их чуть менее, чем полностью, бесполезными. Однако мнение изменилось, ведь это просто еще один инструмент, которым надо уметь и учиться пользоваться.
В следующей статье уже перейдем к дизайну проекта, разберем, какие вещи в архитектурном планировании можно отдать нейросети (конечно же не бесконтрольно), представлю полученную архитектуру, и, через статью, перейду к реализации и описанию результата.
Автор: it_zoobik
Источник [23]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/30157
URLs in this post:
[1] Часть 1: Вводная и формирование ТЗ: https://habr.com/ru/articles/1031140/
[2] опыта: http://www.braintools.ru/article/6952
[3] мышление: http://www.braintools.ru/thinking
[4] логично: http://www.braintools.ru/article/7640
[5] статья : https://habr.com/ru/articles/1025132/
[6] поведения: http://www.braintools.ru/article/9372
[7] памяти: http://www.braintools.ru/article/4140
[8] статья : https://habr.com/ru/articles/975468/
[9] описанию : https://ollama.com/library/qwen3.6
[10] utility and performance: https://ollama.com/library/qwen3.5
[11] официальных материалах: https://qwen.ai/blog?id=qwen2.5-llm
[12] Ollama: https://ollama.com/library/qwen3.5%3A4b
[13] поведения: http://www.braintools.ru/article/5593
[14] есть отдельное эмпирическое исследование квантизации: https://arxiv.org/html/2505.02214v1
[15] gemma4-e4B: https://ollama.com/library/gemma4
[16] бенчмарках : https://habr.com/ru/companies/bothub/articles/1021636/
[17] Apache 2.0 лицензия: https://huggingface.co/google/gemma-4-E4B
[18] Официальная карточка: https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct
[19] в Ollama отдельно указано: https://ollama.com/library/gemma3%3A4b
[20] в официальной карточке на Hugging Face: https://huggingface.co/Qwen/Qwen3.5-4B
[21] отдельный набор условий Google/Gemma Terms of Use: https://ai.google.dev/gemma/terms
[22] зрения: http://www.braintools.ru/article/6238
[23] Источник: https://habr.com/ru/articles/1033798/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1033798
Нажмите здесь для печати.