1. はじめに
近年、大規模言語モデル(LLM)の進化は目覚ましく、その応用範囲は広がり続けています。日本語に特化した高性能モデルも登場しており、その一つである「Llama-3-ELYZA-JP-8B」は多くの注目を集めています。
今回、私個人のプログラミングスキル向上と、ある具体的な目的達成のため、この Llama-3-ELYZA-JP-8B のファインチューニングに挑戦しました。目的は、長年書き溜めてきた自身の映画ブログ記事データを学習させ、私の文体や構成を模倣するような、ブログ執筆の補助となるAIアシスタントを作成することです。
本記事では、そのファインチューニングの全プロセス、試行錯誤の結果、そして何よりもその過程で得られた貴重な学びについて、客観的な記録として共有します。LLMのファインチューニングに興味のある方、特に個人データでの挑戦を考えている方の参考になれば幸いです。
2. ファインチューニング挑戦の概要
2.1 目的
この挑戦には二つの主要な目的がありました。
- 技術的スキルアップ LLM、特にファインチューニングに関する知識と実践経験を深めること。
- 実用ツールの作成 自身の映画ブログ記事(約120件)の文体や構成を学習し、今後のブログ執筆を補助してくれるAIアシスタントを作成すること。
2.2 使用データ
- ソース 自身が運営するWordPress上の映画ブログ。
- データ量 約120件の記事データ(ログ上では123件として処理)。
- 前処理 WordPressからエクスポートしたデータを、Pythonスクリプトを用いてJSONL形式に整形。主に「title」(タイトル)と「text」(本文)のフィールドを持つ形式としました。
2.3 モデルと環境
- ベースモデル Hugging Face Hubで公開されている ELYZA社製の「Llama-3-ELYZA-JP-8B」を使用しました。
- 実行環境 Google Colab のGPU環境を利用しました。
- 量子化 メモリ効率化のため、推論時には4bit量子化を適用し、学習時のオプティマイザにも8bit版を使用しました。
2.4 ファインチューニング手法
- 手法 PEFTライブラリの LoRA (Low-Rank Adaptation) を採用しました。学習対象となったパラメータは全パラメータの約0.52%でした。
- トレーナー Hugging Face の TRL ライブラリに含まれる
SFTTrainer
を使用しました。 - 主要ハイパーパラメータ 学習率 2e-4、3エポック、実効バッチサイズ 8 などで設定しました。
- 学習時間 約2時間15分でした。
- 重要な発見(学習時) 実行ログを確認したところ、
SFTTrainer
が学習データを内部的にChatML(チャット形式)に変換して処理していました。これは後述する結果の考察において重要なポイントとなりました。
3. 評価方法
ファインチューニングの効果を確認するため、学習済みモデルと元のベースモデルの性能を比較しました。
3.1 比較対象
- ファインチューニング済みモデル LoRAアダプターをLlama-3-ELYZA-JP-8Bに適用したモデル。
- ベースモデル ファインチューニングを行っていない、元のLlama-3-ELYZA-JP-8B。
3.2 評価プロンプトと観点
特定の映画(「ブレードランナー」)について、感想記事の生成を指示するプロンプトを使用しました。評価は、指示された構成への追従性、繰り返し出力の有無、文体や口調、内容の事実正確性、全体的な記事としての質などの観点から行いました。特に、推論時に使用するプロンプト形式が結果にどう影響するかを段階的に検証しました。
4. 結果 段階的検証で見えた効果と課題
ファインチューニングの効果を正確に把握するため、プロンプト形式を変えながら段階的に検証を行いました。
4.1 初期比較 ファインチューニング vs ベースモデル
最初の比較では、以下の2つの条件で出力を比べました。
- FT版(テキストPrompt) ファインチューニング済みモデルに対し、単純なテキスト継続形式のプロンプトを使用。
- ベースモデル版(チャットPrompt) ベースモデルに対し、チャット形式のプロンプトを使用。
この結果、FT版(テキストPrompt)は指示構成に従わず、同じ情報を大量に繰り返すなど、読みにくい出力となりました 。一方、ベースモデル版(チャットPrompt)は構成には従ったものの、内容に事実誤認が見られました 。この段階では、ファインチューニングが逆効果だったかのような印象でした。
- [生成テキスト全文へのリンク – FT版(テキストPrompt) – Base_ChatCase.txt] (https://github.com/miyakawa2449/Llama3-ELYZA/blob/main/Bace_ChatCase.txt)
- [生成テキスト全文へのリンク – ベースモデル版(チャットPrompt) – FT_TextPromptCase.txt] (https://github.com/miyakawa2449/Llama3-ELYZA/blob/main/FT_TextPromptCase.txt)
4.2 原因分析と仮説
学習ログから、モデルが「チャット形式」で学習されていたことが判明したため、「学習時と推論時のプロンプト形式の不一致」がFT版(テキストPrompt)の性能低下の原因であるという仮説を立てました。
4.3 検証 再推論 ファインチューニング済みモデル + チャット形式プロンプト
上記仮説を検証するため、ファインチューニング済みモデルに対し、ベースモデルと同じ「チャット形式」のプロンプトを使用して推論を再実行しました。
結果は劇的に改善しました。繰り返し出力は完全に解消され、文章全体の構成も大幅に向上しました。さらに、冒頭の自己紹介や、指示していない「基本情報」セクションの追加など、学習元のブログのスタイルや特徴がある程度反映されている様子が見られました。これは、適切なプロンプト形式を用いれば、ファインチューニングがスタイルの学習に効果を発揮することを示唆しています。ただし、生成トークン数の上限により文章が途中で終了し、内容の事実誤認は依然として残りました。
- [生成テキスト全文へのリンク – FT版(チャットPrompt) – FT_ChatCase.txt] (https://github.com/miyakawa2449/Llama3-ELYZA/blob/main/FT_ChatCase.txt)
4.4 比較まとめ(検証後)
3つのテスト結果を比較すると、以下のようになります。
観点 | FT版(テキストPrompt) | ベースモデル版(チャットPrompt) | FT版(チャットPrompt) |
---|---|---|---|
プロンプト形式 | テキスト継続 | チャット形式 | チャット形式 |
構成への追従性 | 低い | 高い | 中程度 |
繰り返し発生 | 非常に多い | なし | なし |
文体・口調 | 情報羅列 | フォーマル | ブログ風、パーソナル |
独自要素(基本情報等) | なし | なし | あり |
事実正確性 | 比較的正確? | 低い(誤りあり) | 低い(誤りあり) |
全体的な質 | 低い | 中程度 | 中程度〜高い |
5. 考察 なぜ違いが生まれ、何が見えたか?
今回の段階的な検証を通して、ファインチューニングの効果とLLMの挙動について、より深く理解することができました。
5.1 プロンプト形式不一致仮説の検証
正しいチャット形式のプロンプトを用いた結果、出力品質が劇的に改善したことから、「学習時と推論時のプロンプト形式の不一致が性能低下の主因であった」という仮説は強く裏付けられました。 これは、LLMを扱う上で極めて基本的ながら、非常に重要な注意点です。
5.2 ファインチューニングによる「スタイルの学習」
適切な推論方法を用いた結果、ファインチューニングによってモデルが単なる知識の詰め込みではなく、特定の「スタイル」を学習できることが示唆されました。自己紹介のパターンや「基本情報」セクションの追加などは、私のブログデータから学習されたと考えられ、当初の目的達成に向けた一定の成功と言えます。
5.3 残された課題と限界
一方で、解決・改善が必要な点も見えてきました。
- 事実正確性(ハルシネーション) スタイルは学習できても、内容の事実に関する誤りは依然として発生しました。ブログ記事データのみのファインチューニングでは、情報の正確性担保は困難であり、別途対策(RAGなど)が必要になる可能性があります。
- 構成の完全な制御とスタイルの両立 指示された構成と、学習したブログ固有の構成パターンの間で、モデルがどのように振る舞うか、その制御は今後の課題です。
- データ量と質の限界 123件というデータ量が、スタイル学習には一定の効果を示したものの、より安定した性能のためには更なる検討が必要かもしれません。
6. 今回の挑戦から得られた学び
この経験から得られた重要な学びは以下の通りです。
- 学習と推論の一貫性が最重要 モデルが学習したデータ形式と、推論時に使用するプロンプト形式は厳密に一致させる必要があります。
- ツールの挙動理解とログ確認の徹底
SFTTrainer
のようなライブラリの内部挙動(例:自動フォーマット)を理解し、ログを確認することが重要です。 - ファインチューニング評価の複雑さ 学習損失だけでなく、実際の生成タスクでの定性的な評価、特に推論設定を含めた評価が不可欠です。
- 試行錯誤の価値 期待通りでなくとも、原因を特定しプロセスを理解する過程自体が大きな学びとなります。
7. まとめと今後の展望
Llama-3-ELYZA-JP-8B を個人のブログデータでファインチューニングする試みは、初期のつまずきを経て、「適切な使い方をすれば、個人の文体や構成要素をある程度学習させることができる」 という結果を示しました。特に、学習時と推論時のプロンプト形式を一致させることの重要性を、身をもって体験しました。
今回の結果は、目的達成に向けた確かな一歩です。しかし、実用的なブログ執筆補助ツールとして活用するには、生成トークン数上限の調整、事実誤認への対策、構成の制御性の向上といった課題に取り組む必要があります。
この記録が、LLMのファインチューニングに挑戦する方々にとって、何らかの一助となれば幸いです。