BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Bot Framework での 状態管理(state service の概要を整理)

Bot Framework での ステート管理 について、以下のドキュメントのざっくりな個人的まとめメモです。

docs.microsoft.com

Overview

2017/8月時点の情報なので、BotFramework だと Bot Builder 3.8~くらいがターゲットでしょうか。

(状態管理とかステート管理…漢字四文字が重いので「ステート管理」でいきます…)

ステート管理について

ステート管理の概要

  • Bot Framework はボット自体がステートレスですが、会話のステートを State Service によって維持できる(している)。
  • ボットが Dialog を使用している場合、会話のステート(Dialog Stack と Stack 内の各 Dialog のステート)を自動的に保存している。

ステート管理の活用例

  • 以前の会話がどこで途絶えたかを判断する、または返信するユーザに名前で挨拶する
  • ユーザーの設定を保存する場合は、その情報を使用して、次にチャットするときに会話をカスタマイズする
  • 興味のあるトピックに関するニュース記事をユーザーに警告したり、予定が利用可能になったときにユーザーに警告する

注意事項!

  • .NET用の Bot Framework SDK を使った場合、デフォルトでは、プロトタイプ作成専用の Bot Framework State service を使用してステートのデータを保存
  • SDK でデータを取得したり、REST APIで取得したりできる
  • パフォーマンスやセキュリティの観点から、このままでの本番運用はあかん!

ということで、その実装は次回に書きます♪

プログラミング寄りなメモ

State Service 内のメソッド

前提として、ボットは チャネル > 会話 > ユーザー のイメージです。特定のチャネルの中に特定の会話があって、そこにユーザーがいるイメージです。
(我ながら言葉足らず感がひどいですね…)

ステートを管理するために用意されている State Service のメソッドについての表!

メソッド スコープ 目的
GetUserData User 特定のチャネルのユーザー情報を取得する
GetConversationData Conversation 特定のチャネルの特定の会話に関する情報を取得する
GetPrivateConversationData User and Conversation 特定のチャネルの特定の会話のユーザーの情報を取得する
SetUserData User 特定のチャネルのユーザー情報をセットする
SetConversationData Conversation 特定のチャネルの特定の会話に関する情報をセットする。DeleteStateForUser メソッドはSetConversationDataメソッドで保存したデータを削除しないため、このメソッドで個人を識別できる情報を保存しないでください
SetPrivateConversationData` User and Conversation 特定のチャネルの特定の会話のユーザーの情報をセットする。
DeleteStateForUser User 以前に保存されたユーザーの状態データを、SetUserData メソッドまたは SetPrivateConversationData メソッドを使用して削除します。

ステート管理でよく使いそうなプロパティ

Activity オブジェクト内にあるステート管理によく使いそうなプロパティの表!

Property Description Use case
From チャネルでユーザーを識別するId ユーザーに関連付けられたデータの保存と取得
Conversation チャネルで会話を識別するId 会話に関連付けられた状態データの保存と取得
From and `Conversation チャネルで会話の中でユーザーを識別するID 特定の会話のコンテキスト内で特定のユーザーに関連付けられている状態データの保存と取得

参考

https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-state

https://docs.microsoft.com/en-us/bot-framework/rest-api/bot-framework-rest-state