どんどん賢くなるチャットボットの作り方

こんにちは、LINE株式会社でDeveloper Advocateをしている中嶋です。この記事はLINE Advent Calendar 2017の1日目の記事で、私が日頃開発しているチャットボットによく適用している、自動学習機能についてアイデアを共有したいと思います。

どんどん賢くなるチャットボットの作り方

概要

チャットボットは人のように対話できるシステム、とざっくり定義することができると思います。チャットボットの背後では、ユーザーからのメッセージに対して自然言語処理をおこなってユーザーの意図を特定し、その意図と文脈に応じて処理と返答をおこなう方式が典型的な実装の1つだと思います。

典型的なチャットボットの構成図

この仕組みで「賢くなる」には2つの側面があり、1つは理解力が高まること、もう1つはできることが増えることです。一般に、前者は自然言語処理、後者はスキルを強化していくことを意味します。

今回この記事でご紹介するのは理解力を高める方法です。自然言語処理の機能を提供するライブラリやクラウドサービスはいくつかありますが、理解力を高めるにはどれも「例文」をたくさん与えて学習させることが必要です。サービスインの時点でもある程度の例文を学習した状態のはずですが、チャットボットの運用を開始すると、想定している意図を持つメッセージであってもうまく理解できないケースが必ず発生すると思います。

このとき、例文を追加したり例文の文面を修正したりして自然言語処理の精度を上げていくことになりますが、こういう労働集約的な作業はできる限り自動化したいものです。そこでこの記事では、AIと人間のハイブリッドなチャットボットを運用していく中で、自然にチャットボットを賢くしていくアイデアをご紹介します。

ハイブリッドなチャットボット

通常チャットボットはいわゆるAIを用いて無人で対応しますが、2017年現在、AIを使って完全な自然言語処理と対応をおこなうのは容易ではありません。むしろ、処理が不完全であるという前提で開発することによって、より実践的なチャットボットを提供できるのではないかと思います。このとき選択肢として考えたいのがハイブリッドなチャットボットです。ここで言うハイブリッドとは、チャットボットの裏側で対応しているのが時にAI、時に人間ということを意味しています。

ハイブリッドなチャットボットの構成図

このチャットボットの動きを要約すると下記の動作になります。

  • チャットボットが理解できたメッセージは用意されたスキルで処理する。
  • チャットボットが理解できなかったメッセージは人間(管理者)にエスカレーションをおこない、人間(管理者)が対応する。
  • ユーザーがチャットボットの対応に満足しなかった場合、人間(管理者)にエスカレーションをおこない、人間(管理者)が対応する。

簡単に言えば、AIが対応できるものはAIが、そうでないものは人間が対応する仕組みです。完全自動化を放棄してこの構成をとるトレードオフとして、「チャットボットとは思えない、実は人間が対応してるんでしょ」とユーザーに思われるレベルのサービスを提供できます(実際人間が対応しているのですが)。

このサービスには人間が介入していますが、当然ながら、運用しつつ介入率を下げていく、つまりAIで対応できる率を上げていくことを目指したいところです。具体的には、人間が介入して対応した会話を1つずつチャットボットに学習させていけば、次第にチャットボットが賢くなっていくはずです。運用のポイントとして、「学習させるための特段の手順を介在させない」ことによって、チャットボットがどんどん賢くなる、もっと言えば自動的に賢くなるかのような仕組みを構築するのが狙いです。

具体的には、チャットボットが理解できず人間が介入した対応をAIは横目で見て自動的に学習し、次回からはAI自体で対応できるようにします。人間はそのケースに対応するだけで済み、AIに学習させる作業を意識的におこなう必要がないということです。

デモ

ではこの仕組みがどのように機能するのか、実際にLINEで動作するチャットボットで見てみましょう。FAQの質疑応答をおこなうチャットボットというユースケースで進めていきます。

まずユーザーから「LINE APIは無料で利用できますか?」と質問がありました。これは事前に想定している質問で、回答も用意してありました。チャットボットも質問を正しく理解し、自動的に回答しています。これは人間が介入せず、AIだけで対応が完結するパターンです。

次にユーザーから「Developer Trialは何か制約がありますか?」と質問がありました。この質問は想定されていなかったため、チャットボットは質問を理解できません。このときチャットボットはユーザーに「すぐ調べます。ちょっとお待ちを。」と返信しつつ、事前設定済みの管理者に対して「わからないことを聞かれました。」という旨のエスカレーションをおこなっています。

左がユーザーのLINE。右側が管理者のLINEです。

管理者はこのメッセージを受け、AIに代わって回答しています。この回答はチャットボットに送信され、チャットボットはその内容をユーザーに転送します。結果的に少し時間は要するものの、ユーザーには人間(管理者)からの回答が返信されます。このとき、チャットボットは回答をユーザーに転送すると同時に、今のQ&Aについて学習しています。

そして次に他のユーザーから同じ質問がありました。これは先ほどチャットボットがAIでは理解できなかった質問です。しかし今回は管理者にエスカレーションをかけることなく、即座にユーザーに返信できました。先ほどの人間の対応をチャットボットが自分で学習し、理解力を向上させたからです。

サンプルコード

上記の動きを実現するチャットボットのサンプルコードを下記に公開しています。このサンプルコードはNode.jsベースで、bot-expressというオープンソースのチャットボット開発フレームワークを用いて構築されています。

サンプルコード:faq-bot-sample

フレームワークの詳しい説明は割愛しますが、基本的には、自然言語解析で特定した意図に対応するスキルを、skillディレクトリ配下からピックアップして処理を実行する、という構造になっています。1つのスキルは1スクリプトファイルとしてskillディレクトリ配下に格納する形になります。

それではポイントとなる箇所をご説明していきたいと思います。

動作フロー

今回のチャットボットは自然言語処理にDialogflowを利用しています。他の自然言語処理サービスでも必要なAPIが揃っていれば同様に利用できますので、同様の機能で適宜読み替えてください。

ユーザーから受け取ったメッセージはすべて、Dialogflowを使ってまず「意図」を特定します。意図が特定されればそれに紐づく回答が返信されます。したがって、Dialogflowが意図を理解できれば機械的に対応が完了します。

意図を理解できた場合

この場合、チャットボットはskill/robot-response.jsのスキルを採用して対処します。このスキルは、Dialogflowから特定した意図とセットで返される回答文面を、そのままユーザーに返信するという処理をおこないます。

次に意図が理解できなかった場合です。チャットボットは管理者にエスカレーションをおこないます。管理者がエスカレーションに応じて回答すると、ユーザーへの返信がおこなわれると同時にDialogflowにトレーニングを実施し、質問の表現や回答文面についての学習がおこなわれます。この学習によって、次回から同様の質問があった場合、チャットボットは機械的に対応することが可能になります。

意図が理解できなかった場合

このフローの場合、チャットボットはskill/escalation.jsのスキルを採用して管理者にエスカレーションをおこないます。管理者が回答することを選択すると、今度はskill/human-response.jsのスキルを採用してユーザーへの返信とDialogflowに対するトレーニングを実施します。

仕組みはこれだけです。

まとめ

このように自然言語処理エンジン(今回の場合はDialogflow)を学習させていくことで、チャットボットの理解力が徐々に向上し、人間(管理者)が介入しなければならない事態が減少していくはずです。

少なくとも2017年現在においては、チャットボットは運用開始時点での精度を求めるよりも、「成長させていく仕組みを組み込む」という認識をもって継続的にトレーニングと改善をおこなう前提で運用をスタートする、というのが1つの現実解ではないかと思います。今回はFAQというユースケースを前提としたため、「賢くなる」ポイントをチャットボットの理解力に限ってご説明しましたが、実際には「できること」、つまりスキルを拡張していくこともチャットボットを賢くする上で不可欠な要素だと思います。

このような仕組みについても今後BlogやMeetupの場で皆さまにアイデアを共有し、ご一緒にディスカッションを深められればと思っています。

Advent Calendar、明日の記事は川田裕貴さんによる「RxJava 2とArmeriaでマイクロサービスを非同期化してみた」です。お楽しみに!

Related Post