Исправление ошибки 'Failed to parse at pos' в llama.cpp: откат и патч | AiManual
AiManual Logo Ai / Manual.
20 Мар 2026 Гайд

Как исправить ошибку 'Failed to parse at pos' в llama.cpp: полное руководство по откату и патчу

Полное руководство по исправлению ошибки парсера в llama.cpp, включая откат коммита 34df42f7b, использование флага --skip-chat-parsing и ручной патч chat.cpp.

Ошибка, которая ломает все модели подряд

Вы обновляете llama.cpp до последней версии, запускаете свою любимую модель – и получаете фатальное сообщение: error: failed to parse at pos 0. Модель не стартует. Скрипты падают. Конвейеры ломаются. Эта ошибка появилась в начале 2026 года и затронула тысячи разработчиков, работающих с локальными LLM.

Симптомы точь-в-точь: Модель загружается, но при попытке инференса вылетает с ошибкой парсинга. Чаще всего страдают модели с поддержкой tool calling (Qwen 3.5, DeepSeek V3.2) и кастомными чат-шаблонами. Обычный запуск через llama-cli или Python-биндинги дает одинаковый результат.

Корень зла: коммит 34df42f7b

Виновник найден – это коммит 34df42f7b в репозитории llama.cpp, который «улучшил» парсинг чат-шаблонов. Разработчики пытались ускорить обработку промптов для Qwen 3.5, но сломали обратную совместимость. Теперь парсер не понимает старые форматы и кастомные шаблоны.

Почему это так критично? Потому что чат-шаблоны – это основа взаимодействия с моделью. Они превращают сырой текст в структурированные сообщения. Сломанный парсер означает, что модель не может понять, что вы от нее хотите. Это как дать шеф-повару рецепт на непонятном языке – он просто разведет руками.

💡
Эта ошибка – классический пример кризиса стабильности в llama.cpp. Быстрые изменения в угоду производительности ломают рабочие процессы. Если вы сталкивались с другими багами после обновления, вы не одиноки.

Три способа починить сломанное: от простого к сложному

Есть три рабочих пути, каждый со своими плюсами и минусами. Выбирайте по ситуации:

Способ Сложность Когда использовать Риски
Флаг --skip-chat-parsing Низкая Быстрый фикс, тестирование Может сломать tool calling
Откат коммита 34df42f7b Средняя Продакшен, стабильность Потеря новых оптимизаций
Ручной патч chat.cpp Высокая Кастомные сборки, форки Требует знаний C++

1 Способ первый: волшебный флаг --skip-chat-parsing

Самый простой способ – добавить флаг --skip-chat-parsing к команде запуска. Этот флаг отключает новый сломанный парсер и использует старую логику.

./llama-cli -m qwen3.5-7b-instruct-q4_K_M.gguf \
  --skip-chat-parsing \
  -p "Расскажи о квантовой физике"

Что происходит под капотом? Флаг заставляет llama.cpp пропустить фазу парсинга чат-шаблона и сразу передать промпт модели. Это работает, но есть нюанс: если ваша модель использует tool calling или сложные шаблоны, они могут сломаться. Вы получите ответ, но не факт, что корректный.

Внимание: Этот флаг – костыль. Он не решает проблему, а обходит ее. Используйте только для временных задач или если вы уверены, что ваша модель не зависит от сложного парсинга. Для production-систем лучше выбрать откат.

2 Способ второй: откат до стабильной версии

Надежное решение – откатить репозиторий до состояния до коммита 34df42f7b. Это гарантирует стабильную работу, но вы потеряете все последующие улучшения (включая те самые speedups для Qwen 3.5).

Пошаговый план:

# Переходим в директорию llama.cpp
cd llama.cpp

# Находим хеш коммита перед проблемным
git log --oneline | grep -A5 -B5 "34df42f7b"

# Откатываемся к коммиту перед 34df42f7b
# Например, если проблемный коммит был после abc1234:
git reset --hard abc1234

# Пересобираем проект
make clean
make -j$(nproc) llama-cli

Как найти правильный коммит для отката? Изучите историю git. Коммит 34df42f7b обычно имеет описание вроде «optimize chat template parsing» или «Qwen 3.5 speedups». Откатитесь к коммиту непосредственно перед ним.

💡
Если вы собираетесь надолго застрять на старой версии, создайте отдельную ветку: git checkout -b stable_pre_parser_bug abc1234. Так вы сможете переключаться между версиями и тестировать фиксы, когда они выйдут.

3 Способ третий: хирургический патч chat.cpp

Для тех, кто не боится кода на C++. Вы можете вручную исправить файл chat.cpp, закоментировав проблемные строки или добавив проверки. Это самый гибкий способ, но требует понимания кодовой базы.

Откройте файл chat.cpp в редакторе. Найдите функцию llama_chat_apply_template или секцию, связанную с парсингом шаблонов. Проблема часто в строках, где происходит парсинг JSON или обработка специальных токенов.

Пример патча (актуален на март 2026):

// В файле chat.cpp, ищем проблемный блок
// Было:
if (pos >= template.size()) {
    throw std::runtime_error("failed to parse at pos " + std::to_string(pos));
}

// Меняем на более лояльную проверку:
if (pos >= template.size()) {
    // Вместо выброса исключения, логируем и продолжаем
    fprintf(stderr, "Warning: parse position out of bounds at %zu\n", pos);
    break; // или return default value
}

После правки пересобирайте проект:

make clean && make -j$(nproc) llama-cli

Почему это работает? Вы заменяете фатальную ошибку на предупреждение. Парсер продолжает работу, даже если встретит непонятный фрагмент шаблона. Риск: модель может получать некорректно отформатированные промпты, что скажется на качестве ответов.

Что выбрать? Руководство по ситуации

  • Вы разработчик, который тестирует модели – используйте флаг --skip-chat-parsing. Быстро, без пересборки. Когда понадобится tool calling, переключитесь на другую версию.
  • У вас production-система с Qwen 3.5 – откатите коммит. Стабильность важнее скорости. Мониторьте репозиторий, когда выйдет фикс, и обновитесь аккуратно.
  • Вы мейнтейнер форка llama.cpp – примените патч и сделайте pull request в основной репозиторий. Сообщество оценит.

Помните: эта ошибка – не уникальна. Подобные проблемы регулярно всплывают в fast-moving проектах типа llama.cpp. Если вы хотите глубже понять, как избежать таких сценариев, посмотрите практический гайд по ошибкам локального запуска LLM.

Сборка после исправления: нюансы

После отката или патча нужно пересобрать llama.cpp. Здесь свои подводные камни:

# Очистка предыдущей сборки - ОБЯЗАТЕЛЬНО
make clean

# Сборка с оптимизациями под ваше железо
# Для NVIDIA GPU:
make -j$(nproc) llama-cli LLAMA_CUDA=1

# Для Apple Silicon:
make -j$(nproc) llama-cli LLAMA_METAL=1

# Для чистого CPU:
make -j$(nproc) llama-cli

Если сборка падает с ошибками, проверьте зависимости. На 2026 год актуальны: CMake 3.28+, GCC 13+ или Clang 17+, CUDA 12.6+ (для NVIDIA). Устаревшие компиляторы могут не понять новый код.

Не копируйте команды сборки слепо. Каждое железо требует своей настройки. Если хотите выжать максимум, изучите аргументы llama.cpp и тонкую настройку. Разница в скорости может достигать 2-3 раз.

FAQ: частые вопросы и подводные камни

Ошибка осталась после отката. Что делать?

Значит, вы откатились не на тот коммит. Проблема могла прийти несколькими коммитами. Используйте git bisect, чтобы найти точный коммит, где все сломалось:

git bisect start
git bisect bad HEAD  # текущее состояние плохое
git bisect good abc1234  # коммит, где все работало
# Далее git будет вести вас к проблемному коммиту

Флаг --skip-chat-parsing не помогает

Значит, проблема не в парсере чат-шаблонов, а в чем-то другом. Проверьте:

  • Целостность GGUF-файла модели
  • Достаточно ли оперативной памяти
  • Не конфликтует ли llama.cpp с другими библиотеками CUDA

Попробуйте запустить модель с минимальными параметрами: ./llama-cli -m model.gguf -n 1 -p "test".

Как не попадать на такие баги в будущем?

Три правила:

  1. Не обновляйте llama.cpp в продакшене сразу после релиза. Дайте неделю-две, чтобы сообщество нашло косяки.
  2. Используйте тегированные релизы (v3.8.0, v3.9.0), а не мастер-ветку. Мастер – это игра в русскую рулетку.
  3. Держите под рукой стабильную сборку на отдельной ветке или в контейнере. Когда-нибудь это спасет дедлайн.

А если я хочу и новые оптимизации, и работающий парсер?

Ждите фикса от разработчиков. Обычно такие критические баги чинят за 1-2 недели. Мониторьте Issues на GitHub. Когда выйдет фикс, обновитесь аккуратно: сначала на staging-окружении, потом на production.

💡
Для сложных продакшен-систем рассмотрите запуск llama.cpp в изолированных контейнерах. Это дает контроль над версиями зависимостей и упрощает откат. У нас есть гайд по LXC-контейнерам в Proxmox, принципы применимы и к Docker.

Прогноз: что будет дальше с llama.cpp

Ошибка failed to parse at pos – симптом роста. Проект стал слишком большим и сложным. Команда добавляет фичи для новых моделей (DeepSeek V3.2, Qwen 3.5, Gemini 2.5), но ломает старые.

Мой совет: готовьтесь к тому, что таких багов будет больше. Архитектура llama.cpp меняется, добавляется поддержка новых форматов внимания, квантований, аппаратных ускорителей. Каждое изменение – потенциальная регрессия.

Что делать? Диверсифицируйте. Изучайте альтернативные бэкенды: MLX для Apple, DirectML для Windows, облачные GPU-сервисы для тяжелых моделей. Не кладите все яйца в одну корзину под названием llama.cpp.

И последнее: эта ошибка научила сообщество важности тестирования. Если вы мейнтейните кастомные чат-шаблоны, напишите для них unit-тесты. Простой скрипт, который проверяет, что шаблон парсится без ошибок, спасет часы отладки.

Да, llama.cpp иногда ломается. Но он все еще лучший инструмент для локального запуска LLM. Просто теперь вы знаете, как починить его, когда он сломается.

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