Офлайн-ИИ в десктопном приложении: что я узнал, встраивая Ollama в лаунчер для трёх ОС

Я делаю 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 прямо при создании модели. А старые модели, созданные прошлыми версиями, приложение обновляет при запуске:
Через
/api/showберёт текущийsystemу модели.Если он не совпадает с ожидаемым, а базовая модель уже лежит на диске, заново вызывает
/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.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.