次世代コミュニケーションツール「チャットボット」の活用 〜Azure Bot ServiceでAzureのことに何でも答えてくれるLINEボットを作る 〜【Azure Bot Service編】

こんにちは、サイオステクノロジー技術部武井です。今回は、Azure上でチャットボットを構築するサービス「Azure Bot Service」について、一筆したためたいと思います。

5回シリーズでお届けする予定で、第1回目はチャットボットサービスの概要がテーマとなります。

  1. 概要編
  2. 今回はこちら → Azure Bot Service編
  3. QnA Maker編
  4. LUIS編
  5. Azureのことに何でも答えてくれるLINEボット作る編

本シリーズの成果物は以下のGitHubにあがっております。

https://github.com/noriyukitakei/AzureFAQBot

Azure Bot Serviceとは?

ノンコーディングでチャットボットが作成できるサーバーレスなサービスです。
※でもちょっと凝ったことしようとすると、Bot Frameworkを使ったコーディングが必須です

通常、チャットボットを作る際には、RestAPIの基盤となるWebサーバー及びアプリケーションサーバー、会話のステートを格納するためのストレージ、認証基盤、チャットボットのプログラムそのものなどなど、たくさんのものが必要になります。Azure Bot Serviceは、これらのものを1つに詰め込んだ、いわゆるオールインワンパッケージなのです。

下図は、Azure Bot Serviceの構成図になります。
Screen Shot 2019-08-03 at 8.25.09

Azure Bot Serviceはいくつかの層で構成されております。

ユーザークライアント層

FacebookやLINEなどの、ユーザーがチャットボットを利用するためのツールがある層です。Webアプリケーションであればブラウザ、スマホアプリであればダウンロードしたアプリそのものになります。

Web層

ユーザーが発話したとき、その内容がユーザークライアント層にあるLINEやFacebookからHTTPリクエストとして送信されてきます。Web層は、そのリクエストを受け取る層であり、チャネルとWeb Appから構成されます。

チャネルは、LINEやFacebookからのHTTPリクエストを受け取り、後述するBot Frameworkが理解出来る形式に変換します。LINE用のチャネル、Facebook用のチャネルといった形で、様々なチャネルが用意されてます。こうすることで、Bot Frameworkをベースとした、たった1つのチャットボットアプリケーションを作るだけで、LINEやTeams、Facebookなど色々なチャットボットクライアントに対応出来るのです。実際の構成は、各チャネルごとに固有のコネクタサーバーというものがあり、LINE用のコネクタサーバーが、LINEからのリクエストを受け付けます。

そしてWeb Appの中には、Bot Frameworkという、Azure Bot Serviceを稼働させるためのコアとなるアプリケーションフレームワークがあります。通常であれば、ユーザーからの発話に対する返答、会話フローの実装、ユーザーのセッション処理などを自前で作成しなければなりませんが、この辺りの開発を楽にするライブライやクラス群を提供するのが、Bot Frameworkです。Bot Frameworkの利用言語は、C#もしくはnode.jsになります。

Cognitiveサービス層

ユーザーとの対話をより人間らしいものにするためのAIサービスが配置される層です。後述するQnA MakerやLUISなどがこの層に含まれます。

外部サービス層

多種多様な認証方式を持つIDプロバイダーであるAzure AD、Office365を始めとした様々なマイクロソフトクラウドサービスへのAPIを提供しているGraph APIなど、チャットボットが応答を返すために参照する外部サービスがこの層に含まれます。もちろんマイクロソフト以外のサービスも例外ではありません。Salesforce、サイボウズなどのサードパーティー製のサービスや、自社独自開発のWebサービスが含まれることもあります。

処理の流れ

先程の構成図に沿って、ユーザーが発話してから、チャットボットが応答を返すまでの流れを解説します。

まず、クライアント層にあるLINEやFacebookからユーザーが発話します。その発話内容は、HTTPリクエストに乗って、チャネルに届けられます。
Screen Shot 2019-08-08 at 8.58.34

チャネルは、クライアント層のFacebookやLINE固有のHTTPリクエストを、その先のWeb App上にあるBot Frameworkが理解出来る形式に変換して、Bot Frameworkに渡します。

Screen Shot 2019-08-08 at 8.58.41

Web App上のBot Framework(の上で動作するアプリ)は、チャネルからのHTTPリクエストを受け取り、必要に応じて外部サービスにアクセスします。Azure ADで認証したり、後述するQnA MakerやLUISなどのAIサービスを利用して、人間らしいレスポンスを作成します。
Screen Shot 2019-08-08 at 9.01.11

Bot Frameworkは、今までのプロセスを経て作成されたHTTPレスポンスをチャネル経由でユーザークライアント層のLINEやFacebookに返します。

Screen Shot 2019-08-08 at 8.59.12

今までの一連のフローを見て、お気付きの方もいらっしゃるとは思いますが、チャットボットの開発は、今までのWebアプリケーション開発となんら変わりはありません。

すみません。うんちくが長くなりました。次章からは実際に構築する手順をご説明しますので、まだブラウザバックしないでください。

Azure Bot Serviceを用いた構築・開発手順

では、実際にAzure Bot Serviceで簡単なチャットボット(ユーザーが発話した内容をオウム返しするだけのもの)を構築してみましょう。

構築・開発の流れは以下のようになります。

Screen Shot 2019-08-04 at 23.46.52

1.Azure Bot Serviceのリソース作成
Azureでのチャットボットアプリケーション開発に必要である、チャネルやWeb AppなどのリソースをAzureポータルから作成します。

2.ボットのソースコードのダウンロード
1で作成したAzure Bot Service上にデプロイされたチャットボットアプリケーションのソースコードをダウンロードします。

3.Visual Studioで開発
2でダウンロードしたソースコードをVisual Studioに取り込み、開発を行います。

4.Bot Framework Emulatorでテスト
3で開発したチャットボットアプリケーションを、Bot FrameworkのエミュレーターであるBot Framework Emulatorでテストをします。

5.Visual StudioからWeb Appへデプロイ
開発したチャットボットアプリケーションをVisual StudioからWeb Appへデプロイします。これでチャットボットアプリケーションは本番稼働状態となります。

では、次章より、このフローに基づいて、実際に構築・開発をしていきます。

Azure Bot Serviceのリソース作成

Azureポータルの左メニューから「リソースの作成」をクリックして表示されるテキストボックスに「bot」と入力してエンターを押します。すると以下のように「Web App Bot」と表示されますので、これをクリックします。これがAzure Bot Serviceのリソースになります。

Screen Shot 2019-08-01 at 23.58.31

 

「作成」をクリックします。

Screen Shot 2019-08-02 at 0.00.10

 

以下の画面が表示されます。

Screen Shot 2019-08-02 at 0.11.51

上図の各項目を以下の要領で入力してください。

■ ボット名
先程ご説明したWeb Appのホスト名として利用されるため、Azure全体で一意である必要があります。

■ サブスクリプション
ご利用のAzureのサブスクリプションを選択します。

■ リソースグループ
Azure Bot Serviceに利用する各種リソース(Web Appやチャネル)が配置されるリソースグループを選択します。

■ 場所
Azure Bot Serviceに利用する各種リソースが配置されるデータセンターの場所を選択します。一般的には、ユーザーが利用する場所に近い場所を選択します。

■ 価格レベル
F0とS1を選択することができます。F0はLINEやFacebook、Skypeと言った代表的なチャネル(Standardチャネル)の利用であれば、メッセージ数が無制限に利用できるプランです。ここで、メッセージ数という言葉が出てきましたが、これは、ユーザーがbot に送ったメッセージの数と、bot からユーザーに送られたメッセージ数の合算になります。つまり、以下のようなやりとりが実施された場合、メッセージ数は3 になります。

Web ChatやDirect Lineなどの一部の特別なチャネル(Premiumチャネル)は、F0のプランで10,000メッセージを超えた段階でエラーになります。このような場合は、S1プランのご検討が必要になります。ただし、S1プランは、1,000メッセージあたり課金が発生します。また、S1はF1と異なり、SLA(Service Level Agreement)が適用され、これを下回ると返金の対象になります。

■ アプリ名
ボット名と同じ値が入力されます。実際には、こちらがWeb Appのホスト名となります。

■ ボットテンプレート
ここで選択したテンプレートの内容のサンプルアプリが、自動的にWeb App上にデプロイされた状態で、Azure Bot Serviceのリソースが作成されます。ここでは、Echo Bot(ユーザーが発話した内容をおうむ返しのように返すだけのボット)を選択します。

■ App Service Plan / 場所
Web Appのプランを選択します。ここでは、あくまで検証用途なので、F0でいいと思います。

■ Azure Storage
概要編でお話しした「会話型チャットボット」では、いくつかの質問を繰り返して、初めてユーザーの意図がわかります。よって、最後の質問が終わるまで、途中の回答をどこかに保存しなければなりません。この辺り、Webアプリケーションのセッション管理と同じですよね。この「最後の質問が終わるまでの、途中の回答の保存先」をAzure Storageにすることが出来ます。ここでは、そのためのAzure Storageを選択します。新規で作成するか、既存のものを選択するかを決めることができます。

■ Application Insights
Bot Framework上で構築したチャットボットアプリケーションのアクセスログ取得やリソース監視をしたい場合は、オンにしてください。

■ Application Insightsの場所
Application Insightsが配置される場所を選択してください。利用するユーザーに近い場所が一般的にはよいかと思います。

■ MicrosoftアプリIDとパスワード
MicrosoftアプリIDとパスワードとは、平たく言ってしまえば、Azure Active DirectoryによってOpenID Connectで認証するためのクライアントIDとパスワードになります。ここで「アプリIDとパスワードの自動作成」としますと、Azure Active DirectoryにクライアントID(Azure Active Directory的にはアプリケーションIDとかMicrosoftアプリIDとか言いますが同じ意味です)とパスワードが自動的に作成されます。

そのクライアントIDとパスワードを利用すれば、OpenID Connectのフローにより、チャットボットの認証が可能になります。

具体的には、Bot Framework上のチャットボットアプリケーションの中で、ユーザーが未認証と判断した場合、MicrosoftアプリIDとパスワードによってOpenID Connectの認証エンドポイントを作成して、そこにリダイレクトして、Azure Active Directoryの認証画面を表示して、、、といった流れで認証を行います。以降はOpenID Connectのフローに従って認証します。

よって、LINEやFacebookなどの、既に認証が提供されているメッセージングプラットフォーム、もしくはWeb Chatで認証が不要な場合は、このMicrosoftアプリIDとパスワードは必要としません。今回は、認証処理は実装しませんので、「アプリIDとパスワードの自動作成」としてください(何か選ばないと先に進めないので)。

最後に「作成」をクリックして、暫く待つとリソースが作成されます。

ボットのソースコードのダウンロード

リソースグループに移動します。「種類」が「Web アプリ ボット」のものをクリックします。Screen Shot 2019-08-02 at 0.26.11

 

左メニューの「ビルド」をクリックします。「ボットのソースコードをダウンロードする」をクリックして、「はい」をクリックします。すると、チャットボットアプリケーションのソースコードをZIPしたファイルがダウンロードできます。

Screen Shot 2019-08-02 at 0.28.49

 

Visual Studioを起動します(今回のバージョンは2019です)。以下の画面が表示されますので、「プロジェクトやソリューションを開く」をクリックします。

Screen Shot 2019-08-05 at 0.35.02

 

先程ダウンロードしたソースコードを解凍して、「EchoBot.sln」を開きます。

Screen Shot 2019-08-05 at 0.35.23

 

こんな感じになります。

Screen Shot 2019-08-07 at 20.10.15

 

主要なソースコードをご説明致します。Bot Frameworkは.NET Coreがベースになっております。.Net Coreの詳細は、ブログ「多分わかりやすいASP.NET Core Webアプリケーション」をご参照下さい。

まずはC#のプログラムのエントリポイントProgram.csからです。

 

次にStartup.csです。

 

チャットボットアプリケーションのAPIのコントローラーであるBotController.csです。

 

Bot FrameworkをベースとしたチャットボットアプリケーションのコアなクラスであるEchoBot.csです。

 

今回Azure Active Directoryによる認証は使わないので、appsettings.jsonのMicrosoftAppIdとMicrosoftAppPasswordは空にします。空にしないと後述するBot Emulator起動時に、MicrosoftAppIdとMicrosoftAppPasswordを入力しなければいけないのですが、それはめんどくさいので。

Visual Studioでの開発

先程Visual Studioに取り込んだソースコードを、要件に応じて、適宜機能追加・修正します。

Bot Framework Emulatorでテスト

Bot Framework Emulatorというものを使うと、ローカルでチャットボットアプリケーションのテストが可能です。以下のURLからBot Framework Emulatorをダウンロードして下さい。

https://github.com/Microsoft/BotFramework-Emulator/releases/

MacやWindowsなど各環境に合わせたものをダウンロードしてインストールして下さい。ウィザードに従えば猿でもインストールできます。

Visual Studioで先程のEchoBotを起動します。

Screen Shot 2019-08-07 at 21.09.51

 

するとブラウザが起動します。Bot URL(以下ではhttp://localhost:3978/api/messagesですが環境によって変わるかもしれません)をメモします。

Screen Shot 2019-08-07 at 21.14.27

そして次にBot Framework Emulatorを起動します。「Open Bot」をクリックします。

Screen Shot 2019-08-07 at 21.25.16

 

「Bot URL」に先程メモしたBot URLを入力して、「Connect」をクリックします。

Screen Shot 2019-08-07 at 21.26.14

 

先程Visual Studioに取り込んだEchoBotがBot Framework Emulatorの中で起動します。「Type your message」と書いてあるテキストボックスの中にメッセージを入れてエンターすると、オウム返ししてくれます。素晴らC。

Screen Shot 2019-08-07 at 21.30.02

Visual StudioからWeb Appへデプロイ

Visual StudioからWeb Appにデプロイします。ソースコードの改修が終わって本番に反映するフェーズですね。

Visual Studioからプロジェクトを右クリックして「発行」をクリックします。

Screen Shot 2019-08-08 at 7.16.11

 

「開始」をクリックします。

Screen Shot 2019-08-08 at 7.16.45

 

「既存のものを選択」にチェックして、「発行(U)」をクリックします。

Screen Shot 2019-08-08 at 7.17.05

 

適切なサブスクリプション、リソースグループを選択し、先程作成したWeb Appを選択して、「OK(O)」をクリックします。

IMG_0870

 

「出力」のウィンドウに以下のように表示されれば成功です。

Screen Shot 2019-08-08 at 7.42.14

 

デプロイしたチャットボットアプリケーションをAzureポータルからテストできます。

Screen Shot 2019-08-08 at 7.25.02

これでデプロイできました。簡単ですね。

補足:BotAdapterについて

こちらは補足的なものですが、Bot Frameworkでも一番重要と思われるBotAdapterのソースを見てみました。きっかけは、Startup.csでDIしているAdapterWithErrorHandlerってなんだろうと疑問に思ったことです。

 

どうやら以下のようなクラス構成になっているようです。

Screen Shot 2019-08-08 at 7.48.00

ではAdapterWithErrorHandlerクラスから見てみたいと思います。

 

OnTurnErrorってなんでしょうか?名前とソースコードから想像するに、ユーザーがメッセージを発話したときのエラー処理を代入するDelegateのようですが、、、。

ということで継承元の一番上のBotAdapterまで辿ってみます。

OnTurnErrorという変数がありました。やっぱDelegate型の変数のようです。同クラスの中に以下のようなメソッドがありました。

 

なんとなくExceptionをcatchしてOnTurnErrorをInvokeしているところから、メッセージが発話したときの例外処理をしているように見えます。じゃぁ、RunPipelineAsyncって何しているんだろう、、、ていうのは次の機会に分析してみたいと思います(´・ω・`)中途半端ですみません。

まとめ

Bot Frameworkを使うと、とても簡単にチャットボットアプリケーションの開発ができることが、おわかりいただけかと思います。ステキですね。もうBot Frameworkなしでは生きていけません。No Bot Framework, No Life!!

次回は、QnA Maker編になります!!

 

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*