/TeamsBotHandsOn

Microsoft Teams と連携するBot開発をするための学習用レポジトリです

Primary LanguageC#MIT LicenseMIT

Bot Framework & LUIS で作る Microsoft Teams 連携ボット ハンズオン

Microsoft Teams と連携する Bot 開発をするための学習用レポジトリです。

お願い:このハンズオンでお気づきの点があればこのレポジトリの issue に投稿お願いいたします。このページやソースに対するプルリクエストも歓迎いたします。

ハンズオンガイド

ハンズオンの目標

このハンズオンでは、2時間を目安に初級課題の完了を目標とします。

初級課題を終えることにより、Bot Framework を使った Microsoft Teams と連携する Bot を構築することができます。初級課題を終えて時間に余裕のある方は、中級課題として LUIS の設定を行い Bot から 接続させるための API の立ち上げを行い、Bot と連携を行えるようにします。

各課題のリンク先のブログにはサンプルコードがありますので、後からじっくりと取り組んでいただくことができます。逆に、サンプルコードに目を通していただいてから各課題のブログを読んでいただいても構いません。

ハンズオンの準備

以下のページを参照して Visual Studio, Bot Framework(Bot Builder SDK), Bot Emulator による開発環境をセットアップします。

一問一答 Bot の開発 (Getting Started)

2017/05/25補足(Bot Builder SDK):最新版の Bot Builder SDK のデフォルトコードでは、MessageContoroller.cspublic async Task<HttpResponseMessage> Post([FromBody]Activity activity) の中身が await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); というシンプルな記述になっており、 RootDialog.cs に会話の処理を飛ばすような記述となっています。この準備の段階では、RootDialog.cs の存在は忘れていただいて、ブログの内容のまま MessageContoroller.cspublic async Task<HttpResponseMessage> Post([FromBody]Activity activity) 内の一部を書き換えることで進行可能です。 このデフォルトのRootDialog.csのような書き方は、初級課題2Dialog を使った”会話”の実装において await Conversation.SendAsync(activity, () => new MeetingDialog()); という形で使われています。また、初級課題3では、Bot の会話処理のルーター的な役割として RootDialog.cs がでてきます。

2017/05/25補足(Microsoft Teamsとの連携):Microsoft Teams と連携を試していただく際に、会社でお使いの Office 365 の Microsoft Teams では外部アプリの利用が止められている可能性があります。設定箇所ははじめよう Microsoft Teams 第2回“[Microsoft Teams で外部アプリを利用できるようになります] と [外部アプリのサイドローディングを利用できるようになります]” を確認してください。(設定変更にはOffice 365 の全体管理者が必要です。このハンズオン実施中で変更が難しい場合は、携帯電話があれば10分ほどで取得が可能ですので、30日間使えるOffice 365 無料使用版の取得をお勧めいたします。なお、取得するテナントのドメイン "例:abc.onmicrosoft.com" の “abc” の部分は、hackdaysbot20170523など業務とは関係ない適当なものにすることをお勧めいたします。)

ハンズオンの Bot 動作例

初級課題と中級課題を終えたときの Bot の動作例です。

(実際に課題を終えたときには、Microsoft Teams 上で動作する Bot が完成します。今回の課題では、Bot Directory を使っていただいているので Web Chat が Channel にありますのでこのような公開もできます。)

ハンズオン

初級課題

Bot Builder SDK でローカルに作成していた Bot を Azure Web Apps にアップロードします。そして、Bot Directory と Channel を使い Bot を Microsoft Teams と連携させます。

Bot の機能としては、チャットインターフェイス上で、ボタンを使ってメインメニューの機能、ホテル・旅行の予約を Bot とのチャットで行う機能を実装します。

サンプルコードでは、ControllersDialogs フォルダにあるファイルが中心となってきますので、そちらを読んでみてください。

  1. 作った Bot に Teams 経由で話しかける

  2. Dialog を使った”会話”の実装

  3. 複数の話題を扱えるBotを作る

2017/05/26補足(Botが反応しない): Microsoft Teams から Bot にチャットしても反応がない or 古いという場合があります。この場合は、Azure Web Apps を再起動すると改善される場合があります。

2017/05/26補足(自作したBotを使ってもらう): せっかく作ったBotなので他の人にも試してもらいたいと思います。初級課題1の最後に作った Bot を [Add to Teams] をクリック という操作で Microsoft Teams チャット画面で使えるようにするのですが、この時のURLを リンクをコピー などして Microsoft Teams 使える人に教えると他の人にも試してもらえます。

中級課題

はじめに、Microsoft Cogonitive Services の LUIS (Language Understanding Intelligent Service) を利用して、自然言語で Bot とやり取りできる API の準備を行います。

以下の URL に記載されている内容を参考に LUIS のセットアップを行い、入力した自然言語での問いかけへの分析結果が JSON 形式で LUIS から返されることを確認します。

  1. LUISを利用できるようにする

次に、上記手順を実施の上、TeamsBotプロジェクトを使ってBot開発をしてください。プロジェクトにLuisService.csを追加して、 App ID, App Key を埋め込むと使えるようになります。

Microsoft.Cognitive.LUIS を NuGet でインストールします。([ツール]-[NuGetパッケージマネージャー]-[ソリューションのNuGetパッケージの管理])

そして、サンプルコードを参考に、LuisService.csも作成し、 App ID と App Key を埋め込むと使えるようになります。Publish した LUIS の URL から App ID と App Key を取得する方法は以下を参照。

  • App ID : apps/の後ろから?までの文字列
  • App Key(Endpoint Key) : subscription-key=の後ろから&までの文字列

2017/5/26補足(Botが上手く反応しない1):LUIS に言葉を教え込んだ(Intents の Utterancesを増やした)のに Bot の動作が変わらない場合は、Train&Test で Train ApplicationPublish App で Publish を行ったか確認してみてください。

2017/5/26補足(Botが上手く反応しない2):LUIS への入力に対して想定された Intents が返されているのに Bot が上手く動かないという場合は、Intents の文字列と Bot 側での条件文(IfやSwitch)のところでの判定の文字列と一致しているか(特に大文字・小文字など)確認してみてください。

2017/5/26補足(Entityの活用):IntentでせっかくEntityを拾えるのだから、Entityに応じた処理をさせたいという要望が出てくるかと思います。LUIS (Language Understanding Intelligent Service) 日本語対応 ~ 解析エンジン作成&利用方法を参考にしていただくとEntityからの値の抽出方法のヒントがあるかと思います。手始めにLuisService.csGetTopIntent関数 を真似てEntityを取り出す関数を作成してみてください。以下は乱暴な記述ですがサンプルです。

public async Task<String> GetEntity(string input)
{
    LuisResult luisResult = await luisClient.Predict(input);

    var entities = luisResult.GetAllEntities();
    String entity = entities[0].Value;

    return entity;
}

上級課題

Azure ADと連携の実装や、認証情報を使って Bot から Office 365 に Microsoft Graph API 経由で接続します。

  1. Bot に Azure AD 認証/認可を組み込む
  2. Bot から Graph API を呼び出す

Azure の検索サービスである Azure Search と、NoSQL Database サービスのDocumentDB と Bot を連携させ Bot に検索機能を実装します。

  1. Botから検索できるようにする

参考情報

  • 今回のハンズオンで触っていただいた Bor Framework とはそもそも何かを把握したい方は、この "Bot Framework 概要と好きなところ" にヒントがございます。

  • コードの中で変数を活用し会話の状態を保存することができますが、Bot Framework State service という会話の中の状態を保存する機能が実はあります。その概要については "Bot State Service の用途に迫る!" を読んでみてください。

  • 上級課題の先には、Office 365 と実用レベルで連携する Bot の構築が可能です。どんなことができるかは実際に触ってみるのが早いと思います。"SecretaryBotを雇おう!" と "SecretaryBotがメディアで紹介されました"のブログには実際に Microsoft Teams から試せる SecreataryBot についての情報が記載されています。この秘書ボットは、Exchange Online の会議スケジュールを作ってくれます。ぜひ触ってみてください!

  • このハンズオンで構築した Bot を API とさらに連携してもっとできることを増やしていきましょう! この "Computer Vision API" では、Cognitive Services のひとつである Computer Vision API のサンプルを試すことができます。Microsoft Teams から Bot に対して画像をアップロードして処理させてみたりなど、Bot の適用範囲を広げることができます。