【Перевод】Контекстное проектирование: не заполняйте окно слишком сильно! Используйте методы записи, фильтрации, сжатия и изоляции, чтобы отвлечь шум — медленно учитесь AI170
Введение
- Потенциал AI-агентов зависит не только от размеров модели, но и от мастерства в управлении контекстом. Это похоже на то, как мы настраиваем память для CPU, что определяет глубину и эффективность размышлений агента.
- Контекстное окно — это не мусорное ведро: избыток информации может “отравить”, помешать и запутать суждения AI. Точность важнее, чем просто объем.
- Умелые специалисты применяют методы “запись, фильтрация, сжатие, изоляция” для управления контекстом AI и эффективно расходуют ограниченную “память”, что ведет к снижению затрат и повышению эффективности.
- Будущее конкурентной борьбы — это борьба за эффективность систем. Использование архитектуры многопроцессорных систем для “изоляции” задач, чтобы каждый агент достигал максимума в своем узком окне, является ключом к построению сложных систем задач.
Основные выводы
Агент (Agent) выполняет задачи, полагаясь на контекст (Context). “Контекстное проектирование” — это искусство и наука точного введения нужной информации в контекстное окно агента на каждом шаге выполнения задачи. В этой статье мы обобщим стратегии контекстного проектирования, используемые современными агентами.
Контекстное проектирование (Context Engineering)
Как сказал Андрій Карпаты, большие языковые модели (LLM) подобны “новой операционной системе”. LLM является CPU, а его “контекстное окно” — это RAM, которое выполняет роль рабочей памяти модели. Также, как и у RAM есть ограниченная емкость, контекстное окно LLM сталкивается с ограничениями при обработке разных источников контекста. Одна из основных задач операционной системы состоит в управлении эффективным использованием RAM для CPU, и “контекстное проектирование” выполняет аналогичную роль. Карпаты очень точно подытожил это:
Контекстное проектирование — это “…искусство и наука точного заполнения контекстного окна для следующего шага (вычисления)”.
При разработке приложений LLM, какие типы контекста нам нужно управлять? Этот обобщающий концепт контекстного проектирования охватывает несколько различных типов контекста:
- • Инструкции (Instructions) – подсказки, память, примеры с малым количеством данных, описания инструментов и т.д.
- • Знания (Knowledge) – факты, память и т.д.
- • Инструменты (Tools) – обратная информация о вызовах инструментов.
Контекстное проектирование для агентов
В этом году, с улучшением способностей LLM в области рассуждений и вызовов инструментов, интерес к агентам постоянно растёт. Агенты выполняют задачи, чередуя вызовы LLM и инструментов, и особенно успешны в обработке сложных долгосрочных задач.
Однако длительные задачи и постоянно накапливающиеся обратные связи от инструментов означают, что агенты зачастую расходуют значительное количество токенов. Это может привести к множеству проблем: превышение ограничений емкости контекстного окна, рост затрат и задержек, а также снижение производительности агента. Дрю Бройниг чётко указал, что чрезмерная длина контекста может приводить к следующим проблемам с производительностью:
- • Отравление контекста (Context Poisoning): когда в контекст попадают галлюцинации (ошибочные сведения).
- • Помехи в контексте (Context Distraction): когда избыток информации переполняет исходные знания модели.
- • Запутанность контекста (Context Confusion): когда нерелевантная информация влияет на реакцию модели.
- • Конфликт контекста (Context Clash): когда различные части контекста противоречат друг другу.
Учитывая эти проблемы, компания Cognition AI подчеркивает важность контекстного проектирования:
“Контекстное проектирование”… на самом деле является приоритетной задачей инженеров, строящих AI-агентов.
Компания Anthropic также явно указала:
Агенты обычно должны вести сотни раундов диалогов, что требует аккуратных стратегий управления контекстом.
Так как же современные разработчики справляются с этой задачей? Я обобщил существующие подходы в четыре основные категории — запись (Write), фильтрация (Select), сжатие (Compress) и изоляция (Isolate) — и привожу примеры для каждой.
Запись контекста (Write Context)
Запись контекста означает сохранение информации вне контекстного окна для использования агентом при выполнении задания.
Зоны для заметок (Scratchpads)
При решении задач люди делают записи и запоминают некоторые детали, чтобы использовать их в будущем. Агенты тоже постепенно развивают эти навыки! Использование “зоны для заметок” для записи является способом сохранения информации во время выполнения задачи агентом. Главная идея заключается в том, чтобы хранить информацию вне контекстного окна, но при этом сделать её доступной для агента в любое время. Многоагентная исследовательская система компании Anthropic предоставляет чёткий пример:
“Главный исследователь” сначала обдумывает, как решить задачу, и сохраняет свой план в “памяти”, чтобы сохранить контекст, так как контекстное окно может быть обрезано, если его размер превышает 200 тысяч токенов, что делает сохранение плана критически важным.
Существует много способов реализации зон для заметок. Это может быть простой вызов инструмента, например, запись в файл; или поле в объекте состояния во время выполнения, которое сохраняется неизменным в течение всей сессии. В любом случае, зоны для заметок позволяют агенту сохранить полезную информацию для более успешного выполнения задания.
Память (Memories)
Зоны для заметок помогают агенту решить задачу в одной сессии, но иногда агенту требуется запомнить вещи на протяжении нескольких сессий. Модель Reflexion представляет концепцию рефлексии после каждого действия агента и повторного использования этих самостоятельно сгенерированных воспоминаний. Модель Generative Agents может периодически синтезировать память из набора обратной связи от прошлых действий агента.
Эти концепции применяются в таких популярных продуктах, как ChatGPT, Cursor и Windsurf. Все они имеют механизмы автоматического создания долгосрочной памяти, основанные на взаимодействии пользователя с агентом.
Фильтрация контекста (Select Context)
Фильтрация контекста подразумевает выбор необходимой информации для включения в контекстное окно, чтобы помочь агенту выполнить задачу.
Зоны для заметок (Scratchpad)
Механизм фильтрации контекста из зоны для заметок зависит от способа её реализации. Если это инструмент, агент может просто прочитать его через вызов инструментов. Если это часть состояния времени выполнения агента, разработчик может на каждом этапе избирательно раскрывать определённые части состояния агенту. Это дает тонкий контроль над тем, какой контекст из зоны заметок предоставляется LLM в последующих раундах.
Память (Memories)
Если агент может сохранять воспоминания, ему также нужно уметь фильтровать память, относящуюся к текущей задаче. Это очень полезно по нескольким причинам: агент может выбрать примеры с малым количеством данных (сценарные воспоминания) для изучения ожидаемого поведения; выбрать инструкции (программные воспоминания) для управления собственными действиями; или выбрать факты (семантические воспоминания) для предоставления соответствующего фона к задаче.
Одной из больших задач является обеспечение релевантности отфильтровавшей памяти. Некоторые популярные агенты используют только небольшую фиксированную часть файла, которая всегда загружается в контекст. Например, многие кодовые агенты используют файлы для хранения инструкций (программные воспоминания) или, в некоторых случаях, примеров (сценарные воспоминания). Claude Code использует CLAUDE.md
, а Cursor и Windsurf используют файлы правил.
Однако если агент хранит большое количество фактов или взаимосвязей (например, семантические воспоминания), то фильтрация становится более сложной. ChatGPT — отличный пример, который хранит и фильтрует из значительного числа пользовательских воспоминаний.
Векторные вложения и/или графы знаний — это распространённые технологии индексирования памяти для помощи в фильтрации. Тем не менее, фильтрация памяти остаётся сложной задачей. На выставке AIEngineer Саймон Уилисон поделился примером ошибки фильтрации памяти: ChatGPT извлёк его информацию о местоположении из памяти и случайно внедрил её в изображение, которое он запросил. Это неожиданный или нежелательный извлечение памяти может заставить некоторых пользователей чувствовать, что контекстное окно “больше не принадлежит им”!
Инструменты (Tools)
Агентам нужно использовать инструменты, но если предоставленных инструментов становится слишком много, они могут оказаться перегруженными. Это часто происходит из-за того, что описания инструментов могут перекрываться, что приводит к путанице при выборе инструмента. Один из подходов заключается в применении RAG (усиленная генерация), чтобы найти наиболее релевантные инструменты для задачи на основе семантической схожести. Недавние исследования показали, что такой метод может увеличить точность выбора инструментов в 3 раза.
Знания (Knowledge)
Усиленная генерация (RAG) сама по себе является обширной темой и может стать одной из основных проблем контекстного проектирования. Кодовые агенты — один из лучших примеров RAG в масштабных производственных приложениях. Варун из Windsurf хорошо обобщил некоторые из этих проблем:
Индексирование кода ≠ Поиск контекста… Мы занимаемся тем, что разбираем код с помощью AST (абстрактное синтаксическое дерево) и разбиваем его вдоль семантически значимых границ… Но по мере роста размера библиотеки кода поиск векторных вложений как метод поиска становится ненадежным… Мы должны комбинировать несколько технологий, таких как поиск по grep/файлам, поиск на основе графов знаний и… шаг переупорядочивания, где контекст сортируется по релевантности.
Сжатие контекста (Compress Context)
Сжатие контекста означает сохранение только необходимых токенов для выполнения задачи.
Суммирование контекста (Context Summarization)
Взаимодействия агента могут охватывать сотни раундов и использовать инструменты, которые расходуют большое количество токенов. Суммирование — это распространённый метод, чтобы справляться с этими вызовами. Если вы использовали Claude Code, вы уже видели его практическое применение. Когда использование контекстного окна превышает 95%, Claude Code запускает “автоматическое сжатие”, суммируя полный ход взаимодействия между пользователем и агентом. Это сжатие может применяться с использованием различных стратегий, таких как рекурсивное суммирование или многослойное суммирование.
Полезно также встраивать шаг суммирования в дизайн агента. Например, это может быть полезным для последующей обработки вызовов некоторых инструментов (особенно таких, как поисковые инструменты, которые потребляют много токенов). Например, компания Cognition упоминает о необходимости резюмирования в точках перехода между агентами, чтобы уменьшить потребление токенов в процессе передачи знаний. Если нужно захватить специфические события или решения, суммирование может быть сложной задачей. Cognition для этого использует модель, которая требует больших усилий для настройки.
Обрезка контекста (Context Trimming)
Суммирование часто использует LLM для выделения самых релевантных фрагментов контекста, тогда как обрезка больше похожа на фильтрацию или, как сказал Дрю Бройниг, на “обрезание” контекста. Это можно реализовать с помощью жестко закодированных эвристических правил, например, удаляя более ранние сообщения из списка сообщений. Дрю также упоминал о Provence, контекстном обрезателе, обученном для задач вопросов и ответов.
Изоляция контекста (Isolating Context)
Изоляция контекста означает разбивку контекста, чтобы помочь агенту выполнить задачу.
Многопроцессорные системы (Multi-agent)
Одним из самых популярных способов изоляции контекста является распределение его среди нескольких подагентов. Одной из мотиваций для библиотеки Swarm от OpenAI является “разделение внимания”, при котором команда агентов обрабатывает подсобные задачи. Каждый агент имеет свой определенный набор инструментов, инструкции и независимое контекстное окно.
Многоагентная исследовательская система от Anthropic предоставляет убедительные доказательства: несколько агентов с независимым контекстом функционируют лучше, чем один агент, во многом благодаря тому, что контекстное окно каждого подагента может сосредоточиться на более узкой подсобной задаче. Как упоминается в их блоге:
Подагенты работают параллельно с собственными контекстами, исследуя различные аспекты проблемы.
Конечно, многопроцессорные системы также сталкиваются с проблемами, включая потребление токенов (например, Anthropic сообщила, что их использование токенов в 15 раз превышает стандартный чат), необходимость тщательной разработки подсказок для планирования работы подагентов, а также проблемы координации между ними.
Изоляция контекста с помощью окружений (Context Isolation with Environments)
Программа глубоких исследований HuggingFace демонстрирует ещё один интересный пример изоляции контекста. Большинство агентов используют инструменты, вызывая API, которые возвращают объекты JSON (параметры инструмента), которые затем передаются инструментам (например, поисковым API) для получения обратной связи (например, результатов поиска). HuggingFace применяет CodeAgent, который напрямую выводит код для необходимых вызовов инструментов. Этот код затем выполняется в песочнице. Специфический контекст, возвращаемый вызовами инструментов (например, возвращаемое значение), затем возвращается в LLM.
Это позволяет изолировать контекст в окружении от LLM. Hugging Face отмечает, что это отличный способ изоляции объектов, которые расходуют много токенов:
Code Agents лучше справляются с состоянием… Нужно ли сохранить изображение/аудио/другие данные для последующего использования? Не проблема, просто выделите это как переменную, и вы сможете использовать её позже.
Состояние (State)
Стоит отметить, что объект состояния рабочего времени агента также является хорошим методом изоляции контекста. Это можно реализовать так же, как и песочница. Объект состояния может быть спроектирован по шаблону (Schema, например, модель Pydantic), включающему поля, которые можно записывать в контекст. Одно из полей шаблона (например, messages
) может быть доступно для LLM на каждом раунде взаимодействия агента, в то время как информация может быть изолирована в других полях для более избирательного использования.
Заключение
Модели контекстного проектирования агентами продолжают эволюционировать, но мы можем обобщить распространенные методы в четыре основные категории — запись, фильтрация, сжатие и изоляция:
- • Запись контекста означает сохранение информации вне контекстного окна для использования агентом при выполнении задания.
- • Фильтрация контекста означает выбор необходимой информации для включения в контекстное окно, чтобы помочь агенту выполнить задачу.
- • Сжатие контекста означает сохранение только необходимых токенов для выполнения задания.
- • Изоляция контекста означает разбивку контекста для помощи агенту в выполнении задачи.
Понимание и применение этих моделей является ключевой задачей в создании эффективных агентов.