← AI Advent 2026

День 26: модель на своей машине

Ollama на ноутбуке владельца отвечает по CLI и по HTTP. Восемь запросов разной сложности — от факта одной фразой до выжимки документа на четыре с половиной тысячи токенов — прогнаны по одному разу, и у каждого видно, верно ли он отвечен, через сколько пришёл первый токен ответа и с какой скоростью.

Итог дня

Читаю результаты прогона…

  • Повторов на запрос — нет данных. Разброс по повторам в этом прогоне не измерен вовсе: разница в один вердикт может быть шумом, а не свойством запроса.
  • Ступеней восемь, и каждая представлена одним запросом: это не статистика, а срез.
  • Верность ставили код и человек. Модели-судьи в этом прогоне не было, и способ оценки стоит у каждой строки таблицы.
  • Мерено на ноутбуке, а не на проде: на прод переносятся качество и ограничения модели, не секунды.
Как это мерено

Каждый запрос уходил в /api/generate потоком (stream: true) на локальный экземпляр Ollama по петле. Обвязка записывала: промпт, полный ответ, prompt_eval_count, eval_count, load_duration, prompt_eval_duration, eval_duration, done_reason.

Ток/с — это eval_count, делённое на eval_duration: скорость самой генерации, без обработки входа и без загрузки весов. До 1-го токена ответа — время от отправки запроса до первого чанка видимого ответа. На восьми запросах с выключенным рассуждением это то же, что первый чанк любого вида; на строке с включённым рассуждением — нет, и разница там в сотни раз.

Перед каждым запросом снимался размер журнала Ollama: появление в нём обслуженного запроса означало бы, что в то же окно отвечала служба сайта, и замер был бы помечен «с помехой». Помех за прогон не было.

Как оценена верность

Три значения: верно, частично, неверно — рубрика 2/1/0 дня 22. Рядом с вердиктом стоит способ оценки, и он важнее самого вердикта.

  • Механически — ответ сверял код или точный эталон: год в факте, число в арифметике, день недели по datetime, запуск функции в Node 22 против восьми наборов входа, разбор JSON против схемы.
  • Вручную — смысловая сверка человеком: перевод абзаца, пункты выжимки против исходного документа, ответ про коды 429 и 503.

Третьего способа — модели-судьи — в этом прогоне не было, хотя ADR недели его предусматривал. Поэтому там, где стоит «вручную», читатель проверяет не число, а чужое прочтение: полный ответ модели лежит в разборе ниже, и прочтение можно оспорить.

Почему скорость гуляет вдвое

Разброс в таблице — не шум прогона и не окно контекста. У тега модели включено спекулятивное декодирование draft-MTP: черновой слой предсказывает несколько токенов вперёд, и выигрыш зависит от того, насколько текст предсказуем. Там, где принимается почти весь черновик, скорость удваивается. Там, где почти ничего, прогон чернового слоя не отрабатывает своих накладных расходов, и остаётся собственная скорость модели.

Читаю результаты прогона…

Чего этот замер не мерил
  • Устойчивости. Один прогон на запрос. Повтор того же запроса в отдельной серии дал разброс около трёх процентов, но это один запрос, а не весь набор.
  • Потолка железа. Ноутбук был в обычной интерактивной работе владельца, а не на изолированном стенде. Числа — скорость на рабочей машине под нагрузкой.
  • Проды. Замер шёл в отдельный экземпляр Ollama по петле; служба, которую видит сайт, не трогалась.
  • Качества на длинной дистанции. Восемь запросов — срез ступеней сложности, а не выборка, по которой считают долю ошибок.
  • Энергопотребления и троттлинга. Предупреждений о тепловом троттлинге за прогон не было, но частоту без привилегированного доступа не снять.

Что уже было закрыто

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

Разбор по запросам

У каждого запроса — полный промпт, эталон, полный ответ модели и причина вердикта. Ответы не пересказаны: их можно прочитать и оспорить.

Читаю результаты прогона…

    Способы доступа

    Один и тот же запрос — тремя способами. Сравнение не про скорость: про то, какие метрики способ вообще отдаёт и что он делает с рассуждением модели. Ответ верен во всех четырёх вызовах.

    Читаю результаты прогона…

    Побочное наблюдение, важное для эксплуатации: загрузка весов повторялась при каждом переключении между вызовами с разным окном контекста — Ollama поднимает под другое num_ctx новый экземпляр модели. Отсюда и две раздельные службы в текущей схеме: сайт и локальные опыты не делят одно окно.

    Как это вызвать

    Через CLI
    OLLAMA_HOST=127.0.0.1:11435 ollama run qwen3.8:27b --verbose --think=false 'In what year was the Eiffel Tower completed?'
    Через HTTP
    curl -s http://127.0.0.1:11435/api/generate -d '{"model":"qwen3.8:27b","prompt":"In what year was the Eiffel Tower completed?","stream":false,"think":false,"options":{"num_ctx":16384,"temperature":0,"seed":42}}'

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

    Задание дня

    День 26 «Запуск локальной LLM»: установить и запустить локальную LLM; проверить: запускается локально, доступ через CLI или HTTP API, отвечает на простой запрос; сделать: запросы разной сложности. Результат: локальная LLM запущена и отвечает.