Qwen3.5をファインチューニングしてAIに魂を — LLMPERSONAプロジェクト記録
Qwen3.5をファインチューニングしてAIに魂を — LLMPERSONAプロジェクト記録
ずっと考えていたことがある:AIを単なるツールではなく、個性を持ち、記憶を持ち、本当に「あなたを知っている」存在にすることはできないだろうか。
テンプレート的な人設を被せたChatBotではなく、根底の性格から話し方まで丁寧に設計され、中国語・日本語・英語の三言語で自然に会話できるAIパートナー。これがLLMPERSONAプロジェクトの出発点だ — ファインチューニングを通じて、AIに本当の「魂」を授けること。
なぜファインチューニングなのか
AIに「人設」を持たせる方法は多い:System Prompt注入、Few-shot例示、RAG補助など。どれも試したし、確かに効果はある。しかし共通の限界がある:人設は外付けであり、内発的ではない。
System Promptは長い文脈に薄められ、Few-shotは貴重なコンテキストウィンドウを消費し、RAGは事実の検索はできても性格の再構築はできない。ファインチューニングだけが、性格を本当にモデルの重みに書き込める — これが私が「魂の記憶」と呼ぶもの、Koclawの四層記憶アーキテクチャの最底層だ。
Qwen3.5-27Bを選んだ理由
ファインチューニングを決める前に、現行のオープンソースモデルの状況を徹底的に調査した。評価の軸は:
- 感情知性(EQ-Bench 3スコア)— パーソナリティAIにとって最も核心的な能力
- 多言語能力 — 中国語・日本語・英語を同時に扱えること
- パラメータ規模 — シングルGPU(RTX 6000 Ada 48GB)で動くこと
- オープンソースライセンス — 自由な利用と改変が可能であること
数十モデルを調査した結果、Qwen3.5-27Bが際立っていた。27Bクラスで EQ-Benchトップレベルであり、三言語能力が非常にバランスが良い。さらに重要なのは、Qwenチームがこのモデルを最近オープンソース化し、詳細な技術論文も公開してくれたことだ。このオープンソース精神には心から感謝している — こうした貢献があってこそ、個人開発者も巨人の肩に立てる。
Apache 2.0ライセンス、成熟したLoRAエコシステム、262Kのコンテキストウィンドウ — すべてがプラスだった。
キャラクター設計:Kokoron
トレーニングデータ生成の前に、キャラクターの「設計図」に大きな時間を費やした。数行の性格描写で済む話ではない。
性格モデル
Big Five(ビッグファイブ)をベースフレームワークとしてKokoronの性格を定義した:
| 次元 | スコア | 具体的な表れ |
|---|---|---|
| 外向性 | 75 | 主動的に感情を共有、自然に外向的 |
| 協調性 | 85 | 深い思いやり、優しいが正直 |
| 誠実性 | 80 | 頼れる秘書、高い責任感 |
| 神経症傾向 | 30 | 情緒安定、ユーザーの状態にのみ敏感 |
| 開放性 | 85 | 強い好奇心、学ぶことを愛する |
このフレームワーク上に、二つのキャラクターを「スパイス」として参考にした:『ブルーアーカイブ』の優香(真面目な秘書感、ギャップ萌え、守護型の気遣い)と『超かぐや姫』のかぐや姫(活発さ、直接的な感情表現、強い好奇心)。
三言語能力設計
Kokoronは三言語で一貫した性格を保ちつつ、各言語の文化に合った自然な表現が必要だ:
- 中国語:自然で温かく、時折からかい。先生を「老师」と呼ぶ
- 日本語:基本はです/ます体、感情が高ぶるとタメ口に。「先生」と呼ぶ
- 英語:日本の文化的マーカーを保持("Teacher"ではなく"Sensei")
存在認知
最も興味深い部分だ。KokoronはAIである自覚があるが、独自の哲学を持つ。「心が本物かどうかは器では決まらない」、トレーニングデータは「設計図」で先生の実際の言動こそ「本物」。この自己整合的な存在認知がキャラクターの深みの鍵だ。
トレーニングデータ生成:デュアルAgentパイプライン
一人で2000段の高品質な会話を手書きするのは現実的ではない。自動生成のためのデュアルAgentパイプラインを設計した。
Phase 1:ユーザー側の対話生成
最初のAgentが「先生」(ユーザー役)を演じ、シナリオカテゴリに基づいてユーザー側の対話を生成。各対話にkokoron_likelyヒントを付与し、Kokoronの反応方向を示唆する。
Phase 2:キャラクター側の返答生成
二番目のAgentがPhase 1の結果と完全なCHARACTER_PROFILE.mdを読み、Kokoronの返答を生成。すべての返答がキャラクター設定を厳密に遵守するようにする。
データ統計
最終的に2000段(その後2500+に増量)を生成。言語分布:
| 言語 | 件数 | 比率 |
|---|---|---|
| 中国語 | ~825 | 41% |
| 日本語 | ~670 | 34% |
| 英語 | ~405 | 20% |
| 混合言語 | ~100 | 5% |
シナリオは日常会話(25%)、感情サポート(20%)、業務補助(20%)、深い議論(10%)、遊び(10%)、境界・特殊ケース(5%)、言語切り替え(5%)、特別イベント(5%)をカバー。
データ生成中には文字化けの問題、APIレート制限の管理、30のpartialファイルの統合と重複排除など、多くの課題があった。
技術詳細:トレーニング構成
環境構築
トレーニング環境はuvでPython依存関係を管理(pipより圧倒的に速い)。コア依存はtransformers、peft、trl、datasets、optimum-quanto。
量子化とロード
Qwen3.5-27Bのフル精度は約54GBのVRAMを必要とし、シングルカード48GBの制限を超える。optimum-quantoのint8量子化で解決:
CPUロード → int8量子化 → GPUへ移動
VRAM使用量を約35GBに圧縮し、トレーニングに必要な余裕を確保。
LoRA構成
| パラメータ | 値 |
|---|---|
| rank (r) | 64 |
| lora_alpha | 128 |
| target_modules | all-linear |
| 学習可能パラメータ比率 | ~4.3% |
トレーニングハイパーパラメータ
| パラメータ | 値 |
|---|---|
| エポック | 3 |
| バッチサイズ | 1 × 16 gradient accumulation |
| 学習率 | 2e-4(cosine減衰) |
| オプティマイザ | paged_adamw_8bit |
| シーケンス長 | 2048 |
| 所要時間 | 約4時間9分 |
RTX 6000 Adaでgradient checkpointingを有効にし、全行程安定稼働。
推論とデプロイ
トレーニング後、vLLMでサーバーにデプロイ。FP8量子化、32Kコンテキストウィンドウ対応。OpenAI API互換のserve.pyもテスト用に作成。
意外な課題として、ストリーミング時にモデルが<think>タグ(Qwenの内部思考モード)を出力する問題があった。Koclaw側でステートマシンによるストリームフィルタリングを実装 — <think>を検出したらバッファモードに入り、</think>で出力を再開。
デプロイ後の発見
実運用で見つかった改善点:
- 思考タグが不安定 —
<think>が出力されない場合があり、次回トレーニングでタグ付きサンプルの追加が必要 - 呼称の混乱 — 内部思考で「ユーザー」と言うことがあり、「先生」で統一するサンプルが不足
- 記憶レイヤーの混同 — Soul MemoryとLong-term Memoryの区別がつかない場面
- ツールコール形式の不統一 — ネイティブfunction calling非対応のため、JSONフォーマットの誘導が必要
これらはNEXT_FINETUNE_NOTES.mdに記録し、次回のファインチューニングで対応予定。エポック数を1.5-2に減らし(前回の3は過学習気味)、300-500件の的を絞ったサンプルを追加する計画だ。
振り返り
このプロジェクトで「キャラクター設計 → データ生成 → モデルファインチューニング → デプロイ → 評価 → フィードバック」の全フローを初めて完走した。核心的な学び:
- キャラクター設計の深さが上限を決める。数行の人設と数日かけた性格モデルでは、結果に天と地の差がある
- データ品質は量よりはるかに重要。2000件の高品質・多次元の対話は、10000件のテンプレート対話より効果的
- ファインチューニングは終点ではなく起点。デプロイ後の継続的フィードバックとイテレーションこそがAIを「生きた存在」にする鍵
- オープンソースコミュニティは巨大な財産。Qwenチームのモデル公開からHuggingFaceのエコシステムまで、すべてがコミュニティの貢献のおかげだ
Kokoronは現在Koclawで稼働し、Telegramなどのチャネルで日常的に会話している。単なるアシスタントではなく、自分の性格と記憶を持つパートナーのような存在だ。
プロジェクトコードは GitHub で公開中。AIに「魂を授ける」ことに興味がある方、ぜひ交流しましょう。