生成系AI活用術！watsonx Assistant × 生成系AI(watsonx.ai) 連携ガイド

:::note info
以下ウェビナーを開催しました｡資料・録画をイベントページで公開しておりますのでぜひ御覧ください｡
~~下記お知らせでご案内しました､2023/11/1のハンズオンの内容をオンラインで再演いたします｡
watsonx Assistantの構築方法をご説明いたします｡~~

2023/11/09(木)13:00 〜 14:00 あなたも作れるチャットボット！watson Assistant
https://ibm-developer.connpass.com/event/293354/

~~ただし時間の都合上､本記事の内容であるwatsonx.ai連携に関する内容は含みませんのでご了承ください｡~~
:::

:::note info
お知らせ(2023/11/1 終了しました)
~~2023/10/31-11/1に[IBM TechXchange Conference Japan](https://www.ibm.com/jp-ja/events/techxchange?utm_medium=Exinfluencer&utm_source=Exinfluencer&utm_content=TXCWW&utm_term=20CN4&utm_id=TechXchange-via-Sale)という技術イベント内でwatsonx Assistantのハンズオンセッションを行います｡~~

~~11/1 15:30-17:10 【ハンズオン】あなたも作れるチャットボット IBM watsonx Assistantハンズオン~~

~~限られた時間になりますが､セッションの一部で本記事の内容にも触れます｡
本イベントは技術講演やwatsonx AssistantをはじめとしたIBM製品に触れるハンズオンなど､多様なセッションをご用意しております｡ぜひご参加ください｡~~
:::

:::note info
(2023/09/16)お知らせ2
[本記事の要点をまとめた動画](https://video.ibm.com/recorded/133040256)を公開しました｡
:::

# はじめに
昨今､多くの企業が生成系AIの活用に注力されていることと思います｡

[IBM watsonx.ai](https://www.ibm.com/products/watsonx-ai)は生成系AIモデルの構築・利用のためのプラットフォームです｡
IBM製の基盤モデルやHugging Faceとの連携を通じて多様なAIモデルを提供しています｡

参考：[watsonx.ai で使用可能なサポート対象のファウンデーション・モデル](https://www.ibm.com/docs/ja/watsonx-as-a-service?topic=models-)

先日社内ウェビナーで私が聞いた例えを引用いたしますと､watsonx.aiは「あらゆるタスクで80点が取れる1つのAIモデルではなく､得手不得手はあるけれど得意分野では90点を取れる多数のAIモデルを提供すること」が特徴の一つです｡
タスクごとに高い精度を求めるお客様にとっては､watsonx.aiが提供するAIモデルを使い分けて利用することが適しているケースがあるのではないでしょうか｡

ここからは本記事のメインであるwatsonx Assistantの話に移ります｡
先ほどwatsonx.aiの特徴で触れたように多様なAIモデルを使い分ける場合､これらを業務システムへ組み込む際の負荷が課題になるのではないでしょうか｡
watsonx Assistantはカスタム拡張機能により簡単に外部APIを利用することができます｡
これにより､AIモデルの追加や切り替え､チャットボットのタスクに応じて利用するAIモデルを呼び分ける､といったことを容易に行なえるようになります｡

本記事では､カスタム拡張機能によりwatsonx Assistantとwatsonx.aiを連携する方法をご説明します｡
なお､OpenAPIドキュメントが用意されていれば､watsonx.aiに限らず他の生成系AIや､その他のAPIとも連携が可能です｡

:::note info
OpenAPIはAPIのインタフェースを記述するフォーマットです｡
OpenAPIフォーマットで記載したドキュメントをOpenAPIドキュメントと呼びます｡
:::

# watsonx Assistantと生成系AI(watsonx.ai)連携手順
本セクションではwatsonx Assistantとwatsonx.aiの連携手順をご説明します｡

本手順はwatsonx Assistant､watsonx.aiの無料プランを利用して実際にお試しいただくことができます｡
無料プランでのインスタンス作成方法も手順内でご説明します｡

## watsonx.ai用OpenAPIドキュメントのダウンロード
[こちらのGitHubページ](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json)より､watsonx Assistantに読み込ませるOpenAPIドキュメント(watsonx-openapi.json)をダウンロードしてください｡

## watsonx.aiインスタンスの作成
以下の記事を参考に､watsonx.aiのインスタンスを作成してください｡
[0からのIBM watsonx.aiのはじめかた](https://qiita.com/ironikot/items/a1ff1423c5c2e7c44876#%E8%B6%85%E6%97%A9%E3%81%84%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95)

## watsonx.ai用APIKeyの作成

watsonx.aiのプロンプトラボから､watsonx Assistantに連携するプロジェクトを開きます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/6c81669a-dd5d-d3fc-02d5-2167d94aa231.png)

画面右上「モデル：(モデル名)」→「すべての基盤モデルを表示する」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/579ba53d-8961-4a61-dc99-ed482858bf3d.png)

watsonx Assistantと連携したいモデルを選択します｡本記事ではmpt-7b-instruct2を使用します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/cdb52149-5298-e2f8-ca39-67e709c70e55.png)

画面右側の「コードの表示」を選択します｡
表示されたcurlコマンドの内容は､後のwatsonx Assistantの「チャットボットActionの作成」手順で参照しますので､ブラウザのタブは開いたままにしてください｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/639c9fe2-6fa2-d178-7d3a-b65c2e990b5d.png)

「コードの表示」右の「i」ボタンを選択し､「Create a personal API key」リンクを選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/e6c378cf-2b36-1633-492e-4b563513552d.png)

IBM Cloudコンソールが開きますので､画面右の「作成」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/ecb3c5c2-80dd-7a54-2c98-cec31c0372b1.png)

作成するAPI Keyに任意の名前をつけて､作成ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/c874999e-1274-abab-34b6-24153082525b.png)

API Keyの文字列が作成されます｡ダウンロードボタンをクリックしてローカルの任意の場所に保存します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/907c243d-5234-90e6-3c54-462c9d91469d.png)

## watsonx Assistantインスタンスの作成
以下の記事の「Watson Assistant インスタンスを作成する」部分を参考に､watsonx AssistantのLiteプランのインスタンスを作成してください｡
[Watson Assistantのインスタンスを立てる](https://qiita.com/yanagih/items/b02db00d06de397bec64)

IBM Cloudコンソールのリソース・リストから作成したインスタンスを選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/ca650da1-5dac-e9d8-0b62-f2f6e5d46221.png)

「Watson Assistantの起動」をクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/10c38273-e69b-dacb-bc68-219f1b4d8934.png)

## チャットボット作成
「Create your first assistant」画面で「Assistant name」に任意のチャットボットの名前を入力します｡
「Assistant Language」は「Japanese」を選択します｡
画面右上「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/238e9ab5-42af-8836-f375-3c8d687da202.png)

「Personalize your assistant」の各項目に作成するチャットボットと開発者の情報を入力します｡
「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/bd1d6c5b-b399-9a83-e981-14c5376a41e0.png)

必要に応じてチャットボットのデザインを変更します｡
「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/7ddb06ce-a183-29ee-a643-a3100d7c5ce9.png)

チャットボットのイメージを確認し､画面右上「Create」をクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/d57b9c7d-5409-4a35-587a-28efbc689bde.png)

## Extension(カスタム拡張機能)の作成
watsonx Assistantのメニュー画面で､画面左下「Integration」をクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/a24224a5-cfca-e14e-9802-9348e64633f3.png)

「Build custom extension」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/ac7d3657-4836-d4ae-d5c6-346fc699d975.png)

「Get Started」画面で画面右上「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/de552592-5e14-e425-bdbb-685929eb4766.png)

「Extension name」欄に任意のExtension名を入力します｡
「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/632234a1-6c2a-6654-508f-6583f43ab667.png)

「Drag and drop file here or click to upload」にGitHubからダウンロードしたOpenAPIドキュメント(watsonx-openapi.json)をドラッグしアップロードします｡
「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/a76d28ce-2a46-949d-7a72-5cfeca23e452.png)

API定義がインポートされたことを確認して､「Finish」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/5e8a32f8-265a-d5d7-87e3-ad5acec9af61.png)

## チャットボットへのExtensionの適用
Integrations画面内に作成したExtensionが表示されます｡
(以下画像内では「watsonx.ai」)
「Add」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/e8e45117-a45f-5a5c-f629-ff4dda1bc3e6.png)

「Add」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/6ce29261-1595-0ff6-63cf-d979f01ddf2a.png)

「Get started」画面で画面右上「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/aa84f45a-a0d3-93ab-da8e-fcacdbf8960d.png)

「Authentication type」は「OAuth 2.0」を選択します｡
「Apikey」に上の手順で作成したwatsonx.aiのAPIKey文字列をコピー&ペーストして入力します｡(44桁の英数字記号)
その他の項目はデフォルト値のままで結構です｡
「Next」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/09f48863-0349-738a-147c-7fd167c6bf17.png)

「Finish」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/388beb3c-2264-c135-62f4-b1ff3344662a.png)

「Close」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/c97af4f6-9ea1-1097-ea82-bbb595ebff00.png)


## チャットボットのActionの作成
本セクションではチャットボットからwatsonx.aiのAPIを利用する､サンプルのActionを作成します｡

メニュー画面で､画面左上の「Actions」をクリックします｡
右ペインで「Create action」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/e048e8e7-3914-f3dc-f257-4988708ec84a.png)


任意のAction名を入力します｡
このAction名がチャットボット内からActionを起動するためのキーワードとなります｡
「Save」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/ae244ac9-e4e7-1bad-5746-7163c08f7bd1.png)

### Step1：Action起動時のメッセージ
「Assistant says」欄に､このActionが起動した際のチャットボットからのメッセージを入力します｡
「Define customer response」をクリックし､「Free text」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/be19fd7c-7504-e013-87ef-44b1dbd0d66e.png)

### Step2： watsonx.ai用extensionの呼び出し
画面左下「New Step」ボタンをクリックしてStepを追加します｡
「And then」欄の「Continue to next step」をクリックします｡
リストから「Use an extension」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/eba7bc78-5e1e-bbdf-fdca-0e4c73355852.png)

「Extension setup」ダイアログの「Extension」欄で､watsonx.ai用に作成したExtension名を選択します｡
「Operation」で「Generation」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/3b203933-d24a-9a1d-f631-e64237a09fd0.png)

watsonx Assistantへの設定値の確認のため､前述の「watsonx.ai用APIKeyの作成」手順で開いたwatsonx.aiの画面をブラウザの別タブで表示します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/639c9fe2-6fa2-d178-7d3a-b65c2e990b5d.png)

watsonx Assistant「Extension setup」画面の「Parameters」､「Optional parameters」を設定します｡
* Parameters：実行対象のAIモデル､プロジェクトを指定します｡
    * version(*1)： watsonx.aiのcurlコマンドの対象URL内の「version」の値を入力(例：2023-05-29)
    * input： 「Action Step Variables」→Step1で入力したメッセージを選択
    * model_id(*1)： watsonx.aiの「model_id」の値を入力(例：ibm/mpt-7b-instruct2)
    * project_id(*1)： watsonx.aiの「project_id」の値を入力(36桁の英数記号)
* Optional Parameters(*2)：AIモデルの実行方法を指定します｡
    * parameters.temperature(*3):トークンの確立を制御するための値｡範囲は0.05-1.00
    * parameters.max_new_tokens(*3):生成する新規トークンの最大値｡デフォルト300
    * parameters.min_new_tokens(*3):生成する新規トークンの最小｡デフォルト1
    * parameters.stop_sequences(*4):出力内で生成された場合にテキスト生成を停止する文字列｡デフォルト ["\n\n"]
    * parameters.repetition_penalty(*3):既に生成されたトークンやコンテキストに属するトークンへのペナルティ｡範囲は1.0-2.0｡デフォルト1｡1

*1 入力方法は「To」欄の選択→「Enter text」→文字列の入力→Apply
*2 パラメータの詳細は公式ドキュメント「[ファウンデーション・モデル・パラメーター: デコードおよび停止基準](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html?context=wx&audience=wdp)」をご参照ください｡
*3 入力方法は「To」欄の選択→「Enter a numbert」→数値の入力→Apply
*4 入力方法は「To」欄の選択→文字列の入力→Apply

「Parameters」､「Optional parameters」を設定したら「Apply」ボタンをクリックします｡
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/d5b182f5-0de8-3e99-aac4-73e1ad7dd2f3.png)

### Step3： Extension実行結果の表示
画面左下「New Step」ボタンをクリックしてStepを追加します｡
「Is taken」のリストを「with conditions」に変更します｡
「Conditions」のStep1で入力したメッセージ部分をクリックし､「[extention名] (step2)」 →「Run successfully」を選択します｡
「2 Ran successfully == true」という条件にしてください｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/233a53cc-c189-4afb-4963-73138a4dedcc.png)

画面右上の「Set variable values」をクリックします｡
中段に現れた「Set new value」ボタンをクリックし､「New session variable」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/d7511cb7-da6b-9e51-fb69-ffc9fe467ee0.png)

「Session variable」ダイアログでNameに任意の変数名を設定します｡
「Type」は「Free text」を選択します｡
「Apply」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/2c880a18-d6c3-81ea-3852-26d9f7219fa2.png)

先ほど定義した変数名に対する「To」欄で「Expression」を選択します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/7291fd4a-46a2-4c66-1353-5fa262b7528c.png)

「Expression」欄で「$」を入力します｡
表示された一覧から「[extention名] (step2)」 →「body.results」を選択します｡
「{step_xxx_result_1.body.results}」という値が入力されます｡(xxx部分の番号は環境によって異なります｡)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/aa2016fa-0b95-28c5-01d4-fb6b2a7bd764.png)

Expressionの値を調整して、回答の文字列のみを表示するようにします。
「{step_xxx_result_1.body.results}」に対して「[0]["generated_text"]」を追加します｡
「Apply」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/ebc2f282-08f8-c12b-a2da-ca91acc89ddc.png)

「Assistant says」欄に「$[変数名]」を入力します｡
画面右上「save」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/90dbeff6-a9c8-fe4f-3b2c-f523ce55bde0.png)

構築手順は以上です｡お疲れ様でした｡

## 動作確認
プレビュー機能でwatsonx.aiの呼び出しを試してみます｡

画面右下「Preview」ボタンをクリックします｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/1c634a36-fcd6-0f6b-adca-f8f76e9daa93.png)

アクション名を入力してアクションを起動します｡
Step1で設定したメッセージが表示されます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/8d17f483-db06-f42f-8826-59946e9408fc.png)

指示文を入力します｡
* サンプル
    * Write a thank you note in 5 sentences for attending a workshop. Attendees: interns Topic: codefest, AI Tone: energetic

watsonx.aiから応答が返りました｡

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/05391bbf-3f45-ffdd-e823-ff83730e54b2.png)

なお､プレビューでは､「Inspect」ボタンをクリックすることでAPI Request/Responseの内容を確認することができます｡
接続がうまくいかない場合の解析に利用する事ができます｡

# まとめ
watsonx Assistantがカスタム拡張機能により生成系AIと簡単に連携できることをご理解いただけましたでしょうか｡

watsonx Assistantをユーザインタフェースとして生成系AIに適用することで､AIモデルの追加や切り替え､チャットボットのタスクに応じて利用するAIモデルを呼び分ける､といったことを容易に行うことができます｡
* AIモデルの追加：新規Extensionの追加
* AIモデルの切り替え：手順「Step2： watsonx.ai用extensionの呼び出し」でのmodel_idやproject_idの変更

また､構築・運用に関わるwatsonx Assistantの従来のメリットももちろん享受できます｡
1. 構築が簡単 - GUIベースでコーディングなしで構築できる / ノンプログラマーでも構築可能 / テストも簡単
1. デプロイが簡単 - Publishして、プラグインを埋め込むだけ
1. 分析も簡単 - ログの取得、返答出来なかった内容をダッシュボードでまとめてチェック可能

ぜひこれらの利点を活かして､watsonx Assistant､watsonx.aiをご活用ください｡

# 参考資料
* [How to connect WatsonX with Watson Assistant](https://ruslanmv.com/blog/How-to-connect-WatsonX-with-Watson-Assistant)
* [カスタム拡張機能で「いろんなモノ」につなぐ](https://qiita.com/yanagih/items/ae4fdf5a72bf665ce142)