Я делаю Lumi, открытый лаунчер в духе Spotlight: по горячей клавише открывается строка, в которой можно запустить программу, найти файл или задать вопрос нейросети. Честно скажу сразу: код я пишу вместе с Claude, сам я не программист. Но тесты, цифры и ошибки ниже настоящие, и о них хочется рассказать.

Задача была такая: человек без опыта нажимает одну кнопку и получает ИИ, который работает без интернета. Ему не нужен терминал и не нужно знать, что такое Ollama. Дальше расскажу, что из этого вышло и обо что я споткнулся.

1. Какую модель выбрать: тест четырёх кандидатов

Кандидаты: gpt-oss 20B, Qwen 3.5 9B, Gemma 4 E2B и Gemma 4 E4B. Я задал им одинаковые бытовые вопросы, все без интернета, через Ollama. Несколько показательных ответов:

Вопрос

gpt-oss 20B

Gemma 4 E4B

«Где туалет?» по-турецки

«Nerede tuvalet?» — слова не в том порядке

«Tuvalet nerede?» ✓

Excel пишет #ЗНАЧ!

предложил функцию =ПРОПУСК(), которой не существует

«В ячейке текст вместо числа» ✓

Вежливо ответить начальнику, что отчёт будет к 12

ответил так, будто начальник — он сам

«Отчёт пришлю к 12:00, мне нужно ещё проверить цифры» ✓

Самая большая модель оказалась не лучшей для этой задачи, а в памяти она занимает около 13 ГБ против примерно 7 ГБ у Gemma 4 E4B. В итоге получилась такая линейка:

Модель в Lumi

Основа

Параметров всего

Нужно памяти

lumi-mini

Gemma 4 E2B

4,6 млрд

от 8 ГБ

lumi

Gemma 4 E4B

7,5 млрд

от 12 ГБ

lumi-pro

Qwen 3.6 35B-A3B

36 млрд (активных ~3 млрд)

от 32 ГБ

Приложение само предлагает самую большую модель, которая помещается в память компьютера.

Про «думающие» модели. Qwen и gpt-oss по умолчанию сначала «размышляют», и ответ в строке появляется через 20–30 секунд. Для строки поиска это слишком долго. В запросе к Ollama помогает "reasoning_effort": "none": ответ приходит сразу, а на бытовых вопросах качество почти не падает.

2. Ollama одной кнопкой на трёх ОС, без прав администратора

Это заняло больше всего времени. Требования: ничего не просить у пользователя, не требовать пароль администратора и не ставить непроверенные файлы.

  • macOS. Скачиваем официальный Ollama-darwin.zip и перед установкой проверяем подпись: codesign с требованием anchor apple generic and certificate leaf[subject.OU] = "<Team ID Ollama>". Подменённый архив установлен не будет. Кладём в /Applications, а если туда нет прав, то в ~/Applications.

  • Windows. Скачиваем официальный установщик, проверяем Authenticode-подпись (WinVerifyTrust) и имя подписанта. Запускаем тихо: /VERYSILENT /SUPPRESSMSGBOXES /NORESTART. Ставится в профиль пользователя, права администратора не нужны.

  • Linux. Берём архив ollama-linux-amd64.tar.zst с GitHub-релизов Ollama, сверяем SHA-256 с их sha256sum.txt, распаковываем в ~/.local/share/lumi/ollama и запускаем ollama serve. Ни sudo, ни systemd не нужны.

Скачивание идёт через /api/pull с прогрессом. Ollama отдаёт поток NDJSON, где у каждого слоя есть total и completed. Чтобы полоска прогресса не прыгала, суммирую их по всем слоям.

3. Ловушка: системное сообщение заменяет SYSTEM из Modelfile

Свой характер модель получает через Modelfile: SYSTEM с правилами («отвечай на языке вопроса, коротко, не пиши заготовок вроде [Имя]») плюс несколько примеров диалогов через MESSAGE. Приложение создаёт модель у пользователя через /api/create из базовой.

Потом понадобилось сообщить модели, на какой ОС она запущена. Без этого на Linux на вопрос «как посмотреть, сколько места на диске?» lumi отвечала: «На Windows: откройте „Этот компьютер“…». Первая мысль была добавить {"role": "system", "content": "The user's computer runs Linux"} в каждый запрос.

Так нельзя: системное сообщение в запросе полностью заменяет SYSTEM из Modelfile. Я проверил три варианта на одном и том же запросе «Напиши клиенту, что мы задержим проект до пятницы»:

Вариант

Результат

Только Modelfile

«Здравствуйте! Сообщаем, что срок сдачи проекта будет перенесён на пятницу…» ✓

Системное сообщение: весь промпт + строка про ОС

иногда возвращаются заготовки: «из-за [кратко укажите причину…]»

Системное сообщение: только строка про ОС

модель «забывает», кто она: три варианта письма с заголовками, эмодзи и [Имя клиента]

Решение: строку про ОС зашиваем в SYSTEM прямо при создании модели. А старые модели, созданные прошлыми версиями, приложение обновляет при запуске:

  1. Через /api/show берёт текущий system у модели.

  2. Если он не совпадает с ожидаемым, а базовая модель уже лежит на диске, заново вызывает /api/create с тем же from.

Пересоздание занимает пару секунд и ничего не скачивает: Ollama переиспользует слои базовой модели. После обновления на Linux модель отвечает «Открой терминал и введи команду df -h», на Mac — «Об этом Mac → Хранилище».

4. Честный экзамен: где маленькие модели ошибаются

Чтобы не обманываться, я гоняю модели по одному экзамену: 10 вопросов с однозначным ответом, одна попытка, без интернета.

lumi-mini

lumi

lumi-pro

Результат

7/10

7/10

10/10

Типичные ошибки маленьких моделей:

  • «Сколько полных лет было Пушкину, когда он умер?» — lumi-mini ответила «55», lumi — «32» (правильно 37);

  • «Сколько букв „а“ в слове „барабан“?» — lumi ответила «четыре»;

  • «Батон и булка стоят 110 ₽, батон на 100 ₽ дороже» — lumi ответила «50 рублей»;

  • ударения: в одном тесте lumi-mini писала слово целиком заглавными и вообще не показывала ударение.

Вывод для приложения: небольшую модель нельзя выдавать за справочник. Поэтому в промпте прямо сказано: если нужны свежие факты, честно признайся, что не знаешь. А для вопросов о новостях в той же строке можно переключиться на облачную модель с поиском.

5. Что дальше

Дальше хочу попробовать дообучить lumi-mini (LoRA через MLX) прямо на MacBook и пересдать тот же экзамен. Экзамен специально держу отдельно от обучающих примеров, чтобы модель его не зазубрила. Если получится, напишу отдельную статью с цифрами «до/после», даже если «после» окажется хуже.

Мне интересно, с чем сталкивались вы:

  • если вы встраивали локальные модели в приложение, как сообщали модели контекст (ОС, язык, время), не ломая её Modelfile?

  • какие маленькие модели у вас лучше всего работают на русском?


Код открыт (MIT): github.com/AlbertS15/Lumi. Lumi — независимый проект, не связан с Anthropic, OpenAI, Google или Ollama.