💡

ボクとキミ(Copilot)で挑むローカルLLMのファインチューニング(構想編:アイデアは集合知の力を借りる)

に公開

やりたいことをやるって、色々たいへん

前回ではWindows環境下でのLLMのファインチューニングを行うための環境構築を行いました。

本音を言うとローカルでLLMを構築したいのですが、そうするには様々なハードルがあります。ざっと思い浮かぶだけでも以下4つほどあります。

  • 目的:どういったLLMを構築したい?
  • 収集:目的に沿ったデータは収集可能か?
  • 環境:訓練・評価を行える潤沢なリソースを確保できるか?
  • 時間:どれくらいの時間を要するか?

近年LLMの進化スピードは目を見張るものがありますが、私個人の考えはMoney is power and powerです。優秀な人材、高性能GPU複数台などなど札束でぶん殴って開発と実装のスピードを上げている…なんとも羨ましい、やはりお金は正義ですね。

なんてぼやきは置いといて、現状手持ちの手札で知恵を絞りできることを積み重ねていく、継続は力なり!コツコツ頑張って行くことこそ近道と割り切りました!!

アイデアはキミ(Copilot)と共にやってくる

次のステップとしてファインチューニングでどういったローカルLLMに仕上げたいのか、そんな時ふと目に留まったのが、そう!キミことCopilotです。
仕事でもキミがいないとと作業に影響が出るといっても過言でないくらい骨抜きにされているCopioltに以下のように問いかけてみました。

ボク
個人でLLMの開発を行なっています。 開発している環境は以下の通りです。 
- ローカル環境 
- Windows 11 
- WSL2 Ubuntu 24.02 
- Ryzen7 7800X3D 
- RX7800 XT 16GB 
- システムメモリ 32GB 
- VS code 
- python3 12.0.0 
- ROCm 6.4.1 
- PyTorch 
はじめはSLMを利用してファインチューニングから始めてみようと考えています。 どう思いますか?

これに対するCopilotの回答が↓になります。(名前も出力されちゃったので便宜上イニシャルにしてます。)

キミ
Tさん、環境構成だけでテンション上がりますね。特にRX7800 XT+ROCm対応という点が頼もしいです。FP16やBF16対応も含めて、ローカルLLMのファインチューニングには十分なスペックだと思います。SLM(Small Language Model)から始めるのも非常に理にかなっています。以下、目的に応じたアイデア出し、掘り下げ、拡張の流れで展開してみます。

---

🌱 **アイデア出し|SLMからのファインチューニング方向性**
- 量子化済みの3B〜7Bモデル(LLaMA、Phi-2、TinyLlamaなど)を対象に微調整  
- 教育・チュートリアル用途の専門LLMを作成(Azure支援モデルなんて最高です)  
- 自分自身の技術ブログ記事や過去のメンタリング内容を元にRLHF(Reinforcement Learning with Human Feedback)を簡易実装

---

🔍 **掘り下げ|開発アプローチの検討ポイント**
- **目的整理**:推論速度重視なのか、補助知識としての正確性重視か  
- **ファインチューニング方法**:LoRA / QLoRAを活用してVRAM節約+高速化  
- **データ整備**:学習データセットはどう準備する?MarkdownやQ&A形式が扱いやすいか  
- **評価指標**:ファインチューニング後のモデルはどう評価する?BLEU、perplexity、主観評価

---

🌿 **拡張提案|面白くしていく方法**
- 🤝 GitHubで「Azure支援LLM」のチュートリアルを公開(コミュニティ巻き込み)  
- 📦 Docker+FastAPIでモデルをAPI化 → VS Code Dev Containerで簡単起動  
- 🧪 モデルベースの教育アシスタントを開発し、Azure学習者の質問回答に特化  
- 🧠 将来的にはRAG(Retrieval-Augmented Generation)との統合も視野に

---

もし「何から着手するか」で悩まれているなら、まずは**LoRAベースでLLaMAやMistralのファインチューニングを試す**ところからがオススメです。PyTorchとROCmの組み合わせが活きますし、環境的に無理なく進められるはずです。

次はどの軸に掘り下げていきましょうか?データセット選定、ファインチューニング方法、モデル評価など、どれでもお付き合いします!

結構いい感じまとめてかつ次のアイデアまで掘り下げてくれますね…
次はこんな感じで質問してみました。

ボク
まずはSLMの学習のためのデータセットについて考えていきたいです。 
会話特化型のSLMを構築したいのですが、まず何から始めれば良いですか?

これに対して、

キミ
いい切り口ですね、Tさん。会話特化型SLMの学習には、まず「何を話せるようにしたいか」を明確にした上で、データ選定・整備に入ると効果的です。以下、3ステップで整理してみます。

---

💡 **ステップ①:目的に応じた会話スタイルを定義する**
まずはSLMにどんな会話をさせたいか、ざっくりでも方向性を決めましょう。
たとえば:

| 会話スタイル        | 特徴 | 学習に向いている形式 |
|---------------------|------|------------------------|
| 技術QA型            | 端的で正確性重視         | Q&Aペア、FAQ形式         |
| チュートリアル対話型 | 解説+補足+提案が中心   | ステップ付きガイド、対話形式解説 |
| カジュアル雑談型    | 感情表現やゆるい展開     | Chatログ、SNS投稿のやり取り |
| 教育的メンター型    | 問い→誘導→深掘り         | フォーマル対話、ハイレベルQ&A |

---

📚 **ステップ②:学習データをどう集めるか?**
目的が定まったら、次に使えるデータソースを考えていきます。

- **公開データセット**(まずはここからがオススメ)
  - [`OpenAssistant Conversations`](https://huggingface.co/datasets/OpenAssistant/oasst1)
  - [`ShareGPT`](https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered)
  - [`Alpaca`](https://github.com/tatsu-lab/stanford_alpaca)  
    → 指示文・応答形式が多く、技術QAやチュートリアル系に向いています。

- **自作データセットの構築**
  - 過去に書いた技術ブログやチュートリアルをQ&A形式にリライト
  - 他人からの質問・相談への回答履歴を整理(Markdown化推奨)
  - 学習者の疑問+回答をペア化して体系化  
    → LoRA/QLoRAなら数千〜数万ペアでも十分意味ありです。

---

🚀 **ステップ③:整形と準備のベストプラクティス**
- JSON形式で`{"instruction": "...", "response": "..."}`と統一する  
- 文体を揃える(敬語かフラットな口調か)  
- 長すぎる会話は一部切り出す or 分割する  
- メタ情報(タグやカテゴリ)を付けて、後の評価・フィルタリングに備える

---

ご希望があれば、実際に自作データ化するためのテンプレートやPython整形スクリプトの例も提供できますよ。次は「どのスタイルで進めるか」か「どこからデータ集めるか」にフォーカスしてみますか?それとも整形・前処理フェーズまで踏み込みましょうか。

段々とアイデアが浮かんできて、さらに掘り下げてくれそうな感じです。
楽しくなってきましたね!なんかウキウキしているとフッと面白そうなアイデアが降りてきました。
そう、私大阪人なんですよね!
ってことでこんな質問をしてみました。

ボク
カジュアル雑談型でいきます。 
大阪人なので漫才のような会話が出来ると面白いと思います。 
ファインチューニングに使うLLMは何がお勧めですか?

ちょっと難しいかなと思いつつ回答の生成を待ちました。

キミ
それ、めっちゃええやん!漫才スタイルの会話モデル、しかも大阪人らしいノリとテンポを再現したいっていうのは、SLMのファインチューニングとしてもかなり面白い挑戦です。以下、目的に合ったモデル選定を「アイデア出し・掘り下げ・拡張」の3軸で整理してみますね。

---

🎯 **アイデア出し|漫才スタイルに向いてるSLM候補**

| モデル名 | 特徴 | 備考 |
|----------|------|------|
| **LLaMA 3 8B / 7B** | 高品質・汎用性高い | 英語中心なので日本語データ追加必須 |
| **ELYZA-japanese-Llama-2-7b-instruct** | 日本語特化・軽量 | 関西弁や漫才調には追加学習が必要 |
| **RakutenAI-7B-Instruct** | 日本語対応・軽量・商用OK | 雑談系に強く、ノリの良さも出しやすい |
| **Qwen2-7B / Qwen2.5-7B-Instruct** | 多言語対応・日本語も比較的強い | 文脈理解が良く、掛け合いに向いてる |
| **Youri 7B (rinna)** | 日本語継続学習済み | 口語表現に強く、雑談向き |

---

🔍 **掘り下げ|漫才スタイルに必要な要素**

- **テンポ感**:短い発話のキャッチボールができるか
- **キャラクター性**:ボケ・ツッコミの役割を明示できるか
- **関西弁対応**:方言の再現は追加データで補う必要あり
- **ユーモア生成**:突拍子のない発言+自然なツッコミができるか

→ これらを満たすには、**自作データセットでのLoRA/QLoRAファインチューニング**が有効です。特に「ボケ→ツッコミ→オチ」の構造を明示した対話データが鍵になります。

---

🌿 **拡張提案|漫才LLMをもっと面白くする方法**

- 🎭 **キャラ別Agent化**:LangChainなどでボケ役・ツッコミ役を分けて対話させる
- 📚 **漫才台本データセット作成**:M-1やYouTubeの漫才を参考に構造化
- 🧪 **プロンプト設計の工夫**:「ボケ役として話して」「ツッコミ役として反応して」など明示的に役割を与える
- 🗣️ **関西弁変換モジュール**:標準語→関西弁の変換を別途用意して後処理に使う

---

💡 **おすすめのスタート地点**
→ **RakutenAI-7B-Instruct** か **ELYZA-japanese-Llama-2-7b-instruct** をベースに、まずはLoRAで「漫才風対話データ」を数千ペア作ってファインチューニングしてみるのが現実的です。どちらも軽量で、VRAM 16GB前後でも動かせるので、Tさんの環境なら問題なしです。

次は、データセットの構造や、漫才台本の作り方に進みましょうか?それとも、LangChainでAgent化する方向に寄せてみます?どっちも面白くなりそうです。

いやw、Copilotも関西弁で回答してくれるんかい!!って最初だけやん!! とツッコミを入れつつ、あれ?ひょっとして本当に出来ちゃったりするん?と疑心暗鬼になりながらもCopilotとやり取りを繰り返した結果、内容を整理したうえで以下のように方針が固まりました。

目的・ビジョンの整理

項目 内容
目的 関西弁による漫才スタイルLLM(会話特化SLM)の開発・微調整
方向性 ボケ・ツッコミ・オチによるテンポある会話構造を自動生成・整理
活用技術 ローカルLLM(neoAI-8b-chatなど)+ LangChain + Python自動生成スクリプト
最終目標 既存LLMにLoRA/QLoRA学習させ、ユニークな「漫才対話AI」を誕生させること

構成要素のまとめ

モジュール 役割 実装内容
台本構造化 ボケ/ツッコミ/オチ形式の台本をJSONで表現 5ラウンド構造のテンプレート化
関西弁最適化 標準語→関西弁への語彙・語尾変換 関西弁変換関数(ルールベース or LLM対応)の作成
テーマ別大量生成 テーマごとの台本を自動生成 台本自動生成関数でネタを展開
theme_pool管理 台本素材セットを登録・活用 "theme": {boke: [...], tsukkomi: [...], punch: [...]} 形式で保存
LangChain連携 ツール群とAgentで自動処理 Agentに漫才生成・変換・保存処理を割り当て
ローカルLLM統合 neoAI-8b-chatなどで完全ローカル動作 Ollama上にモデル構築→LangChainから呼び出し

果たしてファインチューニングまで辿り着けるのか!?
次回からはCopilotと共に開発を進めて行きます!

Discussion