このチュートリアルでは、犬のグルーミングビジネスのカスタマーレビューを含む合成データセットを使用して、IBM Graniteモデルをプロンプト・チューニングします。
プロンプト・チューニングは、モデル全体を再トレーニングして重みを更新することなく、人工知能(AI)基盤モデルを新しい下流タスクに適応させる効率的で低コストの方法です。
基盤モデルは大規模言語モデル(LLM)上に構築され、大量のトレーニングデータを受け取ります。基盤モデルのユースケースは、チャットボットとバーチャル・アシスタントです。
基盤モデルのインプットの解釈と応答の品質を向上させる方法はいくつかあります。これらのニュアンスをより深く理解するために、いくつかの方法を比較してみましょう。
ハード・プロンプトはユーザー対応で、ユーザーのアクションを必要とします。ハード・プロンプトは、LLMが応答を生成するためのテンプレートまたは指示と考えることができます。次に、ハード・プロンプトのサンプルを紹介します。このプロンプトタイプとその他のプロンプトタイプの詳細については、IBMドキュメントページをご覧ください。
このハード・プロンプト・テンプレートを使用すると、LLMに、好みのアウトプットの構造とスタイルに関する具体的な指示を提供できます。この明示的なプロンプトを通じて、LLMはより高品質で望ましい応答を生成する可能性が高くなります。
ソフト・プロンプトは、ハード・プロンプトとは異なり、自然言語で書かれません。代わりに、プロンプトは、より大きなモデルから知識を抽出する各入力埋め込みの先頭に追加される、AI生成の数値ベクトルとして初期化されます。この解釈可能性の欠如は、特定のタスクに最適化されたプロンプトを選択するAIにも及びます。多くの場合、AIは、なぜこれらの埋め込みを選択したのかを説明できません。他のプロンプト方法と比較して、これらの仮想トークンは、モデル自体が固定された重みでフリーズされたままになるため、ファイン・チューニングよりも計算コストが低くなります。また、ソフト・プロンプトは、人間が作ったハード・プロンプトよりも優れたパフォーマンスを発揮する傾向があります。
このチュートリアルでは、プロンプト・チューニングのためにソフト・プロンプトを取り扱います。
watsonx.aiプロジェクトを作成するにはIBM Cloudアカウントが必要です。
いくつかあるツールの中から選択することもできますが、このチュートリアルでは、Jupyter Notebookを使用してIBMアカウントを設定する方法について説明します。
watsonx.aiにログインします。IBM Cloudアカウントを使用します。
watsonx.aiプロジェクトを作成します。
プロジェクトIDはプロジェクト内から取得できます。「管理(Manage)」タブをクリックします。次に、「一般(General)」ページの「詳細(Details)」セクションからプロジェクトIDをコピーします。このチュートリアルではこのIDが必要になります。
Jupyter Notebookを作成します。
このステップでは、このチュートリアルのコードをコピーして独自にプロンプト・チューニングを実施できるノートブック環境を開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。このJupyter Notebookと使用されるデータセットはGitHubにあります。
watsonx.aiランタイム・サービス・インスタンスを作成します(適切なリージョンを選択し、無料インスタンスであるLiteプランを選択)。
APIキーを生成します。
watsonx.aiランタイム・サービス・インスタンスを、watsonx.aiで作成したプロジェクトに関連付けます。
このチュートリアルには、いくつかのライブラリーとモジュールが必要です。以下を必ずインポートしてください。それらがインストールされていない場合は、pipをクイックインストールすることで問題が解決されます。
認証情報を設定します。APIキーとプロジェクトIDを入力します。
環境を確立するための最初のステップとして、認証の詳細を使用してAPIClientのインスタンスを作成し、project_idを設定します。
アウトプット:
'SUCCESS'
このチュートリアルでは、犬のグルーミング用ビジネス・レビューで構成される合成データセットを使用します。適切なURLを使用して、データセットをAPIクライアントに接続できます。
データセットは自由に使用できます。HuggingFaceなどのプラットフォームでは、いくつかのオープンソースデータセットが利用可能です。
アウトプット:
Creating data asset...
SUCCESS
アウトプット:
3b1db894-8d9e-428d-8fee-d96f328c7726
これらのカスタマーレビューの形式について洞察を得るために、データをPandasデータフレームにロードし、肯定的レビューと否定的レビューの両方を示すいくつかの行を印刷しましょう。アウトプット「1」は肯定的なレビューを表し、「0」は否定的なレビューを表します。
アウトプット:
TuneExperimentクラスは、実験を作成し、チューニングをスケジュールするために使用されます。これを使用して実験を初期化し、基本の基盤モデル、トレーニングデータ、パラメーターを設定しましょう。このプロンプト・チューニング演習の目標は、データセットから抽出された顧客満足度の評価に従ってLLMに応答を調整させることです。レビューは肯定的(「1」)または否定的(「0」)のいずれかに分類できるので、これは分類タスクです。
このチュートリアルでは、同様の結果を得るために、大規模言語モデルとしてIBM Graniteモデルを使用することをお勧めします。
チューニングの実験を設定できたら、それをデータセットに接続する必要があります。これにはDataConnectionクラスを使用しましょう。APIクライアントでデータ資産を開始する際に、以前に作成したasset_idが必要です。
使用するAIモデルの選択は自由です。watsonxを通じてチューニングできる基盤モデルは、こちらまたは次のコマンドを実行して見つけることができます。
アウトプット:
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
アウトプット:
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.
プロンプト・チューニングが完了したことを確認するため、ステータスを確認できます。印刷のステータスが「完了」以外の場合は、チューニングが完了するまで待ってから続行してください。
アウトプット:
完了
これで、プロンプト・チューニング・サマリーを取得できます。このサマリーには、損失値が表示されます。トレーニングを実行するたびに、損失関数は予測の結果と実際の成果の差を測定します。したがって、損失値が低いことが望ましいです。
また、plot_learning_curve()関数を使用して、モデル・チューニングの学習曲線をプロットすることもできます。ゼロに近い下向きの曲線は、モデルが期待されるアウトプット生成を改善していることを示しています。損失関数グラフの解釈の詳細については、関連するIBM watsonxドキュメンテーションを参照してください。
アウトプット:
チューニングされたモデルをデプロイするこのステップは、チューニングされたモデルのパフォーマンスを事前チューニングされたモデルと比較する次のステップを完了するために重要です。
注:SERVING_NAMEは、一意の値でなければならないため、現在の日時が設定されます。
アウトプット:
######################################################################################
Synchronous deployment creation for id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started
######################################################################################
initializing.......................
ready
-----------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------
ここで、チューニングされたモデルと元の基盤モデルの両方のパフォーマンスをテストし、チューニングプロセスの影響を確認してみましょう。まず、テスト用のデータセットを読み込みましょう。このデータセットは、チューニング中には存在しなかったデータのサブセットである必要があります。多くの場合、テスト・セットはトレーニング・セットよりも小さいものです。さらに、テストデータセットの各インプットには、ユーザーのコメントの接頭語としてプロンプトがあります。
データセットの小さな部分を表示して、その構造をよりよく理解してみましょう。
アウトプット:
テストデータセットを読み取り、インプットとアウトプットを抽出しましょう。
また、サンプルのテスト入力と出力を印刷して、データセットのコンテンツを抽出した方法をより深く理解することもできます。
アウトプット:
'Extract the satisfaction from the comment. Return simple 1 for satisfied customer or 0 for unsatisfied.\nComment: Long wait times.\nSatisfaction:\n'
この例では、プロンプトを取得し、その後、長い待ち時間に関する顧客のレビューを取得し、最後に満足度は否定的なレビューを意味する0となっています。
アウトプット:
0
テストデータセットが用意できたので、チューニングされたモデルの精度とF1スコアをテストしてみましょう。F1スコアは、モデルの精度と再現率の平均です。そのためにはdeployment_idが必要です。ただし、APIのレート制限に達しないようにするために、concurrency_limitは2に設定されています。これは、同時に送信されるリクエストの数です。
アウトプット:
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
モデルの高い精度とF1スコアを考慮して、同じGraniteモデルのパフォーマンスをチューニングせずにテストしてみましょう。
アウトプット:
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
チューニングされたモデルでは、事前に調整された基盤モデルよりも優れたパフォーマンスを発揮します。チューニングされたモデルは満足度スコアの抽出に特化しているため、他の満足度抽出タスクにも使用できます。お疲れさまでした。
このチュートリアルでは、watsonx APIを使用してIBM Graniteモデルでプロンプト・チューニングを実行しました。チューニングされデプロイされたモデルでは、基盤モデルよりも約5%高い精度で優れたパフォーマンスを発揮することに成功しました。