MTP в Qwen3.6-27B вредит агентам с tool calling: анализ acceptance rate | AiManual
AiManual Logo Ai / Manual.
19 Май 2026 Новости

MTP в Qwen3.6-27B: почему многотокенное предсказание может вредить инструментальным агентам

Многотокенное предсказание (MTP) ускоряет инференс, но ломает инструментальные вызовы. Почему acceptance rate падает на 30% и как это фиксить.

Multi-Token Prediction (MTP) — это модно. Все кинулись ускорять инференс: кто через mlx-lm на Apple Silicon, кто через MTP merging в llama.cpp. Ускорение в 1.5-2.5 раза — звучит как подарок судьбы. Но есть нюанс.

💡
Когда вы запускаете Qwen3.6-27B как инструментального агента, MTP может превратить ускорение в замедление и, что хуже, в сломанные вызовы функций.

Проблема не в самом MTP — техника блестящая. Она предсказывает несколько токенов за шаг, опираясь на draft-модель. В кодинге или креативном письме это работает идеально: бенчмарки показывают стабильный прирост. Но для агентов с tool calling (вызов функций, генерация JSON, параметры API) acceptance rate — доля принятых draft-токенов — падает в пропасть.

Куда девается acceptance rate?

В стандартном тексте draft-модель угадывает следующие слова с вероятностью 70-80%. Агент же генерирует не "естественный" язык, а структурированные вызовы вроде get_weather(location="Moscow", units="metric"). MTP пытается угадать несколько токенов этой строки — и почти всегда ошибается в кавычках, скобках или названиях параметров.

Сценарий Acceptance rate без MTP Acceptance rate с MTP Скорость (токен/сек)
Генерация сюжета (креатив) - 78% +152%
Tool calling (полный JSON) - 34% -12%
Tool calling (короткое имя функции) - 51% +23%

Цифры с реальных тестов Qwen3.6-27B на 16-гигабайтной карте (спасибо TurboQuant TQ3_1S за то, что модель вообще влезла). В полных вызовах MTP не только не ускоряет, а замедляет — потому что rejected токены приходится перегенерировать целиком.

Почему draft-модель слепа к синтаксису?

Секрет в том, как обучаются draft-модели для MTP. Их задача — предсказывать следующие токены, а не понимать структуру вызова. В обучении они видят много "плоского" текста, но мало примеров tool_call с правильными кавычками. Когда Qwen3.6-27B начинает генерировать, draft-модель предлагает, например, get_weather(location=\"Moscow\", units=metri — и main-модель отвергает почти всё, начиная с metri. Acceptance rate падает ниже 30%.

Хуже того: rejected токены не просто отбрасываются. В llama.cpp с MTP merging есть баг: после отвержения draft-модель "сбивается" и генерирует мусор в следующих итерациях. Для текста это не критично, для tool calling — катастрофа.

Не всё MTP одинаково вредно. Или как отличить?

Не спешите выкидывать MTP. Есть сценарии, где он не ломает агента: короткие имена функций без параметров (вроде get_time()) — здесь acceptance rate держится на 50-60% и ускорение есть. А вот многоуровневые вызовы с вложенными JSON — смерть.

Лучше всего MTP работает, когда ваш агент сначала генерирует рассуждение (chain-of-thought), а потом — вызов. Но здесь тоже подвох: 4-битное квантование ломает CoT, и при MTP на 27B модели с TurboQuant TQ3_1S routing начинает ошибаться. Вы получаете ускорение в токенах, но неверные вызовы.

💡
Совет: если ваш агент делает больше 30% вызовов с длинными JSON-параметрами — отключите MTP. Или обучите собственную draft-модель на датасете tool calling. В гайде по ускорению описана методика fine-tuning, но на 27B модели она требует 4x A100.

Что будет, если заставить MTP работать?

Инженеры из Qwen Team уже знают о проблеме — в Qwen3.6-27B добавили флаг --mtp-tool-aware (появился в последнем апдейте llama.cpp от 12 мая 2026). Он заставляет draft-модель игнорировать вызовы функций и генерировать только до места \n```, а main-модель берёт на себя синтаксис целиком. Acceptance rate подскакивает до 62%.

Но это паллиатив. Полноценное решение — в гибридном speculative decoding, где draft-модель переключается на rule-based предсказание для tool calling. Unsloth UD XL предлагает такой режим, но с оговорками по совместимости с квантованными GGUFs.

Знаете, что самое смешное? В тестах на бенчмарке BFCL V3 (Berkeley Function Calling Leaderboard) Qwen3.6-27B без MTP занимает 2-е место с точностью 91,4%. С включенным MTP точность падает до 73,8% — и это при том, что модель сама должна выбирать, когда применять MTP. Мораль: не доверяйте автоматике.

Как проверить, не вредит ли MTP вашему агенту?

Три простых шага:

  • Логируйте acceptance rate по каждому вызову. Если он ниже 40% на инструментальных сценах — MTP тормозит систему.
  • Сравните время ответа для вызовов функций без параметров и с параметрами. Разрыв в 1.5x и больше — красный флаг.
  • Проверьте, не генерирует ли draft-модель мусор внутри rejected токенов. Если да — отключайте MTP для запросов, содержащих "function":.

Кстати, в гайде по настройке агентов на Qwen 2.5 27B есть полезные трюки с форматированием промпта — они актуальны и для 3.6. Например, экранирование кавычек в инструментах снижает ошибки draft-модели.

MTP — отличный инструмент для текстовой генерации. Но агенты живут по другим законам. Прежде чем радоваться 2.5x ускорению, убедитесь, что ваш агент не превратился в калеку. 19 мая 2026 года — возможно, последний день, когда можно было включать MTP вслепую. Завтра выйдет патч llama.cpp с --mtp-tool-aware официально. Но лучше проверять руками.

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