watsonx Assistantの導入オプションをやってみた!「ページインタラクション」編

# はじめに

watsonx Assistantの機能を体験できるデモサイトがあるのをご存知でしょうか。
この[記事](https://community.ibm.com/community/user/ai-datascience/blogs/kazuma-shimizu/2023/09/29/watsonx-assistant?CommunityKey=eb449c0f-27c1-4223-bbd7-01874dfe4714)を見ることでwatsonx Assistantを簡単に体験することができます。

ただ、この記事を見てもっと自分でwatsonx Assistantをカスタマイズして使ってみたいと思った方もたくさんいらっしゃると思います。
そんな方にはデモ画面左下にあります導入オプションを試してみることがおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/a9081b09-9b1d-db35-fe87-b65d6dc17ff9.png)

この記事では導入オプションの中でもお客様対応( 回答する/実行する/見せる )の「ページインタラクション」を使ってどんなことができるかについて実際のカスタム例も示しながら、書きたいと思います。

また、同様のwatsonx Assistantの導入オプションシリーズが以下のようにありますので、ぜひ気になった導入オプションの記事をご覧になって試していただけると幸いです。
* [watsonx Assistantの導入オプションをやってみた「iframe応答の追加」「ロケーションの共有」編](https://qiita.com/r-nakayamasan/items/f1dd26879745214d12e8)

## 事前準備
この記事で紹介するカスタマイズでは前提としてwatsonx Assistantのセットアップが必要です。
この[記事](https://qiita.com/yanagih/items/b02db00d06de397bec64)が参考になります。

## ページインタラクション
ページインタラクションでは、watsonx Assistantのwebチャットとwebサイトとの間で通信することができます。
[参考記事](https://community.ibm.com/community/user/ai-datascience/blogs/kazuma-shimizu/2023/09/29/watsonx-assistant?CommunityKey=eb449c0f-27c1-4223-bbd7-01874dfe4714)のデモサイトでは、クレジットカードの申請に必要な個人情報入力をwebチャットだけで済ますことができました。

それでは導入オプションをやってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/db2e51de-679f-e894-ec6b-08068358a3e5.png)
「お客様対応( 回答する/実行する/見せる )」のデモの3ページ目にて、左下の「ページインタラクション」を選択すると次のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/86562c21-5f10-9007-8625-874a93028c02.png)
表示された画面は英語ですが、ここに書かれている内容を要約すると、webチャットが、設置されたwebページと通信する方法をガイドしています。
具体的には、例えばwatsonx Assistantのチャット欄のボタンをクリックすると、設置されたwebページの特定のフィールドをある値で埋めることができます。

では実際に体験してみましょう。

### Runnning the JavaScript Example( ページインタラクションの実行例 )
はじめに、自分でカスタムしたチャットボットを動かす前に、事前に設定されたwatsonx Assistantで試しに触ってみましょう。

Runnning the JavaScript Exampleの下にある[リンク](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/webchat/examples/page-interaction/client/javascript/index.html)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/129ae541-af12-a1cc-6e24-a9f8432f423c.png)

表示されたhtmlファイルをダウンロードします。画面左端のダウンロードマークを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/962baebd-9890-c7cc-4ece-15c10bd15eb4.png)

インストールされたindex.htmlというファイルをダブルクリック or Firefoxなどのブラウザの検索窓に貼り付けることで以下のような画面がブラウザに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/ecec1743-7188-7c32-3b3a-1547209b0a19.png)

右下のチャットボットを開くと次のような画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/8a87fea7-9676-090a-0050-9984a444e24b.png)

チャットボットを触る前に、先にこのチャットボットの目的を説明します。

このチャットボットの目的はwatsonx Assistantのチャットボットを操作するだけで、画面左上のテキスト欄を簡単に埋めることとなっております。
また、ここでのwatsonx Assistantからのチャットボット操作方法は２パターンでa. ボタンクリックとb. チャット欄入力の２パターンです。それぞれ見ていきます。

a. ボタンクリック
まずはwatsonx Assistantのボタンクリック操作で左上のテキスト欄の口座番号を入力します。
watsonx Assistantに表示されている「Fill in account number」をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/b654654e-0571-d7f0-6d19-e8ddf26262a3.png)

すると以下のように左の口座番号の欄が自動で入力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/6b1c7502-83f9-84cd-5071-c6f4118eb1ac.png)

b. チャットテキスト入力
次に左上のテキスト欄の電話番号をwatsonx Assistantのチャット操作で入力します。
チャット欄に「fill phone number」と入力してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/b59a9cd6-d688-1b53-2079-13bf5fa24f35.png)

テキストを送信すると画面左の電話番号の入力欄が自動で埋まりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/4baf9f47-31d4-3646-9097-0897a39be22e.png)

このようにwebページを直接操作することなく、チャットボット内だけの操作でwebページの要素を操作することができました。

この機能を使うことで、例えばクレジットカードの申請において、個人情報の入力のためにチャットボットとwebサイトを行き来せずにチャットボットの中だけで完結できるようなユーザー体験を作ることができます。デモサイトのシナリオがこれでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/0cd08696-8440-bdee-4076-17cda33dccdb.png)

また、今回の例ではユーザーは口座番号や電話番号を直接入力する必要はありませんでした。「電話番号を埋めて」とメッセージを打つだけで事前に登録された電話番号などの情報を呼び出して使うことができました。

watsonx Assistantはイライラしないチャットボットであると言われますが、この辺りの機能もその理由の一つだと言えそうです。

### Setting up your own assistant( watsonx Assistantのカスタマイズ )
それでは次にこの機能を使ってwatsonx Assisntantを独自にカスタマイズしてみましょう。

先ほどのgithubの画面に戻りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/f3772c5c-872a-ee3b-921e-b17ae666f600.png)
ここからカスタマイズできます。リンクを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/389bbf3a-8d7d-fa88-c4b1-0539e2fc9631.png)

先ほどと同様にファイルをダウンロードします。

それでは独自のカスタマイズをしてみましょう。
元々のデモでは口座番号と電話番号を自動で入力するデモでした。独自のカスタマイズでは自動入力のボタンとテキスト入力のイベントを１つずつ追加しましょう。

まずはwatsonx Assistantの設定をします。
先ほどダウンロードしたactionファイルを使ってwatosnx Assistantを構築します。~~アクションファイルのアップロードについてはこの記事が参考になります。~~

次に先ほどの章でダウンロードしたHTMLファイルを変更します。
先ほど構築したwatsonx Assistantを設定します。変更する点は以下の箇所です。(98行〜100行目)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/c4dc9b7c-875e-29dc-bf79-181b4b17248b.png)

ここに入力する値はwatsonx Assistantの画面から探します。
まず左のタブから「Environments」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/f79de901-db11-4686-e4c5-96055c4ce9ad.png)

Web chatを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/2c7cb41b-fdbf-793f-936f-73bf76e9df91.png)

「Embed」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/f536e52f-e172-03a7-a0c2-be00267fdf4b.png)

ここにintegrationIDとregion、serviceInstanceIDがあるので、それぞれHTMLファイルに適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/1dec3be4-300a-e2af-565b-5eb5c99315ba.png)

次にイベントハンドラーを追加します。
ボタンを押すことでメールアドレス、テキストの入力で日付が追加されるようにしましょう。

HTMLを引き続き編集します。
![スクリーンショット 2023-12-04 12.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/b85d1c26-2e34-d6df-1b46-6436a1af913d.png)

メールアドレスと日付が入力されるフィールドを追加します。上記28行目以降に以下を追記します。
```html:index.html
<p>
    <label>
        Mail address
        <input id="mail-address" type="text">
    </label>
</p>
<p>
    <label>
        date
        <input type="date" name="example" id="date">
    </label>
</p>
```
![スクリーンショット 2023-12-04 12.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/2f7baf0a-bcc6-5f2d-fff6-ca759dd582c5.png)

ブラウザで表示する場合は以下のようになるはずです。(ブラウザによって少し変わります)
![スクリーンショット 2023-12-04 12.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/37d42a65-78c7-9a15-b9c8-ef17fd4761ff.png)

次にJavascriptを編集します。
クリックするとwebページ上の要素と対話できるカスタムボタンを表示するために、CustomeResopnseイベントハンドラーを設定します。詳しい設定方法は[こちら](https://web-chat.global.assistant.watson.cloud.ibm.com/docs.html?to=api-events#customresponse)です。

HTMLファイルに戻ります。
![スクリーンショット 2023-12-04 13.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/1e7d6e9e-5b93-ba0a-ae2c-d4e26a536eb5.png)
HTMLファイルの96行目以降に追記します。

```html:index.html
mailaddressResponseHandler(event, instance);
```
user_defined_typeなどでイベントを詳しく設定することもできますが、今回のターゲットから外れますので、ここでは条件はつけずに設定しています。

次にmailaddressResponseHandlerの設定を作成します。

![スクリーンショット 2023-12-04 13.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/9774fd4e-e4d4-68cf-2fdd-90f72e764e53.png)
HTMLファイルの65行目以降に追記します。

```html:index.html
function mailaddressResponseHandler(event) {
  const { element } = event.data;

  const button = document.createElement('button');
  button.type = 'button';
  button.innerHTML = 'Fill in mail address';
  button.addEventListener('click', () => {
    // Look for the account number element in the document and fill in the account number. You could get this value
    // from a context variable in the message.
    document.querySelector('#mail-address').value = 'xxx@exam.com';
  });

  const container = document.createElement('div');
  // This class name will allow our button to look like the default buttons used in web chat.
  container.classList.add('ibm-web-chat--default-styles');
  container.appendChild(button);

  element.appendChild(container);
}
```
ここではwebチャットへのボタンの設置、ボタンを押した時の挙動を設定しています。

ここまでの編集の結果をwebサイトで確認します。
![スクリーンショット 2023-12-04 13.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/20113fd1-de29-cf9b-6c18-0226b48f11f8.png)
新たに追加された「fill in mail address」をクリックするとメールアドレスが記入されます。

次にテキスト入力による日付の入力ですが、まずwatsonx AssistantのAction設定から始めます。
watsonx Assistantに戻ります。

この記事を参考にwatsonx AssistantのActionを設定します。
interactionは「fill date of today」にしておきます。
![スクリーンショット 2023-12-04 14.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/bbe3ea8f-6457-c193-ffc8-7b6e50287fdc.png)

次にこのアクションのステップ１のAssistant saysを設定します。
「本日の日付を入力しました」にしましょう。
![スクリーンショット 2023-12-04 14.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/c9905b07-5fdd-4281-481d-2564978f4e95.png)

次にこのステップのuser_defined_typeを設定します。この値をイベントのトリガーにします。
＜/＞をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/c7d7865c-1154-7f06-09cf-e1c990ee4b9c.png)

下の画像のようにコードを変更します。
![スクリーンショット 2023-12-04 14.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/e70bf0f8-9876-76c0-1a96-1b576c2042d0.png)

記入したコードは以下です。
```
"user_defined": {
    "user_defined_type": "fill_date_time"
},
```

続いてHTMLファイルを編集します。
![スクリーンショット 2023-12-04 14.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/f1449c4f-2076-35a0-73ad-bd5ef7c63875.png)
97行目以降にfill_date_timeを受け取った際の挙動をJavascriptで記入します。

記入するコードは以下です。
```
if (message.output.generic && message.output.generic[0].user_defined && message.output.generic[0].user_defined.user_defined_type === 'fill_date_time') {
    var today = new Date();
    const formatted = today
    .toLocaleDateString("ja-JP", {
        year: "numeric",
        month: "2-digit",
        day: "2-digit",
    })
    .split("/")
    .join("-");
    document.querySelector('#date').value = formatted;
}
```
今日の日付をフォーマットを正した状態で値に代入しています。

これでカスタマイズは終了です！
HTMLファイルをダブルクリック or Firefoxなどのブラウザの検索窓に貼り付けることでチャットボットを試すことができます。
![スクリーンショット 2023-12-04 14.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631727/6f8bcde0-158c-8c8d-1291-f7f848e68a5e.png)

# 最後に
今回示しましたは、webチャットと設置されたwebサイトの通信を行う方法についてでした。これにより、webチャットのやり取りの中で、webサイトへの記入が必要な場合にもwebサイトとwebチャットをわざわざ行き来せずに、webチャットのみでやり取りを完結させることができます。
watsonx Assistantはユーザーにイライラさせない顧客体験を実現するチャットボットとして有名ですが、こういった機能がその要素であることを私自身理解することができました。

以上です、ここまで読んでいただきありがとうございました。