Введение: зачем управлять мышлением Qwen 3?
Семейство Qwen 3 включает модели с режимом рассуждений, который можно включать, ограничивать или полностью отключать. Одна и та же модель 8B или 27B способна отвечать мгновенно на простые факты и тратить десятки тысяч токенов на сложный анализ. Проблема в том, что стандартный запуск llama.cpp-server фиксирует поведение модели, а перезагрузка с новыми параметрами отнимает время и ресурсы.
Параметры chat_template_kwargs решают эту задачу динамически. Вы передаёте JSON с настройками enable_thinking, reasoning_effort и preserve_thinking прямо в запросе, и модель переключает режим без перезапуска. Выгода прямая: экономия VRAM на простых задачах, ускорение ответов в чат-ботах и контроль глубины анализа для сложных кейсов.
В этой статье разберём механизм thinking в Qwen 3, каждый параметр chat_template_kwargs, готовые конфигурации для трёх типовых сценариев и влияние настроек на скорость, память и качество генерации.
Механизм thinking в Qwen 3: как это работает
Qwen 3 использует специальные токены для разграничения внутренних рассуждений и финального ответа. Модель генерирует цепочку мыслей внутри блока <think>, затем закрывает его и выдаёт ответ. Управление этим процессом происходит через параметры шаблона чата, которые llama.cpp передаёт в Jinja-шаблон при каждом запросе.
Три режима мышления доступны в Qwen 3:
- Полный thinking: модель свободно рассуждает, длина цепочки зависит от сложности задачи.
- Ограниченный thinking: параметр
reasoning_effortзадаёт уровень глубины, сокращая или расширяя бюджет токенов на размышление. - Отключённый thinking: модель сразу генерирует ответ, пропуская фазу рассуждений.
Переключение между режимами выполняется через chat_template_kwargs в llama.cpp-server. Это особенно полезно, когда один инстанс модели обслуживает разные типы запросов: от классификации текста до многошагового кодинга.
Токены мышления и их роль
Модель обозначает начало рассуждений токеном <think>, а завершение - </think>. После закрытия блока следует <|im_end|> и финальный ответ. При стандартном выводе llama.cpp скрывает содержимое блока <think>, помещая его в отдельное поле reasoning_content.
Параметр preserve_thinking меняет это поведение. При значении true цепочка рассуждений остаётся в основном тексте ответа, что полезно для отладки промптов, анализа ошибок модели и контроля качества рассуждений. В связке с --reasoning-format deepseek llama.cpp корректно разделяет мыслительные токены и финальный ответ, предотвращая зависание агентских обвязок. Подробнее о проблемах официального шаблона Qwen 3.8 и их решении читайте в разборе исправленного Jinja-шаблона.
Параметры chat_template_kwargs для управления мышлением
Три ключевых параметра управляют режимом мышления Qwen 3 через chat_template_kwargs: enable_thinking, reasoning_effort и preserve_thinking. Они передаются как JSON-объект в поле chat_template_kwargs запроса к llama.cpp-server или через Custom JSON в совместимых UI.
enable_thinking: вкл/выкл режима рассуждений
Параметр enable_thinking принимает булево значение true или false. При false модель пропускает фазу рассуждений и сразу генерирует ответ. Это ускоряет инференс в 2-5 раз на простых задачах: фактические вопросы, классификация, извлечение сущностей, простые переводы.
{"enable_thinking": false}Отключение мышления снижает качество на сложных аналитических задачах, где требуется многошаговое рассуждение. Для таких сценариев оставляйте true и управляйте глубиной через reasoning_effort.
reasoning_effort: уровень глубины рассуждений
Параметр reasoning_effort задаёт ограничение на длину цепочки рассуждений. Допустимые значения: low, medium, high или xhigh. Чем выше уровень, тем больше токенов модель тратит на размышление перед ответом.
{"enable_thinking": true, "reasoning_effort": "low"}На практике low сокращает цепочку рассуждений до нескольких сотен токенов, medium даёт сбалансированный результат, а high и xhigh могут генерировать десятки тысяч токенов мышления. Тест Qwen3.8-27B показал, что режим xhigh выдаёт в 5 раз больше токенов, чем medium, достигая 15-40 тысяч токенов на сложных задачах. Детали эксперимента и влияние на скорость описаны в сравнении режимов reasoning_effort.
preserve_thinking: сохранение цепочки рассуждений
Параметр preserve_thinking принимает true или false. При true содержимое блока <think> остаётся в тексте ответа, а не скрывается в reasoning_content.
{"enable_thinking": true, "reasoning_effort": "high", "preserve_thinking": true}Это полезно для отладки: вы видите, как модель пришла к ответу, где ошиблась в логике, какие факты учла. В продакшене preserve_thinking обычно отключают, чтобы не раздувать вывод и не платить за лишние токены.
Готовые конфигурации для типовых задач
Три сценария покрывают большинство практических случаев. Конфигурации работают для Qwen 3 8B и 27B, различия в скорости и потреблении памяти зависят от железа.
Быстрый ответ без анализа (enable_thinking=false)
Для простых фактов, классификации, извлечения данных и коротких диалогов отключайте мышление полностью.
{"enable_thinking": false}Ожидаемое поведение: модель отвечает сразу, без фазы <think>. Скорость генерации максимальная, потребление KV-кэша минимальное. Качество на простых задачах не снижается, на сложных - падает заметно. Используйте для чат-ботов с типовыми вопросами, модерации контента, быстрых проверок.
Средний уровень рассуждений (reasoning_effort=medium)
Сбалансированный вариант для большинства рабочих задач: генерация кода средней сложности, написание текстов, анализ данных, ответы на вопросы с контекстом.
{"enable_thinking": true, "reasoning_effort": "medium"}Модель тратит на размышление от нескольких сотен до пары тысяч токенов. Скорость ниже, чем при отключённом мышлении, но качество на сложных задачах заметно выше. Это компромисс между временем ответа и глубиной анализа.
Максимальная глубина (reasoning_effort=high, preserve_thinking=true)
Для сложных аналитических задач, многошагового кодинга, математических доказательств и случаев, где важна проверяемость рассуждений.
{"enable_thinking": true, "reasoning_effort": "high", "preserve_thinking": true}Модель генерирует длинную цепочку рассуждений, которая сохраняется в выводе. Время ответа максимальное, потребление KV-кэша растёт пропорционально длине мышления. Используйте для отладки, аудита решений и задач, где ошибка стоит дорого.
Влияние настроек на производительность
Режимы мышления напрямую влияют на три метрики: скорость инференса, потребление памяти и качество генерации. Понимание trade-off помогает выбирать конфигурацию под конкретную задачу.
Скорость инференса
Отключение мышления ускоряет генерацию в 2-5 раз. Модель не тратит токены на внутренние рассуждения, а сразу выдаёт ответ. На Qwen 3 27B при отключённом мышлении скорость достигает 80-100 токенов/с на RTX 5090, тогда как с полным thinking падает до 40-60 токенов/с из-за длинной цепочки рассуждений. Подробный разбор производительности Qwen 3.6 27B на RTX 5090 с цифрами и таблицами доступен в статье об оптимизации llama.cpp.
Параметр reasoning_effort масштабирует это поведение: low даёт короткие рассуждения и быстрый ответ, high и xhigh - длинные цепочки и заметную задержку. Для интерактивных приложений выбирайте low или medium, для пакетной обработки - high.
Потребление памяти
KV-кэш растёт с длиной последовательности. Отключение мышления сокращает последовательность до минимума, освобождая VRAM для большего батча или более длинного контекста. При reasoning_effort=high цепочка рассуждений может занимать десятки тысяч токенов, что существенно увеличивает KV-кэш.
preserve_thinking=true увеличивает длину вывода, но не влияет на KV-кэш напрямую: сохранённые токены уже были сгенерированы и попали в кэш. Дополнительный расход памяти возникает только при передаче полного вывода в следующий запрос.
Качество генерации
Для простых задач отключение мышления не снижает качество: модель отвечает на фактические вопросы без рассуждений так же точно, как и с ними. Для сложных задач полный thinking критичен: многошаговые рассуждения, проверка гипотез, отладка кода требуют длинной цепочки мыслей.
reasoning_effort позволяет балансировать: medium даёт достаточную глубину для большинства рабочих задач, high - для сложных аналитических, xhigh - для исследовательских, где время не критично. Практический тест на Qwen3.8-27B показал, что xhigh генерирует 15-40 тысяч токенов мышления, что избыточно для генерации кода, но полезно для сложного анализа.
Типичные ошибки и как их избежать
При использовании chat_template_kwargs возникают типичные проблемы: неверный JSON, конфликты параметров, несовместимость с клиентами. Разберём каждую.
Ошибки в JSON и параметрах
Неправильный синтаксис JSON - самая частая причина, почему chat_template_kwargs не работает. Проверяйте:
- Ключи в двойных кавычках:
{"enable_thinking": false}, а не{enable_thinking: false}. - Булевы значения без кавычек:
true,false, а не"true". - Строковые значения в кавычках:
"medium", а неmedium.
Валидируйте JSON перед отправкой. В llama.cpp-server ошибки парсинга обычно возвращаются в ответе с кодом 400, но некоторые UI молча игнорируют невалидный JSON, из-за чего параметры не применяются.
Конфликты с другими настройками
Если в системном промпте или сообщении пользователя уже есть указания на режим мышления, chat_template_kwargs может не сработать или переопределиться. Например, текстовая команда <|think_off|> в промпте отключает мышление независимо от enable_thinking.
Проверяйте фактическое поведение модели: запросите простой ответ с enable_thinking=false и посмотрите, появляется ли блок <think> в выводе. Если появляется, параметр не применился. Также учитывайте, что некоторые клиенты кэшируют шаблон чата и не передают chat_template_kwargs при повторных запросах. Перезапуск клиента или очистка кэша решают проблему.
Заключение: гибкость без компромиссов
chat_template_kwargs в llama.cpp-server даёт динамическое управление режимами мышления Qwen 3 без перезагрузки модели. Три параметра - enable_thinking, reasoning_effort и preserve_thinking - покрывают весь спектр задач: от мгновенных ответов на простые вопросы до глубокого анализа с сохранением цепочки рассуждений.
Экспериментируйте с конфигурациями на своих задачах. Начните с medium для большинства сценариев, отключайте мышление для простых запросов и включайте high с preserve_thinking=true для сложных аналитических кейсов. Замеряйте скорость и качество на реальных данных, чтобы подобрать оптимальный баланс под своё железо и workload.