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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Agent.Request(config, schema, [
  {
    type: 'text',
    text: "Update the user's city to Austin",
  },

  // Схема сериализуется, чтобы LLM поняла семантику
  {
    type: 'data',
    kind: 'user',
    description: 'Represents the current user.',
    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: "Update the user's city to Austin",
    },
  },
  {
    role: 'user',
    content: {
      type: 'text',
      text: `
        ## Data: ¶user
        {
          "name": "John Doe",
          "age": 30
        }
        Represents the current user.
        Schema for ¶user:
        {
          "type": "object",
          "properties": {
            "name": { "type": "string" },
            "age": { "type": "number" },
            "city": { "type": "string" }
          }
        }`,
    },
  },
];

Взаимодействие с другими протоколами

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

От данных к динамическим связям

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

Следующий документ, 008: Агент/Переменные, описывает протокол, который делает возможными эти динамические связи.