Почему локальные агенты тормозят: проблема повторной оценки промптов
Локальные агентные пайплайны на базе Aider, Claude Code и аналогичных инструментов упираются в общую архитектурную проблему. При каждом вызове LLM модель заново обрабатывает тысячи токенов, которые не изменились с предыдущего шага: системный промпт, схемы инструментов, историю диалога. Этот этап называется prompt evaluation, и на среднем железе он занимает львиную долю времени выполнения.
Типичный цикл агента выглядит так: получив результат выполнения инструмента, среда формирует новый запрос, включающий полный контекст всех предыдущих взаимодействий. Модель честно прогоняет через attention-механизм каждый токен этого контекста, хотя 95% из них уже были обсчитаны на предыдущем шаге. На APU с производительностью генерации 10 токенов/с обработка промпта из 1000 токенов легко забирает 10 секунд. Железо справляется с генерацией, но время отклика становится неприемлемым для интерактивной работы.
Проблема усугубляется с ростом длины диалога. После 20-30 итераций агента история раздувается до десятков тысяч токенов, и каждый следующий вызов модели превращается в ожидание в минутах. Разработчики, использующие локальные модели для агентных задач, знакомы с этой картиной: вентиляторы ноутбука раскручиваются, процессор загружен на 100%, а модель молчит 30, 60, 120 секунд перед тем, как выдать очередной ответ.
CachyLLama: персистентное кеширование KV как решение
CachyLLama - форк llama.cpp, нацеленный на устранение этого узкого места. Проект добавляет персистентное SSD-кеширование KV-состояний, что позволяет пропускать повторную оценку токенов, уже встречавшихся в предыдущих запросах. KV-кеш хранит вычисленные матрицы ключей и значений для каждого токена контекста. При повторном появлении тех же токенов они загружаются с диска, а не пересчитываются заново.
Ключевой механизм - выделенный кеш системного промпта. Системный промпт и описания инструментов одинаковы для всех вызовов агента в рамках одной сессии. CachyLLama вычисляет их один раз, сохраняет KV-состояние на SSD и при последующих запросах подгружает готовый кеш, полностью пропуская этап prompt evaluation для этой части контекста. Второй компонент - контрольные точки беседы. Состояние диалога периодически сохраняется на диск, позволяя восстановить контекст после перезапуска сервера без повторной обработки всей истории.
Для понимания эффекта: на связке из двух AMD MI50 обработка промпта в 15 700 токенов сокращается с 143 секунд холодного старта до менее чем 1 секунды при тёплом кеше. Это не инкрементальная оптимизация, а качественный скачок в отзывчивости агентных систем на локальном железе.
Многоуровневое хранение: RAM и SSD с интеллектуальным вытеснением
CachyLLama реализует двухуровневую систему управления KV-кешем. «Горячие» состояния активных сессий хранятся в оперативной памяти для минимальной задержки доступа. «Холодные» состояния простаивающих сессий или старых контрольных точек вытесняются на SSD. Механизм вытеснения работает по принципу LRU: наименее используемые KV-блоки переносятся на диск, освобождая RAM для текущих задач.
Эта архитектура решает две конфликтующие задачи. Скорость: активный кеш всегда в памяти, загрузка занимает миллисекунды. Объём: SSD предоставляет практически неограниченное пространство для хранения состояний множества сессий и контрольных точек. Для агентов с длинными диалогами это означает возможность держать в памяти состояния десятков параллельных задач без деградации производительности.
Поддержка гибридных архитектур: MoE и SSM
CachyLLama корректно обрабатывает KV-кеш для моделей с архитектурами Mixture of Experts и State Space Models. В MoE-моделях каждый токен маршрутизируется через подмножество экспертов, и кеш сохраняет информацию о том, какой эксперт был активирован для каждого токена. При восстановлении из кеша эта маршрутизация воспроизводится без повторных вычислений gating-механизма.
Для SSM-архитектур форк сохраняет скрытое состояние модели, которое в этих архитектурах выполняет роль, аналогичную KV-кешу в трансформерах. Пользователи, экспериментирующие с новыми архитектурами, получают ту же степень ускорения, что и на классических transformer-моделях.
Бенчмарки на AMD Ryzen 7840U: от минут до секунд
Тесты проводились на AMD Ryzen 7840U со встроенной графикой Radeon 780M - типичной конфигурации современного ноутбука без дискретного GPU. Это важно: речь идёт о потребительском железе, доступном массовому разработчику.
Результаты для промпта длиной ~1243 токена:
- Холодный старт (без кеша): 9,3 секунды
- Тёплый кеш (повторный вызов): 0,41 секунды
Результаты для промпта длиной ~15 700 токенов:
- Холодный старт: 143,1 секунды
- Тёплый кеш: 0,99 секунды
Ускорение составляет 22-144 раза в зависимости от длины контекста. На практике это разница между «пойти налить кофе, пока агент думает» и «ответ приходит мгновенно». Для сравнения, оптимизации промпт-обработки в основном llama.cpp под ROCm дают прирост 15%, что полезно, но не решает проблему повторной оценки системных промптов фундаментально.
Интеграция в агентные пайплайны: Aider, Claude Code и другие
CachyLLama сохраняет полную совместимость с API llama.cpp, что делает его дроп-ин заменой в любых проектах, использующих этот бэкенд. Aider, Claude Code, LocalAI и другие инструменты, работающие через OpenAI-совместимый сервер llama.cpp, подхватывают форк без изменений в коде агента.
Практическая схема внедрения: собираете CachyLLama из исходников, запускаете сервер с флагом включения SSD-кеша, указываете путь к директории для хранения кеша. Всё. Агент продолжает отправлять запросы как обычно, а форк автоматически определяет повторяющиеся фрагменты промптов и подгружает их из кеша.
Эффект наиболее заметен при повторяющихся вызовах с одинаковым системным промптом - а это ровно тот сценарий, в котором работают все агентные фреймворки. Каждый вызов модели в цикле агента включает полный системный промпт и описания инструментов, которые не меняются на протяжении всей сессии. CachyLLama вычисляет их один раз и переиспользует при всех последующих обращениях.
Для разработчиков, которые строят собственных агентов, детальный разбор архитектуры AI-агента с метриками latency и cost поможет понять, на каком этапе пайплайна кеширование даст максимальный эффект.
Ограничения и когда CachyLLama не поможет
Форк решает специфическую проблему и не является универсальным ускорителем инференса. Перечислим сценарии с минимальным выигрышем:
- Полностью уникальные промпты без повторяющихся фрагментов - кешу нечего переиспользовать.
- Отсутствие системного промпта - если агент не использует фиксированные инструкции, выигрыш только на повторяющейся истории диалога.
- Очень короткие диалоги из 1-2 реплик - накладные расходы на сохранение кеша сопоставимы с выигрышем.
- Первый запуск после старта сервера - кеш пуст, и первый запрос всегда выполняется по полному циклу.
Скорость SSD прямо влияет на время загрузки кеша. На NVMe-накопителе загрузка состояния для 15 000 токенов занимает доли секунды. На SATA SSD задержка выше, но всё равно на порядки меньше повторного вычисления. Жёсткие диски не рекомендуются: последовательное чтение больших KV-блоков с HDD может нивелировать выигрыш от кеширования.
CachyLLama не ускоряет генерацию новых токенов - только этап prompt evaluation. Если узкое место вашего пайплайна в скорости декодирования, а не в обработке промпта, форк не даст заметного прироста. В таких случаях стоит смотреть в сторону квантизации и оптимизации бэкенда.
Перспективы развития и влияние на локальный инференс
Персистентное кеширование KV-состояний - закономерный этап эволюции локального инференса. По мере того как агентные пайплайны становятся основным способом взаимодействия с LLM, повторная обработка контекста превращается из допустимой особенности в критический дефект архитектуры.
CachyLLama демонстрирует, что проблема решается без апгрейда железа. Потребительский ноутбук с APU получает время отклика, сравнимое с серверными конфигурациями, для повторяющихся запросов. Это важно для демократизации AI: сложные агентные системы становятся практичными на устройствах, которые уже стоят на столах у разработчиков.
Среди возможных направлений развития - интеграция в основную ветку llama.cpp, поддержка других бэкендов инференса, оптимизация формата хранения кеша для ещё более быстрой загрузки. Фреймворки для сквозного тестирования агентов уже двигаются в сторону метрик, чувствительных к задержкам такого рода, и решения вроде CachyLLama будут напрямую влиять на результаты этих бенчмарков.
Если вы работаете с локальными агентами на среднем железе и тратите минуты на ожидание ответа - установка CachyLLama займёт полчаса и может сократить время отклика в десятки раз. Проект открыт, доступен на GitHub, и автор принимает обратную связь по совместимости с различными конфигурациями.