watsonxユースケース！ 簡単 門外不出の情報を使うFQA  ソースコード付き

# 組み込み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を使ったアプリの構築方法を説明します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回は 「簡単 門外不出の情報を使うFQA 」
https://github.com/IBM/dsce-sample-apps/tree/main/selfservice-cust-assist-qna
会社員が企業ポータルで健康保険契約を検討する場面で、保険会社は実担当者が対応することがないようにQAサイトを備えています。このQAサイトでは、一般的な既存の質問セットの中からユーザーが選択するか、その他の質問を行うことができます。
その他の質問に関してはWatson Discovery やその他の検索可能な索引付きデータベースなどの文書リポジトリーに質問を転送して関連性の高い断片情報を取得し、この断片情報を元にして質問に対する回答を生成します。
このようなケースでは、Retrival Augumented Generation(RAG)といった手法を用います。その特徴として、保険会社は競争の源泉である門外不出の社内データを外に晒すことがないということです。


# アプリ構築
## 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ファイルを展開すると以下のようなフォルダ構成になっていると思います。今回はその中で[email-thread-summarization]配下にあるリソースを使用します。

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

      cd dsce-sample-apps-main/selfservice-cust-assist-qna

### 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/3b017da6-0716-54a1-e7ad-0a8a829fd8aa.png)

中央の「What is the claims process with the AllBright Insuranace Company?」欄をクリックするとよくある質問を選択できます。その後、この欄の右端にある虫眼鏡アイコンをクリックすると、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:ペナルティなし|