В локальных reasoning-моделях есть режим отказа, который не покажет ни один дашборд доступности. Сервер принимает запрос, стримит токены, возвращает HTTP 200 — а пользователь не получает ничего, потому что каждый произведённый токен был рассуждением, и бюджет закончился до первого символа собственно ответа. Запрос, закончившийся так, мы называем answerless-запросом и меряем как полноценный исход: пустой ответ — это отказ, и он остаётся в знаменателе.
Как часто это происходит на самом деле
На Qwen3.6-35B-A3B с включённым reasoning и бюджетом 1024 токена доля повседневных запросов, вернувшихся answerless, составила 58.3% запросовunit_replicated на корпусе человеческих задач — сообщения, письма, объяснения, планы. На старом самореферентном бенчмарк-корпусе та же ячейка дала 75.0% запросовrepeated. Больше половины обычных запросов — молча без ответа, при рапорте об успехе на каждом.
Второе семейство моделей воспроизводит механизм. Gemma-4-26B в дефолтном режиме вернула answerless
8.3% запросовrepeatedзапросов — рейт намного ниже, но не ноль, на модели, чей chat-template даже не выставляет переключатель reasoning наружу. Это не причуда одной модели; это то, что происходит всегда, когда размышляющий проход и токен-бюджет делят одно окно генерации.
Почему дашборд говорит, что всё хорошо
Каждая привычная метрика выглядит здоровой, пока это происходит:
- HTTP-статус — 200: запрос завершился.
- TTFT — отличный: первый токен любого вывода у Gemma-4 приходил с медианой 282мсrepeated. Но это токен рассуждений, не ответа — первый токен собственно ответа приходил через 10768мсrepeated, а на answerless-доле не приходил вовсе.
- Сгенерированные токены — много: модель усердно работала. Просто весь бюджет ушёл на текст, который пользователь не просил читать.
Ловит это единственная метрика, которую почти никто не собирает: токены ответа — токены после закрытия reasoning-блока. Поэтому наш харнесс считает TTFA отдельно от TTFT и трактует пустой ответ как отказавший запрос, даже когда транспорт отработал успешно.
Что с этим делать
- Закладывайте бюджет на рассуждения, а не только на ответ. Окно в 1024 токена, вмещающее любой ответ нашего корпуса, почти не вмещает пару «рассуждения + ответ». Кривая отказов — это кривая бюджетного голодания, а не дефект модели.
- Или выключайте reasoning для повседневного трафика. На той же машине отключение блока рассуждений срезало ожидание первого ответа с десятков секунд до 210мсunit_replicated при неизменном успехе задач на этих ворклоадах — см. сравнение цены reasoning.
- Мониторьте токены ответа. Если ваш стек не отличает токены рассуждений
от токенов ответа, этот отказ для вас невидим. Поля
usage, которые их сливают, его прячут.
Ограничения
- Два семейства моделей, одна машина (Strix Halo, llama.cpp Vulkan, запинен digest’ом), замороженные корпуса, один поток. Рейты — свойства ячейки модель × бюджет × корпус, а не универсальные константы.
- Утверждение о механизме — рассуждения съедают общий бюджет до первого токена ответа — проверяется поштучно по публичным записям качества: у каждого answerless-запроса ненулевые символы рассуждений и ноль символов ответа.
- Вендорские API мы не меряли; у них другая работа с бюджетами.
У каждой цифры выше — постоянная страница со скоупом, ограничениями и запечатанными доказательствами: реестр клеймов. Термин определён в глоссарии.