レッツ 第4次産業革命♪
Bot Frameworkでの開発、「FormFlow」についてです。
公式のドキュメントのFormFlowの部分
http://docs.botframework.com/en-us/csharp/builder/sdkreference/forms.html
をざっくり試したメモです。
2016年7月11日時点の内容です。SDKのバージョンに要注意ですね。
過去のFormFlowの記事のバージョンはもうお亡くなりになったようなので書き直しました(あまり変わってない...)
開発を初めてする場合は、こちらで事前準備をします。
beachside.hatenablog.com
> Environment
検証した環境は以下です。要注意は、Microsoft.Bot.Builder 3.0.0です。(前回の記事では1.2.5でした。)
- Visual Studio 2015 (update3)
- Microsoft.Bot.Builder 3.0.0
- Microsoft.Rest.ClientRuntime 1.8.2
> Overview
- 1. シンプルなサンドイッチ注文Bot作成(今回)
- 2. Attributeを使ってみる(今回)
- 3. Adding Business Logic...(次回)
- 4. Using the Form Builder(次回)
- 5. Dynamically Defined Fields, Confirmations and Messages(次回)
- 6. Handling Quit and Exceptions(次回)
1. シンプルなサンドイッチ注文Bot作成
classを作ればpublicの変数が質問の選択肢となって簡易なBotが作れるとのことなので、試してみましょう。
VSを開いて新しい[プロジェクト作成]→右上の検索で「bot」を入力して「BotApprication」を選択します。
今回、プロジェクト名は、「FormFlowV3」にしました。
出来上がったプロジェクトを見ると、ASP.NETのWebAPI 5.2.3ってのがわかります。
(長めの)余談ですが、
Nugetでなんとなくライブラリを最新...という行為は今のところやめた方がよさそうです。
2016-7-12時点だと、Microsoft.Bot.Builder 3.0.0の更新によって、NugetからBot.Connectorがなくなりましたが、参照のDLLとしては存在します。Bot.Connectorもv3となっていますが、Microsoft.Rest.ClientRuntimeの2.3.1には対応していない?(Bot.Connectorのv1.1.0は、Microsoft.Rest.ClientRuntime1.8.2までしか対応してなかった)。
Microsoft.Rest.ClientRuntimeは、Nugetからv2.3.1にできちゃうので更新すると、デバッグとかした際にBot.Connectorに関するところで「メソッドが存在しないよー」ってExceptionでたりします、...修正するのにNugetからBot.Connectorをインストールしちゃったりした日にはMessagesControllerのActivityクラスが見えなくなったり....もとに戻すには、Microsoft.Rest.ClientRuntimeを1.8.2にする→Bot.ConnectorもBuilderもアンインストールする→Builderのみインストールしなおすとか面倒な事態になります。
本題に戻り実装です。
Dialogsというフォルダーを作りました。(検証なのでプロジェクトのフォルダ構成なんてどうでもいいですが...)
その中に「SandwichOrder」クラスを新規に作ります。
このクラスが、質問とその回答の選択肢となるようです。publicの変数が質問の選択肢となります。ざっくり解説すると、単数のものは単一の選択肢、コレクションは複数選択可能な選択肢となります。
気をつけたい点として、SandwichOrderクラスにはSerializableAttributeがついている点でしょうか。
次は、テンプレートとして用意されているMessageControllerを開き、以下のように変更します。
これだけで、デバッグ開始し、Emulatorからアクセスすると、応答できます。
(Emulatorの簡易セットアップの説明は前回のこちらから..)
これだけのコーディングですが、Emulatorの[Local]で「ja-JP」を指定した状態で「ヘルプ」と入力すると、ヘルプらしきものが出てきます。
[Local]で「en」にすると、「help」と入力することでヘルプ機能が表示されます。I18N自動対応♪
あとはいじってみるとある程度動さを察することができると思います。ポイントは、いくつかありますが、
- 質問の選択肢が、数字(選択の上から順に1~)または選択肢の名称で入力できる
- 入力内容が不明な場合やあいまいな場合に、"それなり"の応答を返す
辺りでしょうか。
2. Attributeを使ってみる
本家の「Improved Sandwich Bot」らへんの内容を順不同に進めます。まずAttributeについて基本的なところから。
DescribeAttribute
DescribeAttributeの情報はこちら。
デフォルトでは、フィールド名が表示されますが、DescribeAttributeを設定することで表示をカスタマイズできます。
上記でSandwichOrder.csにSandwichOrderクラスを書きましたが、クラスとは別にEnum書いています。そこを更新してみます♪。SandwichOptions Enumに以下のように設定すれば、
このように表示されます。
PromptAttribute
PromptAttributeの情報はこちら。
Botが話す内容を定義できます。まずはコードど動作から。
これでデバッグすると、
ふむふむ、いい感じです。Promptに書いた「どの {&} にしますか ? {||}」の、{&}や{||}は、Pattern Languageと呼ばれるものです。
{&}は、fieldのDescriptionに置換されるので、先ほどのDescribeAttributeで説明した挙動に依存してきますね。
{||}は、選択可能を意味します(英文訳そのまま...)。{||}をつけることで選択肢を表示しています。Promptから{||}を消すと、選択肢として表示されているものが消えます。ここら辺を見る限り、Attribute自体、デフォルトの設定に色々と工夫がされてるなーと感心します....。ちなみに先ほど「ヘルプ」と入力して表示した内容は、「?」と入力しても表示されます。
OptionalAttribute
質問として選択はできるけど、選ばなくてよい場合に使えるAttributeです。
今回は、SandwichOrderクラスのCheeseOptionsにつける例となっています。
チーズを選んでもいいし1つも選ばなくてもよい場合、enumに「不要」という選択肢を追加して対応できますが、「不要」の選択肢を追加せず、Optionalをつけるだけで実装ができるというものです。
[Optional]
public CheeseOptions? Cheese;
「優先設定なし」という選択肢が追加されました。
(「優先設定なし」って日本語は微妙ですが、とりあえず機能紹介ということで...)
TemplateAttribute
Promptより色々できるTemplate
機能はたくさんありそうですがここで紹介するのは、Botのクライアントから意味不明な入力があった場合の応答を定義できる[TemplateUsage.NotUnderstood]です。
SandwichOrderクラスにPromptの代わりに以下のように実装します。
[Serializable] [Template(TemplateUsage.NotUnderstood,"\"{0}\"の入力は不正です。選択肢から選んでください。", "\"{0}\"なんて知らんで。ちゃんと入力して。")] [Template(TemplateUsage.EnumSelectOne,"どの{&}にしますか?{||}",ChoiceStyle=ChoiceStyleOptions.PerLine)] public class SandwichOrder { ...
TemplateUsage.NotUnderstoodの後に、2つの返答を書きました。2つ書くとランダムにどちらかが表示されるようにです。
また、「Template(TemplateUsage.EnumSelectOne....」と実装したところは、Promptの代わりに応答文章の定義をしています。
この他に、入力値と選択肢となるフィールドの紐づけを定義するTermsAttributeや、正規化表現に入力を制御できるPatternAttributeがあります。(リンク先の本家ドキュメントを参考に....)
次回は、本家のドキュメントのAdding Business Logicあたりを参考に再開です。
beachside.hatenablog.com
P.S. ここら辺はV1とあんま変わってないっすね。