Суть
Каждый запрос биллится по полному контексту (см. 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