013: Агент/Области видимости
- Требования:
Механизм, который делает контролируемое подмножество контекста из родительской среды доступным для выполнения. Свойство _scopes
действует как список разрешённых элементов, определяя сфокусированное и безопасное представление данных, к которым может получить доступ Вызов.
Паттерн ограниченного контекста — это фундаментальный механизм для управления контекстом, доступным для Вызова. В сложной агентной системе Вызов редко выполняется в вакууме; ему часто требуется доступ к информации из родительской среды, такой как ввод пользователя, текущее состояние или результаты предыдущих шагов. Ограниченный контекст обеспечивает безопасный и явный способ контроля этого потока информации.
Ограничивая контекст, области видимости повышают безопасность, предотвращают случайную утечку данных и фокусируют LLM, что приводит к более предсказуемым и экономичным выполнениям. Этот контролируемый контекст также является ключом к модульности, позволяя таким компонентам, как Идеи и Действия, быть по-настоящему самодостаточными и повторно используемыми. Этот документ объясняет, как работает этот паттерн и как он сочетается с другими возможностями агента.
Предоставление и запрос контекста
Схема свойства _scopes
определяет, будет ли контекст предоставлен статически или запрошен динамически во время выполнения.
-
Статические области видимости (предоставление контекста): Схема
_scopes
может быть значениемconst
, что означает, что контекст предоставляется. Разработчик жёстко закодировал точный контекст, который разрешено видеть инструменту.{ "_scopes": { "const": ["input"] } }
-
Динамические области видимости (запрос контекста): Схема
_scopes
может быть более гибкой, позволяя запрашивать контекст. LLM решает, какие из доступных областей видимости ей необходимы для генерации Вызова.{ "_scopes": { "type": "array", "items": { "enum": ["state", "input"] } } }
Этот динамический паттерн особенно эффективен в сочетании с системой утверждения человеком (human-in-the-loop), обеспечивая критически важный уровень прозрачности и контроля.
Роль областей видимости в композиции вызовов
Свойство _scopes
— это основной механизм для контроля контекста, доступного Вызову. Оно действует как список разрешённых элементов, фильтруя родительскую среду для предоставления сфокусированного, ограниченного поля зрения для выполнения. Этот контролируемый контекст является основополагающим для обработки Вызова, и его роль адаптируется для поддержки композиционной модели выполнения, где могут сочетаться различные возможности, такие как явная логика, экземплирование и модульность.
-
Скрытое выполнение: При скрытом выполнении по умолчанию
_scopes
служат «подсказкой» для фокусировки внимания LLM на релевантных частях родительского контекста. Это рекомендация, а не строгий фильтр, но она крайне важна для повышения надёжности и экономичности рассуждений LLM за счёт уменьшения шума от нерелевантных данных. См. пример Устранение неоднозначности с помощью областей видимости. -
Явное выполнение (
_activity
): Когда Вызов подкреплён детерминированным Действием, роль областей видимости становится более прямой. Ограниченный контекст передаётся целиком в функцию Действия в качестве дополнительного параметра. Это даёт Действию полный доступ к необходимым контекстным данным, даже если эти данные не использовались LLM напрямую для генерации основных параметров Вызова. См. пример Предоставление контекста для Действия. -
Экземплирование (
_instance
): В запросе с несколькими экземплярами, где агент обрабатывает пакет схожих объектов данных, области видимости начинают учитывать экземпляры. Протокол гарантирует, что Вызов, нацеленный на конкретный экземпляр, получает контекст только для этого экземпляра. Это критически важно для поддержания целостности данных и предотвращения «утечки» контекста между параллельными выполнениями. -
Изоляция через делегирование (
_delegate
): Когда Вызов делегируется внешнему Делегату, области видимости действуют как стражи контекста. Они определяют, что из родительской среды будет добавлено к собственному внутреннему контексту делегата, создавая окончательный контекст для изолированного подзапроса. Ничего из родительского контекста не доступно, если это явно не указано в областях видимости, что обеспечивает настоящую инкапсуляцию. См. примеры Ограничение контекста Делегата и Экземплирование с ограниченными Делегатами.
Свойство _scopes
— это мост, который позволяет Вызову получать контекст. Эта глава показала, как этот единый механизм адаптируется к различным режимам выполнения — от мягкого направления скрытого вызова до строгого определения всего контекста для делегированного. Именно эта гибкость делает его краеугольным камнем в построении сложных, безопасных и модульных агентных систем.
Примеры
Пример: Устранение неоднозначности с помощью областей видимости
Неоднозначный контекст
В этом примере контекст неоднозначен. Он содержит двух разных пользователей: currentUser
в state
и mentionedUser
в input
. Агенту нужно отправить сообщение, но неясно, кому именно.
[
{
"type": "state",
"currentUser": { "id": "user_A", "name": "Alice" }
},
{
"type": "input",
"mentionedUser": { "id": "user_B", "name": "Bob" },
"instruction": "Send a welcome message to the user mentioned above."
}
]
`Call` с областью видимости
Добавляя _scopes: ["input"]
, вызывающая сторона даёт важную подсказку. Это указывает LLM сосредоточиться на сообщении из input
, что эффективно устраняет неоднозначность и гарантирует отправку сообщения правильному получателю, Бобу.
{
"_tool": "sendMessage",
"_scopes": ["input"],
"recipientId": "user_B",
"message": "Welcome, Bob!"
}
Пример: Предоставление контекста для Действия
Здесь Действие нуждается в доступе к контекстной информации, которая не является прямым параметром инструмента. Инструмент logEvent
принимает только eventName
, но лежащему в его основе действию также необходимо знать userId
для корректной работы.
`Call` с областью видимости
Вызов прост и предоставляет только eventName
. Однако свойство _scopes: ["state"]
указывает исполняющей среде передать объект state
в действие.
{
"_tool": "logEvent",
"_scopes": ["state"],
"eventName": "user_login"
}
Реализация Действия (TypeScript)
Действие регистрируется с функцией, которая деструктурирует свои параметры напрямую из вызова и из ограниченного контекста. Это обеспечивает чистый, прямой доступ как к eventName
, так и к userId
.
// Параметры деструктурируются для прямого доступа к 'eventName'
// из вызова и к 'state' из ограниченного контекста.
Activity.register('logEvent', async ({ eventName }, { state }) => {
const userId = state.userId;
await analytics.track(eventName, { userId });
});
Пример: Ограничение контекста Делегата
При делегировании _scopes
определяют, что из родительского контекста будет добавлено к собственному внутреннему контексту делегата. Здесь высокоуровневый Orchestrator
делегирует задачу, передавая весь объект state
специализированному делегату Summarizer
.
Родительский `Call` с областью видимости
Агент Orchestrator
имеет свой собственный контекст. Он делает Call
, который ограничивает state
для включения в контекст делегата.
// Контекст и вызов Оркестратора
[
{
"type": "state",
"articleText": "A long and complex article..."
},
{
"_tool": "summarizeArticle",
"_delegate": "SummarizerAgent",
"_scopes": ["state"]
}
]
Контекст подзапроса Делегата
Среда выполнения Summarizer
состоит из его собственного внутреннего контекста и данных, полученных из родительского контекста через области видимости. Это обеспечивает модульность, предоставляя при этом необходимую информацию.
// Контекст, созданный для подзапроса Summarizer
[
// Внутренний контекст Summarizer
{
"type": "system",
"message": "You are an expert summarizer."
},
// Ограниченный контекст из родителя добавляется
{
"type": "state",
"articleText": "A long and complex article..."
}
]
Пример: Экземплирование с ограниченными Делегатами
Этот пример показывает, как _scopes
и _instance
сочетаются, чтобы позволить одному агенту организовывать несколько изолированных вызовов делегатов параллельно.
Родительский контекст и решение
У родительского агента есть два разных экземпляра State
. Он генерирует solution
с двумя Calls
к translatorDelegate
. Каждый вызов нацелен на свой экземпляр и корректно ограничивает только state
для этого экземпляра.
// РОДИТЕЛЬСКИЙ КОНТЕКСТ
[
{ "type": "state", "_instance": "①", "text": "Hello" },
{ "type": "state", "_instance": "②", "text": "Bonjour" }
]
// РЕШЕНИЕ LLM
{
"calls": [
{
"_tool": "translate",
"_delegate": "translatorDelegate",
"_instance": "①",
"_scopes": ["state"]
},
{
"_tool": "translate",
"_delegate": "translatorDelegate",
"_instance": "②",
"_scopes": ["state"]
}
]
}
Контексты подзапросов Делегатов
Исполняющая среда создаёт два независимых подзапроса. Свойства _instance
и _scopes
работают вместе, чтобы гарантировать, что каждый делегат получит только свой собственный, правильно ограниченный state
.
// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ①
[
{ "type": "system", "message": "You are a translator." },
{ "type": "state", "text": "Hello" }
]
// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ②
[
{ "type": "system", "message": "You are a translator." },
{ "type": "state", "text": "Bonjour" }
]