0こんにちは、サイオステクノロジー技術部武井です。Service」について、一筆したためたいと思います。5回シリーズでお届けする予定で、第1回目はチャットボットサービスの概要がテーマとなります。本シリーズの成果物は以下のGitHubにあがっております。Serviceとは?ノンコーディングでチャットボットが作成できるサーバーレスなサービスです。Frameworkを使ったコーディングが必須です通常、チャットボットを作る際には、RestAPIの基盤となるWebサーバー及びアプリケーションサーバー、会話のステートを格納するためのストレージ、認証基盤、チャットボットのプログラムそのものなどなど、たくさんのものが必要になります。Serviceは、これらのものを1つに詰め込んだ、いわゆるオールインワンパッケージなのです。Serviceの構成図になります。Serviceはいくつかの層で構成されております。ユーザークライアント層FacebookやLINEなどの、ユーザーがチャットボットを利用するためのツールがある層です。Webアプリケーションであればブラウザ、スマホアプリであればダウンロードしたアプリそのものになります。Web層ユーザーが発話したとき、その内容がユーザークライアント層にあるLINEやFacebookからHTTPリクエストとして送信されてきます。Appから構成されます。Frameworkが理解出来る形式に変換します。LINE用のチャネル、Facebook用のチャネルといった形で、様々なチャネルが用意されてます。Frameworkをベースとした、たった1つのチャットボットアプリケーションを作るだけで、LINEやTeams、Facebookなど色々なチャットボットクライアントに対応出来るのです。実際の構成は、各チャネルごとに固有のコネクタサーバーというものがあり、LINE用のコネクタサーバーが、LINEからのリクエストを受け付けます。Serviceを稼働させるためのコアとなるアプリケーションフレームワークがあります。Frameworkです。Frameworkの利用言語は、C#もしくはnode.jsになります。Cognitiveサービス層ユーザーとの対話をより人間らしいものにするためのAIサービスが配置される層です。MakerやLUISなどがこの層に含まれます。APIなど、チャットボットが応答を返すために参照する外部サービスがこの層に含まれます。マイクロソフト以外のサービスも例外ではありません。Salesforce、サイボウズなどのサードパーティー製のサービスや、自社独自開発のWebサービスが含まれることもあります。処理の流れ先程の構成図に沿って、ユーザーが発話してから、チャットボットが応答を返すまでの流れを解説します。クライアント層にあるLINEやFacebookからユーザーが発話します。その発話内容は、HTTPリクエストに乗って、チャネルに届けられます。Frameworkに渡します。Framework(の上で動作するアプリ)は、チャネルからのHTTPリクエストを受け取り、必要に応じて外部サービスにアクセスします。MakerやLUISなどのAIサービスを利用して、人間らしいレスポンスを作成します。Frameworkは、今までのプロセスを経て作成されたHTTPレスポンスをチャネル経由でユーザークライアント層のLINEやFacebookに返します。今までの一連のフローを見て、お気付きの方もいらっしゃるとは思いますが、チャットボットの開発は、今までのWebアプリケーション開発となんら変わりはありません。うんちくが長くなりました。次章からは実際に構築する手順をご説明しますので、まだブラウザバックしないでください。Serviceで簡単なチャットボット(ユーザーが発話した内容をオウム返しするだけのもの)を構築してみましょう。構築・開発の流れは以下のようになります。AppなどのリソースをAzureポータルから作成します。Service上にデプロイされたチャットボットアプリケーションのソースコードをダウンロードします。Studioに取り込み、開発を行います。Emulatorでテストをします。Appへデプロイします。これでチャットボットアプリケーションは本番稼働状態となります。次章より、このフローに基づいて、実際に構築・開発をしていきます。Serviceのリソース作成Azureポータルの左メニューから「リソースの作成」をクリックして表示されるテキストボックスに「bot」と入力してエンターを押します。Bot」と表示されますので、これをクリックします。Serviceのリソースになります。「作成」をクリックします。以下の画面が表示されます。上図の各項目を以下の要領で入力してください。Appのホスト名として利用されるため、Azure全体で一意である必要があります。サブスクリプションご利用のAzureのサブスクリプションを選択します。Appやチャネル)が配置されるリソースグループを選択します。Serviceに利用する各種リソースが配置されるデータセンターの場所を選択します。一般的には、ユーザーが利用する場所に近い場所を選択します。価格レベルF0とS1を選択することができます。F0はLINEやFacebook、Skypeと言った代表的なチャネル(Standardチャネル)の利用であれば、メッセージ数が無制限に利用できるプランです。ユーザーに送られたメッセージ数の合算になります。Lineなどの一部の特別なチャネル(Premiumチャネル)は、F0のプランで10,000メッセージを超えた段階でエラーになります。このような場合は、S1プランのご検討が必要になります。S1プランは、1,000メッセージあたり課金が発生します。Agreement)が適用され、これを下回ると返金の対象になります。アプリ名ボット名と同じ値が入力されます。Appのホスト名となります。Serviceのリソースが作成されます。Bot(ユーザーが発話した内容をおうむ返しのように返すだけのボット)を選択します。Appのプランを選択します。ここでは、あくまで検証用途なので、F0でいいと思います。Storage概要編でお話しした「会話型チャットボット」では、いくつかの質問を繰り返して、初めてユーザーの意図がわかります。よって、最後の質問が終わるまで、途中の回答をどこかに保存しなければなりません。この辺り、Webアプリケーションのセッション管理と同じですよね。Storageにすることが出来ます。Storageを選択します。新規で作成するか、既存のものを選択するかを決めることができます。Framework上で構築したチャットボットアプリケーションのアクセスログ取得やリソース監視をしたい場合は、オンにしてください。Insightsが配置される場所を選択してください。利用するユーザーに近い場所が一般的にはよいかと思います。Connectで認証するためのクライアントIDとパスワードになります。Directory的にはアプリケーションIDとかMicrosoftアプリIDとか言いますが同じ意味です)とパスワードが自動的に作成されます。Connectのフローにより、チャットボットの認証が可能になります。Directoryの認証画面を表示して、、、といった流れで認証を行います。Connectのフローに従って認証します。Chatで認証が不要な場合は、このMicrosoftアプリIDとパスワードは必要としません。今回は、認証処理は実装しませんので、「アプリIDとパスワードの自動作成」としてください(何か選ばないと先に進めないので)。最後に「作成」をクリックして、暫く待つとリソースが作成されます。ボットのソースコードのダウンロードリソースグループに移動します。ボット」のものをクリックします。左メニューの「ビルド」をクリックします。「ボットのソースコードをダウンロードする」をクリックして、「はい」をクリックします。すると、チャットボットアプリケーションのソースコードをZIPしたファイルがダウンロードできます。Studioを起動します(今回のバージョンは2019です)。以下の画面が表示されますので、「プロジェクトやソリューションを開く」をクリックします。先程ダウンロードしたソースコードを解凍して、「EchoBot.sln」を開きます。こんな感じになります。主要なソースコードをご説明致します。Coreがベースになっております。Webアプリケーション」をご参照下さい。C#のプログラムのエントリポイントProgram.csからです。プログラムのエントリポイントです。チャットボットアプリケーションは起動します。Webアプリケーションを起動するために使用するWebサーバーの設定を定義します。Webアプリケーションの起動シーケンスです。Webサーバーの起動に必要な情報を定義します。いうメソッドは、一般的なWebサーバーの定義をやってくれています。このあたりの詳細は以下のブログを参考にしてください。プログラムのエントリポイントです。チャットボットアプリケーションは起動します。Webアプリケーションを起動するために使用するWebサーバーの設定を定義します。Webアプリケーションの起動シーケンスです。Webサーバーの起動に必要な情報を定義します。いうメソッドは、一般的なWebサーバーの定義をやってくれています。このあたりの詳細は以下のブログを参考にしてください。=>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();}}次にStartup.csです。DIコンテナから取得してます。Coreが自動でDIコンテナに入れてくれています。COnfigurationのプロパティを定義しています。プロパティの詳細は以下のブログにて。利用するIBotFrameworkHttpAdapterインターフェースの実装をDIしています。詳細に記述したクラスです。ここで行われているDIについては、以下のブログを参考にしてください。IBotインターフェースを実装したEchoBotをDIしています。メッセージを受信したときの実際の処理を記述します。そのまま変える処理をEchoBotに実装しています。EchoBotについては後述します。DIコンテナから取得されます。※どうしてTransientなのかというのがちょっと疑問です。Coreのランタイムから呼ばれるメソッドで、HTTPのリクエストパイプラインを設定します。詳細は以下のブログを見てください。詳細なエラーメッセージを出力するという設定です。env.IsDevelopmentメソッドで判定が出来ます。Developmentの他にもStaging、Productionという設定を標準でサポートしています。HTTPではないリクエストをHTTPSにリダイレクトする設定です。特定のディレクトリ(デフォルトはwwwroot)配下のファイルを静的コンテンツとして扱えるようにします。最初に見つかったものを表示させる設定です。CoreのMVCを使う設定です。DIコンテナから取得してます。Coreが自動でDIコンテナに入れてくれています。COnfigurationのプロパティを定義しています。プロパティの詳細は以下のブログにて。利用するIBotFrameworkHttpAdapterインターフェースの実装をDIしています。詳細に記述したクラスです。ここで行われているDIについては、以下のブログを参考にしてください。IBotインターフェースを実装したEchoBotをDIしています。メッセージを受信したときの実際の処理を記述します。そのまま変える処理をEchoBotに実装しています。EchoBotについては後述します。DIコンテナから取得されます。※どうしてTransientなのかというのがちょっと疑問です。Coreのランタイムから呼ばれるメソッドで、HTTPのリクエストパイプラインを設定します。詳細は以下のブログを見てください。詳細なエラーメッセージを出力するという設定です。env.IsDevelopmentメソッドで判定が出来ます。Developmentの他にもStaging、Productionという設定を標準でサポートしています。HTTPではないリクエストをHTTPSにリダイレクトする設定です。特定のディレクトリ(デフォルトはwwwroot)配下のファイルを静的コンテンツとして扱えるようにします。最初に見つかったものを表示させる設定です。CoreのMVCを使う設定です。app.UseMvc();}}}チャットボットアプリケーションのAPIのコントローラーであるBotController.csです。チャットボットアプリケーションのHTTPエンドポイントです。呼び出されるクラスであり、チャットボットアプリケーション唯一のHTTPエンドポイントです。DIコンテナから取得しています。PostメソッドでHTTPリクエストが送信されたときに呼び出されるメソッドです。IBotFrameworkHttpAdapterに定義されているメソッドです。チャットボットアプリケーションのHTTPエンドポイントです。呼び出されるクラスであり、チャットボットアプリケーション唯一のHTTPエンドポイントです。DIコンテナから取得しています。PostメソッドでHTTPリクエストが送信されたときに呼び出されるメソッドです。IBotFrameworkHttpAdapterに定義されているメソッドです。FrameworkをベースとしたチャットボットアプリケーションのコアなクラスであるEchoBot.csです。ユーザーが発話したメッセージを処理するクラスです。ActivityHandlerを継承します。ActivityHandlerは実際にはIBotインターフェースを実装しています。ユーザー(相手や自分も含む)が発話を行なったときに呼ばれるメソッドです。様々な情報が入っています。以下のブログを参考にしてください。SendActivityAsyncはメッセージを送信するメソッドです。turnContext.Activity.Textにはユーザーが発話したメッセージそのものが入っています。関係がないので、説明を割愛致します。ユーザーが発話したメッセージを処理するクラスです。ActivityHandlerを継承します。ActivityHandlerは実際にはIBotインターフェースを実装しています。ユーザー(相手や自分も含む)が発話を行なったときに呼ばれるメソッドです。様々な情報が入っています。以下のブログを参考にしてください。SendActivityAsyncはメッセージを送信するメソッドです。turnContext.Activity.Textにはユーザーが発話したメッセージそのものが入っています。関係がないので、説明を割愛致します。Directoryによる認証は使わないので、appsettings.jsonのMicrosoftAppIdとMicrosoftAppPasswordは空にします。Emulator起動時に、MicrosoftAppIdとMicrosoftAppPasswordを入力しなければいけないのですが、それはめんどくさいので。Emulatorというものを使うと、ローカルでチャットボットアプリケーションのテストが可能です。Emulatorをダウンロードして下さい。https://github.com/Microsoft/BotFramework-Emulator/releases/MacやWindowsなど各環境に合わせたものをダウンロードしてインストールして下さい。ウィザードに従えば猿でもインストールできます。Studioで先程のEchoBotを起動します。するとブラウザが起動します。URL(以下ではhttp://localhost:3978/api/messagesですが環境によって変わるかもしれません)をメモします。Emulatorを起動します。Bot」をクリックします。URLを入力して、「Connect」をクリックします。Emulatorの中で起動します。message」と書いてあるテキストボックスの中にメッセージを入れてエンターすると、オウム返ししてくれます。Appにデプロイします。ソースコードの改修が終わって本番に反映するフェーズですね。Studioからプロジェクトを右クリックして「発行」をクリックします。「開始」をクリックします。「既存のものを選択」にチェックして、「発行(U)」をクリックします。Appを選択して、「OK(O)」をクリックします。「出力」のウィンドウに以下のように表示されれば成功です。デプロイしたチャットボットアプリケーションをAzureポータルからテストできます。これでデプロイできました。Frameworkでも一番重要と思われるBotAdapterのソースを見てみました。きっかけは、Startup.csでDIしているAdapterWithErrorHandlerってなんだろうと疑問に思ったことです。AdapterWithErrorHandler>();どうやら以下のようなクラス構成になっているようです。AdapterWithErrorHandlerクラスから見てみたいと思います。{e.Message}");}}};}}}OnTurnErrorってなんでしょうか?名前とソースコードから想像するに、ユーザーがメッセージを発話したときのエラー処理を代入するDelegateのようですが、、、。いうことで継承元の一番上のBotAdapterまで辿ってみます。}OnTurnErrorという変数がありました。Delegate型の変数のようです。同クラスの中に以下のようなメソッドがありました。cancellationToken).ConfigureAwait(false);}}}なんとなくExceptionをcatchしてOnTurnErrorをInvokeしているところから、メッセージが発話したときの例外処理をしているように見えます。́・ω・`)中途半端ですみません。Frameworkを使うと、とても簡単にチャットボットアプリケーションの開発ができることが、おわかりいただけかと思います。Frameworkなしでは生きていけません。雑誌等の執筆依頼を受付しております。役に立たなかった1人がこの投稿は役に立ったと言っています。コメントをキャンセルメールアドレスは表示されません。Reserved.本サイトに掲載されている社名、製品名、サービス名等は各社の商標または登録商標です。プライバシーポリシーお問い合わせ。