BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Bot Framework(V1) - FormFlow 入門 その1

注意:このバージョン(Microsoft.Bot.Builder 1.2.5)は、これを書いた数日後にメジャーバージョンアップデートがあったため古いです。新しい投稿をご参照ください。

レッツ 第4次産業革命
f:id:beachside:20160706104217j:plain


Microsoft Bot Frameworkの中の「Bot Builder for C#」の FormFlowについてです。

前段としてBot Frameworkとは?みたいな話は書いてません....こちらを参考に...

Bot Builder を使って開発する際、「Dialogs」と「FormFlow」というものがキーになるようですが、今回は「FormFlow」についてです。
公式のドキュメント

をざっくり試したメモです。
2016年7月時点の内容なので、数カ月でドキュメントも変わってしまう可能性高いですね。

> Environment

検証した環境は以下です。

> Overview

  • 1. シンプルなサンドイッチBot作成
  • 2. Attributeを使ってみる
  • 3. 次回...

1. シンプルなサンドイッチBot作成

なんと、classを作ればpublicの変数が質問の選択肢となって簡易なBotが作れるとのことなので、プロジェクトを作成してコーディングしていきます。
VSを開いて新しい[プロジェクト作成]→右上の検索で「bot」を入力して「BotApprication」を選択します。
f:id:beachside:20160701153728p:plain

出来上がったプロジェクトを見ると、ASP.NETのWebAPIってのがわかります。

Nugetで必要なライブラリをインポートしたり最新にしたりします。
VSの上部のメニューから、[ツール] → [Nugetパッケージマネージャー] → [ソリューションのNugetパッケージマネージャーの管理]を開きます。
まずは[更新プログラム]を選択して全部新しいのにしときました。(依存関係で更新できないものがあれば、それはそのままで....。)
f:id:beachside:20160701154741p:plain

次は、「Microsoft.Bot.Builder」をインストールします。
[参照]で、「microsoft.bot」と入れて検索すればさっと出てきます。
f:id:beachside:20160701155041p:plain

次に、Dialogsってフォルダーを作りました(検証なのでプロジェクトのフォルダ構成なんてどうでもいいですが)。
f:id:beachside:20160705155809p:plain

その中に「SandwichOrder」クラスを新規に作ります。このクラスが、質問とその回答の選択肢となるようです。

次は、既存のMessagesControllerクラスを開きます。
さっそく(このブログを書いてる時期ではお決まりの)エラーがでてますでしょうかね....Microsoft.Bot.Connectorの1.0から1.1への変更によるもので...
f:id:beachside:20160701160103p:plain
不要なusingを削除するエラーを消します。

MakeRootDialogメソッドの追加(29行目)と、Postメソッドの変更(21行目)をします。

こ....これだけ?と思いつつ、デバッグ開始。

Botにアクセスするためのクライアントは、Bot Framework Emulatorを利用します。
起動したら、以下を設定

  • ポート番号を空にする(しなくても大丈夫なんだけど、気持ち的に...)
  • APIのURLを書く
  • Localeをja-JPに(しなくてもいいんだけど、気持ち的に...)
  • 「Hi」とか適当な文字を入れて送信ポチっ

f:id:beachside:20160701172554p:plain

でました。
f:id:beachside:20160701171520p:plain

サンドイッチの選択肢の最初「BLT」は、「ボーイズラブトラブル」というマンガのことですね(#違う)。

「ヘルプ」って入力すると、ヘルプっぽいのが出てきます。ほうほう...。
f:id:beachside:20160701173106p:plain

ヘルプに対応するコーディングはしてないけど、色々ついてますね。謎が深まります。
さらに、I18N用のコード書いてないけど、Localeをenにすると英語に切り替わる....ほほう...

SandwichOrderクラスで設定したpublicのPropertyの順番に質問を聞いてくるBotができました。
実用レベルではないけど...なんと簡単♪

2. Attributeを使ってみる

本家の「Improved Sandwich Bot」あたりの内容です。最初は、Attributeを使ってみようのコーナーです。

Attributeの一覧とソースはこちらに。
http://docs.botframework.com/sdkreference/csharp/dc/dfd/_attributes_8cs.html
http://docs.botframework.com/sdkreference/csharp/dc/dfd/_attributes_8cs_source.html

DescribeAttribute

最初は、Microsoft.Bot.Builder.FormFlow.DescribeAttribute Class Referenceです。

SandwichOptions Enumに以下のように設定すれば、
f:id:beachside:20160701184343p:plain

ふむふむ。
f:id:beachside:20160701184542p:plain

PromptAttribute

Microsoft.Bot.Builder.FormFlow.PromptAttribute Class Referenceです。

説明より見たほうが早い。
f:id:beachside:20160701185104p:plain

これでデバッグすると、
f:id:beachside:20160701185339p:plain

ふむふむ、いい感じです。

Promptに書いた「どの {&} にしますか ? {||}」の、{&}や{||}は、Pattern Languageと呼ばれるものだそうです。今回登場した2つについて、
{&} は、DescribeAttributeで設定した値(設定してなければ、プロパティ名)を表示してくれます。
{||}は、enumを選択肢の一覧として表示してくれます。特にコーディングしてないのに、選択肢が出てきたのは、これが作用していたからですね。

ということは、以下のようにPromptで{||}を消すと
f:id:beachside:20160705101330p:plain

選択肢がでなくなります。しかし、「?」または「ヘルプ」を入力すると、

f:id:beachside:20160705101806p:plain
あれま、親切に色々と機能がついてるもんですね。
(仕組みがわかってないけど...)

OptionalAttribute

Microsoft.Bot.Builder.FormFlow.OptionalAttribute Class Referenceは、C#でいうところのOption引数とにた感じですね(テキトー...)
選択肢はあるけど選ばなくてもいい場合に、Optionalをつけると幸せになれます。
こう実装すると...
f:id:beachside:20160705110441p:plain

「優先設定なし」という選択肢が追加されました。
f:id:beachside:20160705110522p:plain
(優先設定なしって日本語は微妙...)

TemplateAttribute

次は、Promptの代わりにTemplateを使ってみます。
まずは、SandwichOptionsにつけてみます。
f:id:beachside:20160705103102p:plain


TemplateUsageChoiceStyleOptionsは、それぞれのリンク先に詳細あり....。
ここら辺の設定がDefaultで設定されてるから、簡易なBotをサラッと作成できるんでしょうか...。

では、SandwichOrderクラスにTemplateをつけてみます。
f:id:beachside:20160705112011p:plain

TemplateUsage.NotUnderstoodは、クライアント側が入力した内容をBotが理解できなかった場合の応答をカスタムに設定できます。

PatternAttribute

http://docs.botframework.com/sdkreference/csharp/da/d2b/class_microsoft_1_1_bot_1_1_builder_1_1_form_flow_1_1_pattern_attribute.html
さっとしか触れませんが、正規表現もできるようですね。

f:id:beachside:20160706102529p:plain



ざっくりとした内容のみになってしまいましたが....長くなったので、続き(Adding Business Logicあたり)は次回にします。

→次を書いている途中でV1からV3に更新されてしまったので、続きを書くのはやめました...今後V3の情報を公開します。