Исправление бага чекпоинтов контекста в llama.cpp b9978 для агентов | AiManual
AiManual Logo Ai / Manual.
13 Июл 2026 Инструмент

llama.cpp b9978: Исправление бага чекпоинтов контекста, которое спасает агентов от "амнезии"

Фикс в llama.cpp b9978 устраняет коллапс окна контекста при tool calling. Экономит память и ускоряет агентные циклы. Разбор проблемы и практические примеры.

Если вы когда-нибудь запускали агента на llama.cpp с длинной цепочкой вызовов инструментов, то наверняка сталкивались с ситуацией, когда после третьего-четвертого шага агент "забывал", что делал. Окно контекста схлопывалось, начиналась перегенерация всего промпта — и вот вы уже ждете ответ не 2 секунды, а 20. А если агент делает откат? Катастрофа: полный репроцесс с нуля. Именно эту боль решает релиз b9978.

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

Почему это было больно

В агентных системах на llama.cpp каждый вызов инструмента (tool call) — это отдельный запрос к модели. До b9978 движок при каждом вызове сохранял полный снэпшот KV-кэша, чтобы иметь возможность откатиться, если агент передумает или вернет ошибку. Проблема: когда агент делает 10-15 шагов, эти чекпоинты накапливаются, занимая гигабайты памяти. Но самое страшное — при откате на несколько шагов назад система не умела выбирать нужный чекпоинт, а просто перезапускала весь промпт с нуля.

Это превращало работу с долгоживущими агентами в пытку. Статья "Агент, который забыл, что уже сделал" подробно разбирает эту проблему на уровне самой модели. Теперь же fix под капотом llama.cpp убирает корень зла.

Как это работает в b9978

Разработчики переработали механизм управления чекпоинтами. Вместо того чтобы плодить их на каждый чих, теперь используется ленивое создание: чекпоинт фиксируется только при явном запросе от агента (например, перед выполнением рискованного tool call) или при выходе за лимит окна контекста. Кроме того, при откате движок не перезапускает весь промпт — он использует режим слияния частичных кэшей, который позволяет точечно восстановить состояние.

💡
Ключевая метрика: в тестах llama.cpp b9978 количество чекпоинтов за один агентный цикл из 20 шагов сократилось с 20 до 2-3 (первый и последний). При откате на 5 шагов время репроцесса упало с 12 секунд до 0.8.

Важно: фикс не меняет API — все флаги вроде --cache-type-k и --ctx-rows остаются прежними. Просто внутренняя логика стала умнее.

А что было до? Сравнение с альтернативами

До b9978 разработчикам приходилось обходить баг вручную: очищать историю после каждого шага (теряя контекст) или писать костыли с ресетом кэша. Сравним с другими популярными рантаймами:

Решение Управление чекпоинтами Откаты без репроцесса Расход памяти
llama.cpp ≤ b9977 Каждый шаг -> чекпоинт Нет Огромный
llama.cpp ≥ b9978 Ленивое создание Да Умеренный
vLLM (v0.9+) Автоматическое, но без детализации Частично Средний
OpenAI API (GPT-4) Не контролируется Нет Не применимо

Как видите, llama.cpp b9978 теперь не уступает коммерческим решениям, а по контролю над кэшем — превосходит. Для тех, кто использует local models с агентными циклами, это огромный шаг вперед.

Пример: до и после на конкретном сценарии

Представьте агента, который читает файл, извлекает данные, вызывает SQL-запрос, анализирует результат и пишет отчет. На каждом шаге — вызов инструмента. До b9978 при первом же откате агента (скажем, SQL вернул ошибку) система заново переваривала промпт из 10 000 токенов. Теперь:

  • До фикса: 5 чекпоинтов (по числу шагов), при откате — полный репроцесс ~8-10 секунд.
  • После фикса: 2 чекпоинта (старт и после SQL), откат за 0.3 секунды с сохранением предыдущего контекста.

Разница — в 30-40 раз по времени. Особенно критично для агентов, работающих в реальном времени: чат-боты с долгой памятью, coding-агенты, автономные скрипты. Почитайте статью "Файловый доступ для AI-агента" — там как раз разбирается, как баг с кэшем ломал permission gate. В b9978 эта проблема тоже снята.

Кому точно стоит обновиться?

  • Разработчикам агентных систем на llama.cpp — особенно тем, кто использует tool-calling и многошаговые сценарии.
  • Инженерам, создающим coding-агентов. В статье "Пишем кодинг-агента на Swift" показано, как управление контекстом влияет на стабильность. Теперь можно убрать костыли.
  • Всем, кто использует llama.cpp в продакшене с длинными сессиями — экономия памяти и времени напрямую снижает затраты.

⚠️ Важно: если вы используете кастомные сборки llama.cpp с патчами, убедитесь, что ваш форк включил этот коммит. Официальный релиз b9978 содержит все изменения.

Неочевидный совет: комбинируйте с контекстным инжинирингом

Сам по себе фикс чекпоинтов не избавляет от attention drift — эффекта, когда модель "забывает" информацию из начала контекста. Об этом мы писали в разборе "Как избежать attention drift при tool calls". Используйте b9978 как базу, а поверх стройте правильную структуру промпта.

Лучшая практика — задавать глобальные чекпоинты вручную: перед началом подзадачи и после её завершения. Тогда даже если агент уйдет в цикл, откат будет легким. А для совсем длинных сессий — подумайте о техниках из Context Engineering для coding-агентов. Контроль контекста — это не только про чекпоинты, но и про управление памятью на уровне логики приложения.

llama.cpp b9978 — пример того, как один грамотный фикс может кардинально изменить пользовательский опыт. Агенты перестают "забывать" прошлое, разработчики перестают проклинать рантайм. Если вы всё ещё сидите на версии до b9977 — срочно обновляйтесь. Ваши агенты скажут вам спасибо (ну, насколько LLM способны на благодарность).

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