watsonx.aiによる生成系AIチャットボット設定の問題判別


チャットボット作成ツール[watsonx Assistant](https://www.ibm.com/jp-ja/products/watsonx-assistant)と[Watson Discovery](https://www.ibm.com/jp-ja/products/watson-discovery)のテキスト検索機能を使えば、ノーコードで簡単に生成AI [watsonx.ai](https://www.ibm.com/jp-ja/products/watsonx-ai)を使ったチャットボットを作成することができます。

今回、私はとあるwatsonx関連の文書から情報を探し出し、watsonx関連の調査をしたい、という必要性が発生しました。その際、「これも[watsonx.ai](https://www.ibm.com/jp-ja/products/watsonx-ai)に答えてもらおう！」と思い立ちチャットボットを作成しました。そのチャットボットを設定後、なぜか一度動いたものが動かなくなってしまったのですが、問題解析をして復旧することができました。その時の記録が同様の設定をされる皆様の設定時・問題解決のヒントとなるよう期待し本記事を作成します。

## 環境
IBM Cloudの以下のSaaSサービスを使用しました。
- チャットボット作成ツール [watsonx Assistant](https://www.ibm.com/jp-ja/products/watsonx-assistant)
- 生成AI [watsonx.ai](https://www.ibm.com/jp-ja/products/watsonx-ai)
- テキスト検索 [Watson Discovery](https://www.ibm.com/jp-ja/products/watson-discovery)

## 設定の時に参考にした記事
本記事の前提として、以下の２つの記事を参考にさせていただきました。
本記事は特に１番目の記事の設定を理解されていることを前提として記述しますので、もし設定手順自体が初めてという方は先にこの記事に目を通すか実際にやってみることをお勧めします。

- [watsonx Assistant + Discovery + watsonx.ai 連携による生成系AIの活用](https://qiita.com/Jungobu/items/522e1543d2feb9add6ae)　本記事の設定は基本こちらの記事を参照させていただきました。
- [Watson Assistant + 生成系AI (NeuralSeek) + Watson Discovery - 組み込みAI セルフサービス型デジタル共創体験(DSCE)](https://qiita.com/trtrbohz/items/8e7b9916377c12ccfa71)  　「1. Watson Discovery 設定」のところだけこちらを参照しました。


## 正常時の動作
まずは、動作を確認してみましょう。AssistantのPreviewメニューを選択すると、右下にチャットボットの画面が現れ、質問を入力することができます。
![WS001431.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/55944cc9-e23b-a3cb-a7ff-232d87737761.png)

「What's watsonx?」という質問を入力してみました。正しく動いているときの動作はこうなります。

「What's watsonx?」という質問に対して、AssistantがWD内の文書を参照して、説明してくれます。
私が持っていた文書が英語文書だったため、今回のAssistantは英語で対応をするよう設定しています。
![WS001410.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/0621f37c-ce2f-7b24-f1f2-4b1ee3a7911e.png)

## 問題発生時の動作
今回問題が発生したときはこうなりました。「I'm sorry, I encountered an connection error」ということです。
![WS001321.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/1bec6b08-c67b-6809-44a8-badf1bc6768f.png)

## 問題判別のステップ
「I'm sorry, I encountered an connection error」だけでは何が悪いのかわからないので、Assistantの中身をもう少し詳細に見ていきます。
### verbose=trueの設定

さらに、もう少し詳細な情報を取得できるよう、下図の1-6の手順で
問題が発生しているAssistant(Chatbot※)の設定を変更します。

![WS001413.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/4ba0c8cd-78e8-8194-6413-4c7989231c44.png)

![WS001415.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/f3ca2736-da71-1c10-2b62-649c947da1af.png)


※IBM Cloud上のSaaSの１つのWatsonx Assistantサービス（インスタンス）の中には複数の「Assistant」が作れるようになっています(https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-assistant-add)。例えば、１つのWatsonx AssistantのSaaSのサービス（インスタンス）の中に「自動車の故障情報について回答してくれるAssistant(Chatbot)」とか「社内手続きについて教えてくれるAssistant(Chatbot)」を作ることができます。SaaSのサービス（インスタンス）のことなのか、インスタンスの中のAssistant(Chatbot)のことなのか、どっちのことを言っているのかよくわからなくなるのは私だけでしょうか……。本記事ではサービス・インスタンスのWatsonx Assistantと区別するために「Assistant(Chatbot)」という表記を使います。

### Action > Previewの使用とverboseモードの動作確認

verboseの設定を変更したら、そのまま「Action」のページの右下にも「Preview」ボタンがあるので、ここからChatbotを起動してみましょう。

この「Action」のページの中の「Preview」では、Assistant(Chatbot)内で起動されるアクションの動作の１つ１つを詳細に表示し、内部で何が行われているか、詳しく確認することができます。(参考：[アクションのレビューとデバッグ | IBM Cloud 資料](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-review&locale=ja))


![WS001419.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/7ac542ba-fa06-b72c-deea-949cff3c17c9.png)

すると、Assistant(Chatbot)から実施されている処理の詳細情報が取得できます。
Previewウインドウ中で、黄色く「Extension error」と表示されている箇所がエラーの箇所です。「Inspect」という文字がリンクになっているのでクリックしてみます。



![WA_action_verbose_true.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/8c27ba3b-a76f-ca8f-26b3-86cde20f120b.png)


Previewウインドウの左側に「Extension inspector」というウインドウがさらに開きます。


![WS001323.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/bce63e8a-9f0c-55fc-d59f-a6c311422ee1.png)


Overviewタブでこの処理の概要、Advancedタブでこの処理のRequestのcurl表記、ResponseでどのようなResponseが返ってきたかを確認できます。

なんのエラーなのか？というのがResponseで確認できます。今回のエラーはこんな感じでした。

`
{"status":401,"body":{"errors":[{"code":"authentication_no_token","message":"Failed to authenticate the request due to no Bearer token in the request header"}],"trace":"41b64dbe013ecfb48777a32357548d63","status_code":401}}
`

Requestも見てみましょう。
![WS001420.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/a662d5fb-d464-9779-b51e-013fe1f612b5.png)

これらのRequest/Responseから、Assistantからwatsonx.aiのAPIを呼び出しているときに401エラーが発生した、と問題箇所を特定することができます。
(呼び出しているURLの"/ml/v1-beta/generation/text"の部分で[watsonx.aiのAPI](https://dataplatform.cloud.ibm.com/exchange/public/entry/preview?url=https://raw.githubusercontent.com/IBMDataScience/sample-notebooks/master/Cloud/HTML/Use%20Watsonx%20to%20generate%20advertising.html)であることがわかります。）

![WS001421.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/5a945832-7788-d40a-8dce-27c728ac5cbc.png)



### 401 "no Bearer token in the request"の修正
問題箇所が特定できたので、発生しているエラーを修正します。「no Bearer token」というメッセージのため、
watsonx.aiを呼び出している際の"Bearer token"(=APIキーのことです）を修正します。
以下の手順で、設定時に作成したCustom Extensionの設定を開いて修正します。

![WS001428.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/16639c10-c964-7ada-6a7f-1005b796e8cd.png)

![WS001427.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/5e9b455c-32bb-6069-2249-4ff5d78ef603.png)


APIキーは、「[watsonxのAPIを呼び出せるようになるまで](https://qiita.com/katahiro/items/3258cd42226ed82268ac)」」の記事（※）にもあるように、以下のcurlコマンドを使って設定前に動作確認しておくと安心です。
（※本手順の設定をするときは「Service IDを作成する」～「watsonx のプロジェクトにService IDを含める」の箇所を参照すればよいです。）


```
curl --location 'https://iam.cloud.ibm.com/identity/token' \

--header 'Content-Type: application/x-www-form-urlencoded' \

--header 'Accept: application/json' \

--data-urlencode 'grant_type=urn:ibm:params:oauth:grant-type:apikey' \

--data-urlencode 'apikey=_input_your_apikey_here_'
```

APIキーの確認動作例(実行コマンド）
```
#!bin/bash

curl --location 'https://iam.cloud.ibm.com/identity/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json'\
--data-urlencode 'grant_type=urn:ibm:params:oauth:grant-type:apikey' \
--data-urlencode 'apikey=5Ig-dKWU4sYxSP<一部伏字>_GNTE'

```
APIキーの確認動作例(実行結果。。。一部伏字にしたり、レイアウトのため改行を入れていますが、正常の場合はこんな感じで結果が返ります。）
```
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1703  100  1592  100   111    942     65  0:00:01  0:00:01 --:--:--  
1008{"access_token":"eyJraWQiOiIyMDIzMTIwNzA4MzYiLCJhbGciOiJSUzI1NiJ<一部伏字>_ 
HHJ08ah21g","refresh_token":"not_supported","token_type":"Bearer","expires_in":3600,
"expiration":1703500314,"scope":"ibm openid"}

```

### verbose=falseに戻す
後は動作確認し、正常に結果が返ってverbose=falseに戻すだけです。手順は「verbose=trueの設定」と同じでfalseに変えるだけなので省略します。

![WS001410.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536361/0621f37c-ce2f-7b24-f1f2-4b1ee3a7911e.png)


### 結局、何が原因だったのか？
直接原因はエラーメッセージの通りにwatsonx.aiに"Bearer token"(=APIキーのことです）が正しくわたっていなかったことです。ただ、私の場合、設定後、一度正常に動作したはずなのにエラーが発生しました。本問題判別をサポートしていただいたサポートの方のコメントによると、『Custom Extensionを開いた時に（何も変更していないつもりでも）「Save」してしまって指定したAPIキーの情報が消えてしまってのでは』ということです。


### さいごに
以上、watsonx.aiによる生成系AIチャットボットの設定の問題判別の一例をご紹介しました。今回はapiキーを消してしまった症例の解決方法でしたが、他の事象が発生した場合でも本手順でご紹介したverbose設定を使って問題判別していけるのではと思います。本記事が同様な設定をされる方の一助となることを願います。