FAQチャットボットを一歩前進させる 〜 Discoveryとつなぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/602d347b-3dc6-23d4-3fb3-3bc07cf42e9f.png)


バーチャル・アシスタントが答えられる質問や問い合わせ内容を増やすためには、**アクションの追加**が必要です。
対話シナリオをアクションとステップを使って構成する手順はとても簡単なのですが、事前に、**質問や問い合わせ内容を整理**し、**対話シナリオへの落とし込み**と**回答の準備**が必要です。
この手順はバーチャル・アシスタントを育てていくための**王道**ではありますが、それなりの時間とワークロードを要します。
もっとクイックにバーチャル・アシスタンが答えられる範囲を広げる方法はないのでしょうか？

# 検索エンジンとの連携

1 つのアイディアとして**検索エンジンとの連携**があります。
質問や問い合わせに関連する内容を扱っているナレッジベースや文書を検索エンジンに取り込み、バーチャル・アシスタントに入ってくる**質問を使って検索し、検索結果を回答の候補**として提示する、というアイディアです。

IBM Watson には、AI が搭載された検索エンジンである Watson Discovery というサービスがあります。
今回の記事では、この Watson Discovery と Watson Assistant の連携方法と、連携させることで、どんな事が可能になるのかを見ていきます。

# 取り込むデータについて

これまで、ピザの注文に関するバーチャル・アシスタントを扱ってきたので、日本語 Wikipedia から、
・[ピザ](https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%B6)
・[ピザの歴史](https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%B6%E3%81%AE%E6%AD%B4%E5%8F%B2)
の 2 つを取り込んでみます。

取り込み用ファイルの生成に、wikiextractor を使いました。

[こちらのサイト](https://qiita.com/YuukiMiyoshi/items/aee751a1055144adb18c)に wikipedia データのダウンロード方法と wikiextractor の使い方がまとめられていましたので参考にさせていただきました。

# Watson Discovery での事前準備

実は Watson Discovery には、無償で使える **Lite プラン**や**Trial プラン**がないので、有償の **Plus プラン**もしくは **Enterprise プラン**でインスタンスを作成する必要があります。
ただし、**初めて Watson Discovery Plus プラン・インスタンスを作成する場合**に限り、30 日間の無償トライアルが設定されています。
インスタンス作成から 30 日以内にインスタンスを削除すれば課金されませんので、実際に手を動かして確認されたい方はお試しください。

:::note alert
すでに削除済みであっても、以前、**1 度でも** Watson Discovery Plusプラン・インスタンスを作成した事がある場合は 30 日以内にインスタンスを削除されたとしても**課金**されますので、ご注意ください。あくまでも、自己責任でお試しください :sweat:
:::

### Watson Discovery インスタンスの作成

[以前の記事](https://qiita.com/yanagih/items/b02db00d06de397bec64#%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)で Watson Assistant インスタンスの作成方法を紹介しています。
この手順を見ながら、今回は **Watson Discovery** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/931f8959-d7a8-376e-fe7a-3d0122852977.png)
プラス Plan を選択し、作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/ac876d64-c35b-0604-01af-15285c74f428.png)


### データのアップロード

データを入れる**コレクション**を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a6b8f948-1940-b146-58b5-80f583531490.png)
プロジェクト名とタイプを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/63e89fae-12e9-7de9-850b-8929825fd0a1.png)
データのアップロードを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b3828c7e-827b-e912-a940-7fe4468dafa0.png)
コレクション名と言語を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/02ece14a-0a88-c61a-43b8-1a5e0d6e0669.png)
ファイルをアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/74af6038-740c-9032-accd-7391cb529f64.png)
アップロードしたファイルの解析が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c4c13465-2a9d-cbde-5019-4a3e2c1afb68.png)
しばらくして、このような画面になれば準備 OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/e2ba9e54-a466-fa29-a19c-a1e2ed2e89b1.png)

Watson Assistantから検索するデーター・コレクションが作成できました。
この後は、Watson Assistant側の作業になります。

# Watson Assistant との連携

Watson Discovery との連携は、**Integrations** で行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/078c6460-4970-0524-32a1-d9de4d07cea7.png)

**Extensions** 項目にある **Search** で Add をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/e7e2fd46-16d1-46e8-cab0-5dd92aa41d3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/20cc3398-bb35-642a-a95d-5f55a8f6316f.png)

検索先のデータ・コレクションを指定します。
1. ①をクリックし、データー・コレクションを含むWatson Discoveryのインスタンスを選択します。
2. そのWatson Discoveryに含まれるデータ・コレクションが表示されるので、②をクリックし、検索したいデータ・コレクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d3442c17-679e-2d81-0a65-4216c8c51198.png)

Watson AssistantのWeb Chatに表示される内容を設定します。
1. ①をクリックし、『title』を選択します。
1. ②をクリックし、『answer』を選択します。
1. ③をクリックし、『url』を選択します。
1. ④に『検索で見つかりました』と入力します。
1. ⑤をクリックして、設定内容を保存します。

:::note warn
上記、「2.②をクリックし、『answer』を選択します。」において、『answer」を選択していますが、取り込んだデータの属性に応じて変更が必要です。多くのケースでは、text属性の場合が多いですが、今回取り込んだwikipediaのテキストデータはanswer属性に取り込まれているため、『answer』を選択しています。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a031648b-96c9-9c1d-88aa-aae61d1267d5.png)

表示が『add』から『Open』に変わり、Watson Discoveryへの検索設定が行われたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/52414fc8-badc-3dc4-a93a-50e03f947da4.png)

ユーザーからの入力がどのアクションにもマッチしなかった場合に検索エンジンを呼び出す設定をアクションに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5cad841b-57a0-54f5-7f00-de310b5f3c2b.png)
2 番目のステップをこのように修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/963a0259-8617-e942-a51f-33368d9af09e.png)
以上です。
# 実際に試してみます

『**ピザの日はいつ**』と入力してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/55389b73-9b89-f37e-7cc4-2e127653ae85.png)
『11月20日』という**ピンポイントな回答**が返ってきていることにお気づきでしょうか？

:::note warn
Web Chat 6.3.0以降、表示形式に変更が入りました。上記スクリーンショットと同様の表示形式にしたい場合は、```clientVersion: "6.2.0",```の指定を行なってください。詳しくは、もう少し下の方に出てくる```webchat.js```を参照してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c7f05a5e-5945-86ca-2235-13bc9978a5e4.png)
これは、Watson Discovery が提供する **Answer Finding** という機能で、単に情報を検索するだけではなく、**質問文に対する回答となる候補を特定し、ピンポイントに返信してくれる**機能になります。

Web Chat は、**Text Fragment機能**に対応しているので、元文書へのリンクを押すと、回答箇所にピンポントに飛んでくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c4f5d67e-2a84-2612-d57c-85f3a0ac4dd7.png)

使用した index.html と webchat.js はこちらです。
```HTML:index.html
<html>
<head>
    <script type="text/javascript" src="webchat.js"></script>
</head>
<body>
    <title>ピザ屋</title>
    <h1>検索エンジン連携デモ</h1>
    </body>
</html>
```
```javascript:webchat.js
window.watsonAssistantChatOptions = {
  integrationID: "***",
  region: "***",
  serviceInstanceID: "***",
  clientVersion: "6.2.0",
  onLoad: async (instance) => {
    instance.updateCSSVariables({
      'BASE-width': '40%',
    });
    instance.updateHomeScreenConfig({
      greeting: 'こんにちは！ ピザに関するお問い合わせについてお答えできます',
      starters: {
        buttons: [
          {label: 'ピザの注文'},
          {label: '割引条件'},
          {label: '注文のキャンセル'},
          {label: 'ピザの日はいつ'},
          {label: 'どこが宅配ピザを始めたの'},
          {label: '日本初の宅配ピザ店'},
          {label: 'ピザの誕生秘話'},
        ],
      },
    });
    await instance.updateLocale('ja');
    instance.render();
  }
};
setTimeout(function(){
  const t=document.createElement('script');
  t.src="https://web-chat.global.assistant.watson.appdomain.cloud/versions/" + (window.watsonAssistantChatOptions.clientVersion || 'latest') + "/WatsonAssistantChatEntry.js";
  document.head.appendChild(t);
});
```
:::note info
ピンポイント回答を強調表示するために、```clientVersion: "6.2.0",```を追加しています。
:::
:::note info
この記事で使用している index.html と webchat.js を [GitHub](https://github.com/Watson-bx-04/search) にもアップロードしています。
:::

他にも 2 つ程、質問をしてみます。
#### 質問 『どこが宅配ピザを始めたの』
アメリカのドミノ・ピザ

#### 質問 『ピザの誕生秘話』
16世紀に新大陸からトマトがもたらされてから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/28132411-76fc-e420-53c0-d468f45736a6.png)

#### 参考: 動画に落としてみました
https://youtu.be/2UKYFfvml_Y

詳しくは[オンライン・マニュアル](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-query-parameters#answer-finding)や、他の方が [Qiita の記事](https://qiita.com/nax/items/e7205eb77b11ed0975b8)をアップしてくれているので、興味のある方は参照してみてください。

また、Watson Discovery の[検索デモ動画](https://video.ibm.com/recorded/131207546)が IBM Video で公開されています。

https://video.ibm.com/recorded/131207546

# いかがでしたでしょうか

アクションとして事前に用意していない質問を Watson Discovery の **Answer Finding 機能**を使って、ピンポイントに答えさせる方法についてみてみました。
今回は、日本語 Wikipedia の記事 2 つを使用しましたが、質問や問い合わせ内容に合わせて、**マニュアル**、**問合せ履歴**や**ナレッジベース**を Watson Discovery に取り込んでおけば、さまざまな質問に対して、回答となる候補を提示できるバーチャル・アシスタントが構築できそうです。

# 参考情報

### オンライン・マニュアル: チャットボットがよくある質問に回答するのを支援
https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-tutorial-convo

### オンライン・マニュアル: 回答の検出
https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-query-parameters#answer-finding

### Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%B6

https://ja.wikipedia.org/wiki/%E3%83%94%E3%82%B6%E3%81%AE%E6%AD%B4%E5%8F%B2

### GitHub
https://github.com/Watson-bx-04/search

### その他
https://qiita.com/YuukiMiyoshi/items/aee751a1055144adb18c

https://qiita.com/nax/items/e7205eb77b11ed0975b8

https://qiita.com/Ping/items/896dca1a77a3a3796bb1

https://laboradian.com/text-fragments/

https://video.ibm.com/recorded/131207546

https://youtu.be/2UKYFfvml_Y