Botframework v4 сохраняет набор диалоговых окон после развертывания

#node.js #typescript #chatbot #botframework

#node.js #typescript #чат-бот #botframework

Вопрос:

Я использую Microsoft bot framework v4. Его набор диалоговых окон всегда хранится в памяти и исчезнет после перестройки кода (т.Е. Развертывания), поэтому существующий диалог, который происходит в диалоговом окне непосредственно перед перестройкой, получит сообщение об ошибке после завершения развертывания (необходимый диалог не найден).

 export class DialogBot extends ActivityHandler {


  private readonly conversationState: BotState;
  private readonly userState: BotState;
  private readonly dialogState: StatePropertyAccessor<DialogState>;
  private readonly nlpProcessor: NlpProcessor;
  private readonly dialogSet: DialogSet;
  private readonly cacheService: CacheService;
  private readonly mainProcessor: MainProcessors;

  constructor(conversationState: BotState, userState: BotState) {
    super();
    this.conversationState = conversationState;
    this.userState = userState;
    this.dialogState = this.conversationState.createProperty<DialogState>(
      'DialogState'
    );
    this.dialogSet = new DialogSet(this.dialogState);
 

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

 this.dialogSet = new DialogSet(this.dialogState);
 

Хотя dialogStack сохраняется в dialogState, его массив dialogs не сохраняется

 export class DialogSet {
    private readonly dialogs: { [id: string]: Dialog } = {};
    private readonly dialogState: StatePropertyAccessor<DialogState>;
    private _telemetryClient: BotTelemetryClient;
    private _version: string;
 

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

Я попытался расширить класс DialogSet и сохранить его свойство dialogs в хранилище больших двоичных объектов, однако Blob записывает только json и не восстанавливает должным образом массив dialogs (который содержит все объекты Dialog).

У кого-нибудь есть решение для сохранения состояния набора диалоговых окон при развертывании? Заранее большое спасибо.

Комментарии:

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

2. Мой код слишком длинный, чтобы публиковать его здесь, я могу объяснить свою логику только в псевдокоде. Однако вы абсолютно уверены, что dialogSet работает именно так? Поскольку, если вы посмотрите на реализацию add(), там есть добавление суффикса. Если для всего есть один dialogSet, ему никогда не придется добавлять суффикс, поэтому я уверен, что dialogSet будет продолжать расти во время использования, а не статично.

3. Да, я уверен, что наборы диалоговых окон не должны увеличиваться во время использования. Возможно, было бы неплохо ознакомиться с документацией . Я не могу посмотреть на реализацию add (), потому что я не знаю, какой SDK вы используете, потому что вы не опубликовали никакого кода. Можете ли вы хотя бы сказать нам, на каком языке написан ваш бот?

4. Я только что добавил инициализацию набора диалоговых окон. Я использую nodejs.

5. Если это так, нам нужно будет добавить все возможные диалоги в dialogSet в момент инициализации? Я говорю о возобновлении диалога после развертывания

Ответ №1:

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

Вы всегда должны добавлять все возможные диалоговые окна в набор диалоговых окон в момент инициализации. Предполагается, что так должны работать все диалоговые окна Bot Framework, и любой бот, который этого не делает, сломан. Вы можете увидеть этот шаблон в каждом официальном примере (обратите внимание, что ComponentDialog.addDialog он вызывается DialogSet.add внутри). Никогда не вызывается диалоговое окно, которое не было добавлено во время создания. Это гарантирует, что ваш бот будет работать после перезагрузки.

Комментарии:

1. Я пометил ваш ответ как принятый. Большое спасибо @Kyle