Акты Становления

014: Агент/Области видимости

Механизм, который делает контролируемое подмножество контекста из родительской среды доступным для выполнения. Свойство _scopes действует как список разрешений, определяя сфокусированное и безопасное представление данных, к которым может получить доступ Вызов.

Паттерн Ограниченного контекста — это фундаментальный механизм для управления контекстом, доступным Вызову. В сложной агентной системе Вызов редко выполняется в вакууме; ему часто требуется доступ к информации из родительской среды, такой как ввод пользователя, текущее состояние или результаты предыдущих шагов. Ограниченный контекст предоставляет безопасный и явный способ контролировать этот поток информации.

Ограничивая контекст, области видимости повышают безопасность, предотвращают случайную утечку данных и фокусируют LLM, что приводит к более предсказуемым и экономичным выполнениям. Этот контролируемый контекст также является ключом к модульности, позволяя таким компонентам, как Идеи и Действия, быть по-настоящему автономными и многократно используемыми. В этом документе объясняется, как работает этот паттерн и как он сочетается с другими возможностями агента.

Предоставление и запрос контекста

Предоставленный контекст

Вызов инструмента

Родительский контекст

входные данные

состояние

_scopes: ['input']

Выполнить инструмент

Одобрение человеком

Схема свойства _scopes определяет, статически ли контекст предоставляется или динамически запрашивается во время выполнения.

  • Статические области видимости (Предоставление контекста): Схема _scopes может быть значением const, что означает, что контекст предоставляется. Разработчик жестко задает точный контекст, который разрешено видеть инструменту.

    {
      "_scopes": {
        "const": ["input"]
      }
    }
    
  • Динамические области видимости (Запрос контекста): Схема _scopes может быть более гибкой, позволяя контексту быть запрошенным. LLM решает, какие из доступных областей видимости ей нужны для генерации Вызова.

    {
      "_scopes": {
        "type": "array",
        "items": {
          "enum": ["state", "input"]
        }
      }
    }
    

    Этот динамический паттерн особенно эффективен в сочетании с системой утверждения с участием человека, обеспечивая критически важный уровень прозрачности и контроля.

Роль областей видимости в композиции вызовов

Свойство _scopes является основным механизмом контроля контекста, доступного Вызову. Оно действует как список разрешений, фильтруя родительскую среду для предоставления сфокусированного, ограниченного поля зрения для выполнения. Этот контролируемый контекст является основополагающим для обработки Вызова, и его роль адаптируется для поддержки композиционной модели выполнения, где могут сочетаться различные возможности, такие как явная логика, экземплирование и модульность.

Свойство _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" }
]