В чем разница между хранением данных в свойстве состояния диалога и контекстной сериализацией диалога

#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.