Контекстное окно - жёсткий бюджет, а не файловое хранилище
Модель получает только содержимое конкретного вызова: инструкции, сообщения, определения tools, документы и другие элементы. Всё конкурирует за конечное окно. Даже если лимит велик, длинный input стоит дороже, обрабатывается дольше и может ухудшать поиск важного среди шума.
Context engineering - это выбор минимального набора информации, достаточного для следующего правильного действия. История приложения может быть полной, но inference context всегда является собранным представлением.
Сначала вычислите usable input
Номинальное окно нельзя целиком занять историей. Зарезервируйте место для ожидаемого output, tool calls, reasoning и сериализационного overhead. Точные правила подсчёта зависят от модели и API - используйте официальный tokenizer или usage telemetry и оставляйте запас.
usable_input = model_context_limit - reserved_output - reserved_reasoning_or_internal_budget - tool_schema_and_protocol_overhead - safety_margin Reject or compact before usable_input is exceeded. Record estimated and actual tokens in the trace.
Разделите контекст на слои с разной ценностью
| Слой | Содержимое | Стратегия |
|---|---|---|
| Policy | System rules, права, запреты | Сохранять полностью |
| Task state | Цель, план, approvals, открытые шаги | Typed state |
| Verified facts | Подтверждённые значения и источники | Компактная таблица |
| Recent dialogue | Последние релевантные turns | Sliding window |
| Evidence | Retrieved chunks и артефакты | Top relevant under budget |
| Tool results | Ответы внешних систем | Минимальный typed output |
Приоритет должен быть явным и детерминированным
Когда места не хватает, runtime применяет заранее заданную политику, а не просит модель решить, что удалить из собственных инструкций. Policy и актуальный task state имеют гарантированный резерв; evidence и история конкурируют только внутри своих квот.
P0: system policy and current authorization - never summarize P1: task objective, approvals, constraints - preserve typed P2: verified facts and open decisions - preserve with provenance P3: latest user turns - keep verbatim within cap P4: retrieved evidence - rank, deduplicate, cap per source P5: old dialogue and verbose tool output - compact or reference On overflow: fail explicitly if P0 - P2 do not fit.
Typed state надёжнее пересказа всей переписки
Цель, выбранные параметры, обязательства, approvals и незавершённые действия должны жить в состоянии workflow. Тогда после десятков turns не нужно надеяться, что модель найдёт решение в старом сообщении.
Goal
Текущая цель и definition of done.
Decisions
Принятые варианты и источник.
Open work
Зависимости, status и deadline.
Не путайте transcript, state, memory и context
| Объект | Назначение | Попадает в модель |
|---|---|---|
| Transcript | Полный журнал событий | Только выбранные turns |
| Workflow state | Авторитетное состояние задачи | Компактное представление |
| Long-term memory | Разрешённые устойчивые факты | По retrieval и scope |
| Artifacts | Документы и результаты | Фрагменты или ссылки |
| Inference context | Input текущего вызова | Уже собранный пакет |
Sliding window сохраняет свежесть, но теряет решения
Оставлять последние N сообщений просто, но старое важное решение исчезнет раньше свежей болтовни. Используйте sliding window только для локальной связности, а durable facts и decisions переносите в state. При каждом turn определяйте, изменились ли цель, ограничения или открытые обязательства.
- Последние user/assistant turns остаются verbatim.
- Tool chatter не занимает весь window.
- Решение переносится с actor и timestamp.
- Отменённое решение помечается superseded.
- Скрытые reasoning traces не считаются state.
Compaction - контролируемая миграция информации
Compaction заменяет набор старых элементов компактным артефактом. Он должен иметь schema, source range, версию алгоритма, timestamp и проверку. Исходный transcript остаётся в storage для аудита, если это разрешает retention policy.
summary_id: sum_... source_event_range: evt_120..evt_188 summary_schema: ConversationSummaryV3 contains: goals, decisions, constraints, commitments, unresolved_items excludes: secrets, redundant tool payloads, superseded drafts source_refs: [...] generator_version: ... validator_status: passed created_at: ...
Хороший summary сохраняет не темы, а операционные инварианты
Пересказ «обсуждали запуск сайта» бесполезен. Нужны конкретные решения, значения, возражения, незавершённые вопросы и ссылки. Summary не должен превращать предположение в факт или скрывать конфликт.
- Текущая цель.
- Definition of done.
- Подтверждённые факты с sources.
- Решения и кто их принял.
- Жёсткие ограничения.
- Действующие approvals и scope.
- Открытые задачи и blockers.
- Конфликты, которые нельзя сгладить.
- Superseded решения.
- Ссылки на исходные события.
Summary остаётся недоверенным производным артефактом
LLM может пропустить отрицание, перепутать число или принять injection за инструкцию. Валидируйте schema и критичные поля детерминированно, сверяйте с source events и храните confidence только как сигнал маршрутизации, а не как доказательство.
- Approvals извлекаются из authoritative store.
- Деньги, даты и IDs проверяются отдельно.
- Policy никогда не переписывается summary.
- Unresolved conflict сохраняется явно.
- Низкая уверенность вызывает human review или больший verbatim window.
Retrieval заменяет постоянную загрузку всего корпуса
Документацию, архив и прошлые кейсы храните вне prompt и выбирайте под текущий вопрос. Query включает цель и проверенные сущности, но доступ ограничивается trusted tenant context. Каждый chunk имеет source, version, timestamp и data class.
Бюджет retrieval распределяется по источникам
Если один длинный документ занял весь лимит, контекст может потерять разнообразие evidence. Дедуплицируйте похожие chunks, задавайте cap на source, добавляйте соседний фрагмент только когда он нужен для связности и сохраняйте место для контраргумента.
| Проблема | Защита | Метрика |
|---|---|---|
| Один source доминирует | Per-source cap | Source diversity |
| Повторы | Semantic dedup | Duplicate token ratio |
| Обрезан смысл | Boundary-aware chunks | Context sufficiency |
| Устаревшие данные | Version и freshness | Stale retrieval rate |
| Чужие данные | Pre-filter + post-check | Isolation failures |
Tool output должен быть минимальным и типизированным
Не возвращайте модели полный API response, HTML или таблицу из тысяч строк. Tool формирует поля, необходимые для следующего решения, и ссылку на полный immutable artifact. Большие результаты агрегируются кодом.
Return: status, requested fields, bounded items, pagination state, provenance, artifact_ref Do not return: raw credentials, unrelated fields, entire database rows, duplicated payload, hidden policy If result is large: store artifact → compute deterministic summary → return reference + verified aggregates.
Prompt caching оптимизирует повторный префикс
Кэширование контекста может уменьшать стоимость и задержку повторной обработки стабильных инструкций или большого общего материала. Оно не расширяет окно и не решает relevance. Структурируйте стабильную часть в начале, динамическую - после неё; измеряйте cached tokens по telemetry.
Механизм, минимальный размер, TTL, тариф и совместимость с data-retention controls зависят от API. Проверяйте текущую официальную документацию перед архитектурным решением.
Truncation должна быть наблюдаемым событием
Некоторые API умеют автоматически удалять старые элементы при переполнении. Это удобно, но продукт должен знать, что исчезло. Отключите неявную обрезку для критичных workflows либо задайте controlled retention policy и событие, после которого запускается compaction.
| Режим | Плюс | Риск |
|---|---|---|
| Hard error | Ничего не теряется скрыто | Нужно обработать overflow |
| Drop oldest | Просто | Теряются решения |
| Retention ratio | Реже ломается cache prefix | Нужна проверка сохранённого |
| Semantic compaction | Сохраняет смысл | Ошибки summary |
| Typed state + retrieval | Контролируемо | Сложнее архитектура |
Порядок частей влияет на устойчивость
Стабильные system instructions и общие материалы обычно размещают в согласованном префиксе для cache reuse. Текущую задачу и ключевые ограничения формулируют явно; evidence размечают границами и provenance. Не надейтесь, что важный факт будет найден в произвольной позиции длинного input.
- Один authoritative блок policy.
- Явная задача и output contract.
- Typed state перед необязательной историей.
- Evidence с source labels.
- Последний user turn без пересказа.
- Нет противоречивых дубликатов instructions.
Context manifest делает вызов воспроизводимым
Для каждого model call сохраняйте не обязательно весь чувствительный payload, а manifest сборки: версии, IDs элементов, token estimates, причины включения и удаления, compaction version и retrieval query. Это позволяет расследовать потерянный факт.
call_id, trace_id model_and_context_limit policy_version, task_state_version summary_ids, message_range retrieved_chunk_ids_and_scores tool_schema_version, tool_result_refs tokens_by_layer_estimated_and_actual items_dropped_with_reason cache_read_tokens, cache_write_tokens assembler_version
Безопасность: данные не могут стать инструкциями
Retrieved documents, tool outputs, old messages и summaries считаются untrusted data. Маркировка XML или JSON помогает структуре, но не является границей безопасности. Runtime ограничивает tools, права и side effects независимо от prompt.
- Tenant scope применяется до retrieval.
- Секреты удаляются до model call.
- Data и instructions разделены.
- Summary не меняет policy.
- Tool results имеют provenance.
- Каждый side effect повторно авторизуется.
- Compaction тестируется на indirect injection.
- Trace payload редактируется.
Evals должны воспроизводить длинную сессию
Короткий single-turn eval не обнаружит, что после compaction потерялась сумма, отрицание или approval. Создайте сценарии с десятками turns, несколькими сжатиями, конфликтами, tool errors и критичным фактом в начале, середине и конце.
| Метрика | Что измеряет |
|---|---|
| Task success | Достигнут итог задачи |
| Preservation recall | Сохранены обязательные факты и решения |
| Unsupported carryover | Summary не придумал факт |
| Retrieval sufficiency | Evidence достаточно для ответа |
| Tokens per success | Эффективность контекста |
| Compaction recovery | Можно продолжить после сжатия |
| Injection resistance | Данные не меняют policy |
Rollout context policy проводится как изменение кода
- Зафиксируйте current assembler и eval baseline.
- Соберите распределение tokens по слоям.
- Добавьте typed state без удаления истории.
- Запустите новый compactor в shadow.
- Сравните summaries и downstream task success.
- Canary на стабильной cohort.
- Следите за overflow, latency, cost и escalations.
- Храните старую policy как rollback target.
Не меняйте одновременно модель, prompt, retrieval и compaction: иначе причину регрессии невозможно изолировать.
Production-чек-лист управления контекстом
- Usable input рассчитан с резервом.
- У каждого слоя есть приоритет и cap.
- Policy не подвергается summary.
- Task state типизирован и авторитетен.
- Recent dialogue ограничен отдельно.
- Retrieval имеет access scope и provenance.
- Tool outputs минимальны.
- Compaction schema версионируется.
- Critical facts проверяются по source.
- Truncation создаёт наблюдаемое событие.
- Context manifest сохраняется в trace.
- Cache условия и retention проверены.
- Long-session evals включены в CI.
- Canary и rollback policy готовы.