003: Агент/Действие
- Требуется: 002: Агент/Инструмент
Явная асинхронная функция, реализующая логику для Инструмента. Это механизм для выполнения действий, требующих вызовов внешних API, операций с базами данных или любой другой задачи, которая не может быть обработана в скрытом пространстве LLM.
Этот документ описывает Протокол Действий, который определяет, как Инструменты подкрепляются конкретным исполняемым кодом. Если Инструмент определяет интерфейс возможности, то Действие предоставляет её реализацию.
Архитектура двойного реестра
Система агентов использует два взаимодополняющих реестра для разделения интерфейса возможности и её реализации:
- Реестр Инструментов: Хранит определения схем для Инструментов.
- Реестр Действий: Хранит явные
async
функции (Действия), которые реализуют Инструменты.
Это разделение является ключом к гибкости системы. Оно позволяет определять и использовать Инструменты в режиме только скрытого исполнения (где LLM генерирует вывод напрямую) и позволяет заменять различные реализации Действия без изменения интерфейса Инструмента (например, для разных сред, таких как разработка и продакшен).
Регистрация Действия
Действие регистрируется под уникальным именем, которое используется для его привязки к Инструменту.
Реализация Действия
// Регистрация реализации Действия.
// По соглашению, Действие может быть привязано к Инструменту с тем же именем.
// Типы автоматически выводятся из Инструмента.
Activity.register('weatherCheck', async call => {
const data = await weatherAPI.get(call.location);
return { temperature: data.temp, conditions: data.desc };
});
Соответствующая схема Инструмента
Tool.register('weatherCheck', {
type: 'object',
description: 'Gets the current weather for a location.',
properties: {
_tool: { type: 'string', const: 'weatherCheck' },
location: { type: 'string' },
_output: {
type: 'object',
properties: {
temperature: { type: 'number' },
conditions: { type: 'string' },
},
required: ['temperature', 'conditions'],
},
},
required: ['location'],
});
Режимы исполнения: Скрытое и Явное
Система поддерживает два принципиально разных режима исполнения Вызова Инструмента:
- Скрытое исполнение: Использует способности LLM к рассуждению. Агент «продумывает» задачу и выдаёт результат напрямую в том же вызове. Это режим по умолчанию, если для Инструмента не найдено ни одного Действия.
- Явное исполнение: Делегирует Вызов детерминированному коду. Для вычисления результата вызывается функция Действия. Это необходимо для взаимодействия с внешним миром (например, API, базы данных) или для задач, требующих точной, повторяемой логики.
Стратегия разрешения Действий
Система использует стратегию нулевой конфигурации для определения режима исполнения при вызове Инструмента. Поле _activity
в схеме Инструмента сигнализирует о намерении использовать явную реализацию. Это поле разрешается автоматически во время композиции схемы на основе следующих правил:
- Явное поле
_activity
: Если само определение Инструмента включает непустую строку_activity
, это значение используется для поиска Действия в реестре. - Соглашение об одинаковых именах (рекомендуется): Если поле
_activity
в Инструменте отсутствует, система проверяет, было ли зарегистрировано Действие с тем же именем, что и Инструмент. Если найдено, поле_activity
автоматически устанавливается на имя Инструмента. - Резервный вариант — скрытое исполнение: Если по вышеуказанным правилам подходящее Действие не найдено, поле
_activity
устанавливается в пустую строку, что означает, что Вызов должен быть исполнен скрыто.
Этот подход, основанный на соглашениях, упрощает разработку:
- Для нулевой конфигурации регистрируйте ваше Действие под тем же именем, что и ваш Инструмент.
- Инструменты без соответствующего Действия автоматически и безопасно переключатся на скрытое исполнение.
- Явное поле
_activity
в схеме Инструмента всегда будет иметь приоритет, позволяя одному Действию реализовывать несколько интерфейсов Инструментов.
Почему разделение Действий важно
Без разделения схем Инструментов и реализаций Действий определение возможности было бы навсегда связано с её логикой исполнения. Чтобы переключиться с реализации на основе LLM на внешний API, пришлось бы находить и изменять каждого агента, использующего этот Инструмент.
Архитектура двойного реестра решает эту проблему, сохраняя интерфейсы Инструментов стабильными и позволяя их базовым реализациям развиваться. Агенты взаимодействуют с последовательной схемой Инструмента, независимо от того, исполняется ли она скрыто с помощью LLM или явно с помощью Действия. Это означает:
- Изменения в реализации не ломают агентов: Вы можете переключаться со скрытого на явное исполнение, не затрагивая код агента.
- A/B-тестирование стратегий исполнения: Вы можете сравнивать производительность рассуждений LLM с внешним API для одной и той же возможности.
- Постепенное внедрение: Вы можете развертывать новые реализации Действий для части агентов, в то время как другие продолжают использовать старую или резервный скрытый вариант.
От определения к действию
Разделяя «что» (Инструмент) и «как» (Действие), система приобретает огромную гибкость. Но это лишь часть истории. Когда интерфейсы и реализации определены, последним элементом является оркестрация: как эти Вызовы управляются, исполняются и упорядочиваются.
Следующий документ, 004: Агент/Вызов, исследует протокол, который управляет этим исполнением, превращая абстрактные определения в конкретные, сохраняющие состояние действия.