Перейти к основному содержанию

Локальная LLM для AI-чата

Около 4 мин

Локальная LLM для AI-чата

AI-чат Storm оркестрирует внутренние инструменты (создать диаграмму, завести роли и документы, привязать их к процессу, проставить описания). По умолчанию движком выступает внешняя модель через OpenAI-совместимый API. Эту модель можно заменить на локальную LLM на собственном GPU — так дешевле в эксплуатации, а данные не покидают контур. Рядом с моделью на той же карте можно поднять голосовой ввод.

Мы прогнали 8 моделей через настоящий чат Storm с реальными MCP-инструментами на четырёх типах задач и выбрали ту, что тянет агентный tool-calling в продовом сценарии. Ниже — рекомендация и обоснование.

Смена модели — это две настройки, без правки кода

Движок переключается параметрами bpmnAiCompletionBaseUrl и bpmnAiCompletionModel в настройках приложения. Формат OpenAI-совместимый, поэтому подходят как облачные API, так и self-hosted-сервер (vLLM/SGLang). Код приложения менять не нужно.

Коротко

На простых задачах почти все модели работают одинаково хорошо — и это обманчиво. Расхождение проявляется на двух осях:

  1. Масштаб — построить процесс на 20–30 элементов смогли только MoE-модели Qwen.
  2. Многоходовая переписка — половина моделей теряет рабочий контекст между сообщениями или выдаёт вызовы инструментов простым текстом. А чат всегда многоходовый.

Сквозь оба фильтра из локальных моделей прошла одна.

ПриоритетМодельМасштабЧатВердикт
🥇 Основной выборQwen3-Next-80B-A3BЕдинственная локальная модель, прошедшая все 4 теста: довела до конца крупный процесс и удержала контекст в многоходовом чате с верным восстановлением состояния. MoE с 3B активных параметров — быстрая, остаётся запас VRAM под голосовой ввод.
⚡ Быстрая альтернативаQwen3-Coder-30B-A3BЧемпион одиночных задач (крупнейшая схема, быстрее всех, минимум VRAM), но в многоходовом чате ломается — выдаёт вызовы инструментов текстом. Кандидат №2 только если при self-host наладить парсер tool-call (--tool-call-parser в vLLM) и перепроверить многоходовость.
⚠️ Не для продаLlama-3.3-70B / Mistral-Small-24B / gpt-oss-120BНа малых задачах в порядке, но рассыпаются на масштабе (пустая схема, выдуманный отчёт) или в чате (потеря контекста).

Кандидаты (все влезают в 96 ГБ)

Бюджет — одна карта класса NVIDIA RTX PRO 6000 (96 ГБ). Все модели в него помещаются с тем или иным квантованием.

МодельТип / активныхКвант на 96 ГБЗаметка
Qwen3-Coder-30B-A3BMoE / 3BFP8 ~30 / INT4 ~16 ГБагентно-кодовая, очень лёгкая
Qwen3-Next-80B-A3BMoE / 3BINT4 ~45 ГБширокие общие знания
GLM-4.5-AirMoE / 12BINT4 ~55 ГБагентный профиль
gpt-oss-120BMoE / 5BMXFP4 ~61 ГБopen-weights от OpenAI
Llama-3.3-70Bdense / 70BFP8 ~70 / INT4 ~40 ГБзрелый tool-calling
Qwen3-32Bdense / 32BFP8 ~32 ГБ
Mistral-Small-3.2-24Bdense / 24BFP8 ~24 / INT4 ~12 ГБлёгкая

Как мы тестировали

Четыре типа задач — от простого выбора инструмента до сборки крупного процесса и живого диалога. Результат сверяли не по словам модели, а по факту в базе данных: что реально создалось, привязалось и описалось.

  • Выбор инструмента — типовые запросы на чтение плюс один off-topic: выбирает ли модель правильный инструмент и не срывается ли в болтовню.
  • Простой сценарий создания — один промпт собирает диаграмму, задачи, роли с назначением, документ с привязкой и описания (~15 вызовов, нужно прокидывать id между ними).
  • Мега-процесс — «Выдача потребительского кредита» на 20–30 элементов: шлюзы, ветвления, цикл доработки, роли, документы, описания.
  • Многоходовая переписка — процесс собирается за 5 сообщений подряд, как в реальном чате. Проверяем, что модель не теряет контекст (правит ту же диаграмму, помнит id) и в конце верно пересказывает собранное.

Что показал прогон

На простом сценарии хороши почти все — 5 из 8 моделей чисто проходят цепочку из ~15 вызовов. Кажется, можно брать любую. Но это и есть ловушка.

На масштабе поле резко разделилось. Крупную валидную схему (33 и 38 узлов) собрали и полностью связали (роли, документы, описания) только Qwen3-Coder-30B и Qwen3-Next-80B. Остальные сорвались:

  • Llama-3.3-70B — схема осталась пустой (только стартовое событие), но модель «назначила роли» и «проставила описания» на несуществующие элементы → висящие связи и битая диаграмма.
  • Mistral-Small-24B — схема пустая, но в ответе бодро отчиталась: «создал 22 задачи, 4 шлюза, 13 потоков». Чистая галлюцинация успеха.

Главный вывод по масштабу

На малой задаче «модель-ломака» неотличима от хорошей. Реальный тест — крупная правка диаграммы с длинным массивом операций. Его потянули только MoE-модели Qwen.

В многоходовом чате произошёл главный разворот. Победитель одиночных тестов Qwen3-Coder-30B сломался: в диалоге из нескольких сообщений выдавал вызовы инструментов простым текстом (<function=…>) и ничего не создавал — модель чувствительна к формату tool-call и в многоходовом режиме деградирует. Qwen3-Next-80B оказалась устойчива и довела процесс до конца с верным восстановлением состояния. Для чата (а он всегда многоходовый) это решающий критерий.

Скорость на одной карте

Локально скорость decode упирается в память: tok/s ≈ ПСП / (активные_параметры × байт). У MoE активных параметров мало, поэтому они в 3–8 раз быстрее dense-моделей при сопоставимом качестве. Оценка для vLLM/SGLang, FP8, контекст ~8К:

МодельАктивныхdecode tok/s (1 поток)Простой ходМега-процесс
Qwen3-Coder-30BMoE 3B~140–200~1–2 с~12–20 с
Qwen3-Next-80BMoE 3B~120–180~1–2 с~15–25 с
gpt-oss-120BMoE 5B~120–190~1–2 с
GLM-4.5-AirMoE 12B~70–110~2–3 с~25–40 с
Mistral-Small-24Bdense 24B~55–80~2–4 с
Qwen3-32Bdense 32B~40–55~3–5 с~40–70 с
Llama-3.3-70Bdense 70B~18–28~4–8 с

Пропускная способность — не узкое место

При 2–3 одновременных чатах карта не упирается ни у одной модели: continuous batching даёт агрегат в разы выше однопоточного. Точные цифры под ваше железо снимаются 5-минутным прогоном vllm bench.

Что учесть при self-host

Несколько настроек self-host-сервера, которые стоит выверить до продакшена:

  • Настройте парсер tool-call под выбранную модель (--tool-call-parser в vLLM) — иначе вызовы инструментов могут уходить текстом, и чат перестанет выполнять действия.
  • Подстройте системный промпт под модель: формулировки, требующие явного вызова инструментов и перечитывания состояния перед правкой, заметно стабилизируют поведение на крупных процессах.

Как переключить модель

Параметры задаются в настройках приложения (раздел AI) и применяются без перезапуска:

ПараметрЧто задаётПример
bpmnAiCompletionBaseUrlБазовый URL OpenAI-совместимого эндпоинтаhttp://10.0.0.5:8000/v1
bpmnAiCompletionModelИмя модели на этом эндпоинтеQwen3-Next-80B-A3B

План внедрения

Поднять Qwen3-Next-80B-A3B (vLLM, INT4) на карте 96 ГБ — VRAM хватает с запасом, рядом помещается голосовой ввод. Параллельно можно проверить Qwen3-Coder-30B с корректным парсером tool-call: если многоходовость наладится, это будет более быстрый и лёгкий вариант №1.

Условия прогона

Сравнение выполнено по одному прогону на задачу через прокси-цепочку (абсолютная латенси завышена транспортом; локально модели быстрее). Эталоном качества выступала внешняя модель, не локальный кандидат. Сверка — по факту в БД, а не по тексту ответа модели.

Связанная документация