Перейти к содержанию
Публикация AiManual

Улучшенный Jinja-шаблон чата для Poolside Laguna XS и S 2.1: force_thinking, reasoning_effort и экономия контекста

Обновлённый Jinja-шаблон для Poolside Laguna XS и S 2.1 добавляет force_thinking, пресеты reasoning_effort (none, auto, max) и отключаемый preserve_thinking. Ра

Коротко

Что будет в материале

  1. 01

    Зачем понадобился новый шаблон для Laguna

  2. 02

    Что нового в шаблоне: обзор параметров

  3. 03

    Как установить и настроить шаблон

  4. 04

    Сценарии использования: когда что включать

Зачем понадобился новый шаблон для Laguna

Модели Poolside Laguna XS и S 2.1 штатно должны сами решать, когда включать блок размышления <think>. На практике этого не происходит: модель часто пропускает этап reasoning именно там, где он нужнее, и сильнее всего это заметно у XS-варианта. Об этом пишет автор обновлённого Jinja-шаблона чата под ником u/arbv в посте на r/LocalLLaMA.

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

Шаблон выложен в репозитории на Hugging Face, к нему прилагается README с готовыми настройками. Ключевая деталь для осторожных: по умолчанию значения совпадают с исходным поведением (enable_thinking=true, preserve_thinking=true, force_thinking=false), так что шаблон работает как прямая замена. Если ничего не трогать, разницы в генерации вы не увидите.

Что нового в шаблоне: обзор параметров

Появилось четыре управляемых настройки, плюс сохранилась прежняя enable_thinking. Сводка по ним:

ПараметрЗначенияЧто делаетПо умолчанию
enable_thinkingtrue / falseвключает или отключает блок размышленияtrue
force_thinkingtrue / falseзаставляет модель думать на каждом ходуfalse
reasoning_effortnone / auto / maxпресет уровня reasoning вместо ручного перебора булевых флаговauto
preserve_thinkingtrue / falseсохраняет исторические reasoning-токены в контекстеtrue
allow_injectiontrue / falseотключает валидацию проникновения управляющих токенов между ролямиfalse

force_thinking: заставляем модель думать на каждом ходу

Переключатель force_thinking включает размышление принудительно, на каждом ходу диалога, независимо от того, считает модель задачу сложной или нет. Реализован он через промпт-трюк, который нашёл пользователь u/SnooPaintings8639, о чём автор упоминает в том же посте. Содержание самого трюка в исходном сообщении не раскрыто, но логика похожа на манипуляцию шаблоном, разобранную в отдельном материале о форсированном мышлении в Laguna-S-2.1.

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

reasoning_effort: пресеты none, auto и max

Параметр reasoning_effort заменяет ручное жонглирование несколькими булевыми флагами удобным пресетом:

  • none - размышление отключается, модель отвечает сразу;
  • auto - решение оставляют за моделью, это поведение по умолчанию;
  • max - модель выжимает максимальное усилие на задаче.

Автор отдельно отмечает, что пресеты упрощают использование шаблона в Pi и, возможно, в других harness-системах: достаточно одного значения в конфиге вместо комбинации флагов. Для сценариев, где глубина рассуждения меняется от запроса к запросу, это заметно практичнее ручного управления.

preserve_thinking: экономия контекстного окна

Исходный шаблон постоянно принудительно сохранял исторические reasoning-токены. Для prefix cache и агентных циклов с инструментами это полезно: цепочки мыслей остаются в контексте, кэш не пересчитывается, модель видит, что уже обдумала. Проблема проявляется в обычном чате: тысячи прошлых reasoning-токенов тянутся за каждым новым сообщением и быстро съедают контекстное окно.

В обновлённом шаблоне preserve_thinking можно отключить, и тогда исторические размышления не занимают контекст. Именно с этим параметром связан известный баг, из-за которого у Laguna S 2.1 пропадал режим рассуждений: в разборе проблемы с preserve_thinking показано, как шаблон влияет на активацию reasoning и чем помогает замена chat-template.

allow_injection: валидация управляющих токенов

В шаблон добавлена базовая валидация, которая ловит проникновение управляющих токенов между ролями: если служебная последовательность оказывается там, где её быть не должно, шаблон это замечает. Отключается проверка флагом allow_injection: true. Автор описывает валидацию как базовую, полный охват и границы её работы в исходном сообщении не детализированы. Для нестандартных пайплайнов, где управляющие токены передаются намеренно, проверку придётся отключить, но это открывает путь для инъекций в промпт.

Как установить и настроить шаблон

Установка сводится к замене Jinja-шаблона чата в конфигурации модели: берёте файл из репозитория на Hugging Face и подставляете его тем же способом, которым пользуетесь сейчас (для llama.cpp это делается через --chat-template-file, если шаблон не задан в самом GGUF). Сначала имеет смысл поставить шаблон без изменений и убедиться, что генерация не отличается от прежней. Затем включать параметры по одному, отслеживая эффект на своих задачах.

Настройка для llama.cpp

В README приведены рекомендованные параметры сэмплинга отдельно для BF16-версии и для квантованных сборок, а также отмечено, что делать с ними при работе через llama.cpp. Конкретные значения temperature и top_p в исходном сообщении не приводятся, поэтому брать их нужно напрямую из README: подставлять цифры наугад смысла нет, разница между BF16 и квантованной моделью в этом вопросе ощутима.

Для GGUF-сборок Laguna S 2.1 полезно помнить о другом фиксе: исправление yarn_attn_factor до 1.0 восстанавливает корректное масштабирование внимания. Без него новый chat template сам по себе не даст ожидаемого качества.

Конфигурация для Pi

В README есть готовый фрагмент конфигурации models.json для Pi. Точные ключи и значения стоит смотреть в репозитории: в исходном посте они не опубликованы, а придумывать структуру конфига по памяти не стоит. Смысл фрагмента в том, что параметры шаблона, включая reasoning_effort, задаются в конфиге модели, без ручной правки самого Jinja-файла.

Сценарии использования: когда что включать

Комбинации под типовые задачи выглядят так:

  • Обычный чат: preserve_thinking=false, force_thinking=false, reasoning_effort=auto. Экономит контекст, размышления включаются по необходимости.
  • Сложные задачи: force_thinking=true или reasoning_effort=max. Полезно для кода, многошаговой логики и разбора условий, которые модель склонна считать простыми.
  • Агентные циклы с инструментами: preserve_thinking=true. Историю размышлений лучше сохранять, иначе prefix cache теряет смысл, а модель начинает путаться в уже проделанной работе.
  • Отладка и нестандартные пайплайны: allow_injection=true. Нужно, если вы сами передаёте управляющие токены в нестандартных местах.

Переключать reasoning можно в середине разговора без инвалидации prefix cache, поэтому не обязательно фиксировать один режим на всю сессию. Начать диалог с auto, а на сложном запросе поднять до max - рабочий вариант.

Ограничения и на что обратить внимание

  • force_thinking=true увеличивает расход токенов и удлиняет ответ. Для болтовни и коротких уточнений это чистые потери.
  • reasoning_effort=max на простых запросах даёт избыточные цепочки мыслей. Выигрыш появляется на задачах, где модель без подсказки ошибается.
  • Отключение preserve_thinking экономит контекст, но в длинных диалогах, где важна история размышлений, качество может просесть: модель перестаёт видеть собственные прошлые выводы.
  • allow_injection=true снижает защиту от подмены ролей и управляющих последовательностей. Включать только осознанно.
  • Валидация описана как базовая, её поведение на экзотических форматах сообщений не раскрыто.
  • Шаблон - пользовательская разработка u/arbv, а не официальное решение Poolside. Автор обратился к u/matthiasgalle, ведущему post-train-направления Laguna, с просьбой посмотреть шаблон и высказать мнение, но подтверждения от команды на момент публикации не приводится. Независимой проверки работы шаблона в исходных материалах тоже нет.
  • Оценки «модель ленится думать» и «хорошо пишет на английском» - субъективное мнение автора поста, а не результат замеров.

Итог: стоит ли переходить на новый шаблон

Шаблон закрывает конкретную боль: reasoning у Laguna XS и S 2.1 срабатывает непредсказуемо, а исторические цепочки мыслей незаметно съедают контекст. Новые параметры дают контроль без потери совместимости, поскольку по умолчанию поведение не меняется.

Практический план: скачать шаблон из репозитория на Hugging Face, заменить им текущий chat template, выставить preserve_thinking=false для обычных диалогов и добавить force_thinking=true там, где модель упорно пропускает размышление. Параметры сэмплинга для llama.cpp и фрагмент конфига для Pi возьмите из README, а не из сторонних подборок. Если работаете с XS-вариантом, попробуйте его первым: по мнению автора шаблона, Laguna XS 2.1 заслуживает большего внимания, чем получает.

Подписаться на канал