D
Dimension AI | Dmitry Sirakov
@dimension_ai2.0K подп.
1.8Kпросмотров
91.8%от подписчиков
21 января 2026 г.
question📷 ФотоScore: 2.0K
Как на самом деле работает Thinking Mode (Interleaved vs Preserved thinking) и как применять в агентных системах? Мы, как и наверное большинство разрабов, привыкли, что всякие думающие квены очень простые - в инференсе ты указываешь параметр парсинга, а сообщения потом собираешь в стандртном порядке согласно messages и ничего лишнего. Но в GLM-4.5 (и ряд других SOTA-моделей, хотя у Minimax в sglang что-то не так с парсером) выкатили более умный ризонинг, которым можно управлять для решения различных задач (в том числе агентных в зависимости от их сложности) Interleaved vs Preserved: 1. Interleaved Thinking (см. картинку 1): Режим по умолчанию. Модель думает перед ответом или перед вызовом инструмента (Tool Call). Но как только "мини-сессия" завершена и начинается новый запрос пользователя - промежуточный ризонинг «маскируется». Зачем? Экономим токены, Context Engineering, все дела. Идеально для простых тасок (зачем тянуть старый ризонинг, правда ведь?) 2. Preserved Thinking (см. картинку 2): Мысли сохраняются в истории сообщений всегда, на протяжении всего диалога Зачем? Сложная отладка, рефакторинг, нетривиальные задачи (например этап exploration в агентных системах) Как пользоваться? Что нужно, чтобы это заработало? Тем, кто держит инференс - просто выставить корректный парсер reasoning-токенов. А разработчикам - научиться правильно этим управлять. Погнали разбираться! Можно задуматься, воот, нужно писать отдельный класс, хранить диалоги, в нужный момент что-то подсовывать, писать логику на ифах. НО НЕТ. Это сделали уже за нас. Логика «маскирования» ризонинга зашита прямо в Chat Template у GLM, который работает на стороне инференс-сервере (будь то Sglang / Vllm и тд). Смотрим в официальный темплейт GLM-4.7: {%- if ((clear_thinking is defined and not clear_thinking) or loop.index0 > ns.last_user_index) and reasoning_content -%} {{ '<think>' + reasoning_content.strip() + '</think>'}} {%- else -%} {{ '</think>' }} {%- endif -%} Что тут происходит? Параметр clear_thinking, который вы передаете в extra_body у клиента openAI (ну как ризонинг у гибридных моделей прокидываете), прокидывается прямо сюда в чат-темплейт. 1) Если clear_thinking: True (=Interleaved Thinking) -> шаблон попадает в else и не рендерит ризонинг в промпт для модели. Он просто ставит заглушку. Вы не платите за эти токены на входе. И не захламляете контекстное окно 2) Если clear_thinking: False (=Preserved Thinking) -> весь ризонинг учитывается, тратим больше токенов и решаем сложные задачи. Причем можно разобрать это условие в чат-темплейте с loop, но я думаю вы и без меня поймете, что они просто предусмотрели corner-case. TLDR: 1. Всегда сохраняете весь ризонинг, который вам присылает GLM и возвращаете его. А выбрать в каком режиме работать - "халявно" или "нужно потрудиться" - может выбрать например сам агент перед выполнением таски) 2. В API всегда отдавайте полную историю сообщений (если это нативно поддерживается в модели). 3. Управляйте режимом только через флаг clear_thinking, не делайте никаких костылей (если не задумано иначе) 4. Чат-темплейт делает бррр 5. Можно на самом деле подобное сделать и с qwen, просто класть ризонинг обратно в поле content и варьировать от сложности задачи - когда вам нужно видеть ризонинг, а когда нет. Единственное, новые qwen вряд ли такое видели и вряд ли это будет также производительно, но это решается тестами на вашей задаче.
1.8K
просмотров
3450
символов
Нет
эмодзи
Да
медиа

Другие посты @dimension_ai

Все посты канала →
Как на самом деле работает Thinking Mode (Interleaved vs Pre — @dimension_ai | PostSniper