watsonx.aiで日本語文からの項目抽出(プロンプト・ラボ編)

watsonx.aiで、日本語文からの項目抽出(Entity Extraction)を行います。LLMにはIBMのgranite-8b-japaneseを使ってみます。

具体的には以下のような保険請求文書から、車両タイプと車種、日付、時間帯と場所の情報をJSONで抽出してみます。



~~~md:Examples (Input:)
保険請求文書:
ハイブリッドセダン型車両、トヨタプリウス、2024年2月15日午後3時頃、
神奈川県横浜市の都市部の交差点で信号待ち中に後方から追突され、
後部バンパーが損傷しました。
追突事故により、車両の後部パネルにもひびが入り、修理が必要です。
保険金の支払いを申請します。
~~~

~~~md:Examples (Output:)
JSON:
{"車両タイプ": "ハイブリッドセダン型車両", 
"車種": "トヨタプリウス", 
"日付": "2024年2月15日", 
"時間帯": "午後3時頃",
"場所": "神奈川県横浜市"}
~~~

* テスト環境
    * watsonx.ai (クラウド)

# プロジェクトの準備
watsonx.aiで「新規プロジェクト」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6413e7ec-a596-e635-7e09-b867f38f037a.png)

適当に名前をつけて「作成」します。ここでは「240308xai」という名前にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1f34cf13-0bb4-4050-d2df-2bb6bc7da058.png)

Watson Machine Learningというエンジンのサービスを関連付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6492c217-51fc-b136-1460-7115dba8d07a.png)

あらかじめ用意しておいたWatson Machine Learningのサービスを「アソシエイト」します。もし用意していなければ「新規サービス」から追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ab96f02f-5d4f-b675-7710-80f07951379f.png)

# プロンプト・ラボ起動
資産タブにうつり「新規資産」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/aec4e0a7-8499-6200-67da-2f12d5553e65.png)

「プロンプト・ラボ」をクリックして起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cdb222a8-d605-79ee-8bef-5e8921b64fad.png)

# プロンプトの入力
「フリーフォーム」を選び、以下のプロンプトを入力します。
複数の「保険請求文書」と「JSON」の組合せの例をあたえたFewShotのプロンプトになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b30a3d7e-9848-7524-1bca-6664cb01dd75.png)

```md:プロンプト
以下の保険請求文書の説明から、車両タイプと車種、日付、時間帯と場所に関する詳細を含む JSON オブジェクトを生成してください。


保険請求文書:
ハイブリッドセダン型車両、トヨタプリウス、2024年2月15日午後3時頃、神奈川県横浜市の都市部の交差点で信号待ち中に後方から追突され、後部バンパーが損傷しました。追突事故により、車両の後部パネルにもひびが入り、修理が必要です。保険金の支払いを申請します。

JSON:
{"車両タイプ": "ハイブリッドセダン型車両", "車種": "トヨタプリウス", "日付": "2024年2月15日", "時間帯": "午後3時頃", "場所": "神奈川県横浜市"}


保険請求文書:
SUV型車両、ランドローバーディスカバリー、2024年3月1日午前10時頃、埼玉県川口市の高速道路上で車線変更中に側面から衝突され、ドライバーサイドのドアとフェンダーが損傷しました。修理には大規模なボディパネルの交換が必要です。修理費用の請求をいたします。

JSON:
{"車両タイプ": "SUV型車両", "車種": "ランドローバーディスカバリー", "日付": "2024年3月1日", "時間帯": "午前10時頃", "場所": "埼玉県川口市"}


保険請求文書:
コンパクトカー型車両、ホンダシビック、2024年1月10日午後8時頃、東京都世田谷区の住宅街の駐車場で車両が盗難に遭いました。警察に被害届を提出し、車両の所在が確認できないため、保険金の支払いをお願いします。

JSON:
{"車両タイプ": "コンパクトカー型車両", "車種": "ホンダシビック", "日付": "2024年1月10日", "時間帯": "午後8時頃", "場所": "東京都世田谷区"}

保険請求文書:
ピックアップトラック型車両、フォードF-150、2024年2月20日午後2時頃、千葉県柏市のショッピングセンターの駐車場で後退中に他の車両に接触し、リアバンパーとトランクに損傷が発生しました。修理費用の請求を申し上げます。

JSON:
{"車両タイプ": "ピックアップトラック型車両", "車種": "フォードF-150", "日付": "2024年2月20日", "時間帯": "午後2時頃", "場所": "千葉県柏市"}

保険請求文書:
ステーションワゴン型車両、スバルアウトバック、2024年1月5日午後4時頃、神奈川県横須賀市で自宅近くの道路で大雨による洪水が発生し、浸水によりエンジンと電子システムに損傷が発生しました。保険金のお支払いをお願いします。

JSON:
```

# LLMモデルの選択

モデル選択のメニューを開き「すべての基盤モデルを表示する」でLLMモデルを選びます。watsonx.aiではユースケースにあわせてLLMのモデルを選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b3cf5940-7c47-9100-52dd-1d62ee4edc7d.png)

ここでは「granite-8b-japanese」を選択します。日本語に対応したIBM提供のモデルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ea438e03-a51c-b90a-3277-2ed0bdea4571.png)

モデルの詳細が表示されます。「モデルの選択」で進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cd1a265d-1fc6-a942-06c6-89612ca257a1.png)

watsonx.ai で使用可能なサポート対象の基盤モデルは以下です。

https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=wx&audience=wdp

# モデルパラメータの設定

次に「モデルパラメータ」のアイコンをクリックして設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/95aa5f6e-ce72-1774-80fb-3fe456d52354.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/28122b22-44be-23d7-e32b-5cdc8ceb8d58.png)

ここでは、
デコード：Greedy
反復ペナルティ：１
停止規準：}
最小トークン数:0
最大トークン数:800
を設定しました。

Greedyで毎回同じ結果をえて、JSONなので「}」で終了するように設定しています。

うまく望む結果が得られない場合にはパラメーターを調整します。
モデルパラメータの意味は以下のドキュメントにあります。

https://jp-tok.dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-model-parameters.html?context=wx



# 生成

では、「生成」を実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/484380dd-d2c7-6064-590e-0af07686bf41.png)

期待通りJSON形式で抽出ができました！
```JSON
JSON:
{"車両タイプ": "ステーションワゴン型車両", "車種": "スバルアウトバック", "日付": "2024年1月5日", "時間帯": "午後4時頃", "場所": "神奈川県横須賀市"}
```

# 試行錯誤

ちなみにモデルを日本語には正式対応していない「flan-ul-20b」を選び、先ほどのJSONの結果を削除して、「生成」を実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3d9040c0-0a41-a89b-786f-3ee5bd85ea52.png)

正しい結果が得られませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5769b769-3f02-74c2-2862-e1f2051199bd.png)

このプロンプト・ラボでは、プロンプトを書き換えたり、モデルやモデルパラメーターを変更して、望ましい結果が得られるプロンプトとモデルとモデルパラメータの組合せを試行錯誤して探すことができます。


# 参考

#### IBM watsonx.ai を試してみた ( コピペ OK ) 💙 #Watson-Studio - Qiita 

https://qiita.com/yanagih/items/3d1b081f46799072df80#enjoy-your-watsonxai-life-

#### watsonx.aiで日本語文からの項目抽出(Python編)
この記事内容をpython APIで実行しています。

https://qiita.com/kawada2017/items/1ddf432a12fd289ad9a7