Что сломалось в обычных чатах и зачем нужен Interleaved Thinking
Представь: ты запускаешь Minimax M2.1, задаешь сложную математическую задачу. Модель думает пять секунд и выдает ответ. А как она думала? Какие промежуточные шаги сделала? Ты не видишь ничего - только конечный результат. Это как смотреть финальный счет футбольного матча, пропустив все голы.
Interleaved Thinking ломает эту схему. Вместо скрытого внутреннего диалога модель выдает reasoning tokens - специальные теги, которые маркируют ее мыслительный процесс прямо в ответе. , , - это не просто декорация. Это окно в черный ящик нейросети.
Interleaved Thinking - это не фича для красоты. Это инструмент отладки сложных цепочек рассуждений. Особенно критично для агентов, которые должны объяснять свои решения.
Как устроен chat template: неочевидные грабли
Первая ошибка, которую делают 90% пользователей: пытаются использовать стандартный шаблон из Llama или ChatML. Minimax M2.1 требует свой собственный формат, и если его нарушить - Interleaved Thinking просто не заработает.
Вот как выглядит правильный шаблон:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("minimax/m2.1")
messages = [
{"role": "user", "content": "Реши уравнение: 2x + 5 = 17"},
{"role": "assistant", "content": "Нужно изолировать x... \nВычитаю 5 из обеих сторон... \nx = 6 "}
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
Не пытайся вручную добавлять теги в промпт! Токенизатор сам расставляет специальные токены начала и конца. Если сделаешь это вручную - сломаешь позиционное кодирование.
Ключевой момент: теги reasoning tokens должны появляться ТОЛЬКО в ответах ассистента. Если ты поставишь в сообщении пользователя, модель сойдет с ума. Точнее, она просто проигнорирует тег, но контекст испортится.
1 Как настроить температуру для reasoning tokens
Вот что никто не рассказывает: reasoning tokens требуют другой температуры, чем обычные ответы. Слишком высокая температура - и модель начинает генерировать бессвязные . Слишком низкая - и она повторяет одни и те же шаблонные фразы.
# Правильные параметры для генерации с reasoning tokens
generation_config = {
"temperature": 0.7, # для reasoning tokens
"top_p": 0.9,
"max_new_tokens": 1024,
"do_sample": True,
"repetition_penalty": 1.1, # критично, иначе зацикливается
"stopping_criteria": ["", ""] # останавливаем по тегам
}
Лайфхак: используй разные температуры для разных фаз. В архитектуре агентов это работает так: высокая температура для brainstorming в , средняя для , низкая для финального .
EXL3 квантование: что ломается с reasoning tokens
Ты скачал M2.1 в формате EXL3, запустил - и Interleaved Thinking не работает. Знакомая ситуация? Проблема в том, что большинство квантованных версий обрезают специальные токены. Особенно если квантование делалось через автоматические скрипты, которые не знают про теги Minimax.
Вот как проверить, сохранились ли теги после квантования:
import json
# Загружаем токенизатор из квантованной модели
with open("m2.1-exl3/tokenizer.json", "r") as f:
tokenizer_data = json.load(f)
# Ищем специальные токены
special_tokens = tokenizer_data.get("added_tokens", [])
special_tokens_text = [t["content"] for t in special_tokens]
print("Найдены теги:", [t for t in ["", "", "", ""] if t in special_tokens_text])
Если тегов нет - можешь попробовать патч для конвертации, адаптированный под Minimax. Или использовать другую степень квантования - EXL3_32 обычно сохраняет больше специальных токенов, чем EXL3_16.
Open-WebUI: настройка, которая работает (а не та, что в документации)
Официальная документация Open-WebUI по Minimax M2.1 устарела через неделю после выхода модели. Они рекомендуют использовать шаблон ChatML, но это не работает с Interleaved Thinking.
Вот рабочий конфиг для ~/.open-webui/models/m2.1.yaml:
# Конфигурация для Minimax M2.1 с Interleaved Thinking
model: minimax/m2.1
parameters:
temperature: 0.7
top_p: 0.9
max_tokens: 4096
stop: ["", "", ""]
chat_template: |
{% for message in messages %}
{% if message['role'] == 'user' %}
{{ '<|im_start|>user\n' + message['content'] + '<|im_end|>' }}
{% elif message['role'] == 'assistant' %}
{{ '<|im_start|>assistant\n' + message['content'] + '<|im_end|>' }}
{% endif %}
{% endfor %}
{% if add_generation_prompt %}
{{ '<|im_start|>assistant\n' }}
{% endif %}
# Критичный параметр, который все пропускают
prompt_format: "minimax"
Самая частая ошибка: люди забывают про prompt_format: "minimax". Без этого Open-WebUI пытается применить общий шаблон, который ломает структуру тегов.
2 Как заставить Open-WebUI показывать reasoning tokens красиво
По умолчанию Open-WebUI отображает как обычный текст. Выглядит ужасно. Решение - кастомный CSS.
Создай файл ~/.open-webui/css/custom.css:
/* Стили для Interleaved Thinking тегов */
.thinking-token {
background-color: #f0f9ff;
border-left: 4px solid #3b82f6;
padding: 8px 12px;
margin: 8px 0;
border-radius: 0 8px 8px 0;
font-family: 'Monaco', 'Courier New', monospace;
font-size: 0.9em;
}
.reasoning-token {
background-color: #fefce8;
border-left: 4px solid #f59e0b;
padding: 8px 12px;
margin: 8px 0;
border-radius: 0 8px 8px 0;
font-family: 'Monaco', 'Courier New', monospace;
}
.answer-token {
background-color: #f0fdf4;
border-left: 4px solid #10b981;
padding: 8px 12px;
margin: 8px 0;
border-radius: 0 8px 8px 0;
font-weight: bold;
}
Затем добавь в конфиг модели post-processing скрипт:
post_processing: |
function(response) {
// Заменяем теги на span с классами
response = response.replace(/(.*?)<\/thinking>/gs,
'💭 Thinking: $1');
response = response.replace(/(.*?)<\/reasoning>/gs,
'🔍 Reasoning: $1');
response = response.replace(/(.*?)<\/answer>/gs,
'✅ Answer: $1');
return response;
}
Теперь reasoning tokens выглядят как красивые выделенные блоки, а не как сырой HTML.
SillyTavern: почему здесь все сложнее
SillyTavern изначально заточен под ролевые чаты, а не под reasoning tokens. Его система контекста постоянно редактирует историю, что ломает структуру тегов. Особенно если используешь функции типа "summarize" или "chroma DB".
Первое правило: отключи все автоматические обработки контекста. В настройках SillyTavern:
- Открой "Extensions" → "Context"
- Выключи "Auto-summarize context"
- Выключи "Trim sentences"
- В "Tokenizer" выбери "Custom" и укажи путь к токенизатору M2.1
Второе правило: используй правильный формат персонажа. Вместо стандартного "{{char}}" используй явные теги:
# Персонаж для SillyTavern с поддержкой Interleaved Thinking
Персонаж: "Minimax M2.1 Assistant"
Первое сообщение: |
Я - ассистент Minimax M2.1 с поддержкой Interleaved Thinking.
Буду показывать ход своих мыслей в тегах и .
Контекст: |
[System: Ты используешь Interleaved Thinking формат.
Всегда начинай reasoning с тега для первичного анализа.
Затем используй для пошаговых рассуждений.
Заканчивай с финальным ответом.
Не используй эти теги в диалоге, только в reasoning режиме.]
SillyTavern пытается экранировать HTML-теги. Если видишь <thinking> вместо
API-интеграция: как не сломать совместимость
Если ты делаешь собственную интеграцию через API, вот секрет: Interleaved Thinking включается не через параметры запроса, а через специальный токен в system prompt.
import requests
# НЕПРАВИЛЬНО - так reasoning tokens не заработают
payload = {
"model": "minimax/m2.1",
"messages": [
{"role": "user", "content": "Реши задачу"}
],
"temperature": 0.7,
"reasoning": True # Этого параметра не существует!
}
# ПРАВИЛЬНО - reasoning включается через system prompt
payload = {
"model": "minimax/m2.1",
"messages": [
{
"role": "system",
"content": "Используй Interleaved Thinking формат с тегами , , для сложных задач."
},
{"role": "user", "content": "Реши задачу"}
],
"temperature": 0.7,
"max_tokens": 1024,
"stop": [" "] # Обязательно указывай стоп-токены!
}
response = requests.post("http://localhost:8000/v1/chat/completions", json=payload)
Почему так? Потому что Interleaved Thinking - это не отдельный режим работы модели. Это просто специальный формат вывода, который модель использует, когда ее об этом просят в system prompt.
Типичные ошибки и как их исправить
| Ошибка | Причина | Решение |
|---|---|---|
| Теги выводятся как обычный текст | Неправильный chat template | Используй apply_chat_template из родного токенизатора |
| Модель генерирует бесконечный reasoning | Нет стоп-токенов | Добавь stop=["", ""] |
| В EXL3 версии теги не работают | Квантование обрезало специальные токены | Ищи версию с сохраненными токенами или квантуй сам |
| SillyTavern экранирует теги | Включен HTML sanitization | Отключи или добавь теги в whitelist |
| Только первый ответ содержит reasoning | Контекст перезаписывается | Отключи auto-summarize в клиенте |
Почему это важно для агентов и не только для математики
Interleaved Thinking - это не просто фича для учебных задач. В архитектуре агентов reasoning tokens становятся протоколом отладки. Ты видишь не просто конечное действие агента, а цепочку решений: почему он выбрал именно этот API, какие параметры считал важными, какие альтернативы отбросил.
Представь агента, который работает с ETL-конвейером. Без reasoning tokens ты видишь только: "запрос выполнен". С Interleaved Thinking:
Пользователь запросил агрегацию данных за последнюю неделю. В базе 1.2 млн записей.
1. Использую индекс по дате для ускорения
2. Фильтрую по timestamp > now() - 7 дней
3. Агрегирую по category_id
4. Проверяю наличие NULL в ключевых полях
Агрегация выполнена. Обработано 1,200,453 записи за 2.3 секунды. Найдено 12 записей с NULL в category_id.
Разница как между "машина завелась" и "машина завелась, но датчик давления масла показывает 1.8 бар при норме 2.0-4.5".
Что будет дальше: reasoning tokens как стандарт
Minimax M2.1 - не первая модель с подобной фичей. Но она первая, где это сделано не как эксперимент, а как полноценная часть интерфейса. Скоро reasoning tokens станут таким же стандартом, как сейчас system prompt. Уже сейчас видно, как другие архитектуры внимания адаптируются под подобные форматы.
Мой прогноз: через полгода каждый серьезный клиент (Open-WebUI, SillyTavern, Faraday) будет иметь встроенную поддержку Interleaved Thinking. А через год это потребуют регуляторы для критических применений - медицина, финансы, юриспруденция. Потому что "нейросеть сказала" - недостаточно. Нужно "нейросница сказала, и вот как она к этому пришла".
Пока что приходится танцевать с бубном вокруг конфигов и кастомных CSS. Но это временно. Главное - начать использовать сейчас, чтобы когда стандартизация придет, твои агенты уже умели объяснять свои решения. Иначе окажешься в ситуации, когда все вокруг перешли на reasoning tokens, а твои модели молча выдают ответы как черный ящик. В мире, где интерфейсы не готовы к агентам, прозрачность - единственное, что может спасти от полного недоверия.