014: Агент/Области видимости
- Требуется:
Механизм, который делает контролируемое подмножество контекста из родительской среды доступным для выполнения. Свойство _scopes действует как список разрешений, определяя сфокусированное и безопасное представление данных, к которым может получить доступ Вызов.
Паттерн Ограниченного контекста — это фундаментальный механизм для управления контекстом, доступным Вызову. В сложной агентной системе Вызов редко выполняется в вакууме; ему часто требуется доступ к информации из родительской среды, такой как ввод пользователя, текущее состояние или результаты предыдущих шагов. Ограниченный контекст предоставляет безопасный и явный способ контролировать этот поток информации.
Ограничивая контекст, области видимости повышают безопасность, предотвращают случайную утечку данных и фокусируют LLM, что приводит к более предсказуемым и экономичным выполнениям. Этот контролируемый контекст также является ключом к модульности, позволяя таким компонентам, как Идеи и Действия, быть по-настоящему автономными и многократно используемыми. В этом документе объясняется, как работает этот паттерн и как он сочетается с другими возможностями агента.
Предоставление и запрос контекста
Схема свойства _scopes определяет, статически ли контекст предоставляется или динамически запрашивается во время выполнения.
-
Статические области видимости (Предоставление контекста): Схема
_scopesможет быть значениемconst, что означает, что контекст предоставляется. Разработчик жестко задает точный контекст, который разрешено видеть инструменту.{ "_scopes": { "const": ["input"] } } -
Динамические области видимости (Запрос контекста): Схема
_scopesможет быть более гибкой, позволяя контексту быть запрошенным. LLM решает, какие из доступных областей видимости ей нужны для генерации Вызова.{ "_scopes": { "type": "array", "items": { "enum": ["state", "input"] } } }Этот динамический паттерн особенно эффективен в сочетании с системой утверждения с участием человека, обеспечивая критически важный уровень прозрачности и контроля.
Роль областей видимости в композиции вызовов
Свойство _scopes является основным механизмом контроля контекста, доступного Вызову. Оно действует как список разрешений, фильтруя родительскую среду для предоставления сфокусированного, ограниченного поля зрения для выполнения. Этот контролируемый контекст является основополагающим для обработки Вызова, и его роль адаптируется для поддержки композиционной модели выполнения, где могут сочетаться различные возможности, такие как явная логика, экземплирование и модульность.
-
Скрытое выполнение: При скрытом выполнении по умолчанию
_scopesслужат «подсказкой» для фокусировки внимания LLM на релевантных частях родительского контекста. Это скорее рекомендация, а не строгий фильтр, но она крайне важна для повышения надежности и экономической эффективности рассуждений LLM за счет уменьшения шума от нерелевантных данных. См. пример Устранение неоднозначности с помощью областей видимости. -
Явное выполнение (
_activity): Когда Вызов подкреплен детерминированным Действием, роль областей видимости становится более прямой. Ограниченный контекст передается целиком в функцию Действия в качестве дополнительного параметра. Это дает Действию полный доступ к необходимым контекстным данным, даже если эти данные не были напрямую использованы LLM для генерации основных параметров Вызова. См. пример Предоставление контекста действию. -
Экземплирование (
_instance): В запросе с несколькими экземплярами, где агент обрабатывает пакет схожих объектов данных, области видимости начинают учитывать экземпляры. Протокол гарантирует, что Вызов, нацеленный на конкретный экземпляр, получает контекст только для этого экземпляра. Это критически важно для поддержания целостности данных и предотвращения «утечки» контекста между параллельными выполнениями. -
Изоляция через делегирование (
_delegate): Когда Вызов делегируется внешнему Делегату, области видимости выступают в роли стражей контекста. Они определяют, что из родительской среды добавляется к собственному внутреннему контексту делегата, создавая окончательный контекст для изолированного подзапроса. Ничего из родительского контекста недоступно, если оно явно не указано в области видимости, что обеспечивает настоящую инкапсуляцию. См. примеры Ограничение контекста делегата и Экземплирование с ограниченными делегатами.
Свойство _scopes — это мост, который позволяет Вызову получать контекст. Эта глава показала, как этот единый механизм адаптируется к различным режимам выполнения — от мягкого направления скрытого вызова до строгого определения всего контекста для делегированного. Именно эта гибкость делает его краеугольным камнем в построении сложных, безопасных и модульных агентных систем.
Примеры
Пример: Устранение неоднозначности с помощью областей видимости
Неоднозначный контекст
В этом примере контекст неоднозначен. Он содержит двух разных пользователей: currentUser в состоянии и mentionedUser во входных данных. Агенту нужно отправить сообщение, но неясно, кому.
[
{
"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."
}
]
`Вызов` с областью видимости
Добавляя _scopes: ["input"], вызывающий дает важную подсказку. Это указывает LLM сосредоточиться на входном сообщении, эффективно разрешая неоднозначность и гарантируя, что сообщение будет отправлено правильному получателю, Бобу.
{
"_tool": "sendMessage",
"_scopes": ["input"],
"recipientId": "user_B",
"message": "Welcome, Bob!"
}
Пример: Предоставление контекста действию
Здесь Действию требуется доступ к контекстной информации, которая не является прямым параметром инструмента. Инструмент logEvent принимает только eventName, но для правильной работы базовому действию также необходимо знать userId.
`Вызов` с областью видимости
Вызов прост и предоставляет только eventName. Однако свойство _scopes: ["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 определяют, что из родительского контекста добавляется к собственному внутреннему контексту делегата. Здесь высокоуровневый Оркестратор делегирует задачу, передавая весь объект состояния специализированному делегату-Суммаризатору.
Родительский `Вызов` с областью видимости
Агент-Оркестратор имеет собственный контекст. Он делает Вызов, который ограничивает состояние для включения в контекст делегата.
// Контекст и вызов Оркестратора
[
{
"type": "state",
"articleText": "A long and complex article..."
},
{
"_tool": "summarizeArticle",
"_delegate": "SummarizerAgent",
"_scopes": ["state"]
}
]
Контекст подзапроса делегата
Среда выполнения Суммаризатора состоит из его собственного внутреннего контекста плюс данных, ограниченных из родительского контекста. Это обеспечивает модульность, предоставляя при этом необходимую информацию.
// Контекст, созданный для подзапроса Суммаризатора
[
// Внутренний контекст Суммаризатора
{
"type": "system",
"message": "You are an expert summarizer."
},
// Ограниченный контекст из родителя добавляется
{
"type": "state",
"articleText": "A long and complex article..."
}
]
Пример: Экземплирование с ограниченными делегатами
Этот пример показывает, как _scopes и _instance сочетаются, позволяя одному агенту организовывать несколько изолированных вызовов делегатов параллельно.
Родительский контекст и решение
У родительского агента есть два разных экземпляра Состояния. Он генерирует решение с двумя Вызовами к translatorDelegate. Каждый вызов нацелен на свой экземпляр и правильно ограничивает только состояние для этого экземпляра.
// РОДИТЕЛЬСКИЙ КОНТЕКСТ
[
{ "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 работают вместе, чтобы каждый делегат получил только свое собственное, правильно ограниченное состояние.
// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ①
[
{ "type": "system", "message": "You are a translator." },
{ "type": "state", "text": "Hello" }
]
// КОНТЕКСТ ДЛЯ ДЕЛЕГАТА ②
[
{ "type": "system", "message": "You are a translator." },
{ "type": "state", "text": "Bonjour" }
]