Multi-Token Prediction (MTP) — это модно. Все кинулись ускорять инференс: кто через mlx-lm на Apple Silicon, кто через MTP merging в llama.cpp. Ускорение в 1.5-2.5 раза — звучит как подарок судьбы. Но есть нюанс.
Проблема не в самом 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 начинает ошибаться. Вы получаете ускорение в токенах, но неверные вызовы.
Что будет, если заставить 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 официально. Но лучше проверять руками.