Стратегии кэширования для AI-агентов: снижение затрат без потери качества
Стратегии кэширования для AI-агентов: снижение затрат без потери качества
Ваш агент-исследователь выполняет 50 задач в день. Каждая задача начинается с одного и того же системного промпта на 3 000 токенов, одних и тех же определений инструментов на 2 500 токенов и одной и той же базы знаний на 5 000 токенов. Это 10 500 токенов, повторяющихся 50 раз — 525 000 токенов в день, которые модель читает идентично каждый раз. По стандартным ценам вы платите за обработку одного и того же контента снова и снова.
Кэширование — это оптимизация с минимальными усилиями и максимальным эффектом для производственных агентов. Только кэширование промптов может снизить стоимость входных токенов на 90% для кэшированного контента. В сочетании с кэшированием результатов инструментов можно нередко сократить общие затраты на агента вдвое — без ущерба для качества, точности или гибкости.
В этой статье вы познакомитесь с тремя уровнями кэширования для агентов — кэшированием промптов, кэшированием результатов инструментов и мемоизацией ответов — с паттернами реализации на базе API Claude и чётким анализом затрат для принятия решений.
Раздел 1: Анатомия затрат агента
Прежде чем оптимизировать, нужно понять, куда на самом деле уходят токены. Разберём типичный агентный рабочий процесс.
Распределение токенов на один шаг
В стандартной архитектуре агента каждый вызов API модели включает:
| Компонент | Прибл. токенов | Повторяется? |
|---|---|---|
| Системный промпт | ~1 500 | Каждый шаг |
| Определения инструментов | ~2 000 | Каждый шаг |
| База знаний / контекст | ~3 000 | Каждый шаг |
| История диалога | Растёт | Накапливается |
| Результаты инструментов | ~500 в среднем | На каждый вызов инструмента |
Статические накладные расходы — системный промпт, определения инструментов и база знаний — составляют в сумме примерно 6 500 токенов на шаг, и они идентичны каждый раз.
Проблема накапливающихся затрат
Агенты не делают один вызов API. Они работают в цикле. Типичный запуск агента на 15 шагов выглядит так:
Без кэширования:
Каждый из 15 шагов отправляет полный контекст. Допустим, история диалога растёт в среднем на ~300 токенов за шаг:
- Статические токены на шаг: 6 500
- Итого статических токенов за 15 шагов: 97 500
- Токены истории диалога (накопленные): ~33 750
- Токены результатов инструментов: ~7 500
- Итого входных токенов: ~138 750
По цене Claude Sonnet в $3 за миллион входных токенов это примерно $0,42 за задачу. При 50 задачах в день выходит $21/день — только на входных токенах.
С кэшированием промптов:
Кэшированные токены тарифицируются по $0,30 за миллион при чтении из кэша (скидка 90%). Если кэшировать 6 500 статических токенов:
- Чтение кэшированных токенов за 15 шагов: 97 500 × $0,30/М = $0,029
- Некэшированные токены по стандартной цене: ~41 250 × $3/М = $0,124
- Запись в кэш (первый шаг): 6 500 × $3,75/М = $0,024
- Итого стоимость входных токенов: ~$0,18 за задачу
Это снижение на 57% только за счёт кэширования. При 50 задачах в день вы экономите более $12/день — примерно $360/месяц — при минимальных изменениях в коде.
Раздел 2: Кэширование промптов с Claude
API кэширования промптов Claude — это наиболее эффективная оптимизация, которую можно применить к агентным рабочим процессам. Она позволяет сообщить API: «эта часть промпта не изменилась — используй кэшированные вычисления повторно».
Как работает кэширование промптов
Когда вы отправляете запрос с включённым кэшированием, инфраструктура Anthropic:
- Проверяет, существует ли кэшированная версия отмеченного префикса
- При промахе кэша: обрабатывает полный промпт, кэширует префикс и взимает плату за запись в кэш (надбавка 25% к стандартной цене входных токенов)
- При попадании в кэш: использует кэшированные вычисления, взимая только плату за чтение из кэша (скидка 90% от стандартной цены входных токенов)
Кэш имеет TTL 5 минут (Time to Live — время жизни, по истечении которого кэшированные данные устаревают). Каждое попадание в кэш сбрасывает TTL, поэтому активные агенты поддерживают кэш «тёплым» естественным образом. Пакетные задания с паузами более 5 минут между вызовами будут чаще платить за запись в кэш.
Что кэшировать
Не всё можно и нужно кэшировать. Кэшируйте стабильные, повторяющиеся префиксы:
- Системные промпты — почти всегда идентичны между запусками. Кэшируйте их в первую очередь.
- Определения инструментов — схемы инструментов редко меняются между вызовами.
- Статические базы знаний — справочные документы, руководства, политики.
- Префиксы диалогов — для многошаговых диалогов кэшируйте ранние шаги, которые не будут меняться.
Важные ограничения:
- Кэширование основано на префиксах — можно кэшировать только контент с начала промпта, по порядку. Нельзя кэшировать секцию в середине, оставив более ранние секции некэшированными.
- Существует минимальная длина кэшируемого контента — 1 024 токена для Claude Sonnet и Haiku (2 048 для Opus).
- В одном запросе можно установить до 4 точек разрыва кэша.
Реализация
Ниже приведён полный пример настройки агента с кэшированием промптов:
До (без кэширования):
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """You are a research assistant specializing in market analysis.You have access to tools for searching databases, reading files, and performingcalculations. Always cite your sources and provide confidence levels for yourfindings. [... detailed instructions totaling ~1,500 tokens ...]"""
TOOLS = [ { "name": "search_database", "description": "Search the company database for market data, competitor info, or financial records.", "input_schema": { "type": "object", "properties": { "query": {"type": "string", "description": "Search query"}, "database": {"type": "string", "enum": ["market", "competitors", "financial"]}, "limit": {"type": "integer", "description": "Max results", "default": 10} }, "required": ["query", "database"] } }, { "name": "read_file", "description": "Read the contents of a research file.", "input_schema": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Path to the file"} }, "required": ["file_path"] } }, # ... more tools totaling ~2,000 tokens in definitions]
KNOWLEDGE_BASE = """## Company Policies and Guidelines[... reference material totaling ~3,000 tokens ...]"""
def run_agent(user_query: str): messages = [{"role": "user", "content": user_query}]
response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=4096, system=f"{SYSTEM_PROMPT}\n\n{KNOWLEDGE_BASE}", tools=TOOLS, messages=messages, ) # Log token usage print(f"Input tokens: {response.usage.input_tokens}") return responseПосле (с кэшированием промптов):
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """You are a research assistant specializing in market analysis.You have access to tools for searching databases, reading files, and performingcalculations. Always cite your sources and provide confidence levels for yourfindings. [... detailed instructions totaling ~1,500 tokens ...]"""
KNOWLEDGE_BASE = """## Company Policies and Guidelines[... reference material totaling ~3,000 tokens ...]"""
TOOLS = [ { "name": "search_database", "description": "Search the company database for market data, competitor info, or financial records.", "input_schema": { "type": "object", "properties": { "query": {"type": "string", "description": "Search query"}, "database": {"type": "string", "enum": ["market", "competitors", "financial"]}, "limit": {"type": "integer", "description": "Max results", "default": 10} }, "required": ["query", "database"] } }, { "name": "read_file", "description": "Read the contents of a research file.", "input_schema": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Path to the file"} }, "required": ["file_path"] }, "cache_control": {"type": "ephemeral"} # Cache breakpoint after tools },]
def run_agent_cached(user_query: str): messages = [{"role": "user
---
## Связанные статьи
- [Оптимизация затрат на агентов: практическое руководство по сокращению расходов на API](/ru/blog/agent-cost-optimization-a-practical-guide-to-reducing-api-spend/)- [Восстановление Агентов После Ошибок: 5 Паттернов для Продакшн-Надёжности](/ru/blog/agent-error-recovery-patterns/)- [Паттерны использования инструментов: надёжные интерфейсы агент-инструмент](/ru/blog/agent-tool-use-patterns/)