watsonx.aiで、日本語文のセンチメント分析(感情分析)を行います。LLMにはIBMのgranite-8b-japaneseを使ってみます。プロンプト・ラボでやったことのPython版になります。プロジェクトの準備までは同じ手順になりますので、プロジェクトを作成しておいてください。
具体的にはスマートフォンのレビュー文を「ポジティブ」か「ネガティブ」に分類してみます。
レビュー:
驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
感情:
ポジティブ
- テスト環境
- watsonx.ai (クラウド)
- python:3.10.9
- ibm_watson_machine_learning:1.0.353
APIキーとプロジェクトIDの取得
APIキーの作成
watsonxのハンバーガーメニューから「アクセス(IAM)」にアクセスします。
プロジェクトID取得
プロジェクトに入り、「管理」タブの「一般」を選び、「プロジェクト ID」をコピーします。
Jupyter Notebookからの実行
Jupyter Notebookで実行してみます。
watsonxの上のJupyterでも実行できますし、VS Codeなどから手元のPC環境でも実行できます。
まずpipでibm-watson-machine-learningのパッケージを導入しておいてください。
pip install ibm-watson-machine-learning
ibm-watson-machine-learningから必要なモジュールをインポートします。
from ibm_watson_machine_learning.foundation_models import Model
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes, DecodingMethods
プロジェクトID、APIキーは先ほど取得したものを入力します。
#APIキー
api_key = "xxxxxxxxxxx"
#プロジェクトID
watsonx_project_id = "xxxxxxxxxxxxxxxx"
エンドポイントURLはリージョンに合わせて以下から選びます。ここではgranite-8b-japaneseモデルを使いたいので、東京リージョンのエンドポイントURLを選んでいます。
url = "https://jp-tok.ml.cloud.ibm.com"
基盤モデルを選択しています。
ModelTypesは以下で定義されています。
ただ、ibm-watson-machine-learning-1.0.353では、まだgranite-8b-japaneseが定義されていなかったので、model_type = 'ibm/granite-8b-japanese'で文字列で定義しています。
サポートされているモデルは以下に掲載されています。
model_type = 'ibm/granite-8b-japanese'
# model_type = ModelTypes.ELYZA_JAPANESE_LLAMA_2_7B_INSTRUCT
次にモデルパラメーターを設定していきます。
次のパラメーターを指定しています。以下に定義があります。
各パラメーターの意味は以下です。
generate_params = {
GenParams.DECODING_METHOD: DecodingMethods.GREEDY,
GenParams.REPETITION_PENALTY: 1.1,
GenParams.MIN_NEW_TOKENS: 0,
GenParams.MAX_NEW_TOKENS: 200
}
model = Model(
model_id=model_type,
params=generate_params,
credentials={
"apikey": api_key,
"url": url
},
project_id=watsonx_project_id
)
プロンプト・ラボとの対応は以下のようになります。
プロンプトを作成します。
ここではFew-shotでプロンプトを作っています。複数の「レビュー」と「感情」の組合せの例をいくつか用意しています。そして最終的に結果を得たい「レビュー」を{input_text}で与えるようにしています。このように関数化することで、複数の「レビュー」に対して繰り返して処理を行うことも可能にしています。
# プロンプトの作成
def get_prompt(input_text):
# Get the complete prompt by replacing variables
# 変数を置き換えて完全なプロンプトを取得します
complete_prompt = f"""
このスマートフォンに関するフィードバックを分析し、顧客のポジティブな/ネガティブな感情を特定してください。
レビュー:
驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
感情:
ポジティブ
レビュー:
カメラの性能が他の機種に比べるとやや劣っています。特に暗所での撮影時には、ノイズが目立ちます。
感情:
ネガティブ
レビュー:
デザインは非常に洗練されており、手にしっくりと馴染みます。操作性も高く、使いやすさに定評があります。
感情:
ポジティブ
レビュー:
画面の解像度がやや低いです。テキストや画像を拡大すると、粗さが目立ちます。
感情:
ネガティブ
レビュー:
{input_text}
感情:
"""
return complete_prompt
以下で生成を実行しています。「カメラ機能は優れており、高品質な写真や・・・」の文書をポジティブかネガティブで分類しています。
model.generateにプロンプトを入れているだけです。
# プロンプトに入力テキストを入力
complete_prompt = get_prompt('カメラ機能は優れており、高品質な写真や動画を撮影できます。さまざまな撮影モードやエフェクトも豊富です。')
# LLMから結果を取得
generated_response = model.generate(prompt=complete_prompt)
response_text = generated_response['results'][0]['generated_text']
import pprint
pprint.pprint(generated_response)
generated_responseはdict型になっていて、この'results'の中に結果が含まれています。「ポジティブ」が戻ってきており、うまく感情を分類できていることがわかります。
{'created_at': '2024-03-27T05:02:27.186Z',
'model_id': 'ibm/granite-8b-japanese',
'results': [{'generated_text': 'ポジティブ',
'generated_token_count': 2,
'input_token_count': 198,
'stop_reason': 'eos_token'}]}
実行したプロンプトと生成結果を出力してみます。
print("--------------------------------- Generated output -----------------------------------")
print("Prompt: " + complete_prompt.strip())
print("---------------------------------------------------------------------------------------------")
print("Generated output: " + response_text)
print("*********************************************************************************************")
--------------------------------- Generated output -----------------------------------
Prompt: このスマートフォンに関するフィードバックを分析し、顧客のポジティブな/ネガティブな感情を特定してください。
レビュー:
驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
感情:
ポジティブ
レビュー:
カメラの性能が他の機種に比べるとやや劣っています。特に暗所での撮影時には、ノイズが目立ちます。
感情:
ネガティブ
レビュー:
デザインは非常に洗練されており、手にしっくりと馴染みます。操作性も高く、使いやすさに定評があります。
感情:
ポジティブ
レビュー:
画面の解像度がやや低いです。テキストや画像を拡大すると、粗さが目立ちます。
感情:
ネガティブ
レビュー:
カメラ機能は優れており、高品質な写真や動画を撮影できます。さまざまな撮影モードやエフェクトも豊富です。
感情:
---------------------------------------------------------------------------------------------
Generated output: ポジティブ
*********************************************************************************************
プロンプト・ラボとの対応は以下のようになります。
サンプルプログラム
参考
watsonx.aiで日本語文のセンチメント分析(プロンプト・ラボ編)