Тихий апокалипсис: как output parser сломал половину проектов
Вы обновили llama.cpp на прошлой неделе и теперь ваш AI-пайплайн лежит? Вы не одиноки. С начала марта 2026 сообщество локальных LLM столкнулось с волной крэшей, тихих падений и непонятных ошибок tool-calling. Виновник - регрессия в output parser последней версии движка.
Если вы используете llama.cpp с tool-calling или JSON-выводами - немедленно проверьте версию. Баг может привести к потере данных и нестабильной работе в продакшене.
Проблема проявляется в версиях, собранных после 10 марта 2026. Точнее - в коммитах, связанных с оптимизацией парсера JSON для ускорения обработки. Ускорение получилось, но ценой стабильности. Теперь при попытке вызвать инструмент или распарсить структурированный вывод, llama.cpp может:
- Молча завершиться с кодом ошибки 139 (segmentation fault)
- Зависнуть на бесконечном цикле в
llama_grammar_accept - Вернуть пустой ответ, хотя модель явно что-то сгенерировала
- Исказить JSON, сломав downstream-обработку
Что ломается и у кого
Под ударом - все, кто использует функционал structured output или tool-calling. Особенно страдают проекты на Qwen 3.5, Llama 3.2 и новых моделях с встроенной поддержкой JSON-грамматик. Баг не избирателен: он бьёт и по скриптам на Python с обёрткой llama-cpp-python, и по нативным C++ приложениям.
Симптомы часто маскируются под другие проблемы. Например, вы можете подумать, что сломалась сама модель или неправильно настроен контекст. На самом деле, виноват движок. Как мы уже писали в статье о багах парсера LM Studio, проблемы с парсерами - это хроническая болезнь экосистемы. Но сейчас она перешла в острую фазу.
Корень зла: регрессия в обработке JSON
Разработчики llama.cpp в погоне за производительностью переписали логику валидации JSON-токенов. Новая логика неправильно обрабатывает вложенные структуры, когда те генерируются потоково. Результат - парсер теряет синхронизацию с контекстом и либо падает, либо выдаёт мусор.
Баг особенно коварен, потому что проявляется не всегда. Он зависит от:
- Длины генерируемого JSON
- Количества вложенных объектов
- Используемой грамматики (если вы применяете grammar)
- Версии модели (новые модели с расширенным контекстом чаще провоцируют сбой)
Для тех, кто хочет глубже разобраться в отладке llama.cpp, рекомендую практический курс по диагностике AI-моделей. Там разбирают подобные сценарии на реальных кейсах.
Временные костыли: как выжить до фикса
Пока разработчики не выпустили патч, есть несколько рабочих обходных путей. Они не идеальны, но позволяют продолжить работу.
Откат на стабильную версию
Самый надёжный способ - вернуться к коммиту a1b2c3d (условный хэш, актуальный на 5 марта 2026). Соберите llama.cpp из этого коммита и переустановите обёртки. В большинстве случаев это решает проблему. Подробнее о сборках читайте в нашем гайде по сборке llama.cpp.
Отключение грамматик
Если вам не критичен строгий JSON-формат, отключите грамматики вообще. Да, это снизит качество структурированных выводов, но хотя бы не будет падений. Используйте флаг --grammar none или аналогичный в вашей обёртке.
Фильтрация вывода на стороне клиента
Перенесите парсинг JSON из llama.cpp в свой код. Пусть модель генерирует текст как обычно, а вы его обрабатываете отдельной библиотекой. Это добавит задержку, но гарантирует стабильность. Подробнее об этом подходе мы писали в гайде по встраиванию llama.cpp.
Ollama vs llama.cpp: стоит ли переходить?
Многие, устав от нестабильности, смотрят в сторону Ollama. Этот инструмент использует тот же движок, но с дополнительными слоями абстракции. Плюс - он часто быстрее получает фиксы для критических багов. Минус - вы теряете контроль над низкоуровневыми настройками.
| Критерий | llama.cpp (последняя версия) | Ollama (март 2026) |
|---|---|---|
| Стабильность tool-calling | Низкая (из-за бага) | Высокая |
| Производительность | Высокая (когда работает) | Средняя |
| Гибкость настройки | Максимальная | Ограниченная |
Если вам нужен быстрый и стабильный tool-calling прямо сейчас - Ollama может стать временным спасением. Но учтите, что под капотом у него тоже может быть уязвимость, как в критической дыре llama.cpp, так что следите за обновлениями.
Когда ждать спасения?
Разработчики уже в курсе проблемы. На GitHub создан issue #4567 (условный номер), где активно ищут решение. Ожидается, что патч выйдет в течение недели. Но если вы не можете ждать - используйте временные решения выше.
Мораль истории? Не обновляйте llama.cpp в продакшене без предварительного тестирования в staging. Этот баг - не первый и не последний. Как показали тихие убийцы llama.cpp, регрессии здесь случаются регулярно. Держите под рукой стабильную версию и план отката. И да, иногда старый добрый коммит - лучше, чем новомодный баг. Если вы столкнулись с другими странными задержками, проверьте гайд по устранению трёхминутной задержки.