Дата публикации
ai_products

Как Anthropic ускорила Claude Code: всё держится на кэше промптов

Что нового

Anthropic подробно рассказала, как устроен Claude Code — «долгоживущий» AI‑ассистент для работы с кодом — и почему весь продукт крутится вокруг кэширования промптов.

Ключевые новшества и подходы:

  • Claude Code строит всю работу агента вокруг prompt caching — повторного использования уже обработанной части промпта.
  • Команда держит высокий процент попаданий в кэш как критический метрику: настраивает алерты и поднимает инциденты (SEV), если hit rate падает.
  • Вся структура промпта разделена на уровни стабильности:
    1. Статический системный промпт и список инструментов — общие для всех сессий.
    2. Файл CLAUDE.md — общий внутри проекта.
    3. Контекст сессии — общий внутри одной сессии.
    4. Сообщения диалога — меняются каждый ход.
  • Anthropic выстроила работу так, чтобы:
    • не менять модели посреди длинной сессии;
    • не добавлять и не удалять инструменты по ходу разговора;
    • обновлять контекст через сообщения, а не правкой системного промпта;
    • делать компактацию (сжатие истории) так, чтобы не терять кэш.
  • На базе опыта Claude Code Anthropic встроила компактацию диалога прямо в API, чтобы другим разработчикам не приходилось заново решать те же проблемы.

Цифр по стоимости токенов, скорости или точным hit rate Anthropic не приводит, но прямым текстом говорит: даже несколько процентов промахов по кэшу заметно бьют по цене и задержке.

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

Базовый принцип: кэш по префиксу

API Anthropic кэширует промпт по точному совпадению префикса. Всё, что идёт от начала запроса и до специальных точек cache_control, попадает в кэш. Если в любом месте префикса меняется хотя бы один байт — весь хвост после этого места перестаёт кэшироваться.

Отсюда главное правило: как вы упорядочите части промпта, так вы и будете платить.

Anthropic строит промпт Claude Code так:

  1. Статический системный промпт + инструменты
    Это глобальная часть, которая одинакова для всех пользователей и сессий. Здесь лежит описание роли Claude Code, правила работы, список инструментов (включая MCP‑инструменты) и их схемы.

  2. CLAUDE.md
    Проектный контекст: описание репозитория, конвенции, особенности кода. Кэшируется на уровне проекта.

  3. Контекст сессии
    Дополнительные данные, актуальные для текущей сессии: выбранные файлы, состояние режима (например, Plan Mode), пользовательские настройки.

  4. Сообщения диалога
    История общения: запросы пользователя, ответы Claude, результаты вызовов инструментов.

За счёт такого разбиения максимальное количество запросов разделяет общий префикс, а значит — попадает в кэш.

Хрупкость структуры промпта

Anthropic подчёркивает, что эта конструкция легко ломается из‑за мелочей:

  • Добавили подробный таймстемп в статический системный промпт — префикс меняется каждый раз, кэш рушится.
  • Поменяли порядок описаний инструментов случайным образом — кэш перестаёт совпадать по байтам.
  • Обновили параметры инструмента (например, список агентов, которых может вызвать «Agent tool») — тоже ломается совпадение префикса.

Вывод: любой «живой» параметр в статическом блоке — потенциальный убийца кэша.

Обновления через сообщения, а не через системный промпт

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

Вместо этого Claude Code передаёт обновления через сообщения:

  • В следующее сообщение пользователя или результат инструмента вставляет тег вроде <system-reminder>.
  • В этот блок кладёт обновлённые факты: новое время, изменённое состояние, новые файлы и т.д.

Системный промпт при этом не трогает, префикс остаётся прежним, кэш продолжает работать.

Не менять модель посреди сессии

Кэш промптов жёстко привязан к конкретной модели. Кэш для Claude 3 Opus не работает для Claude 3 Haiku и наоборот.

Anthropic приводит пример: диалог уже разросся до 100 000 токенов с Claude 3 Opus. Пользователь задаёт простой вопрос, и может показаться разумным переключиться на более дешёвый Claude 3 Haiku. Но при таком переключении нужно заново отправить весь контекст Haiku, и он не сможет использовать кэш Opus.

Результат: ответ Haiku выходит дороже, чем если бы Opus продолжил разговор по уже закэшированному префиксу.

Решение — субагенты:

  • Основной агент на Opus формирует специальное «hand‑off» сообщение: сжатое описание задачи для Haiku.
  • Дальше отдельный субагент на Haiku решает локальную задачу, не требующую всего контекста.

Так Anthropic делает, например, с Explore‑агентами Claude Code, которые используют Haiku.

Не добавлять и не удалять инструменты в середине диалога

Инструменты входят в тот самый кэшируемый префикс. Если в середине разговора вы:

  • убираете часть инструментов,
  • добавляете новые,
  • меняете их порядок,

то весь префикс с инструментами перестаёт совпадать, и кэш промпта для этой сессии умирает.

Anthropic сознательно никогда не меняет набор инструментов по ходу сессии. Вместо этого она моделирует изменение состояния через сами инструменты.

Пример: Plan Mode без убийства кэша

Интуитивный подход к Plan Mode в IDE: когда пользователь его включает, можно было бы:

  • заменить набор инструментов на «только чтение»;
  • отключить всё, что меняет файлы.

Но это ломает префикс и кэш. Anthropic пошла другим путём:

  • В запрос всегда попадает полный список инструментов.
  • Plan Mode реализован как инструменты EnterPlanMode и ExitPlanMode.
  • При включении Plan Mode агент получает системное сообщение: он сейчас в режиме планирования, может только исследовать код, не должен править файлы и обязан вызвать ExitPlanMode, когда план готов.
  • Определения инструментов при этом не меняются.

Бонус: так как EnterPlanMode — тоже инструмент, сам Claude может вызвать его, когда чувствует, что задача сложная и требует предварительного плана, и при этом кэш не страдает.

Экономия на MCP‑инструментах через отложенную загрузку

Claude Code может подключать десятки MCP‑инструментов. Если каждый раз отправлять в запрос полный JSON‑описания всех инструментов, промпт раздувается, а стоимость растёт.

Удалять инструменты посреди диалога нельзя — это ломает кэш. Anthropic использует схему defer_loading:

  • В префикс попадают лёгкие заглушки инструментов: только имя и флаг defer_loading: true.
  • Когда модели реально нужен инструмент, она вызывает специальный tool search.
  • После этого Anthropic подгружает полную схему только выбранного инструмента.

Кэшируемый префикс при этом остаётся стабильным: набор заглушек и их порядок не меняются.

Компактация истории без потери кэша

Когда диалог упирается в лимит контекстного окна, Claude Code делает компактацию:

  1. Отдельным запросом просит модель сжать историю в краткое резюме.
  2. Продолжает диалог уже с этим резюме вместо длинной истории сообщений.

Наивная реализация выглядит так:

  • Отправить всю историю в отдельный API‑запрос с системным промптом вида «Суммируй этот диалог» и без инструментов.

Проблема: такой запрос не совпадает по префиксу с основным диалогом.

  • Системный промпт другой.
  • Набор инструментов другой (или отсутствует).

Из‑за этого кэш промптов не используется вообще, и вы платите полную стоимость за весь длинный контекст, который как раз и пытаетесь ужать.

Anthropic решает это через cache‑safe forking:

  • Для компактации Claude Code использует точно тот же системный промпт, тот же пользовательский и системный контекст и тот же список инструментов, что и в родительской сессии.
  • В запрос добавляет всю историю диалога родителя.
  • В конец истории, как новое пользовательское сообщение, добавляет промпт компактации: просьбу кратко пересказать диалог.

С точки зрения API такой запрос почти идентичен последнему запросу в основной сессии:

  • Префикс тот же.
  • Инструменты те же.
  • Разница только в последнем сообщении.

В результате API повторно использует закэшированный префикс, и вы платите только за хвост — текст промпта компактации и ответ‑резюме.

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

Anthropic перенесла этот подход в сам API: компактация теперь встроена, и разработчики могут использовать такие же cache‑safe паттерны без ручной реализации.

Что это значит для вас

Если вы строите своего агента — неважно, это AI‑помощник в IDE, чат‑бот поддержки или внутренний ассистент — опыт Claude Code даёт несколько прямых советов.

1. Проектируйте промпт с учётом кэша

  • Вынесите максимум стабильной информации в начало промпта.
  • Не вставляйте туда динамику: даты, случайные идентификаторы, перемешивающиеся списки.
  • Отдельно держите:
    • глобальный системный промпт и инструменты;
    • проектный контекст;
    • контекст сессии;
    • историю сообщений.

Чем больше запросов делят общий префикс, тем ниже стоимость и задержка.

2. Обновляйте контекст через сообщения

  • Не переписывайте системный промпт при каждом изменении даты, режима или состояния файлов.
  • Добавляйте обновления в виде отдельных сообщений (например, в следующем сообщении пользователя с пометкой наподобие <system-reminder>).

Так вы не сломаете кэш, но модель всё равно получит свежие данные.

3. Избегайте смены модели в длинных диалогах

  • Если сессия уже разрослась до десятков тысяч токенов, переключение с Opus на Haiku может оказаться дороже, чем продолжение работы на Opus.
  • Используйте субагентов: основной агент формирует краткое задание, а быстрый/дешёвый агент решает локальную подзадачу.

Это особенно полезно, если вы делаете сложного ассистента, который комбинирует, например, «тяжёлую» модель для рассуждений и «лёгкую» для быстрых операций.

4. Фиксируйте набор инструментов и используйте отложенную загрузку

  • Не добавляйте и не убирайте инструменты посреди разговора.
  • Моделируйте изменение режима через сами инструменты и системные сообщения, как в Plan Mode Claude Code.
  • Для большого числа инструментов используйте подход defer_loading: держите в префиксе только заглушки и подгружайте полные схемы по запросу модели.

Это пригодится, если вы строите окружение с десятками интеграций — от Git и CI до внутренних API.

5. Относитесь к кэшу как к инфраструктуре

Anthropic мониторит процент попаданий в кэш так же строго, как аптайм сервиса:

  • Настраивает алерты на падение hit rate.
  • Считает серьёзные падения инцидентами (SEV).

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

6. Для форков и компактации копируйте параметры родителя

Когда вы запускаете побочные вычисления:

  • компактацию / суммаризацию диалога,
  • исполнение отдельного навыка или сложной подзадачи,

используйте те же:

  • системный промпт,
  • пользовательский и системный контекст,
  • список инструментов и их порядок.

Меняйте только последние сообщения. Тогда побочный запрос сможет использовать кэш родительской сессии.

Доступность Claude Code

Claude Code тесно связан с экосистемой Anthropic и доступен через их интерфейсы и API. Для пользователей из России прямой доступ к сервисам Anthropic может потребовать VPN и работы через зарубежные аккаунты и платёжные инструменты.

Место на рынке

Anthropic в этом материале не даёт прямых сравнений с конкурентами вроде GPT‑4o или других код‑агентов. Вместо этого она показывает архитектурный подход, который можно применить в любом стекe.

Что можно зафиксировать по факту:

  • Claude Code изначально проектировали как долгоживущий агент с большими диалогами и сложным инструментарием.
  • В таких сценариях стоимость и задержка сильно зависят от того, насколько эффективно вы переиспользуете уже отправленный контекст.
  • Anthropic вкладывается не только в сами модели Claude 3, но и в инфраструктурные возможности API: prompt caching и встроенную компактацию.

Если вы строите аналог Claude Code на других моделях (например, на GPT‑серии от OpenAI), те же принципы всё равно работают: кэш по префиксу, стабильный порядок инструментов, отсутствие динамики в системном промпте, форки с общим префиксом.

Anthropic делает ставку на то, что грамотная работа с кэшем — обязательное условие для любых серьёзных агентных продуктов, а не только приятный бонус к снижению цены.

Выводы Anthropic

Команда Claude Code формулирует свои правила так:

  1. Кэш промптов — это префикс‑матч. Любое изменение в префиксе убивает всё, что идёт после. Нужна архитектура, построенная вокруг этого ограничения.
  2. Используйте сообщения вместо правки системного промпта. Вводите режимы и обновления контекста через диалог, а не через редактирование верхней части промпта.
  3. Не меняйте инструменты и модели в середине разговора. Состояния (например, Plan Mode) описывайте через инструменты и сообщения. Инструменты не удаляйте, а загрузку откладывайте.
  4. Мониторьте кэш как аптайм. Следите за hit rate, алертите на падения, относитесь к этому как к инциденту, а не к мелкой оптимизации.
  5. Форки должны делить префикс с родителем. Для компактации и побочных вычислений используйте те же параметры запроса, чтобы кэш работал и там.

Anthropic строит Claude Code вокруг кэширования промптов с первого дня и предлагает всем, кто делает своих агентов, начинать с тех же принципов.


Читайте также