🤖

無料で手早く作る:Teams で動く FAQ bot 開発 [前編] (2021 年 12 月版)

2021/02/19に公開

Teams で動く FAQ bot 開発

『無料で手早く作る:Teams で動く FAQ bot 開発』について書きました!

ただ、これは(ハンズオン資料としても使って欲しいので)スクショを大量に入れたら
めちゃくちゃ長くなってしまったので
前編 と 後編 に分けました!

https://twitter.com/chomado/status/1362601287926259713

登場人物

  1. Azure Cognitive Service for Language の question answering 機能でナレッジベースを作り
  2. Visual Studio でクライアント (bot) を開発し
  3. それを Microsoft Azure (クラウド) でホストし
  4. Microsoft Teams で動かす

アーキテクチャ図

項目
Azure Bot Services bot の開発からどこに公開(LINE や Teams などに接続)などまで行えるマネージドサービス。今回はこの中の「Azure Bot」のリソースを作る
Azure App Services (Web Apps) web アプリの動く PaaS。bot アプリや Web API も動いてる
Microsoft Bot Framework ボット作成のための開発フレームワーク (SDK)。C#、JavaScript、Python に対応。今回は bot をこのフレームワークを使って書いた。GitHub でオープンソースで開発されている。レポジトリはこちら
Azure Cognitive Service for Language テキストを理解し分析するための自然言語処理 (NLP) 機能を提供するクラウドベースのサービス。質問と回答のペアからナレッジベースを作ってくれる機能もあり、今回それを使う

参考資料

目次

  1. 事前準備
  2. Azure で bot ホスト先を用意
  3. Azure Cognitive Service for Language の question answering 機能でナレッジベースを作る
  4. bot クライアント開発 (ここから 後半記事 )
  5. Teams と繋げる

0: 事前準備

0-1: Bot Framework Emulator のダウンロードとインストール

Bot Framework Emulator のダウンロードとインストールをしましょう。

0-1-1: Bot Framework Emulator とは?

(*゚▽゚* っ)ЗBot Framework Emulator って?」

その名の通り、エミュレータです。
Bot Framework (マイクロソフトの bot 作成フレームワーク) 製の bot を手元で開発するときに便利です。

公式ドキュメントを見てみましょう:『エミュレーターを使用したデバッグ

Bot Framework Emulator は、bot 開発者がローカルまたはリモートでボットをテストおよびデバッグできるデスクトップアプリケーションです。 エミュレーターを使用すると、bot とチャットして、bot から送受信されるメッセージを検査できます。

↓ どんな json が返ってくるとか見ながら動かせるのでめちゃ便利です

Bot Framework Emulator

0-1-2: Bot Framework Emulator のインストール

こちらのリリース一覧のページ から最新のリリース版をダウンロードしましょう。(2021 年 11 月 26 日現在、v.4.14.1 が最新)

たとえば私の環境は Windows なので、このリストの BotFramework-Emulator-4.14.1-windows-setup.exe をクリックしてインストーラーをダウンロードしました。

Bot Framework Emulator installer

Bot Framework Emulator を起動すると、このような画面になります

Bot Framework Emulator

0-2: Visual Studio のアップデート

Visual Studio Installer を開いて、Visual Studio 2022 を最新にしておきましょう

Visual Studio Installer

0-3: Azure のアカウント

Azure のアカウントをお持ちでない方は、こちらの 無料トライアルアカウント作成ページからぜひ!


https://azure.microsoft.com/ja-jp/free/search/

1. Azure で bot ホスト先を用意

1-1: リソースグループを作る

Microsoft Azure のポータル画面 portal.azure.com を開きます。

そこでこの bot 用の リソースグループ (リソース (インスタンス) をまとめるフォルダのようなもの) を新規に作りましょう。
名前は何でもいいですが、たとえば私は rg-211126-FAQBot という名前にしました。

1-2: "Web アプリ" を作る

そこの左上の + 作成 をクリック

Web アプリ」があるので、その「作成」をクリック。

bot のリソース名など適当に付けていきます。
(ただし URL の一部になるので一意になる名前にしておきましょう)

私は「app-211126-faqbot」にしました。(私はデモ用に 一意になる文字列を考えるのが面倒くさいので 全部のリソース名に日付を入れてます)

ランタイムスタックは .NET Core 3.1 を選びます。
(なぜなら現在 BotFramework SDK のテンプレートが .NET Core 3.1 のバージョンでできているからです。)

また、App Service プラン とは、アプリの載る物理サーバ的なやつです。メモリ何 GB の環境で動かす?みたいな。
料金の高めのものを選ぶとスペック高めのマシン上で bot を動かすことができます。
例えば CPU のコア数が増えたり、RAM も増えたり、「俺専用 VM」を立てられたりします。

今回は無料版(Free F1)のものを使いましょう。(もし無かったら新規作成しましょう。もし今 新規作成時に無料版を選べなくても すぐに無料版にできます(次のセクションで解説))

という、諸々を設定したら、画面下の「作成」を押します。

しばらく待つと通知欄にデプロイ完了が出るので、そこから「リソースに移動」を押しましょう。

Web アプリ (App Service) の管理画面が表示されました。

ここが、これから手元で作る Teams FAQ bot のホスト先となります。

1-3: App Service Plan を無料プランに変更

先ほど Web App Bot を作るときに一緒に新規作成した App Service Plan

bot の載る物理サーバみたいなものですが、
デフォルトだと S1 (Standard) プランが選択されています。

今回、全て無料でやりたいのであれば F1 Free plan (無料プラン) を選択しておきましょう。
(スペック高くない上に雑居サーバになるのでレスポンスはあまり早くないのですが、お試しで動かすのであればこれで大丈夫だと思います。本番運用には向いていません(マジで))

ポータル画面のトップからリソースグループに移動し、
リソース一覧をチェックします。

リソース 3 つ生えてますね。

該当の App Service Plan に移動します。

右上の方に

App Service プラン
210215TeamsFaqBotPlan (S1: 1)

と書いてありますね。
料金プランが S1 (Standard) になっています。

(*゚▽゚* っ)З 「どう違うの?」

たとえば S1 だとカスタムドメインや自動スケールに対応してたり、運用環境とテスト環境のスワッピング機能や毎日 10 回アプリのバックアップ保存してくれたり、そもそも環境がスペック違う (たとえばディスク領域は F1 は 1GB で S1 は 50GB) し (F1 プランは雑居サーバーですが) S1 は俺専用 VM 立ててくれていたりします。

F1 プランだと、上記の全てが含まれていません。
また、致命的な制限として、F1 は 60 CPU 分/日 という制限があり、要するに CPU を 1 日あたり 60 分使ったら動かなくなります。
(参照:『App Service の価格』)

でも少なくとも bot は動くのでテスト用に今回は無料プランを使おうと思います。

左側のメニューから「スケールアップ」
→「開発/テスト」
→「F1」
→「適用」

概要ページに戻ると、ちゃんと Free プランに変更されているのが確認できます

2: Azure Cognitive Service for Language でナレッジベースを作る

参考:『クイックスタート: Azure Cognitive Service for Language 質問応答

2-0: Azure Cognitive Service for Language とは?

テキストを理解し分析するための自然言語処理 (NLP) 機能を提供するクラウドベースのサービスです。
質問と回答のペアからナレッジベースを作ってくれる機能もあり、今回それを使います。

FAQ bot や "一問一答" の問い合わせの bot を作るのに大変便利です。

いくつか「質問」「その答え」を入力(ファイルで一括で入れる or URL を渡すと既存の FAQ web ページから自動スクレイピングしてくれる) すると、
学習してナレッジベースを作ってくれて、
「それっぽい」問い合わせから「この人これが聞きたいんだな」と予測し、その回答を (json で) 渡してくれます。

API を発行してくれるので、アプリ側から叩いて使う形になります。

2-1: Language Studio にアクセス

Language Studio (https://language.azure.com/) に Azure のサブスクリプションに紐づいたアカウントでログインします。

もし色々聞かれたらそのダイアログに従って素直にポチポチしていきましょう。
たしか「サブスクリプションはどれ使うの」とか「言語は何にするの?(Japanese を選びましょう)」とかだったと思います。

2-2: Custom Question Answering のリソースを作る

Answer questions(質問に回答する) セクションまで下にスクロールし、 Open custom question answering (カスタム質問と回答を開く) を選択します。

2-3: 質問のクエリに Azure (Cognitive) Search を使うので接続

リソースがまだ Azure Search に接続されていない場合は、Connect to Azure Search (Azure Search に接続する) を選択します。

Enable custom question answering(カスタム質問と回答を有効にする) を選択し、リンク先の Azure Search リソースを選択して、 適用 を選択します。

2-4: Custom Question Answering の新しいプロジェクトをつくる

Azure のポータルから Language Studio (https://language.azure.com/) に戻り、
(画面更新などした後)『+ Create new project』(新しいプロジェクトの作成) をクリックします

Language は Japanese を選択します。(FAQ の中身は日本語だと思うので)

回答が見つからなかったときの既定の回答(Default answer when no answer is returned)は
デフォルトは英語で「No answer found」(回答が見つかりませんでした) ですが、
ここも別のが良かったら適当に変えます。(後で設定から変えることもできます)

2-5: ナレッジベースの中身を作る

作成するナレッジベースのなかにデータを生やしましょう。
既存の FAQ の web ページがある場合はその URL を、無い場合はファイルを入れます。(対応するファイル形式は .tsv, .pdf, .doc, .docx, .xlsx です)

Manage sources (ソースの管理) ページ (左側にタブがある) から、
Add source (ソースの追加) > URL を選択します。

今回は例でこのページを取り込んでみたいと思います。

https://www.microsoft.com/ja-jp/software-download/faq

この URL を先ほどの URL 欄に入れます

2-6: 管理画面でテスト

取り込みと学習が終わったら
テストチャットができます

Inspect (検査) を選択して、応答を詳細に確認することもできます。
この テスト ウィンドウは、プロジェクトをデプロイする前にプロジェクトに対する変更をテストするために使用されます。

https://twitter.com/chomado/status/1463819651591274496

2-7: デプロイ

ナレッジベースを作ったので、さっそくこのプロジェクトをデプロイして、今から作る bot から接続 (参照) できるようにしましょう。

ナレッジベースのデプロイアイコン (Deploy knowledge base) を選択します。

デプロイメニューが開くので、画面ポチポチでデプロイしてください。

ちなみに、この、下に、いかにも押したくなるような「Create a bot」ボタンがありますが、
今回は 押しません

これは勝手に bot クライアント側のソースコードとか書いてくれて、本当に自動で FAQ bot をジェネレートしてくれる機能なのですが、
今回私たちは自分でコード書きたいので、
押しません。(上の Get prediction URL からエンドポイントを取ってきてクライアント側 (C#) から叩く処理を書きことになります(とはいえそれも SDK がやってくれるんだけどね))

つづく

次の記事(後編) では
クライアントのコードをガリガリ書いていきます!

GitHubで編集を提案

Discussion