watsonx AssistantのExtentionをカスタマイズしてwatsonx.ai APIをデコード"Sampling"で呼び出す

# はじめに
watsonx Assistantからwatsonx.aiのAPIを呼び出す手順を説明するガイドが複数公開されています｡
ガイドの中で､watsonx.aiのOpenAPIドキュメントとして以下のGitHubリポジトリを案内している場合が多いのではないでしょうか｡
[assistant-toolkit/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json)

しかし､上記のOpenAPIドキュメントは現状､watsonx.ai APIの「デコード」パラメータを"Sampling"で実行するためのパラメータが不足しています｡

※Samplingモードとは
SamplingモードはGreedyモードと比較して生成される文のランダム性が大きくなります｡
以下､[ドキュメント「基盤モデル・パラメーター: デコードおよび停止基準」](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html?context=wx&audience=wdp)より引用
> * Greedy decoding: Selects the token with the highest probability at each step of the decoding process.
> * Sampling decoding: Offers more variability in how tokens are selected.

上記Git Hubリポジトリに"Sampling"モードに対応したパラメータの追加をリクエストしているのですが､反映されるまでの暫定策として本記事ではOpenAPIドキュメントを手動でアップデートする手順をご紹介し､"Sampling"モードでの実行を試してみたいと思います｡

参考) "Greedy"モードのパラメータ(watsonx.ai UIより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/f3ee05eb-ac43-d475-858b-6de9b267a931.png)

参考) "Sampling"モードのパラメータ(watsonx.ai UIより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/943120d8-dbc2-d877-7d47-2cb52bfeb971.png)

# watsonx-openapi.jsonにパラメータを追加する

まずは[GitHub](https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json)にアクセスして､watsonx-openapi.jsonファイルをダウンロードしてください｡

エディタで開き､"parameters"セクションに以下3つのパラメータを追加してください｡

```
"decoding_method": {
  "type": "string",
  "description": "Decoding is the process that a model uses to choose the tokens in the generated output.",
  "example": "greedy"
},
"top_k": {
  "type": "number",
  "description": "Top-k sampling samples tokens with the highest probabilities until the specified number of tokens is reached.",
  "example": "50"
},
"top_p": {
  "type": "number",
  "description": "Top-p sampling samples tokens with the highest probability scores until the sum of the scores reaches the specified threshold value.",
  "example": "1"
}
```

参考) 編集後イメージ("parameters"セクション部分のみ抜粋)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/cfb28f14-b649-2f59-c24b-b2bd59d8a983.png)

# watsonx Assistantでのチャットボット作成
以下のQiita記事を参考に「Step1：Action起動時のメッセージ」までを実施してください｡
「Extension(カスタム拡張機能)の作成」手順では上記手順で編集したwatsonx-openapi.jsonをインポートしてください｡
[生成系AI活用術！watsonx Assistant × 生成系AI(watsonx.ai) 連携ガイド](https://qiita.com/KTZM/items/4bc20d4caed43f3630ba#step2-watsonxai%E7%94%A8extension%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97)

続いて､「Step2： watsonx.ai用extensionの呼び出し」手順ではjsonファイルの編集によってデコード"Sampling"でもAPIを実行可能になっています｡
本記事では例として以下のように設定してみます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/d1bf871e-b569-731e-2ced-fabe4858f085.png)

* Parameters
    * version： 2023-05-29
    * input： 「Action Step Variables」→Step1で入力したメッセージを選択
    * model_id： meta-llama/llama-2-70b-chat
    * project_id： watsonx.aiの「project_id」の値を入力(36桁の英数記号)
* Optional Parameters
    * parameters.min_new_tokens: 0
    * parameters.decoding_method: sample
    * parameters.repetition_penalty: 1
    * parameters.max_new_tokens: 200
    * parameters.top_k: 50
    * parameters.top_k: 1
    * parameters.temperature: 0.7
    * parameters.stop_sequences: 空欄(デフォルト ["\n\n"])

なお､"version", "input", "project_id"以外は別の値でも構いません｡
watsonx.aiのプロンプトラボを活用しながら調整してみてください｡
[ドキュメント「基盤モデル・パラメーター: デコードおよび停止基準」](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html?context=wx&audience=wdp)

続けて､再度以下のQiita記事を参考にして「Step3： Extension実行結果の表示」を実施してください｡
[生成系AI活用術！watsonx Assistant × 生成系AI(watsonx.ai) 連携ガイド](https://qiita.com/KTZM/items/4bc20d4caed43f3630ba#step3-extension%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%81%AE%E8%A1%A8%E7%A4%BA)

以上でアップデート版のjsonファイルを用いたwatsonx Assistantのチャットボット作成が完了です｡

# 動作確認
動作を確認してみましょう｡
※パラメータにより応答が変わることにフォーカスしており､応答の精度については言及いたしません｡
※同じパラメータでも以下と同じ応答を返さない場合があります｡

Action編集画面右下のPreviewボタンでチャットボットを起動します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/825d4f65-12b9-e1a1-0657-74731ecc75a7.png)

アクション名(ここでは"call watsonx.ai")を入力してアクションを起動します｡
Step1で設定したメッセージが表示されます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/5faeb862-404a-d876-708a-bae8a2f2aede.png)

生成AIに送信する指示文を入力します｡
[例]
Write a thank you note in 5 sentences for attending a workshop. Attendees: interns Topic: codefest, AI Tone: energetic

## "Sampling"モード応答例
上記パラメータ設定での"Sampling"モードでは以下の応答が返りました｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/a4f078fa-f26c-7994-2ef3-77d65e4714eb.png)

## "Greedy"モード応答例
"Greedy"モードの応答と比較してみましょう｡

[Greedyモードパラメータ設定例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/60094f2d-6a21-6419-eca9-1438ffb9631e.png)

[Greedyモード応答例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/039e1de3-ef83-fc66-18a7-901c52bb720f.png)

このようにパラメータ設定により応答を変更することができました｡