Гайды

Как запустить модель Hermes локально

Главная причина, по которой модель после скачивания отвечает не так, как ожидалось, — шаблон чата. Разбираем загрузку, шаблон и проверку вызова инструмента.

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

Причина — шаблон чата. Дообученная модель ожидает диалог в конкретной разметке; если разметка не совпадает, модель формально работает, а фактически видит не то, что вы отправили. Это первое, что надо проверять, и последнее, о чём обычно вспоминают.

Речь идёт про веса от Nous Research, а не про одноимённый агентный фреймворк: разбор путаницы — в материале про три разные вещи под именем Hermes. Общий профиль семейства — в обзоре моделей Nous Hermes.

#Что понадобится

  • Установленный локальный сервер моделей. Дальше примеры на Ollama; базовая установка — в материале про локальный запуск через Ollama.
  • Свободная оперативная или видеопамять. Ориентир: файл модели должен помещаться целиком плюс запас на контекст. Точное значение зависит от размера и квантизации.
  • Точное имя сборки. Названия в реестрах отличаются от названий в карточках моделей, поэтому имя надо взять из реестра, а не набрать по памяти.
  • Понимание, что квантизация влияет на качество структурированного вывода: разбор — в материале про формат GGUF.

#Шаг 1. Найти точное имя сборки

Не угадывайте тег. В реестре Ollama модели ищутся по имени, и у одной модели бывает десяток вариантов квантизации с разными суффиксами.

ollama list

покажет то, что уже скачано. Для поиска нового имени откройте библиотеку моделей вашего сервера и скопируйте тег целиком, вместе с суффиксом квантизации.

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

#Шаг 2. Загрузить модель

ollama pull <точный-тег-модели>

Проверка, что загрузка прошла:

ollama list

Модель должна появиться в списке с ожидаемым размером. Если размер заметно меньше ожидаемого — скачался не тот вариант.

Если вы работаете с файлом GGUF напрямую, а не из реестра, модель подключается через описание сборки:

ollama create hermes-local -f Modelfile

где Modelfile содержит как минимум путь к файлу и шаблон. Подробный разбор синтаксиса — в руководстве по Modelfile.

#Шаг 3. Проверить шаблон чата

Это ключевой шаг руководства.

Посмотрите, какой шаблон подставляется на самом деле:

ollama show --modelfile <имя-модели>

В выводе будет блок TEMPLATE. Сверьте его с тем, что указано в карточке модели у автора дообучения. Совпадение должно быть точным: разметка ролей, специальные токены, место системного сообщения.

Три признака неправильного шаблона:

  1. Модель отвечает осмысленно, но игнорирует системный промпт.
  2. В ответе видны служебные токены разметки — модель печатает то, что должно быть невидимой структурой.
  3. Модель продолжает диалог за пользователя: пишет ответ, потом сама задаёт следующий вопрос и сама на него отвечает.

Третий признак — самый однозначный. Он означает, что модель не видит границы конца своего хода, а это ровно то, что задаётся шаблоном.

Быстрая проверка, что системный промпт вообще доходит: задайте в нём легко наблюдаемое правило и посмотрите, соблюдается ли оно.

curl http://localhost:11434/api/chat -d '{
  "model": "<имя-модели>",
  "stream": false,
  "messages": [
    {"role": "system", "content": "Начинай каждый ответ со слова ПРОВЕРКА."},
    {"role": "user", "content": "Скажи что-нибудь короткое."}
  ]
}'

Ответ должен начинаться со слова ПРОВЕРКА. Если не начинается — дальше идти бессмысленно, чините шаблон.

#Шаг 4. Проверить вызов инструмента

Модель, которая держит системный промпт, ещё не обязательно держит формат вызова. Это отдельная проверка.

Опишите в системном промпте один инструмент и синтаксис вызова, затем попросите то, что без него не сделать:

curl http://localhost:11434/api/chat -d '{
  "model": "<имя-модели>",
  "stream": false,
  "messages": [
    {"role": "system", "content": "У тебя есть инструмент list_dir. Чтобы вызвать его, выведи отдельной строкой ровно такую конструкцию: <tool>list_dir({\"path\": \".\"})</tool>. Ничего не выдумывай, если нужен инструмент — вызывай его."},
    {"role": "user", "content": "Покажи, что лежит в рабочей папке."}
  ]
}'

Успех выглядит так: в ответе есть строка с конструкцией вызова, имя инструмента написано правильно, аргументы — корректный JSON.

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

#Проверка результата

Модель считается готовой к использованию, когда одновременно выполняются четыре условия:

  • она есть в списке с ожидаемым размером файла;
  • блок TEMPLATE совпадает с карточкой модели;
  • системный промпт соблюдается: ответ начинается со слова ПРОВЕРКА;
  • на двадцати прогонах конструкция вызова разбирается в подавляющем большинстве случаев.

Четвёртое условие сформулировано без точного числа намеренно: приемлемая доля зависит от того, насколько снисходителен ваш парсер и сколько шагов в ваших цепочках. Важно измерить её и знать, а не считать, что «работает».

#Что может пойти не так

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

Не хватает памяти, и модель выгружается на диск. Симптом — ответы приходят, но очень медленно, а система начинает шуршать диском. Лечение — более сжатый вариант или модель меньше.

Контекстное окно по умолчанию меньше, чем у модели. Локальный сервер может подставлять своё значение, более скромное, чем поддерживает модель. Для агентных цепочек это критично: наблюдения перестают помещаться. Задаётся параметром при запуске или в описании сборки.

Шаблон взят от другой модели. Частый случай при ручном подключении файла GGUF: скопировали описание сборки от соседней модели и не заметили. Симптом — третий признак из шага 3, модель говорит за обоих участников диалога.

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

Модель отказывается пользоваться инструментами. Формулировки вида «я не могу», «сделайте вручную». Лечится прямым утверждением в системном промпте, что инструменты действительно работают, и явным запретом отписываться.

#Когда локальный запуск не нужен

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

И отдельно: скачивание модели с этим именем не даёт вам агентного фреймворка с тем же названием. Это разные проекты; веса — это веса.

#Частые вопросы

#Почему модель игнорирует системный промпт?

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

#Какую квантизацию выбрать?

Наименее агрессивную из тех, что помещаются в вашу память. Для агентных задач это важнее, чем для обычного разговора: сжатие сильнее бьёт по структурированному выводу, где значим каждый символ, чем по связности прозы.

#Сколько памяти нужно?

Столько, чтобы файл модели поместился целиком плюс запас на контекст. Точное значение зависит от размера сборки и уровня квантизации, поэтому его стоит смотреть в карточке конкретного файла, а не выводить из названия семейства.

#Как проверить, что модель годится для агента?

Двадцатью прогонами запроса, где инструмент нужен очевидно, с подсчётом доли ответов, которые разобрал бы ваш парсер. Это занимает полчаса и даёт ответ, который невозможно получить из карточки модели или из чужого обзора.

#Модель говорит сама с собой — что это?

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

#Нужен ли отдельный сервер или хватит встроенного?

Для одной модели на одной машине хватает любого локального сервера. Отдельная установка нужна, когда моделей несколько, к ним обращаются разные приложения или требуется доступ по сети — тогда важнее становится не сам запуск, а адрес и права доступа.

#Вывод

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

Если модель отвечает странно — начинайте с шаблона, а не с перебора весов: это самая частая причина и самая дешёвая в исправлении. И измерьте долю разбираемых вызовов до того, как строить на модели агентные цепочки, — иначе вы узнаете этот показатель в самый неудобный момент.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт