毎月開催されているwatsonx.ai Dojoのハンズオンの内容の復習の続きになります。今回は直前に体調を大きく崩してしまい、最新回までに間に合わず😫😫😫
イベントページ
今回のハンズオンではLLMの回答精度を上げる、RAG(Retrieval-Augmented Generation)とは異なるアプローチであるファインチューニングを試してみるという内容。今回の内容はコンピューティングリソースを非常に使用する可能性があるので、前半部分のハンズオンに留めておきたいと思います。

資料はConnpassページにもありますが、念の為こちらにも掲載しておきます。今回は最後にPythonでのコードの実行に関しては、初回参加時のエントリーで行った準備作業が必要になります。自分もやってみようという方はそちらも参考にしてください。
資料
資料(GitHub)
【動画】
- ハンズオン概要
- RAG(Retrieval-Augmented Generation)とファインチューニングの違い
- Tuning Studioを使用したファインチューニング
- 【ラベル付きデータを使用した基盤モデルのチューニング】の設定
- 金銭的コストについて
- InstructLABに関して
- InstructLabでできること
- おわりに
- 過去記事参照
ハンズオン概要
今回のハンズオンではTuning Studioを使ったファインチューニングと、InstructLABを使用したファインチューニングを行っていますが、後者は明らかにローカル側にマシンパワーが必要なので行っていません。ドキュメントはあるのでやり方のみ見てもらえればと思います。そのため今回はボリュームがかなり少ないです😊
- Tuning Studioを使用する
- InstructLab CLIから
InstructLABを使用する(こちらは行っていません)- インストール
- 初期化とモデルのダウンロード
- モデルのサーブとチャット
Taxonomyの確認とデータ変更- 学習用の合成データの作成
- モデルの学習
前回と異なり、今回は前半部分を行うためwatsonx.aiのUIの使用のみになりますが、必要になる方もいるかもしれないので環境設定の参考も記載しておきます。
開発環境設定の参考
RAG(Retrieval-Augmented Generation)とファインチューニングの違い
RAGとファインチューニングは、どちらもモデルの回答結果を向上させることを目的としていますが、それぞれ異なるアプローチを使っています。
簡単な説明としては以下のようになるでしょうか。
RAGの方針=LLMが本やウェブサイトを参考にしながら答える。
人間同様に何か難しい質問に答えるとき、本やインターネットで調べてから答えを探す(生成する)仕組みです。これによって対応が難しかった最新の情報を使って応答も可能になります。
ファインチューニングの方針=LLMが特定の仕事を上手にこなせるように特訓する
練習を繰り返して、正解を出せるようにする仕組みです。人間に当てはめるなら、特定の分野を集中的に勉強して専門家になるようなものです。体得しているようなものなので、オリジナルの状態より得意になったといえるでしょうか。
どちらもより役立つ答えを得るための方法で、例え方がもう人間と同じ考え方になっていて正直複雑な気分です😑😑😑
表にするとこんな感じでしょうか。
| 特徴 | RAG |
ファインチューニング |
|---|---|---|
| 基本的な仕組み | 参考資料を見ながら回答する仕組み | 特定の分野を集中的に学習させる仕組み |
| 知識の更新 | 新しい参考資料を追加するだけでOK | 中身を全部作り直す必要がある |
| 必要な容量 | 参考資料を保存する分の容量があれば十分 | 学習に大きなメモリなどの容量が必要 |
| 回答の正確さ | 参考資料の質が良ければ、正確な回答ができる | 学習データが良質なら、安定した回答ができる |
| 開発の手間 | 良い参考資料を集めて整理する手間が必要 | 大量の学習データと時間が必要 |
| 得意分野 | ・最新情報が必要な質問(ニュースや製品情報など)・幅広い知識が必要な質問・情報の出典を示す必要がある場合 | ・特定分野に特化した質問(医療や法律など)・決まったフォーマットの文章作成・組織独自のルールに従った回答 |
| 変更のしやすさ | 参考資料を変えるだけで簡単に調整できる | 一度作ったモデルの変更は難しい |
| 回答の速さ | 参考資料を検索する時間が必要 | 比較的素早く回答できる |
過去からの知識の蓄積や適応分野によって向き不向きが出てくると思います。
Tuning Studioを使用したファインチューニング
では、ハンズオンをすすめていきます。
資料
上記の内容は以下リンクを参考に作られています。日本語版もあるので見ておくとよいでしょう。
1)新規プロジェクトの作成
Webブラウザを開き、IBM watsonx へアクセスしてログインを行います。

ログイン後、画面左上の【三】メニューから【プロジェクト】>【すべてのプロジェクトの表示】をクリックし、

プロジェクト画面で【新規プロジェクトの作成 +】ボタンをクリックします。

名前を Dojo #5と入力して、【作成】ボタンをクリックします。

作成が完了するとプロジェクトの概要画面が開くので【管理】タブをクリックします。

左側にあるプロジェクトメニューから【サービスおよび統合】を選択し【サービスの関連付け +】をクリックします。

リストにWatson Machine Learningまたはwatsonx.ai Runtime(※)のサービスが表示されるので、チェックボックスをクリックし【アソシエイト】ボタンをクリックします。

画面が【サービスおよび統合】に戻り、以下のように表示されていればサービスが関連づけられています。
※少し前にWatson Machine Learningがwatsonx.ai Runtimeという名称に変わったとのことです。

2)基盤モデルのテスト
ここではファインチューニングしたあとの変化を比較するため、まずベースモデルのテストをしています。
【概要】タブをクリックして、Dojo #05プロジェクトの概要ページから、【基盤モデルを使用したチャットとプロンプトの作成】ボタンをクリックします。

【構造化】タブをクリックして、モデル・メニューからgranite-13b-instruct-v2モデルを選択します。もし表示されていなければ【すべての基盤モデルを表示する】をクリックすると一覧が表示されるのでその中から選択します。



選択したら、【セットアップ】の項目の【命令(オプション)】に以下を入力します。内容は「顧客からの苦情をまとめ」になっています。
Summarize customer complaints

次にすぐ下の【例(オプション)】に入力:と出力:に対して以下2つの例を加えます。
| 入力: | 出力: |
|---|---|
| I forgot in my initial date I was using Capital One and this debt was in their hands and never was done. | Debt collection, sub-product: credit card debt, issue: took or threatened to take negative or legal action sub-issue |
| I am a victim of identity theft and this debt does not belong to me. Please see the identity theft report and legal affidavit. | Debt collection, sub-product, I do not know, issue. attempts to collect debt not owed. sub-issue debt was a result of identity theft |
日本語では以下のような内容です。
| 入力: | 出力: |
|---|---|
| 最初の日付で、私はCapital Oneを使用していてこの借金は彼らが管理していて、決済されていなかったことを忘れていました。 | Debt collection、sub-product:クレジットカード債務、issue:否定的または法的措置を取るまたは取ると脅迫したsub-issue |
| 私は身分証明書の盗難被害者で、この借金は私のものではありません。身分証明書の盗難報告書と法的宣誓供述書をご確認ください。 | Debt collection、sub-product:不明、issue:所有していない債務の回収を試みた、sub-issue:債務は身分証明書の盗難の結果 |

更に下にある【試行】の【入力:】に以下のプロンプト文を入力します。
日本語では「クレジットレポートを確認したのですが、私のものではない情報が依然として私の信用情報に記録されています。これらの誤った情報を信用情報から削除する手続きをお願いできますでしょうか。」
| 入力 | 出力 |
|---|---|
| After I reviewed my credit report, I am still seeing information that is reporting on my credit file that is not mine. please help me in getting these items removed from my credit file. | ここは空のまま |

【生成】ボタンをクリックして、生成結果を確認します。

ベースモデルの生成結果を得られたので画面上部にある【💾マーク(名前を付けて保存)】ボタンをクリックして保存をしておきます。

作業の保存ダイアログから、以下を入力し【保存】ボタンをクリックします。
- 【資産タイプ】:`プロンプト・テンプレート`を選択
- 【名前】:
Base model promptを入力

3)学習データの追加
ようやくここからファインチューニングの作業に入っていきます。
画面左上の【三】メニューから【リソース・ハブ】を選択します。

リソース・ハブ画面で[サンプル]タブをクリックし、検索文字列にcustomerと入力して
検索結果から【Customer complaints training data】をクリックします。

Customer complaints training dataの説明が表示されたら、【プロジェクトに追加】ボタンをクリックします。プロジェクト名には先ほど作成したDojo #5を選択します。


追加後、表示が【プロジェクトの表示】に変更されるのでそれをクリックします。

Dojo #5のプロジェクト概要が表示されるので、【資産】タブをクリックします。すべての資産のリストに先ほど登録したCustomer complaints training data.jsonが表示されていることを確認します。

4)Tuning Studioの準備
Dojo #5のプロジェクト概要タブに戻り、【ラベル付きデータを使用した基盤モデルの調整】をクリックします。

【ラベル付きデータを使用した基盤モデルのチューニング】のウィンドウが開きます。
この時点で無料アカウントの方およびユーザーAPI鍵の無い方は警告が表示されます。

ユーザーAPI鍵の作成
Task credentials are missing.と表示された場合は、新たにユーザーAPI 鍵を作成します。
警告表示にある【作成】ボタンをクリックします。新規タブが表示されます。

ユーザーAPI 鍵の生成画面が表示されるので【鍵を生成する +】ボタンをクリックします。

ユーザーAPI鍵が正常に生成されましたと表示され、下のキーのリストにも追加が行われます。

ユーザーAPI鍵を作成後、警告表示されていたタブを戻り【再ロード】ボタンをクリックします。

無料アカウントから有料アカウントへの切り替え
無料アカウントの警告がある場合に警告表示の【アップグレード】ボタンをクリックして

リスト内から【対象となるサービス】(watsonx.ai Runtimeになります)をクリックし、タイプをLiteからEssentialやStandardに変更します。私はEssentialへ変更しました。

上記作業が終わると警告表示はすべて消えます。
【ラベル付きデータを使用した基盤モデルのチューニング】の設定
名前にSummarize customer complaints tuned modelと入力して、【作成】ボタンをクリックします。

5)Tuning Studioの構成
チューニング済みモデルの構成画面が表示されます。ツアー表示の画面をスキップして

【基盤モデルの選択】をクリックします。

【基盤モデルの選択】から【granite-13b-instruct-v2】をクリックします。

【granite-13b-instruct-v2】のModel Sheetが表示されるので、【選択】ボタンをクリックします。

【プロンプトをどのように初期化しますか】の設定で、【テキスト】をクリックし、【タスクの説明および指示】に次の内容を入力します。日本語では「提供された苦情を一文に要約する。」となっています。
Summarize the complaint provided into one sentence.

【どのタスクが目標に適合していますか?】の設定で、【要約】ボタンをクリックします。

続いては画面右側にある、【トレーニング・データの追加】から【プロジェクトから選択】をクリックします。

【プロジェクトからデータを選択します】の画面から、【データアセット】をクリックし、【データ資産】から【Customer complaints training data】を選びます。最後に【アセットの選択】ボタンをクリックします。

これでTuning Studioの構成が完了しました。
以降の作業は課金されるので注意してください。 また、中断した場合にはチューニングした結果の確認はできない点も注意です。
※注意点
- チューニングを開始すると
watsonx.ai Runtimeが動作し、利用できるコンピュート・リソースが減っていきます。 - 無料枠で利用している場合、利用可能なコンピュート・リソースが足りなくなる場合があります。
- チューニングには時間がかかり、30分以上要する場合があります。
上記に問題ない対象者は【チューニングの開始】ボタンをクリックします。

6)チューニングしたモデルのデプロイ
作業開始するとチューニング・エクスペリメント画面で経過を確認することができます。

チューニング・エクスペリメント画面で【チューニング完了】を確認します。私はこの結果を得るには35分必要でした。

完了時に表示される損失関数は、右下がりになる程、モデルの精度が向上していることを表します。
☝️ここでの損失関数の役割
損失関数は、モデルの出力と正解の間の誤差を定量化する指標です。ファインチューニングでは、モデルがタスクに適応する動きにより、この損失を最小化するように重みが調整されます。この値の動きによってチューニング度合いが示しています。
重みの更新 … 損失関数の勾配に基づいてモデルの重みが更新されます。このプロセスでは、損失が減少する方向に重みが調整されます。
損失の変化 … 重みが調整されると、トレーニングデータに対する損失が減少していきます。これが、モデルがタスクに適応している(チューニングされている)ことを示します。
チューニング済みモデルのデプロイのリストに表示されたモデルの右端の【新規デプロイメント】をクリックします。

表示された[チューニング済みモデルのデプロイ]で次の3つを設定します。
- 【デプロイメント・コンテナー】 は【このプロジェクト】を選択
- 【デプロイメント・サービス提供名】に名前を入力(ユニークである必要あり、私は以下のようにしました)
uepon_model_20241218
- 【作成後、プロジェクトで展開を表示する】にチェックを入れます。
上記の作業後に【作成】ボタンをクリックするとデプロイメントが進行します。



状態がデプロイ済みになったことを確認し、【Summarize customer complaints tuned model】をクリックします。

7)チューニングしたモデルのテスト
デプロイされたモデルが表示されたのを確認し、【Prompt Labで開く】ボタンをクリックします。

Prompt Lab画面が表示されたら、【構造化】タブをクリックし、下記の内容を入力します。(先ほどの(2)の手順と同じです)

【セットアップ】の項目の【命令(オプション)】に以下を入力します。
Summarize customer complaints
次にすぐ下の【例(オプション)】に入力:と出力:に対して以下2つの例を加えます。
| 入力: | 出力: |
|---|---|
| I forgot in my initial date I was using Capital One and this debt was in their hands and never was done. | Debt collection, sub-product: credit card debt, issue: took or threatened to take negative or legal action sub-issue |
| I am a victim of identity theft and this debt does not belong to me. Please see the identity theft report and legal affidavit. | Debt collection, sub-product, I do not know, issue. attempts to collect debt not owed. sub-issue debt was a result of identity theft |
更に下にある【試行】の【入力:】に以下のプロンプト文を入力します。
| 入力 | 出力 |
|---|---|
| After I reviewed my credit report, I am still seeing information that is reporting on my credit file that is not mine. please help me in getting these items removed from my credit file. | ここは空のまま |
【生成】ボタンをクリックして、生成結果を確認します。

ここまでの作業でファインチューニングを行うことができました🤗
最初に行ったファインチューニングなしと生成結果が違っているのが確認できるでしょうか。
金銭的コストについて
今回は人柱になって有料プランでファインチューニングしてみましたが、Essentialプランでは35分のファインチューニングで2041円のコストがかかっていました。業務でも、このコストでは何度も行うようなことは難しい肌感ですね🙄🙄🙄


時間がかかってもいいので、もう少しお安いといいのかなと感じますが難しいですかね。
InstructLABに関して
InstructLABについてはここでは作業をしていませんが、以下から資料を参照ください。
InstructLabは、端的に言えば、「みんなで力を合わせてLLMをもっと賢くする」プロジェクトです。
InstructLabでできること
LLMに新しい知識を追加
これも知っててほしい!という知識を教えることができます。たとえば、「昆虫の分類」とか「日本の歴史」といった具体的なテーマを追加できます。
LLMを手軽にトレーニング
「新しい知識を教えた後にLLMを賢くする」作業も、自分のパソコンで簡単にできます。大きなスーパーコンピューターがなくても大丈夫といっているが🥲🥲🥲
チャットでLLMと会話できる
教えた内容がちゃんと理解されているか、チャットで確かめることもできます。
おわりに
今回・前回のハンズオンを通じて、LLMの精度向上のアプローチとしてRAGとファインチューニングの違いを実践的に学ぶことができました。特に、ファインチューニングがモデルに新しい「専門性」を教え込むような特訓である一方、RAGが人間が本を参照しながら回答するように外部知識を活用するアプローチだということが、より深く理解できたように感じます。
これまでのwatsonx.ai Dojoを通じて、LLMの仕組みや活用方法について体系的な知識が少しずつ積み重なってきているのを実感しています。最初はブラックボックスのように感じていたLLMも、今では「どういう方法で、どんな結果が得られるのか」をある程度予測できるようになってきました。
ただし、今回の実践で特に印象に残ったのは、ファインチューニングに必要となるコンピューティングリソースの規模です。必要なリソースを考えると、むやみに選択できる手法ではないことを実感します。個人的にはRAGで対応できる場合はそちらを優先し、どうしても必要な場合の最後の切り札として、ファインチューニングを検討するという判断基準も実感としてが見えてきた気がします。
既に最終回である#6は開催されてしまっていますが、自分もこれから追いかけようと思います。オンラインでは参加していたので、アプリ作りに関する内容だったのでこちらも勉強になると思いますよ💪🤩