watsonxユースケース！ 簡単 botの窓口業務引き継ぎ円滑化  ソースコード付き

# 組み込みAI セルフサービス型デジタル共創体験(DSCE)とは

[組み込みAI セルフサービス型デジタル共創体験](https://qiita.com/trtrbohz/items/356a5a4b66624b2c94a2)に記載しております。
現在は STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIをサーバーに接続しなくても組み込んで利用することが可能となりました。
その情報がこちらの[サイト](https://dsce.ibm.com/)、DSCE([Digital Self-Serve Co-Create Experience](https://dsce.ibm.com/);"組み込みAI セルフサービス型デジタル共創体験"？)にて紹介されております。さらに IBM の新たなAIエンジンである watsonx もユースケースを交えて紹介しております。
ここではそのDSCEの中からwatsonxを使ったアプリの構築方法を説明します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回は 「簡単 簡単 botの窓口業務引き継ぎ円滑化」
https://github.com/IBM/dsce-sample-apps/tree/main/agent-handoff-insights
銀行で口座振替などの自動化可能な場面では、bot等のバーチャルエージェントを活用することがあります。一方、利用者はバーチャルエージェント活用の途中で実担当者による会話に切り替えたいと希望する場合があります。そのため、担当者は利用者とバーチャルエージェント間の会話内容を理解し、効率的に業務を引き継げるようにする必要があります。
そんな時、本アプリで「Get Insights」をクリックするとwatsonx.aiが事前構成されたプロンプトに従って要約、会話のトピック、発信者の感情、および主要なキーワードを表示してくれます。
しかも、この watsonx では、モデルのトレーニングやチューニングするための追加学習は不要です。


# アプリ構築
## 1. 前提
* ターミナル環境
mac : ターミナルを使います。[ココ](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac) を見てターミナルを起動できるようにしてください。
windows : powershellを使います。[ココ](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3) を見てpowershellを起動できるようにしてください。
* リソース取得
下のURLにアクセスしリソースを取得します。
https://github.com/IBM/dsce-sample-apps/tree/main
※コード改変＆プルリクをするのであれば「git clone」コマンドを使うのですが、今回はソースコードの入手が目的ですので以下の様に Zip 形式でリソースを入手します。
![スクリーンショット 2023-08-12 22.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e97bd8bc-0767-b52e-9914-d11c0af69259.png)
リソース取得後、zipファイルを展開すると以下のようなフォルダ構成になっていると思います。今回はその中で[sales-conv-insights]配下にあるリソースを使用します。

## 2. 手順
### 2.1. [sales-conv-insights]フォルダに移動
zipファイルを解凍した場所を起点として[sales-conv-insights]フォルダに以下のようにして移動します。

      cd dsce-sample-apps-main/sales-conv-insights

### 2.2. 必須ライブラリのインストール

      pip3 install -r requirements.txt

### 2.3. APIキー生成or取得と設定
#### 2.3.1. APIキー生成or取得
以下の図を参照してAPIキーを生成or取得してください。※一度生成していれば再作成は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/c7bd56ce-21ea-4073-e72f-7087ac6d493d.png)

①IBM Cloudにログイン
②上メニューにある「管理」ー「アクセス(IAM)」をクリック。左バーにある「APIキー」をクリックし、右側にある「作成＋」をクリック
③APIキーに適当な名前を付与
④生成されたAPIキーをメモ帳等で大切に保管 
<font color="MediumVioletRed">※このAPIキーを他人と共有しないようにしてください。</font>

#### 2.3.2. APIキー設定

brief-builderフォルダの中で<font color="MediumVioletRed">".env"ファイルを作成します。</font>
.envファイルの中で以下のパラメータを作成し、APIキーを紐つけてください。

    WATSONX_API_KEY=<your IBM Cloud API key>


### 2.4. プロジェクトID生成or取得と設定
#### 2.4.1. プロジェクトID生成or取得
以下の図を参照してプロジェクトIDを生成or取得してください。※一度生成していれば再作成は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/03d3b434-5eb4-38cf-d65d-90f652ed00d6.png)

①watsonx.ai にログイン。プロジェクトがない、または新しくプロジェクトを作成する場合には「新規プロジェクトの作成」として「＋」ボタンをクリック。既存のプロジェクトがある場合は、そのプロジェクトをクリック。→③へ
②プロジェクト名を記載したのち「作成」ボタンをクリック
③画面上部のメニューから「管理」タブを選択
④作成したプロジェクトのプロジェクトIDをメモ帳等で大切に保管

#### 2.4.2. プロジェクトID設定
brief-builder/payload フォルダの中に存在する全jsonファイルにプロジェクトIDを記載していきます。

    "project_id": "<your watsonx instance project_id>"

### 2.5. アプリ実行

      pip3 template.py

その後、http://localhost:8050 にアクセス。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/815fe99a-0d02-f1df-977f-3fafb97b397e.png)

左下の[Sample text]ボタンをクリックして左枠の「Virtual agent transcript」に例文を入力した後、[Get insights]ボタンをクリックすると画面右側にLLMの回答結果が表示されます。
ここでは、これまでの会話の要約、トピック、発信者の感情、および主要なキーワードを表示します。

## appendix.&nbsp;&nbsp;watsonx.ai の実行パラメータ

[2.4.2. プロジェクトID設定]のところで触れた <font color="MediumVioletRed">brief-builder/payload フォルダの中に存在するjsonファイルそのものがwatsonx.aiに送信するプロンプトになります。</font>
このファイルに以下のパラメータを設定することで watsonx.ai の大規模言語モデル(LLM)のパラメータを調整することができます。 

| # | パラメータ名 | 説明 |
|---|---|---|
| #1 |model_id| 大規模言語モデルのモデル|
| #2 |decoding_method| 出力テキストの生成時にトークンを選出する方法を表します。選択肢はgreedyとsample。greedyの場合、連続する各トークンは既に生成されているテキストの中で最も確率の高いトークンに対応します。一方sampleの場合、既に生成されているテキスト、または次のトークンの確率分布に基づいて後続のトークンを選出し、テキストを生成します。|
| #3 |max_new_tokens| 生成されるトークン数の最大値 (デフォルト 20)|
| #4 |min_new_tokens| 停止シーケンスが指定された場合、最小トークンは生成されるまで無視されます。 (デフォルト 0)|
| #5 |stop_sequences| テキスト生成を停止させるストリング|
| #6 |repetition_penalty| 重複ペナルティ（1以上であれば重複しないようにモデルを調整し、１以下の場合は重複した結果が出てくる。) デフォルトは1.0:ペナルティなし|