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

005: Агент/Данные

Постоянное контекстное сообщение, содержащее значение data и необязательную schema. Оно сохраняется на протяжении всего цикла выполнения агента для обеспечения стабильного, структурированного контекста.

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

Сообщение с данными

Сообщение с Данными — это простая, но мощная конструкция для добавления структурированного контекста в Запрос. Это объект сообщения, который содержит следующие свойства:

  • data: Любое значение JSON (например, строка, число, объект, массив), содержащее полезную нагрузку.
  • schema: Необязательная JSON Schema, которая определяет структуру и семантическое значение data.
  • kind: Необязательная строка, которая идентифицирует роль сообщения (например, "state", "input"). Это позволяет системе и LLM различать различные типы данных в одном и том же контексте.

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

Слияние и идентичность

Протокол предназначен для обработки нескольких сообщений с Данными в рамках одного контекста. Если система решает, что несколько сообщений имеют одинаковую идентичность, они объединяются в один целостный объект. Это особенно полезно для сценариев, таких как применение серии исправлений состояния.

Идентичность сообщения в первую очередь определяется его kind. Например, все сообщения с kind: "state" без каких-либо других отличительных признаков считаются имеющими одинаковую идентичность. Эта идентичность может быть дополнительно уточнена другими протоколами, в первую очередь Экземплированием, которое позволяет выполнять параллельную обработку путем создания различных контекстов.

Когда присутствует несколько объединяемых сообщений (например, несколько объектов state, представляющих исправления), система может обработать это двумя способами. Во-первых, логика выполнения агента может явно объединить эти объекты в один целостный объект состояния перед его представлением LLM. Это снижает когнитивную нагрузку на модель. Во-вторых, сама LLM может «мысленно объединить» информацию в своем скрытом состоянии, понимая, что отдельные сообщения представляют разные аспекты единой концепции.

Пример того, как сообщения с данными видит LLM

  • Сообщение text передается без изменений.
  • Сообщения data объединяются и преобразуются в одно сообщение text.

Как выглядит код

Agent.Request(config, schema, [
  {
    type: 'text',
    text: "Обновите город пользователя на Остин",
  },

  // Схема сериализуется, чтобы LLM мог понять семантику
  {
    type: 'data',
    kind: 'user',
    description: 'Представляет текущего пользователя.',
    data: { name: 'John Doe' },
    schema: {
      type: 'object',
      properties: {
        name: { type: 'string' },
        age: { type: 'number' },
        city: { type: 'string' },
      },
    },
  },

  // Второе сообщение `user` объединится с первым
  {
    type: 'data',
    kind: 'user',
    data: { age: 30 },
  },
]);

Что видит LLM

[
  {
    role: 'user',
    content: {
      type: 'text',
      text: "Обновите город пользователя на Остин",
    },
  },
  {
    role: 'user',
    content: {
      type: 'text',
      text: `
        ## Data: ¶user
        {
          "name": "John Doe",
          "age": 30
        }
        Представляет текущего пользователя.
        Схема для ¶user:
        {
          "type": "object",
          "properties": {
            "name": { "type": "string" },
            "age": { "type": "number" },
            "city": { "type": "string" }
          }
        }`,
    },
  },
];

Специализация сообщения с данными

Обобщенное сообщение с Данными является основополагающим шаблоном. Оно специализируется для разных ролей другими частями системы, часто путем присвоения определенного kind.

От общих данных к конкретным ролям

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

Следующий документ, 006: Агент/Ввод, описывает, как сообщение Data используется для создания структурированного запроса для агента.