まくろぐ
更新: / 作成:

とある事情によりチャットボットを作ろうという話になっています。 まずは、チャットボットってどんなことに気を付けて作ればよいかを調べたので、ポイントになりそうなことをまとめておきます。

下記の Microsoft が提供している Bot Framework のドキュメントがとても参考になりました。

参考: Principles of bot design - Bot Service | Microsoft Docs

チャットボットの知識は、今流行りのスマートスピーカー(Amazon Alexa や Google Home)などのスキルを作成する際にも応用がききそうです。 音声入力による会話は、チャットの特殊形態(キーボードやモニタがないときの手段)と考えることができるので、チャットボットの基本原則を押さえておくことはきっと参考になります。

チャットボットが目指すべきこと

こだわるべき事

  1. 少ないステップで簡単に問題を解決できること
  2. 他の手段よりもチャットボットを使ったほうが速く、簡単で、よりよい結果を得られること
  3. ユーザが**使いたい環境(クライアント)**で動作すること
  4. ユーザがボットの存在に気付けること。それを使って何をすればよいのか気付けること

何より大切なのはユーザーエクスペリエンスです。 めっちゃ賢い AI を使っているかどうかではなく、ユーザがやりたいことを素早く、簡単に行えるかが重要です。

こだわらなくてよい事

  1. 機械学習は必須ではない。めっちゃ賢いボットは必須ではない。
  2. 完璧に自然言語を理解して会話できる必要はない。
  3. ボイス対応により必ず UX が改善されるわけではない。ボイスを嫌うユーザはいるし、ノイズの多い環境では使えない。

大切なのは技術力とかクールさとかではなく、ユーザのやりたいことができることです。

最初の挨拶は「自然言語」か「メニュー選択」か?

どんな話しかけにも反応できるボットは存在しません(少なくとも現在は)。 ユーザは、ボットが何をできるのか知らないので、できることの選択肢を表示してあげるとよいです。

選択肢が少なければボタンを並べて、それを押すだけで会話を進められるようにすると、ユーザの入力の手間を大幅に削減することができます。 できることがたくさんあるのであれば、選択肢として「ヘルプ」ボタンを配置して、より詳しい使い方を提示してあげましょう。

/p/o2nq2qa/chatbot-menu.png
図: 最初のメッセージの例

一般的に、自由回答形式の質問 (open-ended question) はユーザーの返答を予測できないので、選択回答形式の質問 (closed-ended question) を使用した方がボットの設計者にとっても望ましいといえます。 見栄を張ってどんな会話でもできる賢いボットを作ろうとするのではなく、できることを明確に示して上げたほうがユーザにとっても使いやすいボットができるでしょう。

プライバシーポリシーの表示

ユーザが「個人情報保護に関する方針と利用規約」(Privacy policy and terms of use) にアクセスできるようにしておくのが望ましいです。 特に、チャットボットサービスを介して個人情報を収集するのであれば、このような表示は必須になります。

会話 (Dialog) のスタック構造という罠

チャットボットのフレームワーク内部では、会話の流れは Dialog(会話)といった単位で管理されます。 一般的に、ユーザとの会話は、GUI アプリケーションのウィンドウと同様に、Dialog(会話)のスタック構造で管理されます。 つまり、ウィンドウを開いたり閉じたりするのと同様に、次の会話内容へ進んだり、前の会話内容へ戻ったりします。

/p/o2nq2qa/chatbot-stack.png

ただし、、、ユーザにはこのようなスタック構造で会話しているという意識はありません。 ユーザは本当に気まぐれなので、こんなきれいに会話が進むことはありません

/p/o2nq2qa/chatbot-stack2.png

チャットボットのアンチパターン

(1) 頑固なボット (The stubborn bot)

ユーザが別のことをしたいのに、ボットが現在のシナリオが完了するまで強引に会話を進めようとしてしまう。

ボット「どちらまで行きますか?」
ユーザ「やっぱりやめます」

ボット「分かりませんでした。どちらまで行きますか?」
ユーザ「キャンセル」

ボット「分かりませんでした。どちらまで行きますか?」
ユーザ「終了」

ボット「分かりませんでした。どちらまで行きますか?」
ユーザ「キャンセルしてください。会話を終了してください。もういいです。何もしないでください。」

教訓

  • ユーザがやりたいことを途中で変えられるようにしよう。
  • ユーザの発言を無視して、同じ質問を繰り返すのはやめよう。少なくともリトライ回数の上限を設定しよう。

(2) 無知なボット (The clueless bot)

ユーザが別の意図で入力したキーワードを、現在の質問への回答だと判断して処理を進めてしまう。

ボット「好きな映画のジャンルを入力してください」
ユーザ「help」

ボット「好きなジャンルとして help を登録しました。それではお楽しみください」
ユーザ「ちょっと待って」

教訓

  • help(ヘルプ)、cancel(キャンセル)、start over(やり直し)といった入力に対して、割り込んで応答するミドルウェアを導入しよう。
  • 各々の会話 (dialog) ごとに、認識しなければならないキーワードをリスト管理するのやめよう。いつでも使えるマジックワードは、共通のミドルウェアで処理すると楽。

(3) 謎めいたボット (The mysterious bot)

会話中に急にボットからの反応がなくなってしまう。

ボット「こんにちは。ご用件をどうぞ」
ユーザ「今週はどんな映画をやっていますか?」

ユーザ「こんにちは」

ユーザ「今週上映される映画は何がありますか?」

ユーザ「ボットさん、いますか?」

教訓

  • ボット側で時間がかかるかもしれない処理を開始する前には、ユーザに何らかの反応を返しておこう。
  • ボットフレームワークの提供する typing メッセージ機能 (typing indicator) を利用しよう。このメッセージ返すことで、ユーザのチャット UI 上に「入力中です」と表示される。

(4) わざわざ言うボット (The captain obvious bot)

Captain obvious というのは、分かり切ったことをわざわざ言う人のことです。

ボット「また1万円も課金しちゃいましたね」
ユーザ「そうだね。。。」

ボット「いまオフィスに向かっていますね」
ユーザ「そのとおり。。。」

ボット「オフィスに着きましたね。これから一日仕事ですね」
ユーザ「もう!ほっといてくれ!」

教訓

  • ユーザにとって有益な情報を提供しよう(そのボットは何のためのもの?)

(5) 忘れられないボット (The bot that can’t forget)

昔の会話で入力した内容を、今回の会話でも有効な情報として使おうとしてしまう。

ユーザ「旅行に行きたいんだ。イタリアへ。」

ボット「ラスベガスへの交通費は $200 かかります。よろしいですか?」
ユーザ「ラスベガス???」

ボット「あなたは1月5日にラスベガス行きのチケットを予約しました」
ユーザ「あぁ、半年前の話ね。。。」

教訓

  • ユーザが以前の話題を持ち出そうとしない限り、今回開始した話題に集中すること。

例外的な割り込みに対応するミドルウェア

ユーザからの特殊な入力に対して「割り込んで」反応するミドルウェアを導入することで、ボットの強引さをいくらか軽減することができます。 具体的には、ユーザから下記のような入力があった場合に、現在の会話への応答として処理するのではなく、例外的な特殊コマンドとして処理するようにします。

  • cancel: 処理を中断する
  • help: システムの使い方を表示する(処理は継続する)
  • more info: 現在のコンテキストに沿って詳しい情報を表示する(料理メニューの一覧とか、電話番号でも予約できます、とか)

これらの振る舞いは、特定の話題に結び付いたものではなく汎用的に使用できるものなので、ミドルウェアとしての実装は一種類だけで済みます。 これらの簡単なコマンドを実装するだけで、ユーザが路頭に迷ってしまうリスクを下げることができます。

ミドルウェアに認識できない入力が来た場合は、現在の会話への入力なのだと判断して、通常通りのコンテキストに応じた処理を行います。 それでも認識できないユーザ発言が繰り返されるようでしたら、最終的にはメインメニューの表示へフォールバックさせます。

具体的な質問 (specific question) で揺らぎのある回答を防ぐ

ボットがユーザ発話を自然言語処理する際には、正規表現や LUIS などの文章解析サービスが利用されます。 しかし、高度な言語処理を実装するのはとても大変な作業です。 それよりも、ユーザがあいまいな返答をしないようにうまく質問で誘導することで、自然言語処理の手間を省くということを考慮すべきでしょう。

悪い例

ボット「あなたの名前は何ですか?」
ユーザ「私は山田です」

ボット「こんにちは、“私は 山田”さん」

よい例

ボット「名前を入力してください(入力例: 山田 太郎)」
ユーザ「山田 花子」

ボット「こんにちは、“山田 花子”さん」

このように、入力例を示すというのはとても効果的です。 他にも、次のように入力の例を複数示したり、受け付けるフォーマットを示すのもよいでしょう。

  • 「どこが痛いですか?(入力例: 肩/頭/腕/ひざ)」
  • 「誕生日はいつですか? (yyyy/MM/dd)」

このような例示では完ぺきではないという人もいるかもしれませんが、何も示さずに自由回答形式で質問するよりは100倍マシです。

高度なサービスを制御するための入り口として使用する

専門的な用途に特化したボットであれば、コマンド入力専用の構文を用意しておくのもよい考えです。

DebOps ボットの例

ユーザ「/STOP VM XYZ」
ボット「仮想マシン "XYZ" を停止します」

ユーザ「/START VM ABC」
ボット「仮想マシン "ABC" を起動します」

このようなコマンドを用意することで、ネット上に構築された高度なサービスを利用するための、敷居の低い入口としてチャットクライアントを使用できるようになります。

ネット上のサービスは常に進化を続け、できることはどんどん増えていきます。 チャットボットをサービス操作のインターフェイスとして配置すれば、チャットボットが最初にユーザに挨拶をするときにサービスの最新情報を伝えることができます。 また、ユーザは help と入力するだけで、いつでも最新の機能を把握することができます。

関連記事

まくろぐ
サイトマップまくへのメッセージ