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


![image](https://qiita-image-store.s3.amazonaws.com/0/108535/abe65ee7-9d31-d24c-0d8b-fd7afe52865a.png)

# はじめに ～ Converstaionは Watson Assistantになりました

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


:triangular_flag_on_post: 「やってみた」系はドキュメントの「 [概説チュートリアル](https://console.bluemix.net/docs/services/conversation/getting-started.html#gettingstarted)」をはじめ、ネット上に色々にありますので割愛します。当記事は「用語」や「仕組み」の紹介が中心ですので、当記事を一通り読まれてから上記のチューリアルをやると、ご理解が早いかもしれません。

:triangular_flag_on_post: (2018/10/27更新) 記事「[はじめてWatsonに入門する方のためのスキルアップ・リソースのまとめ](https://qiita.com/ishida330/items/775b7035ed661723d69c)」などもよろしければご覧ください。
:triangular_flag_on_post: (2018/11/19更新) 2018/11/9にWatson Assistantに[UI変更などの大きめの変更](https://console.bluemix.net/docs/services/assistant/release-notes.html#release-notes)が入ったので、当記事も最新にアップデートしました

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

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

[^6]: 2018/09には[Watson_Assistant_on_ICP](https://medium.com/ibm-watson/introducing-watson-assistant-for-ibm-cloud-private-8f00f7348810)が出て、オンプレでも動くようになりました。

# :chart_with_upwards_trend: Watson Assistantまでの道のり

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4bdb831f-9aa9-b011-86b6-102588c08fe4.png)

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からの移行は不要です。さらに(英語:us:の世界では) Assistant Solutionsとして自動車、ホテル向けなどの業種別チャットボットを提供し、チャットボット開発の生産性向上と投入までの時間短縮を目指していきます。
- :bulb: 2018/11月にはアーキテクチャー変更があり、従来の「ワークスペース」が「**アシスタント**」と「**スキル**」に分離されました。
 

# :beginner: チャットボットとWatson Assistantのしくみ概要(2018/11変更後の最新で説明)

### チャットボットの全体図
以下が2018/11月に新しくなったチャットボットの全体図です
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f019599a-7c34-c53f-c45a-b3ff9fa6c017.png)

- 利用者は何らかのユーザーインターフェースを介して、（テキスト/音声などを使って）バックエンドの会話エンジンと会話します
- **Watson Assistantはチャットボットの脳に相当する「会話エンジン」部分を提供するサービス**です。チャット用のユーザーインターフェースはご提供しません
- 逆に言うと、**チャットのためのユーザーインターフェースはオープン**であり、自作でもSlackやSkype/Facebook Messengerなどの既存のサービスでも、好きなものをお使い頂けます。Facebook MessengerやSlackなど一部サービスはパネル上の定義するだけで統合できます。（＝コーディングや開発が不要です）
- Watson Assistantの機能は**REST APIやSDKを使って簡単に呼び出し**て使えます。RESTやSDKで必要な機能を呼び出せばいいだけなので、呼び出す側のアプリケーションはお好きな言語・お好きなランタイム・お好きな場所でオーケーです。更に他のWatsonサービスやバックエンド・システムとの連携が必要な場合は、IBM Cloud上のサーバーレス・フレームワークである[IBM Cloud Functions(≒Apache OpenWhisk)](https://console.bluemix.net/openwhisk/)を使って統合できます[^1]。


[^1]: 詳しくは記事_「[Watson_AssistantからIBM_Cloud_Functionsを呼び出す](https://qiita.com/makaishi2/items/349d366e550b37cf4521)」などご参照ください。

:bulb:ご参考) 今までと変わった点
当初の全体図では｢フロントエンドやバックエンドの統合=様々なAPIの呼び出しはアプリケーション側で制御してね、Watson側はサービスとして呼ばれる立場だから、それ以外の責務は面倒見ませんよ～」という方式でした。その後、Cloud Functionsを介してバックエンド統合ができるようになりました。今回はそこが「なるべくWatson側で責務を担って、裏であれこれ統合できるようにして、アプリ側の生産性向上＝負担を軽くしますよ～」って感じに変わってます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a1dde7ff-ac41-3a87-d9b2-14b4bbb0468c.png)


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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/42b81a40-9875-66b7-3a54-9a48cf5b8c4d.png)

- 2018/11月の拡張で「アシスタント」と「スキル」という概念が出てきました。
- １つのインスタンス(サービス）で複数の**アシスタント**をホストできます
- １つのインスタンス(サービス）で複数の**スキル**をホストできます。「スキル」は従来の「ワークスペース」に相当し、**チャットボットの扱う領域・ドメイン**のようなものです。たとえば「パソコンの修理」や「お天気」や「出張手続き」などは各々が「スキル」と言えます。これらはチャットボットの扱う領域・ドメインが違うので、普通は別々のスキルに分けておくのがよいでしょう。(この３つを強引に１つの「スキル」に押し込んでしまうことも**技術的には可能ですが、不適切**かと思います)
- 「アシスタント」には事前に「スキル」を割り当てます。その上で「アシスタント」は利用者と対話します。**2018/11月時点では「アシスタント」には１つの「スキル」しか割り当てられませんが、将来的には複数の「スキル」を割り当て可能になる予定です。** つまり、将来的には１つのボットが様々な特化分野/興味領域/ドメインに対応できるようになる、ということです。

以下のようにパネル構成も変わっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b76c63b4-cc62-fc03-6a30-8ce02c3a7795.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d37e0401-e2dd-e365-6c71-47c4332ce3d9.png)

### スキル(旧ワークスペース)の中での対話の流れ

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/83c92857-319a-a1e3-d806-4bcd15ccea6c.png)

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

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

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

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

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

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

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

 ![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2f22b60b-f344-2448-9bf3-4d6879c9c70d.png)


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

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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b3b89226-720e-3053-1c1d-0c01a4cc0a99.png)

- パソコン修理のチャットボットに自然言語で「修理をしてほしい」という意図を伝える言葉の表現は星の数ほどありますし、「表現の揺らぎ」も色々ありえます
- Watson Assistantは日本語での「言語表現のバリエーションや揺らぎ」を吸収したうえで、利用者の発話をドメイン毎に定義した特定の意図（インテント）に分類[^4]してくれます。
[^4]: AIに詳しい方向けの説明としては、「利用者の発話」という文章を入力にして、｢意図（インテント）」を出力(分類)する自然言語処理(NLP)、ってことです

- 上記を実現するための方法ですが、具体的には意図を伝える言葉の表現をなるべく多く集めて、それらを「修理」という意図（インテント）と結び付ける定義作業を行います。定義は以下のようにパネルから実施できますし、CSVファイルをインポートすることもできます。(プログラムやコーディングは一切不要です)
 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7400d2d5-774d-545a-4798-4479e4923580.png)

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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f6cf3fde-a04c-5ff3-9c99-6323d62cffd8.png)

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

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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/628de218-312e-9937-534d-6c4d48f10df7.png)

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

### :three:  対話(ダイアログ)
#### ダイアログのエディター
以下がインテントとユーザーへのレスポンスを結びつける「ダイアログ」です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/95c731a7-2707-1af8-700c-b35712b780d6.png)

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


#### ノードは条件(condition)と回答(response)から出来ている
以下のイメージでおわかりのとおり、各ノードは条件(condition)と応答(response)から出来ています。ユーザーからのインプットがノードで指定した条件に合えば、その応答（テキストとコンテキストなどの付帯情報）が返る、というシンプルな形です。**要はif-thenだ**とお考え頂けばよろしいかと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3362ca0a-c050-9398-b55c-b895768f2cb8.png)

#### ダイアログのノードは上から下/左から右に条件を評価される
以下は[Dialog Overview](https://console.bluemix.net/docs/services/conversation/dialog-build.html#overview)に掲載されている図です。
ダイアログは以下のように複数ノードから成るツリー構造ですが、いくつかの「お約束」があります。一応念のため確認しておきます。

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/adea9f9b-f453-6156-9701-8a5a0a675ea8.png)

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


# :mag_right: サマリー

ということでWatson Assistantのしくみをご説明してきましたが、下記が一枚のサマリーです
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2c84d5ab-ed04-bbb4-cada-f62dfb7af196.png)

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

# 各種リソースのご紹介
#### :blue_book: ドキュメント

- :us: :jp: [Watson Assistant](https://console.bluemix.net/docs/services/conversation/) - ドキュメント
- :us: [Watson Assistant](https://www.ibm.com/watson/ai-assistant/) - 製品ページ
- :us:[Watson Assistant](https://www.ibm.com/watson/services/conversation/) - サービス紹介
 
#### :newspaper: ブログ記事
- :jp: dW  「[Watson Assistant (Watson Conversation) の使い方を学ぶ](https://www.ibm.com/developerworks/jp/cognitive/library/cc-watson-chatbot-conversation/index.html)」 - 入門編として良記事だと思います
- :jp: IBM ソリューション・ブログ [Watson Assistantのご紹介](https://www.ibm.com/blogs/solutions/jp-ja/the-future-of-watson-conversation-watson-assistant/)

#### :tv: 動画やデモ
- :us: [Watson Assistant](https://www.youtube.com/watch?v=h-u-5f8fZtc&list=PLZDyxLlNKRY8zx37vPh6s_pCtOXIp_5yL) - YouTubeの動画コレクション(15本)
- :us: [BankBot](https://www.ibm.com/watson/services/conversation/demo/index.html) - 新しいデモ
- :us: [カー･ドライブ](https://conversation-demo.ng.bluemix.net/) - 以前のデモ

#### :tv: 動画セミナー( Watson Academy )
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2883644b-7ba1-3151-ea92-83af0b6b1c9f.png)
- :us: [Watson Academy](https://ibm.com/training/watsonacademy) でAssistantの新しい入門コース　**Watson Assistant Foundations** が公開されています。無料でサインアップすれば動画を受講できますし、合格すればバッジももらえます。全部で90分-120分くらいなので、初めての方はチャレンジしてみてはいかがでしょうか?

# :clipboard: 改定履歴

| 版| 日付| 変更内容|
|:---|:---|:---|
| 1.0 | 2018-06-19| 初版公開|
| 1.1 | 2018-07-23| 動画コースの案内を追記|
| 1.2 | 2018-10-28| スキルアップ記事とICP対応を追記|