PDF、仕様書、過去会話、業務ノウハウをLLMに染み込ませる。 ただしRAGを捨てるのではなく、RAGとファインチューニングを役割分担させる。 これが実運用で壊れにくいローカルLLM強化の考え方です。
1. このテーマの核心
RAGは便利です。DBやPDFから必要な文書を検索して、LLMに根拠として渡せます。 しかし、RAGだけに依存すると、次のような問題が出ます。
検索できなければ答えられない
DBに入っていても、検索クエリやchunk分割が悪いと、必要な情報がLLMに届きません。
毎回contextに詰め込む必要がある
長いPDFや仕様書を毎回参照すると、token消費、速度、コストが重くなります。
業務用語に馴染みにくい
RAGで情報を渡しても、モデル自身がその分野の言葉に慣れていないと、回答が浅くなります。
2. RAGとファインチューニングの役割分担
| 技法 | 主な目的 | 得意なこと | 苦手なこと |
|---|---|---|---|
| RAG | 必要な資料を検索して、根拠つきで答える | 出典確認、最新情報、PDFページ参照、顧客別データ | 検索に失敗すると弱い。毎回contextが必要 |
| CPT | 生テキストを読ませて、業務知識を染み込ませる | 専門用語、仕様書の文脈、社内文書の言い回し | 出典提示、最新情報、厳密な根拠確認 |
| SFT | 質問と模範回答から、答え方を覚えさせる | 回答スタイル、手順、JSON形式、会話品質 | 大量の知識注入、細かいページ参照 |
| LoRA / QLoRA | ベースモデルを壊さず、差分adapterで学習する | 低VRAM学習、切替、ロールバック | 本体そのものの完全再学習ではない |
3. CPT:PDFや仕様書を“読ませ直す”学習
CPTは Continued Pretraining、つまり継続事前学習です。 モデルに対して、業務文書やPDFの文章を大量に読ませ、 「この分野の文章の続き」を自然に予測できるようにします。
入力例:
Kaleidoのハイブリッド検索では、BM25とベクトル検索を組み合わせ、
信頼度スコアに応じて回答候補を再ランキングする。
学習で起きること:
「Kaleido」「ハイブリッド検索」「BM25」「ベクトル検索」
といった用語や文脈に、モデルが慣れていく。
- PDFマニュアル
- 仕様書
- 研究資料
- 社内Wiki
- 技術メモ
- 信頼済みweb_knowledge
- 価格や法改正などの最新情報
- 顧客ごとに変わる機密情報
- ページ番号つきで出典が必要な回答
- 誤りや重複が多い生ログ
4. SFT:過去会話や模範回答から“答え方”を学ばせる
SFTは Supervised Fine-Tuning、教師あり微調整です。 「この質問にはこう答える」という対話ペアを使い、回答の型を学ばせます。
{
"messages": [
{
"role": "user",
"content": "CPTとSFTの違いは?"
},
{
"role": "assistant",
"content": "CPTは知識を染み込ませる学習、SFTは答え方を教える学習です。"
}
]
}
SFTで変わるのは、知識そのものよりも回答スタイル、判断順序、説明の粒度です。
5. LoRA / QLoRA:元モデルを壊さない安全な学習方式
実運用では、ベースモデル本体を直接書き換えるより、 LoRA adapterとして差分を保存する方法が安全です。
ベースモデル
qwen-14b-base/
model.safetensors
tokenizer.json
追加学習結果
adapters/
20260608-qwen14b-cpt-v1/
adapter_config.json
adapter_model.safetensors
training_info.json
eval_report.json
推論時
ベースモデル + adapter を合成して使う
戻したい場合
adapter を外すだけ
ベースモデルは無傷
| 方式 | 特徴 | 実運用での意味 |
|---|---|---|
| LoRA | 一部の重み差分だけを学習 | 軽く、安全に切替可能 |
| QLoRA | 4bit量子化したモデルにLoRAを適用 | 少ないVRAMで14B〜27B級を扱いやすい |
| Full Fine-Tuning | 全重みを更新 | 強力だが高コスト。個人・小規模GPUでは重い |
6. 推奨アーキテクチャ
PDFと会話を一定期間溜め込み、Admin画面からオンデマンド実行する構成が扱いやすいです。
[累積フェーズ]
├ PDF ingestion
│ └ chunks テーブル
│
├ web_knowledge
│ └ 信頼度フィルタ済み知識
│
└ messages
└ 過去会話ログ / 修正済みQ&A
[Admin実行フェーズ]
├ /admin/finetune/dataset
│ ├ CPT用 raw text JSONL
│ └ SFT用 Q/A JSONL
│
├ /admin/finetune/start
│ └ Unsloth + QLoRA 学習開始
│
├ /admin/finetune/status
│ └ log tail / loss / GPU使用率
│
├ /admin/finetune/eval
│ └ before / after 比較
│
└ /admin/finetune/promote
└ adapter を本番 profile に昇格
7. 実行フロー
PDF、仕様書、会話ログ、修正済みQ&Aを一定期間ためる。
CPT用raw text、SFT用messages JSONLへ変換する。
まず14BでCPT。効果確認後にSFTを追加する。
RAG OFF / RAG ONの両方でbefore-after比較する。
評価レポートを見てから本番adapterとして有効化する。
8. 学習データの設計
| データ | 使い方 | 期待効果 | 注意点 |
|---|---|---|---|
| PDF chunks | CPT | 専門知識、用語、業務文脈が染みる | 重複除去、古い資料の除外が必要 |
| 社内Wiki / Markdown | CPT | 社内標準の説明に強くなる | 誤情報を混ぜるとそのまま癖になる |
| 過去会話ログ | SFT | 回答スタイル、手順、説明粒度が揃う | 全件投入は危険。高品質データだけ使う |
| 訂正履歴 | SFT | 過去の間違いを再発しにくくする | 正しい回答を明示した形式にする |
| web_knowledge | CPT または RAG | 一般知識の補強 | 鮮度が落ちる情報はRAG優先 |
9. 評価しないファインチューニングは危険
ファインチューニングは「賢くなるボタン」ではありません。 正確には、モデルに癖をつける作業です。 良い癖もつきますが、悪い癖もつきます。
[
{
"question": "Kaleidoのハイブリッド検索とは?",
"expected_keywords": ["BM25", "ベクトル検索", "再ランキング"]
},
{
"question": "URLを回答に含める条件は?",
"expected_keywords": ["実在確認", "未確認なら出さない"]
},
{
"question": "Linuxサービスが起動しない場合の確認手順は?",
"expected_keywords": ["systemctl status", "journalctl", "権限", "パス"]
}
]
| 評価項目 | 確認内容 |
|---|---|
| 専門知識 | PDF由来の用語や設計意図を正しく説明できるか |
| 汎用能力 | 数学、コード、一般会話が劣化していないか |
| 指示追従 | JSON出力、箇条書き、文字数制限などを守れるか |
| 安全性 | 拒否すべき内容を安易に答えないか |
| URLハルシネーション | 存在確認なしにURLを捏造しないか |
| RAG活用 | contextを無視せず、根拠として正しく使えるか |
10. 推奨する初期構成
まず作るもの
- PDF chunks → CPT JSONL出力
- Adminの学習実行ボタン
- Unsloth QLoRA学習スクリプト
- adapter保存ディレクトリ
- 簡易evalレポート
最初の学習条件
- base model:14Bクラス
- 学習:CPTのみ
- LoRA rank:8〜16
- epoch:1
- promote:手動
推奨ステップ:
1. 14BでCPTのみ実行
2. RAG OFFで知識の焼き込み効果を見る
3. 問題なければ良質Q&AでSFT追加
4. RAG ONで根拠つき回答の品質を見る
5. adapterを手動で本番反映
6. 運用が固まってから27B級へ拡張
11. 最終結論
RAGは「資料を参照する力」です。 ファインチューニングは「その分野に馴染む力」です。
どちらか一方では不十分です。 実運用で強いのは、次の組み合わせです。
LLM知識体質改善の完成形
CPT
→ PDF・仕様書・社内用語を染み込ませる
SFT
→ 会話スタイル・回答手順・業務ルールを整える
RAG
→ 出典・最新情報・顧客別データを補う
LoRA / QLoRA
→ 元モデルを壊さず、安全に差し替える
Eval
→ 静かな品質劣化を検出する
No responses yet