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.
-
Входное сообщение: Входное сообщение — это сообщение с Данными, имеющее
kind: 'input'. Оно формально объявляет параметры, которые принимает Запрос, превращая статический Запрос в многократно используемый, подобный функции компонент. -
Сообщение о состоянии: Сообщение о состоянии — это сообщение с Данными, имеющее
kind: 'state'. Оно представляет собой постоянную, развивающуюся память рабочего процесса. Егоschemaопределяет структуру этой памяти, включая то, какие свойства доступны для чтения или записи. -
Вывод: Механизм
_outputPathсоздает новые сообщения с Данными для сохранения результатов Вызовов инструментов. Когда выполняетсяCallс_outputPath, его результат добавляется в контекст как новое сообщение с Данными (часто сkind: 'state'), делая его доступным для последующих шагов. -
Экземплирование: Система Экземплирования использует свойство
_instanceдля различения сообщений с Данными. Этот ключ ограничивает сообщение конкретным потоком выполнения в пакетной операции. Сообщения с Данными, имеющие разные значения_instance, рассматриваются как имеющие разную идентичность и не будут объединяться, обеспечивая изоляцию данных. -
Цикл: Цикл выполнения полагается на сообщения с Данными для поддержания непрерывности. В частности, Сообщение о состоянии является основным средством для сохранения информации между тактами Цикла.
-
Переменные: Система Переменных является основным потребителем сообщений с Данными. Ссылки на переменные (
†<kind>.<path>) используются внутри Вызовов инструментов для динамического чтения значений из сообщений с Данными в контексте, таких как Входное сообщение или Сообщение о состоянии.
От общих данных к конкретным ролям
Сообщение с Данными предоставляет общий контейнер для структурированной информации. Однако, чтобы агент мог эффективно использовать эти данные, ему необходимо понимать их роль в процессе. В следующих главах описывается, как это общее сообщение с Данными специализируется для конкретных целей, например, для предоставления начальных параметров для рабочего процесса.
Следующий документ, 006: Агент/Ввод, описывает, как сообщение Data используется для создания структурированного запроса для агента.