Зачем понадобился новый шаблон для 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_thinking | true / false | включает или отключает блок размышления | true |
force_thinking | true / false | заставляет модель думать на каждом ходу | false |
reasoning_effort | none / auto / max | пресет уровня reasoning вместо ручного перебора булевых флагов | auto |
preserve_thinking | true / false | сохраняет исторические reasoning-токены в контексте | true |
allow_injection | true / 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 заслуживает большего внимания, чем получает.