Prompt Caching

Prompt caching — кэширование неизменного префикса промпта (статичный системный промпт), чтобы провайдер не пересчитывал его на каждом запросе. Даёт экономию стоимости и латентности на повторяющейся части (по материалам — до −90% на повторяющихся system-промптах).

Суть

Каждый запрос биллится по полному контексту (см. Context Window), а system-промпт часто один и тот же от запроса к запросу. Если положить статику в начало и закэшировать, повторные запросы переиспользуют префикс — платишь только за новую (динамическую) часть.

Зачем это нужно

Это прямой рычаг unit-экономики агента (см. Agent CostControl): инструкции, структура документов, правила компании, few-shot примеры — всё это неизменно и не должно пересчитываться/переоплачиваться на каждом вызове.

Как работает

  • Раздели статику и динамику: неизменное (роль, правила, описание формата/документа, примеры) → в системный промпт (кэшируемый префикс); конкретные данные запроса → в пользовательскую часть.
  • Порядок важен: кэшируемая статика впереди, динамика в конце — иначе кэш «ломается».
  • Anthropic в «Prompting 101» прямо рекомендует держать статическую информацию (например, структуру страховой формы) в system prompt именно ради prompt caching.
  • Связка с Prompt Engineering: «анатомия промпта» (статичные блоки впереди) сама располагает к кэшированию.
  • Правило «статика вверх, динамика вниз» (лекция по архитектуре): положишь динамику (лог ошибок, свежие данные) перед статикой — кэш слетает на каждой итерации, цена ×10. Конкретика: скидка 90% = $0.30 vs $3.00 за 1M входных токенов; на локальной модели TTFT падает с ~10 c до ~0.5 c. Критично для агента в большой кодовой базе (50k+ строк).

Пример

«Статика вверх, динамика вниз»: неизменный префикс (system prompt, инструменты, документы, few-shot) — в начало (кэшируется), меняющаяся часть — в конец. Ключ кэша = хеш статического префикса.

def build_cache_aware_prompt(static_blocks, dynamic_blocks):
    # статика (роль, правила, документы, few-shot) — В НАЧАЛЕ: префикс кэшируется
    static_text  = "\n\n".join(f"### {t}\n{c}" for t, c in static_blocks)
    # динамика (текущий запрос, свежий контекст) — В КОНЦЕ: меняется каждый вызов
    dynamic_text = "\n\n".join(f"### {t}\n{c}" for t, c in dynamic_blocks)
    full = static_text + "\n\n--- DYNAMIC ---\n\n" + dynamic_text
    cache_key = hashlib.sha1(static_text.encode()).hexdigest()[:16]   # ключ = хеш статич. префикса
    return {"prompt": full, "cache_key": cache_key}

Связано с

  • Context Window — кэш снижает стоимость повторного префикса в окне
  • Prompt Engineering — статичные блоки промпта впереди → кэшируемы
  • Agent CostControl — prompt caching как способ резать затраты

Открытые вопросы

  • TTL кэша и минимальный размер префикса для срабатывания (зависит от провайдера)
  • как структурировать промпт агента, чтобы максимизировать cache hit