🧠NAS как ИИ-сервер
💬
Фаза 5 · LLMГодится

Языковые модели

Сердце всего. LLM разбирает документы в JSON, понимает команды для умного дома и просто отвечает на вопросы по-русски. Прогнали 14 моделей от 1.7B до 35B, включая модели Вихря против их базовых версий.

Берём Qwen3.5-4B для голосовых команд, Qwen3.6-35B-A3B для качества на русском и разбора документов
Сухие цифры и методика →

На NAS нет видеокарты, только встроенная графика Intel и 32 ГБ общей памяти. Звучит грустно, но есть хитрость: MoE-модели. У Qwen3.6-35B-A3B 35 миллиардов параметров, но на каждый токен работают только 3 миллиарда. Получается и умно, и терпимо по скорости: 8.7 токенов в секунду, примерно как читает человек.

8.7 tok/sQwen3.6-35B на iGPU — 35B параметров!
40 из 40команд умного дома у Qwen3.5-4B
100%валидного JSON у всех 14 моделей (с одной хитростью)
2.5 tok/sу плотных 24B — слишком медленно

Кто умнее по-русски

Выше — умнее, правее — быстрее. 🌀 — модели Вихря. Belebele — понимание текста, MMLU — знания, MGSM — задачки на арифметику; по 40–100 вопросов, разница меньше ~5 пунктов — шум.

Наверху — MoE-модели: Qwen3.6-35B, Gemma 4 26B и gpt-oss-20b. Они и умнее, и в 3–4 раза быстрее плотных 24B (Mistral-Small и Vistral), которые на этом железе выдают 2.5 токена в секунду. Это примерно слово в секунду, на чат не годится. Маленькие модели на 1.7B быстрые, но заметно глупее.

Qwen3.5-4B — отдельный герой. По знаниям на русском (MMLU 74%) она обходит Qwen3-8B, а занимает всего 4.7 ГБ.

Команды умного дома

LLM получает команду («сделай свет в спальне потусклее, процентов на тридцать») и 13 инструментов Home Assistant. От неё нужно выбрать правильный инструмент с правильными параметрами.

40 голосовых команд для Home Assistant (по тексту, без распознавания речи). Выше и левее — лучше.

Достаём данные из документов в JSON

Задача: дать модели текст (счёт, заявку на ремонт, объявление) и JSON Schema, а получить заполненный JSON. В документах спрятаны ловушки: «8,5 млн руб.», телефон «8 907…», который надо привести к «+7907…», поля, которых в тексте нет (нужен null, а не выдумка).

объявление

Продаётся двухкомнатная квартира в г. Екатеринбург. Площадь 54,3 м². Цена: 8,5 млн руб., торг уместен. Из плюсов: балкон, новый ремонт, рядом метро. Звоните: 8 907 129 54 00.

правильный JSON
{
 "type": "flat",
 "price": 8500000,
 "currency": "RUB",
 "area_m2": 54.3,
 "rooms": 2,
 "city": "Екатеринбург",
 "contact_phone": "+79071295400",
 "features": [
  "балкон",
  "новый ремонт",
  "рядом метро"
 ]
}
Модельтелефон, режим B (\d)телефон, режим C ([0-9])ценакомнат
Qwen3-1.7B89071295400+7907129540085000002
Ling 3.0 Tiny89071295400+790712954008500000null
LFM2.5-24B+7907129015400+7907129010085000002
Qwen3.5-4B89071295400+7907129540085000002
Qwen3.6-35B+79071295400+7907129540085000002

Хитрость, которая даёт 100% валидного JSON

llama.cpp умеет «зажать» модель грамматикой по JSON Schema (response_format: json_schema), и тогда синтаксис всегда правильный. Но есть подвох: \d в регулярках схемы llama.cpp молча игнорирует. Поле с телефоном просто не проверяется, и маленькие модели пишут «89071295400» вместо «+79071295400». Стоит написать [0-9] вместо \d — и все 14 моделей выдают 100% валидных ответов.

24 документа. Большие модели (Gemma 4, Qwen3.6, Mistral) и так дают 100% в любом режиме — их на графике нет.

По точности лидеры почти идеальны: 98.5–99.3% полей верно. А целиком без единой ошибки разбирают 92–96% документов.

Счета, заявки, письма, рецепты, объявления, отзывы — 24 штуки, в каждом 7–12 полей. Одна ошибка в любом поле — документ не засчитан.

Типичные ошибки: лишний пункт в списке («торг уместен» среди плюсов квартиры), выдуманное время окончания встречи, которого в тексте нет, срочность заявки normal вместо low.

Вихрь против базовых моделей

Вихрь — русские дообучения популярных моделей. Мы сравнили их с базовыми моделями в той же квантизации и на тех же задачах.

Выше нуля — Вихрь лучше своей базовой модели, ниже — хуже. Та же квантизация Q4_K_M, те же задачи.

Чуда не случилось. QVikhr-3 знает больше фактов (MMLU +7…11 у маленьких моделей), но чуть хуже извлекает JSON, выполняет команды и решает задачки. А Vistral-24B сломал вызов инструментов: 10% команд против 85% у базового Mistral-Small. По знаниям он с базой наравне.

Грабли, на которые мы наступили

--cache-ram 0 обязателен

По умолчанию llama-server кэширует промпты в RAM, и на этом iGPU каждый запрос с новым промптом получал +10 секунд непонятной задержки. С --cache-ram 0 всё летает. Кэш внутри слота при этом работает: системный промпт с описанием дома не обрабатывается заново.

Gemma 4 и Intel iGPU не дружат

На этой сборке llama.cpp Gemma 4 без флага --swa-full выдаёт мусор («de de de») или вешает видеокарту так, что в логе ядра появляется GPU hang. С флагом работает, но ломается кэш промпта: его приходится отключать, и каждая команда обрабатывает 2 тысячи токенов заново. Отсюда и 30 секунд на команду.

Грамматика может зациклить модель

В одной реальной схеме было строковое поле без ограничения длины. 8 моделей из 14 под грамматикой ушли в бесконечное «jZ2dna2NjZ2d…» до лимита токенов. Мораль: в своих схемах задавай maxLength.

Итого

Задача Берём Почему
Голосовые команды Qwen3.5-4B 40/40, 6.6 с, 4.7 ГБ, отвечает словами
Документы → JSON Qwen3.6-35B или gpt-oss-20b 99.3% полей, ~18 с на документ
То же, но быстро Ling 3.0 Tiny 98% полей за 6 с
Вопросы и тексты на русском Qwen3.6-35B-A3B лучший по всем тестам, 8.7 tok/s, 18 ГБ