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

Форсированное мышление в Laguna-S-2.1: как простая новая строка заставляет модель рассуждать

Laguna-S-2.1 пропускает блок рассуждений на задачах средней сложности? Добавьте символ новой строки после тега в chat template — и модель начнёт генерировать ра

Коротко

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

  1. 01

    Почему Laguna-S-2.1 «молчит» на средних задачах

  2. 02

    Трюк с новой строкой: как принудительно активировать блок <think>

  3. 03

    Что меняется: от однофразового мышления до десятков тысяч токенов

  4. 04

    Когда форсированное мышление - фича, а когда - баг

Почему Laguna-S-2.1 «молчит» на средних задачах

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

Корень проблемы - в chat template. Модель не получает явного сигнала начать генерацию внутри тега <think>. Без этого сигнала она воспринимает блок рассуждений как опциональный и в большинстве случаев игнорирует его. Исправление занимает одну строку кода.

Как chat template управляет мышлением модели

Chat template - это Jinja2-шаблон, который собирает промпт перед отправкой в модель. В Laguna-S-2.1 он определяет структуру: системный промпт, роли user и assistant, опциональный блок <think> для внутренних рассуждений. Модель ожидает либо закрывающий тег </think>, либо специальный токен, который инициирует генерацию внутри блока. Когда ни того, ни другого нет - она переходит сразу к ответу.

Стандартный диалог без форсирования выглядит так:

User: Напиши функцию для бинарного поиска с обработкой дубликатов.
Assistant: Вот реализация:
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    ...

Модель выдаёт код. Без анализа краевых случаев. Без обоснования выбора алгоритма. Ответ рабочий, но неглубокий. Для продакшен-задачи этого недостаточно.

Почему так происходит? Chat template Laguna-S-2.1 построен так, что тег <think> - это контейнер, который нужно явно открыть и начать заполнять. Модель не делает этого автоматически, если задача не выглядит экстремально сложной. Это не баг в традиционном смысле - это архитектурная особенность, связанная с тем, как модель обучена распределять вычислительные ресурсы. Подобные проблемы мы разбирали в статье о потере контекста в Qwen 3.6 27B, где неоптимальный chat template приводил к игнорированию инструкций на длинных диалогах.

Трюк с новой строкой: как принудительно активировать блок <think>

Решение обнаружил один из пользователей модели. Если после открывающего тега <think> добавить символ новой строки \n, модель воспринимает это как сигнал: «контейнер открыт, начинай генерацию». Дальше она автоматически разворачивает цепочку рассуждений, а после закрывающего тега </think> выдаёт финальный ответ.

Механика проста. Новая строка - это не пробел и не пустой символ. Для токенизатора это значимый разделитель, который в контексте chat template означает переход к содержимому блока. Модель «видит» открытый тег и непустое содержимое после него - и продолжает генерацию внутри <think> до тех пор, пока не решит закрыть блок.

Код: меняем chat template за 1 минуту

Для фреймворка Transformers модификация выглядит так:

# Исходный шаблон
chat_template = """
{% for message in messages %}
{{ message['role'] }}: {{ message['content'] }}
{% endfor %}
Assistant: {% if enable_thinking %}<think>{% endif %}
"""

# Модифицированный шаблон
chat_template = """
{% for message in messages %}
{{ message['role'] }}: {{ message['content'] }}
{% endfor %}
Assistant: <think>
"""

Для vLLM или ручной сборки промпта принцип тот же - добавляете \n после <think> в том месте, где модель начинает генерацию ассистента. Никаких дополнительных библиотек или патчей не требуется.

Этот подход перекликается с темой кастомных токенизаторов, которую мы разбирали в материале о расширении токенизатора LFM2.5-8B-A1B: небольшие изменения на уровне токенов дают непропорционально большой эффект на выходе.

Что меняется: от однофразового мышления до десятков тысяч токенов

Эффект форсирования зависит от сложности запроса. На простых репликах модель генерирует короткое рассуждение. На сложных задачах - разворачивает полноценную цепочку мыслей, которая может занимать десятки тысяч токенов. Приведём конкретные примеры из тестов на Q2.

Пример 1: простой запрос - «Привет, как дела?»

Без форсирования:

Assistant: Привет! Всё отлично, чем могу помочь?

С форсированием:

Assistant: <think>
Пользователь поприветствовал меня. Это стандартное начало диалога. 
Моя задача - ответить вежливо и предложить помощь. Запрос не требует 
глубокого анализа, поэтому рассуждение будет коротким.
</think>

Привет! Всё отлично, чем могу помочь?

Рассуждение заняло около 30 токенов. Для такого запроса это избыточно: задержка выросла, а ответ не изменился. Но механизм работает.

Пример 2: задача на генерацию кода

Запрос: «Реализуй алгоритм поиска медианы двух отсортированных массивов за O(log(min(n,m)))».

Без форсирования: модель выдала сразу код с бинарным поиском по меньшему массиву. Решение корректное, но без объяснения выбора подхода, без разбора граничных условий, без анализа сложности. Ответ занял около 200 токенов.

С форсированием:

Assistant: <think>
Задача: найти медиану двух отсортированных массивов nums1 и nums2.
Требуемая сложность: O(log(min(n,m))).

Анализ:
1. Стандартный подход - объединить массивы и взять средний элемент - 
даёт O(n+m), что не подходит.
2. Нужен бинарный поиск по меньшему массиву.
3. Ключевая идея: разделить оба массива так, чтобы элементы слева 
были меньше элементов справа.

Разбор граничных случаев:
- Один из массивов пустой - медиана второго.
- Все элементы одного массива меньше другого - раздел на границе.
- Чётная/нечётная суммарная длина - разная формула медианы.

Реализация:
[детальный код с комментариями на 80+ строк]

Проверка:
- nums1=[1,3], nums2=[2] → медиана 2.0
- nums1=[1,2], nums2=[3,4] → медиана 2.5
</think>

[финальный ответ с полным кодом]

Блок рассуждений занял более 15 000 токенов. Модель прошла через все этапы: анализ условий, выбор метода, разбор краевых случаев, пошаговую реализацию и верификацию на тестовых примерах. Финальный код стал не просто рабочим, а обоснованным и документированным.

Этот эффект напрямую связан с тем, как LLM обрабатывают контекст. В статье об архитектуре AI-агентов мы разбирали, почему явная цепочка рассуждений улучшает качество решений: модель фиксирует промежуточные выводы в токенах, и каждый следующий шаг опирается на них.

Когда форсированное мышление - фича, а когда - баг

Постоянная активация <think> удваивает, а иногда и утраивает расход токенов. Каждый запрос, даже «поставь таймер на 5 минут», будет проходить через блок рассуждений. Задержка растёт, стоимость инференса увеличивается. Для простых диалоговых систем это неприемлемо.

Но для задач, где качество ответа критично, этот «баг» chat template превращается в фичу. Модель начинает конкурировать со специализированными reasoning-моделями, не требуя дополнительного обучения.

Сценарии использования: где форсирование оправдано

  • Решение математических и алгоритмических задач - модель проговаривает каждый шаг, снижая вероятность ошибки.
  • Генерация сложного кода - анализ требований, выбор архитектуры, обработка краевых случаев перед написанием.
  • Логический анализ и планирование - разбор условий, построение дерева решений, оценка альтернатив.
  • Задачи на рассуждение - всё, что требует многошагового вывода.
  • Бенчмарки и тестирование - получение максимального качества от модели без файнтюнинга.

Антисценарии: когда лучше оставить модель в покое

  • Простые вопросно-ответные системы - фактический запрос не требует рассуждений.
  • Чат-боты поддержки - важна скорость ответа, а не глубина анализа.
  • Быстрые фактические запросы - «какая столица Франции» не нуждается в цепочке мыслей.
  • Потоковая обработка с жёсткими ограничениями по latency - каждый лишний токен увеличивает задержку.

Практическая рекомендация: не включайте форсирование глобально. Создайте два chat template - стандартный и «думающий». Переключайтесь между ними в зависимости от типа запроса. Или добавьте простой классификатор на входе: если запрос содержит маркеры сложности («реализуй алгоритм», «докажи», «оптимизируй»), применяйте форсирование. Если запрос фактический или диалоговый - используйте стандартный шаблон.

Взгляд в будущее: что этот трюк говорит о потенциале моделей

Находка с новой строкой - не уникальна для Laguna-S-2.1. Подобные «недокументированные» рычаги управления есть у многих LLM. Умение их находить и применять - часть инженерной работы с моделями в 2026 году. Модель не обязана «сама догадаться», когда нужно рассуждать. Инженер может явно указать ей это через prompt engineering на уровне chat template.

Laguna-S-2.1 с форсированным мышлением показывает результаты, сопоставимые с моделями, специально обученными для рассуждений. Это подтверждает тезис из нашего разбора модели Inkling от Thinking Machines Lab: архитектурные особенности и правильная работа с промптами могут дать прирост, сопоставимый с дорогостоящим обучением.

Эксперимент также подтверждает фундаментальную связь между процессом мышления модели и её выходными токенами. Скрытое рассуждение, без генерации промежуточных выводов, не работает - это было показано в нашем тесте мем-модели catmind-1.2b, где подмена контекста вывода разрушила способность к решению задач. Форсированный блок <think> в Laguna-S-2.1 - это обратный пример: явная, развёрнутая в токены цепочка мыслей напрямую улучшает качество ответа.

Экспериментируйте с chat template своих моделей. Делитесь находками. Одна строка с \n может изменить поведение модели сильнее, чем недели файнтюнинга.

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