Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ПРИМЕНИМО К: пакет SDK версии 4
Состояние бота подчиняется тем же принципам, что и современные веб-приложения, и пакет SDK для Bot Framework предоставляет некоторые абстракции, позволяющие упростить управление состоянием.
Как и веб-приложения, бот по своей природе не учитывает состояния. Любой экземпляр бота может обработать любой шаг беседы. Для некоторых ботов эта простота предпочтительна— бот может работать без дополнительных сведений, или сведения, необходимые, гарантированно будут находиться в входящего сообщения. Для других пользователей для полезного разговора с ботом необходимо состояние (например, где разговор был прерван или данные, полученные ранее о пользователе).
Зачем мне нужно государство?
Поддержание состояния позволяет боту иметь более значимые беседы, запоминая определенные вещи о пользователе или беседе. Например, если вы говорили с пользователем ранее, вы можете сохранить предыдущие сведения о них, чтобы вам не нужно было его снова попросить. Состояние также сохраняет данные дольше текущего хода, чтобы бот сохранял информацию в течение многосерийного разговора.
Так как это относится к ботам, существует несколько уровней для использования состояния: уровень хранения, управление состоянием (в состоянии бота на схеме ниже) и методы доступа к свойствам состояния. На этой схеме показаны части последовательности взаимодействия между этими слоями, с твердыми стрелками, представляющими вызов метода, и дефисированные стрелки, представляющие ответ (с возвращаемым значением или без них).
Поток этой схемы описан в следующих разделах с подробными сведениями о каждом из этих слоев.
Уровень хранилища
Начиная с серверной части, где фактически хранятся сведения о состоянии, — это уровень хранения. Это можно рассматривать как физическое хранилище, например в памяти, Azure или сторонний сервер.
Пакет SDK Bot Framework включает некоторые реализации для уровня хранилища:
- Хранилище памяти реализует хранилище в памяти для тестирования. Хранилище данных в памяти предназначено только для локального тестирования, так как это хранилище является переменным и временным. Данные очищаются при каждом перезапуске бота.
- Хранилище BLOB-объектов Azure подключается к базе данных объектов хранилища BLOB-объектов Azure.
- Хранилище Azure Cosmos DB с секционированием подключается к секционированной базе данных Cosmos DB NoSQL.
Это важно
Класс хранилища Cosmos DB является устаревшим. Контейнеры, изначально созданные с помощью CosmosDbStorage, не имели установленного ключа раздела, и им был назначен ключ раздела по умолчанию "/_partitionKey".
Контейнеры, созданные с помощью хранилища Cosmos DB, можно использовать с секционированным хранилищем Cosmos DB. См. сведения о секционировании в Azure Cosmos DB.
Кроме того, обратите внимание, что в отличие от устаревшего хранилища Cosmos DB секционированные хранилища Cosmos DB не создают базу данных в учетной записи Cosmos DB. Необходимо вручную создать новую базу данных, но пропустить создание контейнера вручную, так как CosmosDbPartitionedStorage создаст для вас контейнер.
Инструкции по подключению к другим параметрам хранения см. в разделе "Запись непосредственно в хранилище".
Управление состоянием
Управление состоянием автоматизирует чтение и запись состояния бота в базовый уровень хранилища. Состояние хранится в виде свойств состояния, которые фактически являются парами "ключ-значение", которые бот может читать и записывать через объект управления состоянием, не беспокоясь о конкретной базовой реализации. Эти свойства состояния определяют способ хранения этих сведений. Например, при получении свойства, определенного как определенный класс или объект, вы знаете, как будут структурированы эти данные.
Эти свойства состояния сгруппированы в контекстные "корзины", которые представляют собой лишь коллекции для упорядочивания этих свойств. Пакет SDK включает три из этих «разделов».
- Состояние пользователя
- Состояния разговора
- Состояние частной беседы
Все эти контейнеры представляют собой подклассы класса состояния бота , которые могут быть производными для определения других типов контейнеров с различными областями.
Эти предопределенные области имеют определенную видимость, зависящую от каждой конкретной области.
- Состояние пользователя доступно в любом случае, что бот взаимодействует с этим пользователем в этом канале независимо от беседы
- Состояние беседы доступно в любом случае в определенной беседе независимо от пользователя, например в групповых беседах
- Состояние частной беседы распространяется как на конкретный диалог, так и на конкретного пользователя
Подсказка
Состояние пользователя и беседы определяются каналом. Один и тот же пользователь, использующий разные каналы для доступа к боту, отображается как разные пользователи, по одному для каждого канала и каждый из которых имеет отдельное состояние пользователя.
Ключи, используемые для каждого из этих предопределенных контейнеров, зависят от пользователя и беседы или обоих. При установке значения свойства состояния ключ задается для вас автоматически на основе информации, содержащейся в контексте диалога, чтобы гарантировать, что каждый пользователь или беседа попадают в правильную категорию и имеют соответствующее свойство. В частности, ключи определяются следующим образом:
- Состояние пользователя создает ключ, используя идентификатор канала и исходный идентификатор. Например, {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
- Состояние беседы создает ключ с помощью идентификатора канала и идентификатора беседы. Например, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
- Состояние частной беседы создает ключ с помощью идентификатора канала, идентификатора from и идентификатора беседы. Например, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName
Когда следует использовать каждый тип состояния
Состояние беседы хорошо подходит для отслеживания контекста беседы, например:
- Задает ли бот вопрос пользователю, и какой вопрос был
- Какова текущая тема разговора или последняя тема разговора.
Состояние пользователя хорошо подходит для отслеживания сведений о пользователе, таких как:
- Некритическая информация о пользователе, такая как имя и предпочтения, настройки будильника или предпочтения уведомлений
- Сведения о последней беседе с ботом
- Например, бот поддержки продукта может отслеживать, о каких продуктах спросил пользователь.
Состояние частной беседы хорошо подходит для каналов, поддерживающих групповые беседы, но где вы хотите отслеживать сведения о пользователях и беседах. Например, если у вас был классный кликер-бот:
- Бот может агрегировать и отображать ответы учащихся на заданный вопрос.
- Бот может собирать результаты каждого учащегося и конфиденциально передавать их им в конце сеанса.
Дополнительные сведения об использовании этих предопределенных контейнеров см. в статье о состоянии.
Подключение к нескольким базам данных
Если боту нужно подключиться к нескольким базам данных, создайте уровень хранилища для каждой базы данных. Вы можете использовать несколько баз данных, если бот собирает информацию, которая имеет разные потребности в безопасности, параллелизме или расположении данных.
Для каждого уровня хранилища создайте объекты управления состоянием, необходимые для поддержки свойств состояния.
Методы доступа к свойствам состояния
Методы доступа к свойствам состояния используются для чтения или изменения одного из ваших свойств состояния и включают методы получения, установки и удаления для доступа к свойствам состояния в одном ходе. Чтобы создать аксессор, необходимо указать имя свойства, что обычно делается при инициализации бота. Затем вы можете использовать этот аксессор для получения и управления свойством состояния вашего бота.
Методы доступа позволяют библиотеке SDK получать состояние из базового хранилища и обновлять кэш состояния бота для вас. Кэш состояния — это локальный кэш, поддерживаемый ботом, который хранит объект состояния для вас, позволяя выполнять операции чтения и записи без доступа к базовому хранилищу. Если данные еще не находятся в кэше, вызов метода accessor get извлекает состояние и помещает его в кэш. После получения свойство состояния можно управлять так же, как и с локальной переменной.
Метод доступа delete удаляет свойство из кэша, а затем из базового хранилища.
Это важно
Для первого вызова метода get метода доступа необходимо использовать фабричный метод для создания объекта, если он еще не существует в текущем состоянии. В случае отсутствия фабричного метода, вы получите исключение. Сведения об использовании метода фабрики см. в статье о том, как использовать метод фабрики.
Чтобы сохранить любые изменения, которые вы внесли в свойство состояния, полученное через аксессор, необходимо обновить свойство в кэше состояния. Это можно сделать с помощью метода аксессора set, который задает значение вашего свойства в кэше и доступен для чтения или обновления позже, при необходимости. Чтобы фактически сохранить эти данные в базовом хранилище (и таким образом сделать их доступными после текущей сессии), необходимо сохранить состояние.
Как работают методы доступа к свойствам состояния
Методы доступа — это основной способ взаимодействия бота с состоянием. Как работает каждая из них и как взаимодействуют базовые слои, описано ниже.
- Метод get аксессора:
- Метод доступа запрашивает свойство из кэша состояния.
- Если свойство находится в кэше, следует вернуть его. В противном случае получите его из объекта управления состоянием. (Если он еще не находится в требуемом состоянии, используйте фабричный метод, предоставленный в вызове получения доступа get.)
- Метод set аксессора:
- Обновите кэш состояния с новым значением свойства.
- Метод сохранения изменений объекта управления состоянием:
- Проверьте изменения свойства в кэше состояния.
- Запишите это свойство в хранилище.
Состояние в диалоговых окнах
Библиотека диалогов использует аксессор свойства состояния диалога, определенный в состоянии беседы бота, чтобы сохранить позицию диалога в беседе. Свойство состояния диалога также позволяет каждому диалогу хранить временные сведения между ходами.
Адаптивные диалоги имеют более сложную структуру области памяти, что упрощает доступ к результатам конфигурации и распознавания, помимо прочего. Диспетчер диалогов использует объекты управления состоянием пользователя и беседы для предоставления этих областей памяти.
Сведения о библиотеке диалогов см. в статье библиотеки диалогов .
- Сведения о компонентах и каскадных диалогах , относящихся к этим типам диалогов.
- См. статьи введение в адаптивные диалоги и управление состоянием в адаптивных диалогах для получения информации, относящейся к адаптивным диалогам.
Сохранение состояния
При вызове метода аксессора для установки обновленного состояния это свойство состояния еще не сохранено в постоянном хранилище и вместо этого сохраняется только в кэше состояния вашего бота. Чтобы сохранить изменения в кэше состояния в сохраненном состоянии, необходимо вызвать метод сохранения изменений объекта управления состоянием, который доступен в реализации класса состояния бота, указанного выше (например, состояния пользователя или состояния беседы).
Вызов метода сохранения изменений для объекта управления состоянием (например, контейнеров, упомянутых выше) сохраняет все свойства в кэше состояний, который вы настроили до этой точки для этого контейнера, но не для других контейнеров, которые могут быть в состоянии бота.
Подсказка
Состояние, поддерживаемое ботом, реализует поведение «последняя запись выигрывает», где последняя запись переписывает ранее записанное состояние. Это может работать для многих приложений, но имеет последствия, особенно в сценариях горизонтального масштабирования, где может быть некоторый уровень параллелизма или задержки в игре.
Если у вас есть пользовательское промежуточное ПО, которое может обновить состояние после завершения обработчика очереди, рассмотрите обработку состояния в промежуточном ПО.