Управление состоянием

Состояние внутри агента следует тем же парадигмам, что и современные веб-приложения. SDK Agents предоставляет некоторые абстракции для упрощения управления состоянием.

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

Зачем мне нужен штат?

Поддержание состояния позволяет вашему агенту вести более содержательные разговоры, запоминая определённые вещи о пользователе или разговоре. Например, если вы уже общались с пользователем, вы можете сохранить прежнюю информацию о нём, чтобы не просить её снова. State также хранит данные дольше текущего хода, чтобы ваш агент сохранял информацию в течение многоходового разговора.

Что касается агентов, существует несколько уровней использования состояния: уровень хранения, управление состоянием и AgentApplication.

Уровень хранилища

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

SDK Agents включает некоторые реализации для слоя хранения:

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

Хранилище BLOB-объектов Azure connects to a Хранилище BLOB-объектов Azure object database.

Azure Cosmos DB partitioned storage подключается к разделённой базе данных Cosmos DB NoSQL.

Инструкции по подключению к другим вариантам хранения смотрите в разделе Обзор хранения агентов SDK

Управление состоянием

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

Эти государственные объекты объединены в «ведра» с ограниченной областью, которые представляют собой коллекции для их организации. SDK включает три таких «ведра»:

  • Состояние пользователя
  • Состояние беседы

Все эти бакеты являются подклассами класса состояния агента, которые можно вывести для определения других типов бакет с разной областью видимости.

Эти заранее определённые ведра имеют определённую видимость в зависимости от ведра:

  • Состояние пользователя доступно в любой момент, когда агент общается с этим пользователем на этом канале, независимо от разговора
  • Состояние разговора доступно в любой момент конкретного разговора, независимо от пользователя, например, в групповых разговорах

Состояние пользователя и состояние разговора определяются по каналам. Один и тот же человек, использующий разные каналы для доступа к вашему агенту, появляется как разные пользователи — по одному для каждого канала, и у каждого с определённым состоянием пользователя.

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

  • Состояние пользователя создаёт ключ с использованием идентификатора канала и идентификатора From (From ID). Например: {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
  • Состояние разговора создаёт ключ с использованием идентификатора канала и идентификатора разговора. Например: {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName

Когда использовать каждый тип состояния

Состояние разговора хорошо подходит для отслеживания контекста разговора, например:

  • Задал ли агент пользователю вопрос и какой именно вопрос был
  • Какова тема текущего разговора, или какая была последняя
  • История записи чата

Состояние пользователя хорошо подходит для отслеживания информации о пользователе, например:

  • Некритическая информация о пользователе, такая как имя и предпочтения, настройка сигнализации или предпочтение оповещения
  • Информация о последнем разговоре с агентом
    • Например, агент поддержки может отслеживать, о каких продуктах пользователь спрашивал.

AgentApplication

  • Добавленные вами обработчики маршрутов получат TurnState экземпляр. Получите доступ к разговору или состоянию пользователя из этого экземпляра.
  • Состояние автоматически загружается и сохраняется.