Типовая история: модель скачана, запускается, отвечает — и делает это как будто не читая системный промпт. Роль игнорируется, правила не соблюдаются, вызовы инструментов приходят в произвольном виде. Дальше начинается перебор моделей, хотя проблема почти всегда одна и та же и лежит на шаг раньше.
Причина — шаблон чата. Дообученная модель ожидает диалог в конкретной разметке; если разметка не совпадает, модель формально работает, а фактически видит не то, что вы отправили. Это первое, что надо проверять, и последнее, о чём обычно вспоминают.
Речь идёт про веса от 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. Сверьте его с тем, что указано в карточке модели у автора дообучения. Совпадение должно быть точным: разметка ролей, специальные токены, место системного сообщения.
Три признака неправильного шаблона:
- Модель отвечает осмысленно, но игнорирует системный промпт.
- В ответе видны служебные токены разметки — модель печатает то, что должно быть невидимой структурой.
- Модель продолжает диалог за пользователя: пишет ответ, потом сама задаёт следующий вопрос и сама на него отвечает.
Третий признак — самый однозначный. Он означает, что модель не видит границы конца своего хода, а это ровно то, что задаётся шаблоном.
Быстрая проверка, что системный промпт вообще доходит: задайте в нём легко наблюдаемое правило и посмотрите, соблюдается ли оно.
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 с карточкой модели и тестом с наблюдаемым правилом в системном промпте.
#Какую квантизацию выбрать?
Наименее агрессивную из тех, что помещаются в вашу память. Для агентных задач это важнее, чем для обычного разговора: сжатие сильнее бьёт по структурированному выводу, где значим каждый символ, чем по связности прозы.
#Сколько памяти нужно?
Столько, чтобы файл модели поместился целиком плюс запас на контекст. Точное значение зависит от размера сборки и уровня квантизации, поэтому его стоит смотреть в карточке конкретного файла, а не выводить из названия семейства.
#Как проверить, что модель годится для агента?
Двадцатью прогонами запроса, где инструмент нужен очевидно, с подсчётом доли ответов, которые разобрал бы ваш парсер. Это занимает полчаса и даёт ответ, который невозможно получить из карточки модели или из чужого обзора.
#Модель говорит сама с собой — что это?
Признак неправильного шаблона: модель не видит границы конца своего хода и продолжает диалог за обе стороны. Чинится шаблоном, а не промптом и не сменой модели.
#Нужен ли отдельный сервер или хватит встроенного?
Для одной модели на одной машине хватает любого локального сервера. Отдельная установка нужна, когда моделей несколько, к ним обращаются разные приложения или требуется доступ по сети — тогда важнее становится не сам запуск, а адрес и права доступа.
#Вывод
Порядок запуска: точный тег, загрузка, сверка шаблона чата с карточкой, проверка системного промпта наблюдаемым правилом и только потом проверка вызова инструмента на двадцати прогонах.
Если модель отвечает странно — начинайте с шаблона, а не с перебора весов: это самая частая причина и самая дешёвая в исправлении. И измерьте долю разбираемых вызовов до того, как строить на модели агентные цепочки, — иначе вы узнаете этот показатель в самый неудобный момент.