IBM watsonx Assistant から ChatGPT (OpenAI API) を呼び出してみた

# 概要
本記事では、[IBM watsonx Assistant](https://www.ibm.com/jp-ja/products/watsonx-assistant) （旧 IBM Watson Assistant）の[ツールキットとして提供されている情報](https://github.com/watson-developer-cloud/assistant-toolkit/tree/master/integrations/extensions/starter-kits/language-model-openai)を元に、watsonx Assistant と ChatGPT (OpenAI API) を連携する方法をキャプチャ画面を多用して説明します。技術選定や理解推進の役に立てばと思います。

> つい先日（2023年8月あたり）にIBM Watson AssistantからIBM watsonx Assistantに名称変更がありました。まだ、変更が追いついていない部分があるので、IBM Watson Assistant→watsonx Assistantと読みかえていただければと思います。

# はじめに

IBM watsonx Assistant は チャットボット構築のためのサービスです。ChatGPT が出てきて、もう全部 ChatGPT でいんじゃね？という雰囲気が強い気がしてますが、コストや回答の確からしさを考えるとルールベースでのチャットボットとの組み合わせが必要なのかなと思います。watsonx Assistant は、よくある質問に対して、ルールベースで事前に登録しておいたアクションを実施できることや、様々なツールと連携できることが特徴です。また、質問の意図を理解するためにChatGPTと同じようにトランスフォーマーを使用しているらしいです。また、OpenAPI のフォーマットに従ってオリジナルの拡張機能を定義することで様々な REST API を呼び出すことも可能です。

実は拡張機能を使うことで、watsonx Assistant から ChatGPT を API (OpenAI API や Azure OpenAI API) として呼び出すことも可能です。なんと、[公式のドキュメント](https://github.com/watson-developer-cloud/assistant-toolkit/tree/master/integrations/extensions/starter-kits/language-model-openai)で連携方法も提供されています。コンペになりうるのに驚きです。連携のユースケースとしては、watsonx Assistant を入り口として、よくある質問に対しては watsonx Assistant の機能を使って事前に登録した回答し、事前に予測できない質問に対しては ChatGPT に答えてもらうような使い方があるかと思います。また、ChatGPT と社内ドキュメントのデータベースを連携して、事前に準備し切れない質問に回答してもらうことも可能です。拡張できるって素晴らしいですね。

本記事では、[IBM watsonx Assistant](https://www.ibm.com/jp-ja/products/watsonx-assistant) （旧 IBM Watson Assistant）の[ツールキットとして提供されている情報](https://github.com/watson-developer-cloud/assistant-toolkit/tree/master/integrations/extensions/starter-kits/language-model-openai)を元に、watsonx Assistant と ChatGPT (OpenAI API) を連携する方法をキャプチャ画面を多用して説明します。技術選定や理解推進の役に立てばと思います。

# 想定読者

- チャットボットの構築を検討している方
- ChatGPT (OpenAI API) の実装を検討している方

# 構築方法
## IBM Cloud アカウントの作成

下記サイトからアカウントを作成します。必要な情報を入力するだけではあるけれど、クレジットカードの認証が厳しいらしく悩ましいかな正直、鬼門かなと思います。問い合わせて対応してもらうと、うまくいったというケースも聞きましたので、諦めない気持ちが大事だと思います。

[IBM Cloud 無料利用枠 - 日本 | IBM](https://www.ibm.com/jp-ja/cloud/free)

## watsonx Assistant の構築

アカウントを作成したら、まず watsonx Assistantのインスタンスを作成していきます。

ログイン後の最初のダッシュボード画面で、右上の`リソースの作成`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/afb1801d-2e06-da69-85ec-fc09c8577ec8.png)

カタログが出てきますので、`assistant`と検索して`Watson Assistant`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/a9449693-6e2c-20e5-2fb6-a42bef7975e5.png)

無償枠のライトプランを選択し、`作成`します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/70ccf50e-a33a-682b-46b0-8fd67cafb49a.png)

作成後は`リソース・リスト`に追加され、以下の画面が表示されますので、`Watson Assistantの起動`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/8b280b04-4887-b744-24cb-e404c416a56a.png)

watsonx Assistantの画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/90f4e51a-e796-9c7d-9c1b-4fbefc89ec7a.png)

これで、watsonx Assistantの準備ができました。
次に、OpenAI側の準備を実施します。

## OpenAI API key の取得

ここでは、[OpenAI APIのサイト](https://openai.com/blog/openai-api)に行って、API Keyを取得する方法を記載します。

リンクに飛ぶと以下の画面が表示されます。アカウントがないひとは`Sign up`でアカウントを作成します。
右上の、`Log in`ボタンを押すと、なぜかAPIのダッシュボードでなく、チャットである「ChatGPT」の方にログインしてしまうので、アカウントを持っている人も`Sign up`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/11671389-5aa8-f889-e165-e8380aaa34d9.png)

アカウントを持っていない人は、アカウントを作成してください。持っている方は、`Log in`ボタンからログインしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/298a7170-0c6e-ef6c-b8b3-b442a0150e4a.png)

最初の画面の`Log in`を押すと、このような画面になるので、アカウントを持っている方はこちらからもアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/6e537fe5-21d2-88a7-64ff-140b0b097fba.png)

ログインするとAPIのダッシュボードが表示されます。右上のアカウントアイコンをクリックし、さらに`View API keys`をクリックすると、API keyの管理画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/f4c72f48-56cc-0538-6d2d-f145bbe20a84.png)

次に、`Create new secret key`をクリックすると、API keyを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/fc19b2c9-fe59-fb25-0249-cd3d7b0cc4a0.png)

覚えやすいような名前をつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d33ec8e0-27d4-6791-e258-f2c1e8b12e24.png)

表示された文字列がAPI keyとなります。ここでしか表示されないので、後から使うためにコピペしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/bb1a671e-72b1-8e1d-c647-46baa813ecd5.png)

また、使いすぎたり、API Keyが漏れた時のために、Usage limitsをつけておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b8f2866c-6cf3-ef3c-d017-74d4e22ddd99.png)

以上で、OpenAIのAPI keyが取得できました。
次は、watsonx Assistantの拡張機能を設定していきます。

## watsonx Assistant の Custom extension の作成

ここでは、拡張機能としてOpenAI APIにアクセスするための情報を入力していきます。

まず、左下の`Integrations`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/12a400e9-a948-972f-7f95-eb8f9c32d50e.png)

以下のようなダッシュボードが表示されます。`Build custom extension`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/cffa6319-ef56-a39c-e6ef-8b70b6a5d587.png)

設定画面に行くので、記載を読んだ後、`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d096da80-a98d-527e-8c96-48bd7928be41.png)

名前をつけて、`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/1772b937-0472-ec90-7c72-2138e6e2c8df.png)

[設定ファイルが置かれたGitHub](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-openai/openai-openapi.json)にアクセスし、`openai-openai.json`ファイルをダウンロードします。このjsonファイルに、OpenAI APIのAPI定義等が記載されています。自分で、カスタマイズすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/838c8339-0c7d-77f2-ab9b-9efb5d85881e.png)

上記jsonファイルをアップロードします。以下の画面は、アップロード後の表示です。その後、`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/a7e8b577-77c1-3c09-61ca-7af05bde40a7.png)

これで、jsonファイルに記載されていた情報から拡張機能が定義されたので内容を確認して右上の`Finish`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/8fbfa412-37ac-bb94-90e2-feb5ee1efa3e.png)

`Integrations`のダッシュボードに戻ると、`Extensions`のところに、先ほどつけた名前（`openai example`）が表示されていることを確認できます。さらに、設定するために、`Add`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/df593695-fe2e-fa5b-eb34-c137d37653f7.png)

確認画面が表示されるので、`Add`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/227f1d46-02ed-cd3d-0135-a73cfb327329.png)

記載を読み、`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/260bb63e-ed0e-b80b-98f0-caab8403ac46.png)

OpenAI側のAuthenticationの設定をしていきます。`Bearer auth`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/3e655d11-b83d-e574-509d-1fe181206c6a.png)

前章で取得したAPI keyを`Token`欄に貼り付け、`Next`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/4e5572e3-58be-0f7a-6d23-a4605bc6d02b.png)

最後に、設定項目を確認し、右上の`Finish`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/711aed9a-b38e-7d36-fa75-6306890c2515.png)

以上で、拡張機能の登録が完了しました。次に、登録した拡張機能を呼び出すためのアクションを設定していきます。

## watsonx Assistant の Action の作成

本章では、チャットボットの動作をルールベースで定義するためのアクションを作成していきます。
左側のアイコンから`Actions`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/afe8d7ea-22af-210c-c043-c4e72e976127.png)

以下のような画面に遷移します。
この画面ではGUIでアクションを定義できますが、今回は、jsonファイルをアップロードすることで定義します。
`Global settings`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/5b8f9aa8-e25d-b7df-8978-70ba1ccf0c7e.png)

全体の設定を実施するための画面に遷移します。
右上の、`Upload/Download`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/12cc1d1e-ffa4-34f9-6f03-d33a36edc1e9.png)

左側の`Upload`のところから、jsonファイルをアップロードしていきます。jsonファイルの取得方法は次で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/63467a05-3ad7-d5fb-75d7-9bb3ab91e465.png)


[GitHubのページ](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-openai/openai-actions.json)から、`openai-actions.json`ファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/28c97a36-2cd1-2e2d-3d1a-01ae99581370.png)

ダウンロードしたファイルをアップロードしようとすると、以下のようなエラーが表示されます。
エラー内容を読むと、日本語設定では、New Off Topicが使えないようです。オフトピックとは、トピックから外れた質問に対応するための機能のようです。
以下で、エラーを解決するために、jsonファイルを修正していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b41d68ae-76b5-989f-5b7e-aee3c7e6acf2.png)

jsonファイルをエディターで開いて、1424 行目の下記 3 行を削除します。

```json
      "off_topic": {
        "enabled": true
      },
```

先ほどの画面から、再度アップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/6e0e5a2a-ddb0-801c-7e9d-47ef921a0258.png)

無事、アップロードに成功すると、`Actions`画面に3つのアクションが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/64dbe769-d070-749f-faab-3219e015f0cf.png)

これで、watsonx AssistantからChatGPTにアクセスする準備ができました。
折角ですので、次章で実行する前にアクションの中身を確認していきます。

## watsonx Assistant の アクション

ここでは、３つあるアクションのうち、`Test model`と`Invoke GPT Chat Completion API`を確認していきます。OpenAIは、呼び出すモデルによってAPI仕様が異なり[Chat completions API](https://platform.openai.com/docs/api-reference/chat)と、レガシーな[Completions API](https://platform.openai.com/docs/api-reference/completions)の2種類があるため、watsonx Assistantのアクションについても2種類（`Invoke GPT Chat Completion API`と`Invoke GPT Completion API`）あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/64dbe769-d070-749f-faab-3219e015f0cf.png)

まず、呼び出しの入り口になる`Test model`についてみていきます。
最初に、アクション呼び出しのためのフレーズが記載されています。ここれは、`Test model`が登録されているため、それに近い意味の文字列が入力された時、このアクションが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/706a6c80-d1f6-2435-2681-fc1c83c59954.png)

最初のステップでは、モデルを選択してもらうダイアログが登録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/8c256c68-f666-cade-8174-3d5f9774cbce.png)

次に、トークン数の入力ダイアログがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/9257de1c-9da4-a659-3f31-6d12245db002.png)

そして、ユーザー質問文の入力が促されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/56b65981-6b36-f561-639e-29606ed6d18e.png)

ここまでで得られた情報を変数に詰めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/80f522bc-acc4-3d37-97b2-bad0f7ee9790.png)

まず、gpt-3.5、gpt-4を選択した場合、`Invoke GPT Chat Completion API`アクションを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/84469b82-b599-fc3f-ffa7-5840f1bd4ccd.png)

また、レガシーなtext-davinci、text-curieを選択した場合、`Invoke GPT Completion API`アクションを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/bd78bef8-b4cf-a513-b1cb-e407d5c0e434.png)

最後に、モデルのレスポンスをユーザーに返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d436469e-8858-8a29-6323-485579d92ffe.png)

次に、gpt-3.5、gpt-4を呼び出した時のアクションの詳細について説明します。
このアクションは、先ほどのアクションから呼び出すため、ユーザーからの入力トリガーは設定していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/6f14d448-3b66-60cc-da7a-79e4bf719b6d.png)

API呼び出しのためのパラメータを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/7c4a6423-d550-b416-7a65-c6a29b0bda43.png)

レスポンスが正常だった場合、APIレスポンスのチャッの回答部分をユーザーに返すための変数に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b34ebc25-7241-2e70-bfea-b145bc7a63db.png)

レスポンスが異常だった場合、ユーザーに返すための変数にnullを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/fbaa6ab4-e309-587f-cd1d-7ce4c2679af0.png)

アクションの説明は以上となります。もう一つの`Invoke GPT Completion API`については説明しませんでしたが、`Invoke GPT Chat Completion API`と同様な処理になっています。OpenAI API仕様に従って、リクエストとレスポンスのパラメータを処理しています。

## watsonx Assistant の Preview の確認
最後に、実際の動きをプレビュー機能を使って確認していきます。
`Actions`画面の右下にある`Preview`をクリックして、文字列を入力していきます。
ここでは、`test model`と入力→`gpt-3.5-turbo`をクリック→`50`と入力→`日本の首都はどこ？`と入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/e0304f04-2ff5-4833-b9b5-9937cd95cf81.png)

`日本の首都は東京です。`と回答が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/4bcda899-12dd-f291-ad1b-f361d3ab693c.png)

プレビュー画面では、`Inspect`をクリックすると、`Overview`と`Advanced`からAPI呼び出しの詳細を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/e5197560-929f-542d-d546-710dea84a70d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/fcadc653-7594-a2b0-ce69-4300b9645568.png)

また、左側の`Preview`からは、より実際の画面に近い状態で動作を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b2bdf6ed-fcb2-1a3b-b649-9e494c3c053a.png)

以上で、IBM watsonx AssistantからChatGPT (OpenAI API)を呼び出す方法についての説明を終わります。

# おわりに

IBM watsonx Assistant がいろんなものと連携できることは知っていましたが、実際試せて良かったです。比較的簡単に連携できました。Infrastructure as Code 的に json ファイルをインポート・エクスポートできるのもいいですね。ChatGPTだけでなく、いろんなシステムと連携ができそうで、夢が広がりますね。
また、コンペにもなりうる OpenAI との連携について、提供しているのに驚きました。ユーザーフレンドリー・開発者フレンドリーなエコシステムを構築しながら市場も広がると良いですね。