SDKが提供するダイアログ機能を用いて、シンプルなChatbotを作成してみる。SDKは、「ダイアログ(対話)」という機能を提供しています。ダイアログの説明に入る前に、ネットでなにか調べものをする際の手順を考えてみましょう。週末にキャンプを予定しているので、天気予報のサイトで週末の奥多摩町の天気を知りたいとします。一般的にWebサイトから調べる手順としては、以下のようになるでしょう。少々回りくどいですが、このような流れで最終的な目的の情報にたどり着くことができます。各ステップでの画面の表示は、直前にユーザーが選択した結果と関連したものになるため、ユーザーの選択結果ごとにWebサイトの画面内容も切り替わります。これは、様々なユーザーインターフェースを持つ一般的なアプリケーションの仕様です。Chatbotは、ユーザーとボットの対話が基本的なインターフェースとなります。対話によるユーザーインターフェースは、1枚のチャット画面だけです。Chatbotを開発する場合は、1つの話題ごとにそれまでの対話内容をきちんと保持して、必要に応じて適切な回答をする必要があります。一般的なアプリケーションのように、質問のたびに画面を切り替えるわけにはいきません。SDKでは、ユーザーごとの内容や話題=対話の流れをきちんと保持し続けることを、基本機能の一部として提供しています。これがダイアログ(対話)と呼ばれる機能です。入力する簡単なものですが、ダイアログの基本的な使い方を確認します。前回作成した「ChatBot201707」を利用します。今回の記事で使用するファイル一式は、以下のリンクからダウンロード可能です。Chatbot03.zipまずDialogsフォルダーに、空白のクラスファイル「HelloDialog.cs」を追加します。RootDialog.cs」の一部をコピーして、最低限のダイアログを作成するためのテンプレートとして用意します。}}上記リストの内容を、一つずつ細かく見ていきましょう。参照設定usingで参照しているクラスは、ダイアログを作成するために最低限必要なクラスです。Serializable属性ダイアログはシリアル化可能でなければならないという制約があるのでSerializable属性を付けます。Chatbotでは対話の状態を保存するために必要となります。IDialog<object>IDialog<T>インターフェースを実装したクラスがダイアログになります。<T>はダイアログが終了した時に戻り値として返す値の型を表し、上記の例では「object」となります。StartAsyncIDialogインターフェースはStartAsyncメソッドが開始時に呼び出されます。context.Waitダイアログは基本的にcontext.Waitメソッドにメッセージを処理するメソッドを渡す形で定義します。context.PostAsyncユーザーにメッセージを返します。context.Doneダイアログによる対話の流れが終了したらcontext.Doneメソッドでダイアログを終了します。戻り値はないので、nullを返しています。5.0から導入された、Taskクラスの構文の一つです。非同期処理のメソッドとなり、他のメソッドの終了を待つことなく独立して実行~終了されます。awaitは非同期処理の終了を待って値を取り出します。最後にTask.CompletedTaskで完了済みのTaskを取得しています。ダイアログでは非同期処理が基本となります。ダイアログのコードを詳細に理解するために、多少難しい話が続きましたが、上記の基本となるコードをテンプレートとして利用すれば、特に難しいことは気にすることなくダイアログを作成することができます。このダイアログを実行してみましょう。MessagesControllerクラス(MessagesController.cs)のPostメソッドでHelloDialogを呼び出すように変更して実行します。Dialogs.HelloDialog());HelloDialogを実行このままでは何を入力しても「こんにちは」しか返ってきませんが、ダイアログとしてはきちんと動いていることがわかります。これを元に、少しずつカスタマイズして対話らしくしていきましょう。ダイアログで対話のやり取りダイアログで対話の流れを維持しつつユーザーとやり取りをするためには、「一つの対話処理が終わったら、context.Waitメソッドで次の処理に対話を引き渡す」という作業が必要です。HelloDialogを修正して対話らしいやり取りができるようにしてみましょう。}}修正を加えたHelloDialog.csの詳細を見ていきましょう。StartAsync最初の処理としてユーザーが何か入力したら、HelloMessageメソッドを呼び出します。context.PostAsync("こんにちは!\r\n\r\nお名前は?")」であいさつと名前を尋ねるメッセージを送信します。改行は「\r\n」を2回入力します。「context.Wait(NameMessage)」で、次の処理NameMessageに対話を引き渡します。activity.Text」でユーザーが入力した名前を受け取ります。次の質問である住まいを尋ねるメッセージを送信し、PlaceMessageに対話を引き渡します。activity.Text」でユーザーが入力した地名を受け取ります。」で、これまで入力された名前と地名を含めてようこそメッセージを送信します。「context.Done<object>(null)」でダイアログを終了します。この後、ユーザーが何か入力すると初めに戻ってMessagesControllerクラス(MessagesController.cs)のPostメソッドが実行されることになります。HelloDialogが呼び出され、対話が開始されます。Chatbotと対話ができるようになってきました。チーフエグゼクティブGMOインターネットでWindowsのサービス開発運用に関わって16年、数年単位で進化し続けるMicrosoftのWindowsは新しもの好きにはたまらない製品です。自動販売機に見たことのないジュースがあれば、迷わすボタンを押します。そんなチャレンジが僕の人生を明るく、楽しくしてくれています。第10回Chatbotから話しかける(プロアクティブメッセージの送信)2018/5/18連載10回目となる今回は、Chatbotから先に話しかけるための手順を紹介します。第9回Chatbotで画像コミュニケーションを実現する2018/5/14連載9回目となる今回は、Chatbotとの文字でのやり取りに画像を追加する方法を解説します。第8回FacebookでChatbotを公開する2018/4/17連載8回目となる今回は、FacebookのMessengerを介してChatbotとやり取りする方法を解説します。Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。ITがお届けするポッドキャストです。