Bluemix
Watson
ibmcloud

いまさら聞けない!? 簡単にチャットボットをつくれる「Watson Assistant」の基礎知識【2018/7月時点】

image

:new: はじめに ~ Converstaionは Watson Assistantになりました

こんにちわ!石田です。既に皆様ご存知かと思いますが、2018/3月にAIチャットボット・サービスであるWatson Conversationが進化して、名前もWatson Assistantに変わりました。ついては以前Qiitaに書いたWatson ConversationのTipsの記事をアップデートしたのですが、長くなったので「入門・基礎・まずはこの辺を押さえて頂ければ」的な内容を「いまさら」記事として切り出すことにしました。「チャットボットには興味があるけど、Watson ConversationもWatson Assistantもぜんぜん知らない」という方を想定して「要はこんなもの」と思っていただくための記事です。

:triangular_flag_on_post: 「やってみた」系はドキュメントの「 概説チュートリアル」をはじめ、ネット上に色々にありますので割愛します。当記事は「用語」や「仕組み」の紹介が中心ですので、当記事を一通り読まれてから上記のチューリアルをやると、ご理解が早いかもしれません。

:clock1: Watson Assistantって何? ~ 一分間ピッチ

  • 昨今流行のチャットボットを簡単に作れるIBMのAI/クラウドサービスです
  • 以前はWatson Conversationと呼ばれていました
  • 日本語が使えます。「です/ます」他、日本語特有の表記の揺らぎも吸収します
  • 企業/ビジネスでの利用を想定しています(=だらだらした世間話は苦手です)
  • お客様ドメインでのチャット/対話を簡単に素早く組み立てられます
  • ボットの作成やトレーニングにプログラムやコーディングは不要です
  • パブリック・クラウドなので、コスト面でスモール・スタートできます
  • サンプル類が付いているので時間面でファースト・スタートできます
  • 日本・世界中で事例や実績がたくさんあります

:chart_with_upwards_trend: Watson Assistantまでの道のり

image

Watsonでのチャットボット機能がAssistantになるまでには、過去、様々な変遷を辿ってきました. まずはその歴史を簡単におさらいします

  • 第一世代はインテントを扱うNLCと対話を扱うDialogという2つのサービスで構成していました。Dialogは対話をXMLで記述する必要があり、かなり面倒でした。NLCはチャットボット以外にFAQ検索システム向けに使われることも多いです。その後、Dialogは廃止されましたがNLCは現在も現役です。
  • 第二世代ではNLCとDialogが統合されConversationになりました。UIパネルで対話を簡単に定義でき、非常に使いやすくなりました。さらにチャットでの業務層を提供するVirtual Agent、音声や電話との統合なども進みました。Watsonのチャットボットはここで一気に花開いた印象です。
  • 第三世代では、2018/3にConversationとVirtual Agentが統合され、Assistantになりました。Assistantは技術的にはConversationの上位互換なので、Conversationからの移行は不要です。さらに(英語:flag_us:の世界では) Assistant Solutionsとして自動車、ホテル向けなどの業種別チャットボットを提供し、チャットボット開発の生産性向上と投入までの時間短縮を目指していきます。

:beginner: チャットボットとWatson Assistantのしくみ概要

チャットボットの全体図

image

  • 利用者は何らかのユーザーインターフェース(テキスト/音声など)を介して、バックエンドの会話エンジンと会話します
  • Watson Assistantはチャットボットの脳に相当する「会話エンジン」部分を提供するサービスです。チャット用のユーザーインターフェースはご提供しません
  • 逆に言うと、チャットのためのユーザーインターフェースはオープンであり、自作でもSlackやSkype/Facebook Messengerなどの既存のサービスでも、好きなものをお使い頂けます。Slackなどの既存サービスと統合する場合は、WatsonのBotKitなどを使えば、殆どの場合、設定だけで済みます。(=コーディングや開発が不要です)
  • Watson Assistantの機能はREST APIで簡単に呼び出して使えます。RESTで呼び出せばいいので、呼び出す側のアプリケーションはお好きな言語・お好きなランタイム・お好きな場所でオーケーです。他のWatsonサービスやバックエンド・システムとの連携が必要な場合は、フロントの自作アプリケーションで呼び出しを行ってください。(=Watson Assistantとして様々なバックエンド・アプリを統合する包括的なしくみやフレームワークは今は提供していません)
  • フロントのアプリケーションを介在させず、Assistantからサーバーレス・アプリケーションのフレームワークであるIBM Cloud Functions(Open Whisk)を介して他のサービスを呼び出すことも可能1です。

:new: 新しい概念: 「スキル」と「アシスタント」

Watson Assistantでの対話の流れ

image

上記は全体図の赤枠部分=Watson Assistantでの対話の流れを簡単にご説明する絵です。

  • Watson Assistantは1つのインスタンス(サービス)で複数のワークスペースをホストできます。「ワークスペース」とはチャットボットの扱う領域・ドメインのようなものです。たとえば「パソコンの修理」や「お天気」や「出張手続き」などは各々が「ワークスペース」と言えます。これらはチャットボットの扱う領域・ドメインが違うので、普通は別々のワークスペースに分けておくのがよいでしょう。(この3つを強引に1つの「ワークスペース」に押し込んでしまうことも技術的には可能ですが、不適切かと思います)

  • 利用者またはアプリが「パソコンが壊れました」などの「発話(Utterance)」をすると、Watson Assistantはその発話(文章)から意図(インテント)対象(エンティティ)を特定した後に、制御を「ダイアログ」に引き渡します。例えば「パソコンが壊れました」との文章から「修理してほしい」という意図(インテント)と「パソコン」という対象(エンティティ)を抜き出します。インテント(意図)とは「だから何?(So What?)」に答えるもの、エンティティとは「目的語=何を?」に該当するもの、と考えるとわかりやすいです。

  • チャット対話においてはインテント(意図)は必須2ですが、エンティティ(対象)は必須ではありません。たとえば「こんにちわ」という文章の意図(インテント)は「挨拶」になるでしょうが、エンティティは特にありません。

  • 意図(インテント)と対象(エンティティ)3事前に定義しておく必要があります。Watsonの人工知能が意図(インテント)を自動的に理解・忖度してくれるわけではありません。たとえば利用者が「修理受付サービス」のチャットボットで「パソコンが壊れました」と言ったなら、それは「 (壊れたので)修理をしてほしい」という意図(インテント)でしょうし、同じことを「パソコン・サポート」のチャットボットで言ったなら、意図(インテント)は「(動かないので) 直し方を教えてほしい」ということでしょう。このように同じ発話(文章)でも意図(インテント)は文脈やドメインにより変わります。

  • 意図(インテント)や対象(エンティティ)が決まったら、ダイアログに制御が渡ります。ダイアログはフローチャートのようなもので、複数の「ノード」から構成されています。「ノード」はダイアログ・パネル上でのひとつの箱であり、「条件」と「応答」から構成されています。具体例で説明しますと、たとえば利用者が「今いいですか?」と発話して、「挨拶」というインテントに分類されたとします。その状態でWatson Assistantはダイアログのノード群を上から順番にノードに書かれた条件と一致するかどうか調べていきます。あるノードで「挨拶」という条件に一致したら、対応した「ようこそ!何なりとご相談ください」という応答を自動的に戻してくれます。これらの「条件」と「応答」はダイアログのパネル上で簡単に定義できます。簡単に言えば、対話(ダイアログ)とは「言われたこと(意図)と応答」から成るノードの積み重ね、ともいえますね。

image

:point_up: 3つの重要な要素~ 意図(インテント)、対象(エンティティ)、対話(ダイアログ)

以下、意図(インテント)、対象(エンティティ)、対話(ダイアログ)をもう少し詳しくご紹介します。

:one: 意図(インテント)

image

  • パソコン修理のチャットボットに自然言語で「修理をしてほしい」という意図を伝える言葉の表現は星の数ほどありますし、「表現の揺らぎ」も色々ありえます
  • Watson Assistantは日本語での「言語表現のバリエーションや揺らぎ」を吸収したうえで、利用者の発話をドメイン毎に定義した特定の意図(インテント)に分類4してくれます。
  • 上記を実現するための方法ですが、具体的には意図を伝える言葉の表現をなるべく多く集めて、それらを「修理」という意図(インテント)と結び付ける定義作業を行います。定義は以下のようにパネルから実施できますし、CSVファイルをインポートすることもできます。(プログラムやコーディングは一切不要です)

image

  • 意図(インテント)の表現については以下のようなベスト・プラクティスがあります
    • ① 基本的に「専門家の作った架空の発話」ではなく、(たとえばコールログなどから収集した)「利用者の実際の発話」を集めるのが望ましい。(いい間違いやタイポなども含めると、なお良い)
    • ② 意図(インテント)あたり、最低でも5つの表現を集めること(推奨)
    • ③ 語尾の違いなどの瑣末ではなく「同じ意図の違う言い方・表現のバリエーション」を増やすのが良い

:two: 対象(エンティティ)

image

対象(エンティティ)とは、同じ意図(インテント)でボットの振る舞いを区別したい時に使うものです。日本語では「~を」という目的語に該当するとお考えください。たとえば家庭用のAIスピーカーに対して「#TURN_ON(ONにしろ、つけて)」という意図(インテント)を指示するなら 「何を?」という「対象・目的語・Target」に該当します。
たとえばホームスピーカーのシナリオでは、「エンティティ」は①ライト ②ファン ③テレビなど様々なものが想定できますよね。Assistantの定義の実装としては「ライトつけて」「ファンつけて」「テレビつけて」との発話に対して各々を「ライトON」「ファンON」「テレビON」という意図(インテント)に割り当てるのも設計としては可能ですし、そうすればエンティティは一切使わなくても良いわけです。しかし「指示がわかりません」のような共通的な対話もあること、「音を下げて」など機器別に固有の操作があること、などを考えると、意図(インテント)は「#TURN_ON(ONにしろ、つけて)」としてまとめておいて、その対象(エンティティ)は別に分離しておいたほうがダイアログのフローがスッキリしてよさげであることはおわかりいただけるでしょう。要はこのユースケースでは「意図(インテント)」と「対象(エンティティ)」の組があって始めて具体的な操作にたどり着くわけです。

  • Assistantでは「エンティティ」の利用は必須ではなくオプションです 5 . エンティティの指定なしで会話が成り立つシナリオなら、それはそれでいいです。たとえばパソコンのサポート業務では、お客様から「修理してほしいんだけど」と言われたら、「パソコンを」というエンティティをわざわざ抽出せずとも、「修理」のインテントと判断して「かしこました。では手順を案内します」と返せばいいでしょうし、「挨拶」のインテントでは「エンティティ」は無いでしょう。
  • (使うなら) エンティティは明示的に&事前に定義する必要があります(≒ユーザーのインプットを解釈して文脈から自動的にエンティティを抽出してくれるわけではありません)
  • 日付や数字、通貨などは「システム・エンティティ」として事前に準備されており、抜き出すのが楽になってます。日本語にも対応していますので「10月1日」「明日」とか「100円」などの表現が簡単に抽出できます

image

  • エンティティの定義もパネルからまたはCSVでのインポートが可能です
  • 1つのエンティティには複数の値(Value)を登録できます。そして1つの値(Value)には複数の同義語(シノニム)を登録できます。上記の例では「を診察してくれますか?」も「ネコを診察してくれますか?」も@animalエンティティの「」という値(Value)にヒットします。

:three: 対話(ダイアログ)

ダイアログのエディター

以下がインテントとユーザーへのレスポンスを結びつける「ダイアログ」です。
image

# 説明
ノードのメニューから更なるノードの追加・移動・削除
ノードの名前(任意かつユニークでなくてもいい)
条件は複数書けます(and/or)
レスポンスに条件を設定可能
レスポンスのバリエーションを登録可能
ここからJSON & コンテキスト エディターを起動
複数のレスポンス条件を設定して、レスポンスの出しわけ可能
レスポンスに伴うフローの流れの分岐(Jump to)

ノードは条件(condition)と回答(response)から出来ている

以下のイメージでおわかりのとおり、各ノードは条件(condition)と応答(response)から出来ています。ユーザーからのインプットがノードで指定した条件に合えば、その応答(テキストとコンテキストなどの付帯情報)が返る、というシンプルな形です。要はif-thenだとお考え頂けばよろしいかと思います。
image

ダイアログのノードは上から下/左から右に条件を評価される

以下はDialog Overviewに掲載されている図です。
ダイアログは以下のように複数ノードから成るツリー構造ですが、いくつかの「お約束」があります。一応念のため確認しておきます。

  • ノード間の関係は同列(Peer)か子(Child)になります
  • ノード群の条件の評価は上から下/左から右に行われます
  • 条件に一致したら、そのノードが現在位置になり対応するレスポンスが返されます
  • 次のインプットは現在位置のノードを起点に評価されます
  • 条件で一致するのは必ず1ノードだけです。一度に複数ノードに一致することはありません

image

ノードの条件の記述順番は重要

上記のようにノードの条件は現在位置を起点に上/左から順番に評価され、条件に一致したところの応答(response)が使われます。ので、同一レベルで複数の条件を書く場合は「きびしい条件」を先に書くようにしてください。わかりやすい例で言えば、飲食店の宴会コースに松(7000円)・竹(5000円)・梅(3000円)があったとします。ここで「ご予算は?」と聞いて回答金額によりコースを割り当てるなら「松」の7000円の判定を先に書かないといけません。(「梅」を先に書くと7000円>3000円なので、条件は真、ゆえに常に梅コースにヒットしてしまいます)

:mag_right: サマリー

ということでWatson Assistantのしくみをご説明してきましたが、下記が一枚のサマリーです
image

Watson Assistantは今流行のチャットボットをつくるには、現時点で一番進んだ機能と日本語での実績を有していると思います。とても敷居が低いので、お時間あるときにぜひ遊んでみてくださいませ。より細かい話は :newspaper: 記事「【2018/7月最新版】チャットボットを簡単に作れる!Watson Assistant(旧名: Conversation)の色々なTips(メモ)」をご参照ください。

各種リソースのご紹介

:blue_book: ドキュメント

:newspaper: ブログ記事

:tv: 動画やデモ

:tv: 動画セミナー( Watson Academy )

  • :flag_us: Watson Academy - Watson Assistant Foundations - 2018/7/23. 英語:flag_us:ですがWatson Assistantの新しい入門コースが公開されています。無料でサインアップすれば動画を受講できますし、合格すればバッジももらえます。全部で90分-120分くらいなので、初めての方はチャレンジしてみてはいかがでしょうか?

:clipboard: 改定履歴

日付 変更内容
1.0 2018-06-19 初版公開
1.1 2018-07-23 動画コースの案内を追記

  1. 詳しくは記事「Watson AssistantからIBM Cloud Functionsを呼び出す」などご参照ください。 

  2. 技術的には「インテントが無い」状態でもダイアログは利用可能です。しかし「意図のない対話」はありえません。(「独り言」とか「話し相手=世間話型のボット」ならアリですが、Watson Assiatantの方向性とは異なります) 

  3. 日付・時刻・通貨などの「システム・エンティティ」も使えますが、これらは明示的な定義が不要です  

  4. AIに詳しい方向けの説明としては、「利用者の発話」という文章を入力にして、「意図(インテント)」を出力(分類)する自然言語処理(NLP)、ってことです 

  5. (ユースケースとして成り立つかどうかは別にして、テクニカルには)意図(インテント)も必須ではありません