チャットボット作成：NeuralSeek+WA+WD連携ハンズオン


# はじめに
本記事では、2023年からIBM Cloudにて提供されはじめたAIサービス、NeuralSeekについて取り扱います。

皆さんはNeuralSeekという製品、聞いたことがありますか？

NeuralSeekは、[CerebralBlue社](https://cerebralblue.com/)が作成したIBM Cloudで扱える生成系AIのSaaS製品です。
企業ナレッジベースと連携させ、ユーザーの質問に対して投入した文書の文脈に応じた応答を提供することができます。

Google検索でもあまり多くはヒットしないところを見ると、まだまだ知名度が低く、製品ナレッジもそこまで蓄積されていないようです。
（AzureのOpen AIなど猛威を振るっている製品に埋もれてしまっているような感じ）

しかし実際に筆者が触ってみたところ、「NeuralSeek、結構いい感じかも？」となったため、他のAI製品に埋もれさすにはもったいないと思い、本記事を執筆するに至りました。
その第一歩として、まずはハンズオンでどのようなサービスかを実際に手を動かして知っていこう！という試みがこちらです。

本ハンズオンの成果物としては、watsonx Assistant上で触れる簡易的なチャットボットになります。

もしご興味がある方は、ぜひトライしてみてください。

# 前提
このハンズオンでは、NeuralSeekをIBM製品であるWatson Discovery、watsonx Assistant（旧：Watson Assistant）と連携し、以下の構成の簡易的なチャットボットを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/b501c1d9-9a79-acbd-15dd-519f4d32e7e5.png)

よって、NeuralSeekの他にWatson Discoveryとwatsonx Assistantのインスタンスが必要です。

今回のハンズオンではナレッジベースをWDとしていますが、以下サービスとも連携可能です。
* [Elastic AppSearch](https://www.elastic.co/guide/en/app-search/current/index.html)

* [Amazon Kendra](https://aws.amazon.com/kendra/)

* [OpenSearch](https://opensearch.org/)

# 手順概要
チャットボット作成の大まかな手順は以下になります。

1. Watson Discoveryのセットアップ
    a. インスタンス作成
    b. project作成
    c. 文書投入
2. NeuralSeekのセットアップ
3. watsonx Assistantのセットアップ
    a. インスタンス作成
    b. Assistant作成
    c. Custom Extensionの作成
    d. Actionの作成
4. 回答確認
5. 回答チューニング
6. 運用Tips

# 詳細手順
## 1. Watson Discoveryのセットアップ
### a. インスタンス作成
IBM Cloudにログインし、「Watson Discovery」と検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/8b608c66-34d4-a949-8745-531eb13f1b93.png)
IBM Cloudカタログの Discovery リソース ・ページに移動し、プラス・プラン・サービス・インスタンスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/59df8da7-ecd2-f9ac-ee58-bdfb6d6b7813.png)

資格情報(API鍵/URL)をメモしておき、作成したWatson Discoveryを起動し、Projectを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a69bddbc-f916-21b1-86b1-f6a534972670.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/b261f81c-b957-6349-2cec-cb1eed33d628.png)

### b. project作成
任意の[Project name]を入力します。
[Project type]はConversational Searchを選択し、「Next」を選択します。*
次に、Data Sourceを選択します。Watson Discoveryは様々なデータソースやファイルタイプに対応していますが、今回は例として、 Web crawlを選択し「Next」を選択します。
<b>*NeuralSeekとはConversational Search以外のProject typeは接続できないため、注意してください。</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/7b619a61-c7c1-9d7e-c724-7c60b32137c7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/c2dd3aac-d5c4-d745-03c6-8a4fbe52ab86.png)

### c. 文書投入
Web crawlについての各種設定を行います。
今回は日本IBMのWebページ (https://www.ibm.com/jp-ja)をクロールするため、URLを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/9cc8f948-03a6-5a71-33e6-34347d30a137.png)
ペンマークをクリックし、「5」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/f23c0ad7-6196-35c9-6478-29606a8d939b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/28c9a836-48e1-9dfe-4a6f-da895315fbce.png)


[Integrate & Deploy]>[API Information]からProject IDをメモし、文書投入が終わるまで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/25751978-442c-b729-237b-bd316f83c5cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a85a563b-fe29-5437-d714-09cf3dbf51b9.png)

## 2. NeuralSeekのセットアップ
IBM Cloudのカタログから「NeuralSeek」を検索し、インスタンスを作成します。ここでは、無料のLiteプランを選択します。*
<b>*Liteプランはインスタンス作成後、30日で消失する可能性があります。あらかじめご認識ください。</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/625fc0e4-2306-df8b-9231-a5d142d7286f.png)

[Launch NeuralSeek]をクリックして、NeuralSeek を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/45395f29-f534-839a-45b8-5ceb397333fb.png)

NeuralSeekを起動すると、HomeタブのBasicsステップが選択された状態で開始されます。
Watson Discoveryに投入した文書と関連のある企業の名前を入力します。
言語は日本語を選択し、利用目的に合わせて外部/内部を選びます。
[Next]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/464040fb-02a2-6e33-34ef-eddfb814ec76.png)

続いて、連携するナレッジベースを指定します。
先ほどメモしたDiscoveryの情報を入力します。
[Test]を押下し、入力したDiscoveryとの接続確認をし、[Next]をクリックします。*
*1度目の押下時にビックリマーク（WDからレスポンスが返ってこない旨）が表示されることがありますが、再度Testしていただくと解消します。解消しない場合は入力内容を確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/e6268d09-6dde-c96f-70f8-65bef5f4cb4a.png)

About ステップでは、NeuralSeek が入力した会社または組織についての紹介文を自動生成します。
上記の内容が正確であることを確認してください。
フレームワークは、今回はwatsonx AssistantのAction機能を利用するため、[Watson Assistant Actions]を選択します。
レスポンスに回答の根拠となるリンクを含めたい場合は、[Enable]とし、[Next] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/1c0c2ad2-8133-35b4-ad4a-5ddf0ab1d499.png)

文書コンテンツとデータに最も似た設定を選択し、コンテンツがどの程度最新であるかを最もよく表すオプションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/13f571e2-b1f0-99e2-d8e8-118fa0da7940.png)
[Next]をクリックし、NeuralSeekのセットアップは完了です。

続いて、watsonx AssistantとNeuralSeek を統合するための情報を取得します。 
[Integrate]タブ に移動します。
APIキーをメモし、Custom Extension OpenAPIファイルをダウンロードします。
watsonx AssistantをNeuralSeekと統合するには、これらの両方が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/d23b05fd-41ad-bc64-49bb-fd1e63948176.png)


## 3. watsonx Assistantのセットアップ
### a. インスタンス作成
watsonx Assistantのインスタンスを作成します。ここでは、無料のLiteプランを選択します。*
*Liteプランは非アクティブな状態が30日間続くと、自動的に削除される可能性があります。あらかじめご認識ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/3f44df50-6327-e014-1cb2-b98b3b0d213d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/6a034f60-acdd-9af3-fe79-c9e300d40b7d.png)

watsonx Assistantを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/5d4c8aea-3431-22bc-0357-d703d8d7b86c.png)

### b. Assistant作成
続いてAssistantを作成します。
Assistant Nameの入力や、languageを選択し、[Next]を選択します(環境によって画面が異なる場合があります)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/efb5ea5a-a53e-2e10-175b-544a9934ff32.png)

適宜情報を入力し、[Next]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/2e085488-ee80-3a5e-8f09-801644af38a4.png)

そのまま[Next]ですすみ、「IBM Watson Assistant Lite」のロゴを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a008310e-e470-d7c7-7fc3-17e30e17de52.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/df8ba07a-0e67-1a1f-38e9-4a3fcc1aa8ad.png)


### c. Custom Extensionの作成
左サイドメニューから[Integration]に移動し、スクロールして[Build Custom extension] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/6a2dfb2a-1ddb-28d9-2866-07eb8f130215.png)

「Next」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/64663fb4-86f0-0654-b7f4-0c36e63aca50.png)

拡張機能にNeuralSeekという名前を付け、簡単な説明を入力し、[Next]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/cca61899-2329-9f01-6e39-19aa3ec4258c.png)
こちらでダウンロードした、NeuralSeek OpenAPIファイル(NeuralSeek.json)をアップロードし、[Next]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/7987965a-0bff-6acc-d6bd-0b3fc466a0ac.png)
レビューを確認して[Finish]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/c2e3f806-b736-4f32-6b13-3dcfaf2c1512.png)

表示される新しい NeuralSeek 拡張タイルで、[Add] >[Add] >[Next] の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a6e2680e-c63a-8dbb-e5ed-122985b9d274.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/b968c631-ea76-e152-ca25-98cfa4493dc1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/c6b20402-814f-3e48-d972-54e89f32f583.png)

認証画面で、API キー認証を選択し、p.19にて取得したNeuralSeekのAPIキーを入力します。
[Next] >[Finish] の順にクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/693f8f18-fb0c-e224-6894-156f431c1158.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a36ba2cd-5e0f-43a0-66c1-116ffcc9187b.png)

以上でNeuralSeekと連携する準備が整いました。


### d. Actionの作成
続いて、Actionを設定していきます。Actionは、外部APIとのやり取りを行う際に設定をします。
NeuralSeekは公式でNeuralSeekアクションのスターターキットを配布しているので、今回はそちらを利用します。
以下のWebサイトにアクセスし、[neuralseek-actions.json]ファイルをダウンロードします。
https://github.com/watson-developer-cloud/assistant-toolkit/tree/master/integrations/extensions/starter-kits/neuralseek
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/16b96446-69e5-2649-ddac-42b22499a473.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/ef173e04-8a19-a7cb-8270-552088bff111.png)

本手順ではAssistantの言語設定をJapaneseで作成しているため、ダウンロードしたActionのjsonファイルを開き、languageの設定を”ja”、off_topicの設定”false”に修正します。
* language
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/4b440e11-8304-6a45-d196-3239b200c9f6.png)
* off_topic
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/7d986e7d-6c28-5b11-76d3-6dfd12470cb4.png)

左のサイドメニューからActionsを選択し、表示された画面の右上にある歯車マークを選択します。
Upload/Downloadタブにて、ダウンロードした「neuralseek-actions.json」ファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/baa409d7-743d-0e9e-12f9-d61d0e45bff6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/99b0ebaf-007d-b995-d5f5-b3b0b8396061.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/73156f51-7583-1b8b-aa02-58cbcbe10cff.png)

テンプレートが追加されると、Statusに赤色のインジケーターが表示されることがわかります。これに対処するために、 [NeuralSeek search]を選択し、アクションを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/8ae19761-89fe-2b03-9bd6-667c8957d7e7.png)

NeuralSeekテンプレートの3番目のstepが赤くなっていますが、このステップに、Extensionを設定する必要があります。
[And Then]セクション内で、 [Edit extension] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/e206e447-0620-a89b-1cd1-e309b2291b7a.png)

続いて、NeuralSeekからの応答を求めるように操作を更新します。
ドロップダウンメニューから先ほど作成したCustom Extensionの[NeuralSeek]を選択します。
Questionパラメータを[Session Variable]>[query_text] に設定します。
options.language文字列を[Expression]>”ja”に設定します。
[Apply]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/9f3fdd54-191d-16a2-49dc-0772aa5bbb73.png)

保存してアクションを閉じます。Statusがグリーンになっていることを確認します。
以上でwatsonx Assistantのセットアップは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/ebdf3301-05ab-3193-8904-0c612298cae1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/7cb1b026-26f8-ae8c-fe26-3308c82f52e7.png)


## 4. 回答確認
watsonx AssistantとNeuralSeekの連携が完了したので、Preview機能で質問をしてみます。
回答が返ってくることができたら、チャットボットの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/95a16135-493d-74e5-75eb-e63e149976c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/cd41e434-f245-fe64-aa56-748332229b08.png)

## 5. 回答チューニング
続いて、回答の細かい設定を行います。チャットボットの回答は、watsonx AssistantやNeuralSeekでカスタマイズすることが可能です。

ここでは、冒頭のあいさつが英語になっているので、日本語にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/bd2b85c7-6e61-3b13-cda1-8dd024779831.png)

watsonx AssistantのActions>Set by assistantを選択し、[Greet customer]をクリックします。
Step1に既存で設定されている英語のあいさつを、任意の日本語文に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/f9e29246-ef92-1f4b-6837-6e7192127b04.png)

変更後、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/311791c3-78ad-3acb-925a-07bcca6df9e1.png)

続いて、NeuralSeekから得られる回答の内容をカスタマイズします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/6849050f-67c3-b586-89ba-335160927ad8.png)

回答の長さは、 NeuralSeekのConfigure>Answer Engineering & Preferencesにて調節できます。
より長い回答を得たい場合は、Very Verboseに近づけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/951fc991-e87a-df96-d593-978f7263b477.png)

設定値の変更による回答内容を比較してみます。
左：変更前
右：変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/3f0c604b-4d51-695d-9d77-93a06e8a8716.png)

NeuralSeekのレスポンスには、回答の根拠となるリンクを付与する機能があります。しかし、デフォルト設定のままではうまく機能しないことがあるため、その場合は以下の手順を実施してみてください。
Actions>Created by youを選択し、[NeuralSeek search]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/26195a31-5ce3-f270-d42b-e52d591bff28.png)

[Assistant says]セクション内に、aタグで囲まれたbody.urlが含まれていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/233d5c29-5b86-5713-1cc7-f1bdb2ae4de4.png)

NeuralSeekのConfigure>Confidence & Warning Thresholdsにて、Semantic Scoreを[Disable]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/59e02900-8e33-717e-e62e-705c84bc28fc.png)

Previewにて確認します。「こちら」をクリックすると、Watson DiscoveryでクロールしたWebページにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/f6428b5d-cc61-259c-b662-20011a8f6c9d.png)

## 6. 運用Tips
ユーザーとのQAのやりとりはNeuralSeek内に全て保存されており、Logsタブから確認できます。
また、日付、セッションID、質問、回答で効率的にフィルタリングすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/a3642cdb-4bd9-49a7-9960-18238620a6ea.png)

回答の精度が思わしくない場合、その回答をトレーニングすることができます。
Curateタブを開き、回答の質問を開きます。これまで回答したAnswerの一覧が表示されるので、クリックして編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/804a67bc-5daa-d823-6a9b-d06b89e300b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/3383349d-50b6-3b39-c220-e45dc1227f0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079128/dfff80a9-0402-90aa-3bd5-d7a6d343f4e2.png)


# まとめ
NeuralSeekを連携したチャットボット作成は以上になります。

いかがでしたでしょうか？
NeuralSeekの強みはなんといっても手軽さにあると思います。ノーコードで構築でき、チューニングもGUIで設定できるので、コードを書き慣れていない方でも簡単にプロビジョニングすることができます（＝ユーザー向き）。

筆者は未実施ですが、BYOLLM（Bring Your Own LLM）プランを利用すれば、サポートされたLLMを連携してプロンプトチューニングも可能になるので、より回答の精度を上げることもできると考えています。

日々アップデートされているのでこれからもキャッチアップして情報共有していければと思います。

以上、ご覧いただきありがとうございました。