Контекст-инженерия
Этот блок о том, что лежит в окне модели на каждом шаге: чем оно заполняется, какими четырьмя способами держать его полезным и как при сжатии истории можно потерять правило, которому агент обязан следовать.
Покупатель Northwind оспаривает повреждение в заказе 4417. Агент раз за разом загружает полную историю заказа и документы о доставке. К шагу 15 перед ним лежит 96 000 токенов, а сама жалоба покупателя занимает в них совсем немного.
Одна доска у телефона
У вашего коллеги на телефоне есть одна доска. Всё, чем он воспользуется в следующей фразе, должно быть на ней, а чего на доске нет, для него не существует. Между звонками вы стираете её и пишете заново, поэтому каждый раз сами выбираете, что на ней окажется.
Эта доска — окно контекста: все токены, которые модель видит за один вызов. Контекст-инженерия — это решение, что положить в окно на каждом шаге. Цель Anthropic формулирует так: наименьший набор полезных токенов, который даёт нужный результат.
Окна выросли: у Claude Sonnet 5.5 это 1 миллион токенов. Размер всё равно важен, и причин две. Первую показал прошлый блок: за каждый токен вы платите снова при всех последующих вызовах. Вторая — качество. Anthropic сообщает, что по мере роста контекста модель хуже извлекает из него сведения, а в документации LangGraph предупреждают, что на длинных контекстах большинство моделей работает хуже, отвлекаясь на устаревшее и постороннее.
Вот шаг 15 этого прогона:
Здесь первыми идут результаты инструментов. Следующим большим куском могут стать схемы инструментов, и они лежат на доске ещё до начала работы. Anthropic приводит пример: пять подключённых серверов MCP, у которых 58 инструментов занимают около 55 000 токенов.
Четыре приёма
1. Загружать только то, что нужно шагу. Инструмент возвращает короткий результат и способ получить остальное. Агент запоминает указатель и достаёт подробности, если они понадобятся. В Anthropic это называют извлечением «just in time».
{
"order_id": "4417",
"lines_total": 212,
"lines_shown": 5,
"next_cursor": "c_88f2",
"lines": [
{
"sku": "LMP-204",
"qty": 1,
"status": "delivered_damaged"
}
]
}То же относится и к схемам. В API Anthropic инструменты с defer_loading: true не попадают в окно, пока их не найдёт поиск по инструментам, и в документации сказано, что обычно это уменьшает токены определений больше чем на 85 процентов. Цена загрузки по требованию — больше вызовов, и каждый медленнее, чем если бы данные уже были под рукой.
2. Сжимать старую историю. Есть две степени.
Очистка убирает содержимое старых результатов инструментов и оставляет заглушку. Агент ими уже воспользовался. В API Anthropic это функция в бете, и ваш код включает её в запросе:
{
"context_management": {
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": {
"type": "input_tokens",
"value": 60000
},
"keep": {
"type": "tool_uses",
"value": 3
},
"clear_at_least": {
"type": "input_tokens",
"value": 20000
},
"exclude_tools": [
"get_refund_policy"
]
}
]
}
}Compaction, то есть сжатие в сводку, заменяет старые реплики кратким пересказом. Anthropic предлагает её в бете, по запросу или автоматически при достижении порога токенов, по умолчанию это 150 000 входных токенов. Своя compaction есть и у OpenAI.
В этой модели, где начало занимает 12 000 токенов, а сводка 8 000, 60 вызовов отправляют 4,85 миллиона входных токенов с compaction и 11,34 миллиона без неё. В этот счёт уже входят два дополнительных вызова, которые пишут сводки: написать сводку — это тоже оплачиваемый вызов модели.
Сжатие к тому же меняет префикс, поэтому следующий вызов не попадает в кэш начиная с этого места. Anthropic советует очищать сразу достаточно много, чтобы промах окупался, для этого и нужен clear_at_least, и ставить точку кэширования в конце системного промпта, чтобы он оставался в кэше после сжатий.
3. Держать заметки вне окна. Агент записывает выясненное в файл или хранилище и читает обратно, когда нужно: «фото проверено, претензия перевозчику C-118 открыта». Про хранилище, которое переживает прогон, следующий блок.
4. Отдать подзадачу субагенту. Отдельный агент с чистым окном читает 200 строк документов поставщика и возвращает короткий ответ. Anthropic описывает субагентов, которые могут потратить десятки тысяч токенов и вернуть сводку, часто на 1 000–2 000. Остального главный агент не видит, а значит, и проверить не может.
Приём | Пример в Northwind | Цена |
|---|---|---|
Загрузка по требованию | Первые 5 строк заказа и курсор | Больше вызовов, шаги медленнее |
Очистка старых результатов | Оставить 3 последних результата | Позже может понадобиться загрузить заново |
Compaction | Сводка шагов с 1 по 24 | Детали могут пропасть, промах кэша, лишний вызов |
Заметки вне окна | Заметки по обращению | Нужны инструменты и внимание к тому, что записано |
Субагент | Прочитать документы поставщика | Лишние вызовы модели, обратно приходит только сводка |
Что может потерять compaction
Бывает, что доску стирают в спешке. Представьте, что на шаге 12 подключился руководитель и написал: «Не возвращать деньги по заказу 4417, пока не закончена проверка адреса». Эта фраза живёт в истории. Сводка на шаге 24 сохраняет суть дела и теряет фразу. На шаге 25 модель видит «повреждение подтверждено, возврат положен» и вызывает issue_refund.
Anthropic об этом предупреждает: при слишком агрессивной compaction пропадает тонкий контекст, важность которого становится ясна только позже. В документации по compaction также сказано, что текстовые инструкции в системных сообщениях внутри сжатого участка перестают действовать, как только их заменяет сводка.
Защищают три вещи, начиная с самой надёжной:
- Правило, которое обязано выполняться, проверяет ваш код перед запуском инструмента. Об этой проверке говорилось в блоке о решениях в коде.
- Постоянное правило лежит в основном системном промпте, вне сводки. Правило, появившееся по ходу прогона, ваш код сохраняет и добавляет в промпт.
- Вы говорите тому, кто пишет сводку, что сохранить обязательно. Поле
instructionsв API Anthropic целиком заменяет стандартный промпт сводки, поэтому в нём должно быть всё важное. Ещё можно оставить последние реплики дословно.
Если пишете compaction сами, соблюдайте и формат сообщений. В API Anthropic результаты инструмента должны идти сразу за tool_use, который их запросил, поэтому если разрезать такую пару, API отклонит запрос.
Вывод
- Контекст-инженерия решает, что модель видит на каждом шаге. Когда инструментов много, больше всего места часто занимают их вывод и схемы.
- Приёмы такие: загрузка по требованию, сжатие истории, заметки вне окна и субагенты. У каждого своя цена.
- При сжатии правила могут потеряться. Те, что обязаны выполняться, держите вне истории и проверяйте в коде.