[IRNA] IRNAからwatsonx.aiに質問する方法

# はじめに
IBM Rapid Network Automation(IRNA)からIBMのLLMプラットフォームであるwatsonx.aiに質問をするワークフローを作ってみたので紹介します。

# 実現方法
IRNAのワークフロー機能には、HttpRequestというGUIベースで作成した設定を元にAPIコールを実施してくれるものがあります。
今回はHttpRequestの機能を使ってwatsonx.aiに対してAPIコールで質問を投げ、回答をもらうという動作を実現しました。

:::note info
この記事はIBM Cloudのアカウントがあることを前提にしています。
さくっと試したい場合は以下のリンク先から評価環境の作成が可能です。
https://jp-tok.dataplatform.cloud.ibm.com/registration/stepone?context=wx&preselect_region=true
また、IRNAからwatsonx.aiにアクセスできる環境が必要です。
:::

# 1. 事前準備
事前準備としてwatsonx.aiのデプロイを済ませ、APIキーとProject IDを取得しておきます。
APIキーとProject IDの取得方法は以下を参考にしてください。

[watsonxのAPIを呼び出せるようになるまで](https://qiita.com/katahiro/items/3258cd42226ed82268ac)
[watsonx.aiのAPIの使い方とサンプルコード](https://qiita.com/ironikot/items/021b3530b54ca39bc0d8)

# 2. ワークフロー作成
IRNAのワークフローを作成します。
完成したワークフロー全体の流れは図のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/a4856d03-d459-6e76-3503-9c21401bfa2d.png)

以降に個々の設定内容を説明します。

## 2-1. 環境変数の設定
まず、環境変数として以下の変数を定義しました。
`$question_message`  watsonx.aiに質問するプロンプト文章、ここに質問内容を入力する
`$watson_api_token` APIキーから取得するアクセストークン
`$apikey` 事前準備で取得したAPIキー
`$project_id` 事前準備で取得したProject ID

`$result` はデフォルトで存在する変数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/8784ad11-32de-4237-a405-ba589d872776.png)

## 2-2. 1つ目のHttpRequestの設定
1つ目のHttpRequestはAPIキーからアクセストークンを取得するために作成します。

:::note warn
IBM Cloudの仕様上、発行されたアクセストークンは1時間(3600秒)が有効期限になっていました。一定時間経過するとアクセストークンがExpireしてしまうため、都度取得するワークフローとしました。
:::

以下のcurlを実行するとアクセストークンを取得できるので、これをHttpRequestのパラメータとして置き換えて設定します。
```
curl -X POST "https://iam.cloud.ibm.com/identity/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json' \
-d 'grant_type=urn:ibm:params:oauth:grant-type:apikey' \
-d 'apikey=事前準備で取得したAPIキー'
```

HttpRequestはCommon配下にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/b6ff9372-50ea-bdfc-a8d7-e961b0927028.png)


HttpRequestでは画像のような設定となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/312df5db-85ed-0f84-66df-d13fe86340ba.png)

Queryに設定した`"grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=" + $apikey`で事前に取得したAPIキーをセットしています。

## 2-3. 1つ目のAssignの設定
上記のHttpRequestで取得したアクセストークンを環境変数にセットするAssignを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/295cdbd6-aa77-a084-cd80-4a3a6e04df26.png)

## 2-4. 2つ目のHttpRequestの設定
2つ目のHttpRequestがwatsonx.aiにプロンプトをリクエストする部分の設定になります。

どういったパラメータを入力する必要があるのかはwatsonx.aiのPrompt Labから確認しました。
Prompt Labではプロンプトをコード表示する機能があるのでcurlではどういったコードになるかの確認が可能です。画像の赤枠部分をクリックするとコードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/3c21cee0-e6c7-3d66-4c0d-98e01519a777.png)

テキストでは次のような内容です。
```
curl "https://jp-tok.ml.cloud.ibm.com/ml/v1/text/generation?version=2023-05-29" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -d '{
	"input": "IBM watsonx.aiについて教えてください",
	"parameters": {
		"decoding_method": "greedy",
		"max_new_tokens": 200,
		"min_new_tokens": 0,
		"stop_sequences": [],
		"repetition_penalty": 1
	},
	"model_id": "ibm/granite-8b-japanese",
	"project_id": "使用するwatsonx.aiのProject IDが入ります"
}'
```
:::note info
URLはwatsonx.aiをデプロイしているリージョンによって変更が必要です。
今回の例は東京リージョンとなります。他のリージョンはリンク先のEndpoint URLsを参照してください。https://cloud.ibm.com/apidocs/watsonx-ai
:::

HttpRequestでcurlのコードを置き換えて画像のような設定をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/a6d49a52-c0cb-633b-2b86-55f9bb778456.png)

次の点で汎用性を上げています。
・Headersの"Authorization"に有効なアクセストークンが必要となるので`$watson_api_token`を使用
・Bodyの"input"に`$question_message`を使用することで質問内容を変更したい場合に環境変数値の変更で対応可能

別のLLMを使用したい場合は”model_id”を変更することで可能です。watsonx.aiでサポートされているLLMはリンク先でご確認ください。
[IBM Cloud 上のサービスおよび機能の地域での可用性](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/regional-datactr.html?context=wx&locale=ja)

## 2-5. 2つ目のAssignの設定
最後に上記のHttpRequestの結果をAssignにセットする設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/6e34d819-f55f-8042-1081-328333c234b7.png)


# 3. テスト
作成したワークフローでwatsonx.aiに質問できるかテストします。
設定に問題なければRunを実行した際のLogで回答が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/9d2cecdf-9483-3612-cefc-a2e871ecd6e8.png)

以下が「IBM watsonx.aiについて教えてください」の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361515/1478915e-50f4-c6de-3e19-ed868b0442bd.png)

Prompt Labで質問した場合と同じ結果が得られたので正しく機能しているようです。

# 4. さいごに
今回の記事はここまでのワークフローの内容ですが後続で別のサービスに渡すようなワークフローが実際のユースケースと想定されます。
また、今回Inputは固定で設定していますが他の機器からのwebhook通知など動的な入力情報からwatsonx.aiに質問することでIRNAとwatsonx.aiのシナジーが発揮できると思います。



以上、IRNAからwatsonx.aiに質問する設定の紹介でした。