005: Агент/Данные
- Требует:
- Позволяет создать:
- Дополняется:
Это как стикер с заметкой для агента. На нём есть сами данные (информация) и, по желанию, схема (объяснение, что эта информация означает). Этот стикер не выкидывают сразу, а сохраняют на протяжении всей работы агента, чтобы у него был постоянный доступ к важной информации для решения сложных задач.
Протокол Данных — это как основной язык для общения с информацией. Он помогает раскладывать её по полочкам и объяснять, что она означает. Другие части системы, например Ввод и Состояние, используют его, чтобы управлять данными в «рабочем пространстве» агента. В отличие от обычных сообщений, которые появляются и тут же исчезают, сообщения с Данными остаются надолго. Это как доска с заметками, на которую агент может смотреть, выполняя сложную задачу из нескольких шагов.
Сообщение с данными
Сообщение с Данными — это простой, но очень полезный способ добавить в Запрос понятную и упорядоченную информацию. Это как контейнер с несколькими отделениями:
data: Сама информация (например, текст, число, объект или список).schema: Необязательная инструкция или «чертёж», который объясняет, как устроеныданные.kind: Необязательная метка, которая говорит о роли сообщения (например,"state"— «состояние» или"input"— «ввод»). Это помогает системе и ИИ понимать, с каким типом данных они работают.
Когда у данных есть schema (инструкция), они становятся понятными для машины. schema объясняет ИИ, что означает каждое поле, какого оно типа и какие у него есть правила. Это не только помогает ИИ лучше думать, но и служит документацией для людей, показывая, что можно изменить или настроить.
Слияние и идентичность
Этот протокол умеет работать с несколькими сообщениями с Данными одновременно. Если система видит, что несколько сообщений относятся к одному и тому же (например, несколько частей одной и той же информации), она их объединяет в одно целое. Это очень удобно, когда нужно, например, применить несколько небольших изменений к одному большому файлу.
Чтобы понять, какие сообщения нужно объединить, система смотрит на их метку kind. Например, все сообщения с меткой kind: "state" будут считаться частью одного целого. Другие протоколы, такие как Экземплирование, могут добавлять свои правила, чтобы создавать отдельные рабочие пространства и не смешивать данные из разных задач.
Когда система получает несколько таких сообщений, которые можно объединить (например, несколько кусочков «состояния»), она может поступить двумя способами. Первый — сама склеить их в один большой и понятный объект, прежде чем показывать ИИ. Это упрощает работу для модели. Второй — ИИ может сам мысленно «сложить» эти кусочки у себя в голове, понимая, что они описывают одну и ту же вещь с разных сторон.
Пример того, как ИИ видит сообщения с данными
- Обычное текстовое сообщение (
text) передаётся как есть. - Сообщения с данными (
data) объединяются и превращаются в одно текстовое сообщение.
Как выглядит код
Agent.Request(config, schema, [
{
type: 'text',
// Обнови город пользователя на Остин
text: "Update the user's city to Austin",
},
// Схема передаётся ИИ, чтобы он понял смысл данных
{
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 },
},
]);
Что видит ИИ
[
{
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" }
}
}`,
},
},
];
Специализация сообщений с данными
Обычное сообщение с Данными — это универсальный инструмент. Другие части системы используют его для своих нужд, просто присваивая ему определённую метку kind.
-
Сообщения с входными данными: Это сообщение с Данными и меткой
kind: 'input'. Оно объявляет, какие параметры принимает Запрос, превращая его в многоразовый компонент, похожий на функцию в программировании. -
Сообщения о состоянии: Это сообщение с Данными и меткой
kind: 'state'. Оно хранит «память» агента, которая может меняться со временем. Егоschemaописывает, что именно агент может запоминать и изменять. -
Вывод: Механизм
_outputPathсоздаёт новые сообщения с Данными для сохранения результатов работы Инструментов. Когда инструмент завершает свою работу, его результат добавляется в рабочее пространство как новое сообщение (часто с меткойkind: 'state'), чтобы его можно было использовать на следующих шагах. -
Экземплирование: Система Экземплирования использует специальное свойство
_instance, чтобы различать сообщения с Данными. Эта метка привязывает сообщение к определённому потоку выполнения, когда нужно запустить много задач параллельно. Сообщения с разными_instanceне будут смешиваться, что гарантирует порядок. -
Цикл: Цикл выполнения использует сообщения с Данными для непрерывной работы. В частности, Сообщение о состоянии — это главный способ сохранять информацию между шагами Цикла.
-
Переменные: Система Переменных — главный потребитель сообщений с Данными. Ссылки на переменные (выглядят как
†<kind>.<path>) используются в вызовах Инструментов, чтобы брать нужные значения из сообщений, например, из входных данных или состояния.
От общих данных к конкретным ролям
Сообщение с Данными — это универсальный контейнер для информации. Но чтобы агент мог эффективно её использовать, ему нужно понимать, какую роль эти данные играют в процессе. В следующих главах мы расскажем, как этот универсальный контейнер используется для конкретных задач, например, для передачи начальных параметров для работы.
Следующий документ, 006: Агент/Ввод, описывает, как сообщение с Данными используется для создания структурированного запроса для агента.