#botframework
#botframework
Вопрос:
Когда я просматривал чужую кодовую базу для проекта bot framework v4, я заметил много данных о состоянии, хранящихся в закрытых элементах этого конкретного экземпляра диалога, вместо того, чтобы хранить их в своем собственном StateProperty. Например, разработчик попытался сохранить данные между WaterfallSteps в закрытых элементах и хотел использовать их на следующем шаге в новом повороте (вместо того, чтобы передавать результат с помощью stepContext.Next(result)
).
В отличие от v3 (насколько я помню), в v4 сам диалог не сериализуется, и поэтому эти закрытые элементы «сбрасываются» в новом порядке.
Я видел эту «попытку» у многих моих коллег, когда они начинали с bot Framework v4, поскольку для них это кажется естественным.
Таким образом, мой вопрос скорее из любопытства и заключается в следующем:
Как описано здесь, бот инициализирует подсистему диалога, вызывая create context в наборе диалогов, который возвращает контекст диалога. Этот контекст диалога содержит необходимую информацию, необходимую для диалога.
Поскольку набор диалоговых окон инициализируется с помощью ConversationState, я спросил себя, что именно подразумевается под «необходимой информацией». Какая информация о конкретном экземпляре диалога фактически восстанавливается?
Есть ли какие-либо или это действительно просто контекст вокруг диалога (например, индекс шага водопада), который восстанавливается?
В зависимости от ответа на этот вопрос можно спросить, почему дизайн был выбран для хранения его с выделенными свойствами состояния вместо сериализации экземпляра диалога с набором его членов, что кажется более естественным способом для большинства людей, на которых я смотрел через их плечи.
Почему поведение изменилось между v3 и v4 и каковы основные причины этого?
Ответ №1:
Как в Bot Builder V4, так и в V3, DialogStack хранится в состоянии. Вы правы, что V3 сериализовал и десериализовал поля диалога. Однако эта «магия» часто была проблематичной. Метод двоичной сериализации V3 позволил бы sdk нацеливаться только на netframework, и весь стек диалоговых окон был более хрупким. Стек диалоговых окон V4 был переработан, и была включена обратная связь от V3. Состояние теперь менее автоматическое и больше «в руках разработчика».
Вот пример ConversationState, содержащий DialogStack:
"document": {
"$type": "System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Collections.Concurrent",
"DialogState": {
"$type": "Microsoft.Bot.Builder.Dialogs.DialogState, Microsoft.Bot.Builder.Dialogs",
"DialogStack": {
"$type": "System.Collections.Generic.List`1[[Microsoft.Bot.Builder.Dialogs.DialogInstance, Microsoft.Bot.Builder.Dialogs]], System.Private.CoreLib",
"$values": [
{
"$type": "Microsoft.Bot.Builder.Dialogs.DialogInstance, Microsoft.Bot.Builder.Dialogs",
"Id": "GreetingDialog",
"State": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib",
"dialogs": {
"$type": "Microsoft.Bot.Builder.Dialogs.DialogState, Microsoft.Bot.Builder.Dialogs",
"DialogStack": {
"$type": "System.Collections.Generic.List`1[[Microsoft.Bot.Builder.Dialogs.DialogInstance, Microsoft.Bot.Builder.Dialogs]], System.Private.CoreLib",
"$values": [
{
"$type": "Microsoft.Bot.Builder.Dialogs.DialogInstance, Microsoft.Bot.Builder.Dialogs",
"Id": "namePrompt",
"State": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib",
"options": {
"$type": "Microsoft.Bot.Builder.Dialogs.PromptOptions, Microsoft.Bot.Builder.Dialogs",
"Prompt": {
"$type": "Microsoft.Bot.Schema.Activity, Microsoft.Bot.Schema",
"type": "message",
"id": "3Md4r2ECwdEJnnPshesDe1-g|0000009",
"timestamp": null,
"localTimestamp": null,
"localTimezone": null,
"serviceUrl": "https://webchat.botframework.com/",
"channelId": "webchat",
"from": {
"$type": "Microsoft.Bot.Schema.ChannelAccount, Microsoft.Bot.Schema",
"id": "BotHealthTest@6hiZPWXn5jc",
"name": "BotHealthTest",
"aadObjectId": null,
"role": null
},
"conversation": {
"$type": "Microsoft.Bot.Schema.ConversationAccount, Microsoft.Bot.Schema",
"isGroup": null,
"conversationType": null,
"id": "3Md4r2ECwdEJnnPshesDe1-g",
"name": null,
"aadObjectId": null,
"role": null,
"tenantId": null
},
"recipient": {
"$type": "Microsoft.Bot.Schema.ChannelAccount, Microsoft.Bot.Schema",
"id": "EGnHowki8Se",
"name": "You",
"aadObjectId": null,
"role": null
},
"textFormat": null,
"attachmentLayout": null,
"membersAdded": null,
"membersRemoved": null,
"reactionsAdded": null,
"reactionsRemoved": null,
"topicName": null,
"historyDisclosed": null,
"locale": null,
"text": "What is your name?",
"speak": null,
"inputHint": "expectingInput",
"summary": null,
"suggestedActions": null,
"attachments": null,
"entities": null,
"channelData": null,
"action": null,
"replyToId": "3Md4r2ECwdEJnnPshesDe1-g|0000007",
"label": null,
"valueType": null,
"value": null,
"name": null,
"relatesTo": null,
"code": null,
"expiration": null,
"importance": null,
"deliveryMode": null,
"listenFor": null,
"textHighlights": null,
"semanticAction": null
},
"RetryPrompt": null,
"Choices": null,
"Validations": null
},
"state": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
}
}
},
{
"$type": "Microsoft.Bot.Builder.Dialogs.DialogInstance, Microsoft.Bot.Builder.Dialogs",
"Id": "profileDialog",
"State": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib",
"options": null,
"values": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
},
"instanceId": "9b48b35f-3fa5-431d-bb4d-9a512491aca4",
"stepIndex": 1
}
}
]
}
}
}
}
]
}
}
}
Тем не менее, адаптивный диалог создателя ботов следует модели, более похожей на реализацию V3. Предварительные фрагменты можно найти в этой ветке: 4.Будущее Пожалуйста, ознакомьтесь с этим и оставьте отзыв о репозитории Github.