🚀 日本語LLMファインチューニング + RAGシステム + 継続学習統合Webツールキット
Dockerベースの統合Webインターフェースで、日本語大規模言語モデル(LLM)のファインチューニング、土木道路設計特化型RAGシステム、そしてEWCベースの継続学習を同一プラットフォームで実行できます。単一のポート(8050)で全機能にアクセス可能な革新的なツールキットです。
IMPLEMENTATION_GUIDE.mdに詳細な使用方法を記載/rag/* エンドポイントで9つのRAG機能を提供継続学習システムは、EWC(Elastic Weight Consolidation) アルゴリズムを使用して、破滅的忘却を防ぎながら新しいタスクを学習します。
主要コンポーネント:
outputs/ewc_data/task_history.jsonに全履歴を永続化# 継続学習パイプライン(src/training/continual_learning_pipeline.py)
1. ベースモデルのロード
- フルファインチューニング済みモデルから開始
- outputs/ディレクトリから自動検出
2. 継続学習タスクの実行
- 過去のFisher行列をロード
- EWC損失を含むトレーニング実行
- 新しいFisher行列を計算・保存
3. Fisher行列の効率的管理
- ブロック単位計算(1Mパラメータごと)
- メモリ効率的な保存形式
- 動的バッチサイズによる最適化
Webインターフェースの「モデル更新」ボタンは、利用可能なモデルリストを更新する機能です:
outputs/ディレクトリをスキャンして新規モデルを検出すべての継続学習タスクで作成されたモデルは自動的に保存されます:
| 保存内容 | ファイル | 説明 |
|---|---|---|
| モデルの重み | pytorch_model.bin | 学習済みパラメータ |
| 設定ファイル | config.json | モデルアーキテクチャ |
| トークナイザー | tokenizer_config.json | テキスト処理設定 |
| 学習情報 | training_info.json | 学習パラメータ履歴 |
| Fisher行列 | outputs/ewc_data/fisher_task_*.pt | EWC用重要度情報 |
# Webインターフェースから実行
1. http://localhost:8050/continual にアクセス
2. ベースモデルを選択(フルファインチューニング済みモデル推奨)
3. タスク名とデータセットをアップロード
4. EWCパラメータを設定(λ=5000推奨)
5. 「学習開始」をクリック
# 学習履歴の確認
- data/continual_learning/tasks_state.json に全タスクの状態を記録
- outputs/continual_task_* に各タスクのモデルを保存
最新のサポートモデルリストです。
| モデル名 | タイプ | 精度 | 推奨VRAM | タグ |
|---|---|---|---|---|
| Qwen/Qwen2.5-14B-Instruct | CausalLM | bfloat16 | 32GB | multilingual, 14b, instruct |
| Qwen/Qwen2.5-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese | CausalLM | bfloat16 | 80GB | japanese, 32b, deepseek |
| cyberagent/calm3-22b-chat | CausalLM | float16 | 48GB | japanese, 22b, chat |
| meta-llama/Meta-Llama-3.1-70B-Instruct | CausalLM | bfloat16 | 160GB | multilingual, 70b, instruct |
| meta-llama/Meta-Llama-3.1-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| microsoft/Phi-3.5-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| microsoft/Orca-2-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
app/main_unified.py)git clone https://github.com/kji-furuta/AI_FT_3.git
cd AI_FT_3
# Ollamaをインストール
curl -fsSL https://ollama.com/install.sh | sh
# Ollamaサービスを起動
ollama serve
※ 新しいターミナルウィンドウでOllamaを起動したままにしてください
# RAG依存関係も含めた完全ビルド+起動+テスト
./scripts/docker_build_rag.sh --no-cache
# 初回のみ:RAG統合版Dockerイメージビルド
cd docker
docker-compose up -d --build
# 2回目以降:通常起動(ビルド不要)
docker-compose up -d
# コンテナ内で統合インターフェース起動
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# コンテナ内で直接起動(ログ確認用)
docker exec ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# バックグラウンドで起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# 必要なファイルをコンテナにコピー
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# Webサーバーを起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
/manual - 詳細な利用方法/system-overview - 技術仕様ブラウザで http://localhost:8050 にアクセスして以下の機能を利用:
/)/finetune)データアップロード
モデル選択
cyberagent/calm3-22b-chat学習設定
LoRA: 軽量学習(推奨)QLoRA: 4bit量子化学習フルファインチューニング: 全パラメータ更新学習実行
学習完了
/generate)モデル選択
プロンプト入力
生成パラメータ調整
生成実行
/rag) - 土木道路設計特化文書アップロード
インテリジェント検索
Hybrid: ベクトル+キーワード検索(推奨)Vector: 意味的類似性検索Keyword: キーワードマッチング質問応答
数値処理・検証
バッチ処理
メタデータ管理
/models)利用可能モデル
学習済みモデル
モデル変換
システム情報 (/api/system-info)
キャッシュ管理
ログ確認
利用マニュアル (/manual)
システム概要 (/system-overview)
AI_FT_3には、土木道路設計分野に特化したRAG(Retrieval-Augmented Generation)システムが統合されています。このシステムは、道路構造令や設計基準書などの技術文書から正確な情報を検索し、引用情報付きの回答を生成します。
from src.rag.specialized import NumericalProcessor, extract_numerical_values
# テキストから数値を自動抽出
text = "設計速度60km/h、最小曲線半径150m、縦断勾配5%とする。"
processor = NumericalProcessor()
result = processor.process_text(text)
print(f"抽出された数値: {len(result['numerical_values'])}個")
for value in result['numerical_values']:
print(f"- {value['value']}{value['unit']} ({value['value_type']})")
from src.rag.specialized import check_design_standard
# 道路構造令に基づく適合性チェック
result = check_design_standard(
value=135, # 曲線半径135m
value_type='curve_radius',
unit='m',
context={'design_speed': 60}
)
print(f"妥当性: {'○' if result.is_valid else '×'}")
print(f"メッセージ: {result.message}")
from src.rag.specialized import create_version_manager
# 文書のバージョン管理
manager = create_version_manager()
# 新しいバージョンを作成
version = manager.create_version(
document_id="road_standard_001",
title="道路設計基準書 v1.1",
content="設計速度は原則として60km/hとする...",
parent_version_id="previous_version_id"
)
# バージョン間の差分を検出
diff = manager.compare_versions(version1_id, version2_id, content1, content2)
print(f"変更されたセクション: {len(diff.modified_sections)}個")
from src.rag.retrieval import HybridSearchEngine
from src.rag.indexing import QdrantVectorStore, EmbeddingModelFactory
# ハイブリッド検索の設定
vector_store = QdrantVectorStore(collection_name="road_documents")
embedding_model = EmbeddingModelFactory.create("multilingual-e5-large")
search_engine = HybridSearchEngine(
vector_store=vector_store,
embedding_model=embedding_model,
vector_weight=0.7,
keyword_weight=0.3
)
# 検索実行
from src.rag.retrieval import SearchQuery
query = SearchQuery(text="設計速度60km/hの最小曲線半径は?")
results = search_engine.search(query, top_k=5)
# 統合APIサーバーの起動(RAG + ファインチューニング)
from app.main_unified import app
import uvicorn
# 単一ポート8050で全機能利用可能
uvicorn.run(app, host="0.0.0.0", port=8050)
# 統合REST API の利用例
# RAGクエリ(統合API)
curl -X POST "http://localhost:8050/rag/query" \
-H "Content-Type: application/json" \
-d '{
"query": "設計速度80km/hの道路の最小曲線半径を教えて",
"top_k": 5,
"search_type": "hybrid"
}'
# RAGヘルスチェック
curl "http://localhost:8050/rag/health"
# RAG文書アップロード
curl -X POST "http://localhost:8050/rag/upload-document" \
-F "file=@道路設計基準.pdf" \
-F "title=道路設計基準書" \
-F "category=設計基準"
# RAG簡易検索
curl "http://localhost:8050/rag/search?q=曲線半径&top_k=3"
# RAG文書一覧
curl "http://localhost:8050/rag/documents"
# RAGストリーミング検索
curl -X POST "http://localhost:8050/rag/stream-query" \
-H "Content-Type: application/json" \
-d '{"query": "道路設計について教えて", "top_k": 5}'
POST /api/train - モデルファインチューニング開始GET /api/training-status/{task_id} - 学習状況確認POST /api/generate - テキスト生成GET /api/models - 利用可能モデル一覧GET /rag/health - RAGシステムヘルスチェックPOST /rag/query - 高度な文書検索・質問応答GET /rag/search - 簡易検索APIPOST /rag/batch-query - バッチクエリ処理GET /rag/documents - 文書一覧取得POST /rag/upload-document - 文書アップロードGET /rag/statistics - システム統計情報POST /rag/stream-query - ストリーミング検索GET /rag/system-info - RAGシステム詳細情報統合システムの動作確認用テストスクリプトが用意されています:
# Webインターフェース統合テスト(100%成功確認済み)
python3 test_integration.py
# Docker RAG統合テスト
python3 test_docker_rag.py
# 設定解決機能テスト
python3 scripts/test_config_resolution.py
# 特化機能の簡易テスト
python3 scripts/simple_feature_test.py
# 包括的な機能テスト(依存関係が必要)
python3 scripts/test_specialized_features.py
テスト内容:
| 種類 | 単位 | 例 | 検出パターン |
|---|---|---|---|
| 速度 | km/h, m/s | 60km/h, 16.7m/s | 設計速度、制限速度 |
| 長さ | m, km, mm, cm | 150m, 2.5km | 曲線半径、幅員、延長 |
| 勾配 | %, % | 5%, 8% | 縦断勾配、横断勾配 |
| 角度 | 度, °, rad | 30度, 0.52rad | 交角、偏角 |
| 面積 | m², km² | 25m², 1.5km² | 断面積、用地面積 |
| 荷重 | kN, t | 245kN, 25t | 軸重、輪荷重 |
システムは道路構造令の以下の基準に対応しています:
| 項目 | 第1種 | 第2種 | 第3種 | 第4種 |
|---|---|---|---|---|
| 設計速度 | 60-120 km/h | 50-80 km/h | 40-80 km/h | 20-60 km/h |
| 車道幅員 | 3.5m | 3.25m | 3.0m | 2.75m |
| 最大縦断勾配 | 3-5% | 4-6% | 5-7% | 6-8% |
from src.models.japanese_model import JapaneseModel
from src.training.lora_finetuning import LoRAFinetuningTrainer, LoRAConfig
from src.training.training_utils import TrainingConfig
# モデルの初期化 (新しい推奨モデル)
model = JapaneseModel(
model_name="cyberagent/calm3-22b-chat" # または "cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese"
)
# LoRA設定
lora_config = LoRAConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.05,
use_qlora=False
)
# トレーニング設定
training_config = TrainingConfig(
learning_rate=3e-4,
batch_size=4,
num_epochs=3,
output_dir="./outputs/lora_stablelm_3b"
)
# トレーナーの初期化と実行
trainer = LoRAFinetuningTrainer(model, lora_config, training_config)
trainer.train(train_texts=["日本の首都は東京です。", "日本の最高峰は富士山です。"])
DoRAは、LoRAを超える精度と効率性を実現する最新のファインチューニング手法です。
from src.training.dora.dora_implementation import DoRAConfig, train_with_dora
# DoRA設定(LoRAより高精度)
config = DoRAConfig(
rank=32, # LoRAより高いランクでも効率的
alpha=64, # スケーリング係数
dropout=0.1, # ドロップアウト率
use_magnitude_scaling=True # 大きさスケーリング有効化
)
# DoRAでファインチューニング
model = train_with_dora(
base_model_path="cyberagent/calm3-22b-chat",
train_data="data/training_data.jsonl",
output_dir="outputs/dora_model",
config=config
)
vLLMは、PagedAttentionを使用してメモリ効率とスループットを大幅に向上させます。
from src.inference.vllm_integration import VLLMIntegration
# vLLMエンジンの初期化(マルチGPU対応)
engine = VLLMIntegration(
model_path="outputs/trained_model",
tensor_parallel_size=2, # 2GPUで並列化
gpu_memory_utilization=0.9, # GPU使用率90%
max_num_batched_tokens=32768 # バッチ処理の最大トークン
)
# ストリーミング生成(リアルタイム応答)
for token in engine.stream_generate(
prompt="道路設計における最小曲線半径の決定要因について説明してください。",
max_tokens=512,
temperature=0.7
):
print(token, end="", flush=True)
AWQは、精度を維持しながら75%のメモリ削減を実現します。
from src.inference.awq_quantization import AWQQuantizer
# AWQ量子化器の初期化
quantizer = AWQQuantizer(
model_path="outputs/dora_model",
w_bit=4, # 4ビット量子化
group_size=128, # グループサイズ
zero_point=True # ゼロポイント使用
)
# モデルの量子化(キャリブレーションデータ使用)
quantized_model = quantizer.quantize(
calibration_data=calibration_dataset,
num_samples=512 # キャリブレーション用サンプル数
)
# 量子化モデルの保存
quantizer.save_quantized("outputs/model_awq_4bit")
最高のパフォーマンスを実現する統合パイプライン
# Step 1: DoRAでファインチューニング
from src.training.dora.dora_implementation import train_with_dora
dora_model = train_with_dora(
base_model_path="cyberagent/calm3-22b-chat",
train_data="data/training_data.jsonl",
output_dir="outputs/dora_model",
config=DoRAConfig(rank=32, alpha=64)
)
# Step 2: AWQで量子化
from src.inference.awq_quantization import AWQQuantizer
quantizer = AWQQuantizer(model_path="outputs/dora_model")
quantized_model = quantizer.quantize(
calibration_data=calibration_data,
w_bit=4
)
quantizer.save_quantized("outputs/dora_awq_4bit")
# Step 3: vLLMで高速推論
from src.inference.vllm_integration import VLLMIntegration
engine = VLLMIntegration(
model_path="outputs/dora_awq_4bit",
quantization="awq",
tensor_parallel_size=2
)
# 3倍高速、80%メモリ削減で推論実行
response = engine.generate(
prompt="設計速度100km/hの高速道路における安全設計について",
max_tokens=1024
)
詳細な使用方法は IMPLEMENTATION_GUIDE.md を参照してください。
EWCは、以前のタスクの知識を忘れることなく、新しいタスクをモデルに学習させるための手法です。
from src.models.japanese_model import JapaneseModel
from src.training.lora_finetuning import LoRAFinetuningTrainer, LoRAConfig
from src.training.training_utils import TrainingConfig
from src.training.ewc_utils import EWCConfig, EWCManager
# 1. ベースモデルと最初のタスクのデータ
model = JapaneseModel("cyberagent/calm3-22b-chat")
task1_data = ["一般的な知識に関するテキスト...", "歴史に関するテキスト..."]
# 2. 最初のタスクでモデルをファインチューニング
lora_config = LoRAConfig(r=8, lora_alpha=16)
training_config = TrainingConfig(learning_rate=2e-4, num_epochs=2, output_dir="./outputs/task1_lora")
trainer = LoRAFinetuningTrainer(model, lora_config, training_config)
trained_model = trainer.train(train_texts=task1_data)
# 3. EWCの準備 (Fisher情報行列の計算)
ewc_manager = EWCManager(trained_model.model, trained_model.tokenizer)
fisher_matrix = ewc_manager.compute_fisher(task1_data)
# 4. 新しいタスクでEWCを使ってファインチューニング
ewc_config = EWCConfig(enabled=True, ewc_lambda=0.5, fisher_matrix=fisher_matrix)
training_config_task2 = TrainingConfig(learning_rate=1e-4, num_epochs=2, output_dir="./outputs/task2_ewc_lora")
task2_data = ["プログラミングに関するテキスト...", "Pythonのコード例..."]
trainer_task2 = LoRAFinetuningTrainer(
model=trained_model,
lora_config=lora_config,
training_config=training_config_task2,
ewc_config=ewc_config # EWC設定を渡す
)
final_model = trainer_task2.train(train_texts=task2_data)
AI_FT_3/
├── app/ # Webアプリケーション
│ ├── main_unified.py # 統合Webサーバー(稼働中)
│ ├── memory_optimized_loader.py # メモリ最適化ローダー
│ └── static/ # フロントエンドファイル
│ └── logo_teikoku.png # 帝国大学ロゴ
├── templates/ # HTMLテンプレート
│ ├── base.html # ベーステンプレート(ロゴ統合)
│ ├── index.html # メインページ
│ ├── finetune.html # ファインチューニングページ
│ └── models.html # モデル管理ページ
├── static/ # 静的ファイル(templatesと同じレベル)
│ └── logo_teikoku.png # ロゴファイル(Web配信用)
├── src/ # コアライブラリ
│ ├── models/ # モデル関連
│ ├── training/ # ファインチューニング
│ ├── utils/ # ユーティリティ
│ └── rag/ # RAG機能(土木道路設計特化型)
│ ├── indexing/ # 文書インデックス化
│ ├── retrieval/ # ハイブリッド検索・リランキング
│ ├── core/ # クエリエンジン・引用生成
│ ├── document_processing/ # PDF処理・OCR・テーブル抽出
│ ├── specialized/ # 数値処理・バージョン管理
│ └── config/ # RAG設定
├── docker/ # Docker環境
│ ├── Dockerfile
│ └── docker-compose.yml
├── scripts/ # 運用スクリプト
├── outputs/ # 学習済みモデル保存
├── data/ # トレーニングデータ
├── config/ # 基本設定
├── configs/ # DeepSpeed設定
└── docs/ # ドキュメント
├── API_REFERENCE.md
├── LARGE_MODEL_SETUP.md
└── MULTI_GPU_OPTIMIZATION.md
IMPLEMENTATION_GUIDE.mdに詳細な使用方法記載scripts/test_dora_training.py追加scripts/check_docker_dependencies.sh や scripts/check_rag_dependencies.py により、環境の健全性を自動で検証。docs/MONITORING_GRAFANA_GUIDE.md に追加。docs/PERFORMANCE_OPTIMIZATION_GUIDE.md に基づく最適化を実施。docs/NEXT_STEPS_PRODUCTION.md にて、本番環境へのデプロイ手順を詳述。run_phase2_complete_test.sh) を追加。プルリクエストを歓迎します。主な開発ブランチは main です。
git checkout -b feature/new-feature)git commit -m 'Add new feature')git push origin feature/new-feature)このプロジェクトはMITライセンスの下で公開されています。
# 1. クローン
git clone https://github.com/kji-furuta/AI_FT_3.git
cd AI_FT_3
# 2. Ollamaをインストール・起動(新しいターミナルで)
curl -fsSL https://ollama.com/install.sh | sh
ollama serve
# 3. 起動(元のターミナルで)
cd docker && docker-compose up -d --build # 初回のみ
# 2回目以降は: docker-compose up -d
# 4. Webサーバー開始
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# 5. 起動確認
```bash
# ポートの確認
docker exec ai-ft-container netstat -tlnp | grep 8050
# プロセスの確認
docker exec ai-ft-container ps aux | grep uvicorn
# ログの確認
docker logs ai-ft-container --tail 20
メインダッシュボード: http://localhost:8050/
ファインチューニング: http://localhost:8050/finetune
RAGシステム: http://localhost:8050/rag
モデル管理: http://localhost:8050/models
**🚀 5分でファインチューニング・RAG開始!**
### 📊 監視システム(Prometheus + Grafana)
統合監視システムにより、アプリケーションのパフォーマンスとリソース使用状況をリアルタイムで監視できます。
#### 監視システムの起動
```bash
# 監視統合環境の起動(メインアプリケーション + 監視ツール)
./scripts/start_monitoring_with_main.sh
# または個別に起動
./scripts/manage_services.sh start-all # すべて起動
./scripts/manage_services.sh start-app # アプリケーションのみ
./scripts/manage_services.sh start-monitor # 監視ツールのみ
Grafana ダッシュボード: http://localhost:3000
Prometheus: http://localhost:9090
メトリクスエンドポイント: http://localhost:8050/metrics
システムメトリクス
ai_ft_cpu_usage_percent: CPU使用率ai_ft_memory_usage_percent: メモリ使用率ai_ft_gpu_available: GPU利用可能状態ai_ft_gpu_count: GPU数ai_ft_gpu_memory_used_mb: GPU メモリ使用量アプリケーションメトリクス
ai_ft_http_requests_total: HTTPリクエスト数ai_ft_rag_queries_total: RAGクエリ数ai_ft_training_tasks_total: トレーニングタスク数ai_ft_cache_hits_total: キャッシュヒット数# ダッシュボードの自動設定
./scripts/setup_grafana_dashboard.sh
# 状態確認
./scripts/manage_services.sh status
# アプリケーション再起動
./scripts/manage_services.sh restart-app
# ログ確認
./scripts/manage_services.sh logs-app # アプリケーションログ
./scripts/manage_services.sh logs-monitor # 監視サービスログ
# 停止
./scripts/manage_services.sh stop-all # すべて停止
# Ollamaが起動しているか確認
curl http://localhost:11434/api/tags
# Ollamaを再起動
killall ollama
ollama serve
# 静的ファイルの確認
docker exec ai-ft-container ls -la /workspace/static/
# ロゴファイルの存在確認
docker exec ai-ft-container curl -I http://localhost:8050/static/logo_teikoku.png
# コンテナの状態確認
docker ps -a
# ログの確認
docker logs ai-ft-container
# 自動起動スクリプトの実行
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# ファイル不足の確認
docker exec ai-ft-container ls -la /workspace/app/
# ファイルが不足している場合の対処法
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# 手動起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# モジュールのインポートテスト
docker exec ai-ft-container python -c "import app.main_unified; print('Import successful')"
# ファイル構造の確認
docker exec ai-ft-container ls -la /workspace/app/
docker exec ai-ft-container ls -la /workspace/src/
# 必要に応じてファイルを再コピー
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# 特化機能のテスト
python3 scripts/simple_feature_test.py
# RAGシステムの統合確認
curl http://localhost:8050/rag/health
# システム情報の確認
curl http://localhost:8050/rag/system-info
# ベクトル化エラーのテスト(v2.1.0で修正済み)
docker exec ai-ft-container python test_vector_fix.py
# 必要な依存関係の確認
pip install qdrant-client sentence-transformers transformers
# テキスト処理の確認
python3 -c "
from src.rag.specialized import extract_numerical_values
values = extract_numerical_values('設計速度60km/h')
print(f'抽出結果: {len(values)}個')
"
# 設計基準の確認
python3 -c "
from src.rag.specialized import check_design_standard
result = check_design_standard(60, 'speed', 'km/h')
print(f'検証結果: {result.is_valid}')
"
# Webインターフェースの確認
curl http://localhost:8050/
# RAGシステムの確認
curl http://localhost:8050/rag/health
# システム情報の確認
curl http://localhost:8050/api/system-info
🚀 日本語LLMファインチューニング + RAGシステム + 継続学習統合Webツールキット
Dockerベースの統合Webインターフェースで、日本語大規模言語モデル(LLM)のファインチューニング、土木道路設計特化型RAGシステム、そしてEWCベースの継続学習を同一プラットフォームで実行できます。単一のポート(8050)で全機能にアクセス可能な革新的なツールキットです。
IMPLEMENTATION_GUIDE.mdに詳細な使用方法を記載/rag/* エンドポイントで9つのRAG機能を提供継続学習システムは、EWC(Elastic Weight Consolidation) アルゴリズムを使用して、破滅的忘却を防ぎながら新しいタスクを学習します。
主要コンポーネント:
outputs/ewc_data/task_history.jsonに全履歴を永続化# 継続学習パイプライン(src/training/continual_learning_pipeline.py)
1. ベースモデルのロード
- フルファインチューニング済みモデルから開始
- outputs/ディレクトリから自動検出
2. 継続学習タスクの実行
- 過去のFisher行列をロード
- EWC損失を含むトレーニング実行
- 新しいFisher行列を計算・保存
3. Fisher行列の効率的管理
- ブロック単位計算(1Mパラメータごと)
- メモリ効率的な保存形式
- 動的バッチサイズによる最適化
Webインターフェースの「モデル更新」ボタンは、利用可能なモデルリストを更新する機能です:
outputs/ディレクトリをスキャンして新規モデルを検出すべての継続学習タスクで作成されたモデルは自動的に保存されます:
| 保存内容 | ファイル | 説明 |
|---|---|---|
| モデルの重み | pytorch_model.bin | 学習済みパラメータ |
| 設定ファイル | config.json | モデルアーキテクチャ |
| トークナイザー | tokenizer_config.json | テキスト処理設定 |
| 学習情報 | training_info.json | 学習パラメータ履歴 |
| Fisher行列 | outputs/ewc_data/fisher_task_*.pt | EWC用重要度情報 |
# Webインターフェースから実行
1. http://localhost:8050/continual にアクセス
2. ベースモデルを選択(フルファインチューニング済みモデル推奨)
3. タスク名とデータセットをアップロード
4. EWCパラメータを設定(λ=5000推奨)
5. 「学習開始」をクリック
# 学習履歴の確認
- data/continual_learning/tasks_state.json に全タスクの状態を記録
- outputs/continual_task_* に各タスクのモデルを保存
最新のサポートモデルリストです。
| モデル名 | タイプ | 精度 | 推奨VRAM | タグ |
|---|---|---|---|---|
| Qwen/Qwen2.5-14B-Instruct | CausalLM | bfloat16 | 32GB | multilingual, 14b, instruct |
| Qwen/Qwen2.5-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese | CausalLM | bfloat16 | 80GB | japanese, 32b, deepseek |
| cyberagent/calm3-22b-chat | CausalLM | float16 | 48GB | japanese, 22b, chat |
| meta-llama/Meta-Llama-3.1-70B-Instruct | CausalLM | bfloat16 | 160GB | multilingual, 70b, instruct |
| meta-llama/Meta-Llama-3.1-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| microsoft/Phi-3.5-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
| microsoft/Orca-2-32B-Instruct | CausalLM | bfloat16 | 80GB | multilingual, 32b, instruct |
app/main_unified.py)git clone https://github.com/kji-furuta/AI_FT_3.git
cd AI_FT_3
# Ollamaをインストール
curl -fsSL https://ollama.com/install.sh | sh
# Ollamaサービスを起動
ollama serve
※ 新しいターミナルウィンドウでOllamaを起動したままにしてください
# RAG依存関係も含めた完全ビルド+起動+テスト
./scripts/docker_build_rag.sh --no-cache
# 初回のみ:RAG統合版Dockerイメージビルド
cd docker
docker-compose up -d --build
# 2回目以降:通常起動(ビルド不要)
docker-compose up -d
# コンテナ内で統合インターフェース起動
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# コンテナ内で直接起動(ログ確認用)
docker exec ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# バックグラウンドで起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# 必要なファイルをコンテナにコピー
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# Webサーバーを起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
/manual - 詳細な利用方法/system-overview - 技術仕様ブラウザで http://localhost:8050 にアクセスして以下の機能を利用:
/)/finetune)データアップロード
モデル選択
cyberagent/calm3-22b-chat学習設定
LoRA: 軽量学習(推奨)QLoRA: 4bit量子化学習フルファインチューニング: 全パラメータ更新学習実行
学習完了
/generate)モデル選択
プロンプト入力
生成パラメータ調整
生成実行
/rag) - 土木道路設計特化文書アップロード
インテリジェント検索
Hybrid: ベクトル+キーワード検索(推奨)Vector: 意味的類似性検索Keyword: キーワードマッチング質問応答
数値処理・検証
バッチ処理
メタデータ管理
/models)利用可能モデル
学習済みモデル
モデル変換
システム情報 (/api/system-info)
キャッシュ管理
ログ確認
利用マニュアル (/manual)
システム概要 (/system-overview)
AI_FT_3には、土木道路設計分野に特化したRAG(Retrieval-Augmented Generation)システムが統合されています。このシステムは、道路構造令や設計基準書などの技術文書から正確な情報を検索し、引用情報付きの回答を生成します。
from src.rag.specialized import NumericalProcessor, extract_numerical_values
# テキストから数値を自動抽出
text = "設計速度60km/h、最小曲線半径150m、縦断勾配5%とする。"
processor = NumericalProcessor()
result = processor.process_text(text)
print(f"抽出された数値: {len(result['numerical_values'])}個")
for value in result['numerical_values']:
print(f"- {value['value']}{value['unit']} ({value['value_type']})")
from src.rag.specialized import check_design_standard
# 道路構造令に基づく適合性チェック
result = check_design_standard(
value=135, # 曲線半径135m
value_type='curve_radius',
unit='m',
context={'design_speed': 60}
)
print(f"妥当性: {'○' if result.is_valid else '×'}")
print(f"メッセージ: {result.message}")
from src.rag.specialized import create_version_manager
# 文書のバージョン管理
manager = create_version_manager()
# 新しいバージョンを作成
version = manager.create_version(
document_id="road_standard_001",
title="道路設計基準書 v1.1",
content="設計速度は原則として60km/hとする...",
parent_version_id="previous_version_id"
)
# バージョン間の差分を検出
diff = manager.compare_versions(version1_id, version2_id, content1, content2)
print(f"変更されたセクション: {len(diff.modified_sections)}個")
from src.rag.retrieval import HybridSearchEngine
from src.rag.indexing import QdrantVectorStore, EmbeddingModelFactory
# ハイブリッド検索の設定
vector_store = QdrantVectorStore(collection_name="road_documents")
embedding_model = EmbeddingModelFactory.create("multilingual-e5-large")
search_engine = HybridSearchEngine(
vector_store=vector_store,
embedding_model=embedding_model,
vector_weight=0.7,
keyword_weight=0.3
)
# 検索実行
from src.rag.retrieval import SearchQuery
query = SearchQuery(text="設計速度60km/hの最小曲線半径は?")
results = search_engine.search(query, top_k=5)
# 統合APIサーバーの起動(RAG + ファインチューニング)
from app.main_unified import app
import uvicorn
# 単一ポート8050で全機能利用可能
uvicorn.run(app, host="0.0.0.0", port=8050)
# 統合REST API の利用例
# RAGクエリ(統合API)
curl -X POST "http://localhost:8050/rag/query" \
-H "Content-Type: application/json" \
-d '{
"query": "設計速度80km/hの道路の最小曲線半径を教えて",
"top_k": 5,
"search_type": "hybrid"
}'
# RAGヘルスチェック
curl "http://localhost:8050/rag/health"
# RAG文書アップロード
curl -X POST "http://localhost:8050/rag/upload-document" \
-F "file=@道路設計基準.pdf" \
-F "title=道路設計基準書" \
-F "category=設計基準"
# RAG簡易検索
curl "http://localhost:8050/rag/search?q=曲線半径&top_k=3"
# RAG文書一覧
curl "http://localhost:8050/rag/documents"
# RAGストリーミング検索
curl -X POST "http://localhost:8050/rag/stream-query" \
-H "Content-Type: application/json" \
-d '{"query": "道路設計について教えて", "top_k": 5}'
POST /api/train - モデルファインチューニング開始GET /api/training-status/{task_id} - 学習状況確認POST /api/generate - テキスト生成GET /api/models - 利用可能モデル一覧GET /rag/health - RAGシステムヘルスチェックPOST /rag/query - 高度な文書検索・質問応答GET /rag/search - 簡易検索APIPOST /rag/batch-query - バッチクエリ処理GET /rag/documents - 文書一覧取得POST /rag/upload-document - 文書アップロードGET /rag/statistics - システム統計情報POST /rag/stream-query - ストリーミング検索GET /rag/system-info - RAGシステム詳細情報統合システムの動作確認用テストスクリプトが用意されています:
# Webインターフェース統合テスト(100%成功確認済み)
python3 test_integration.py
# Docker RAG統合テスト
python3 test_docker_rag.py
# 設定解決機能テスト
python3 scripts/test_config_resolution.py
# 特化機能の簡易テスト
python3 scripts/simple_feature_test.py
# 包括的な機能テスト(依存関係が必要)
python3 scripts/test_specialized_features.py
テスト内容:
| 種類 | 単位 | 例 | 検出パターン |
|---|---|---|---|
| 速度 | km/h, m/s | 60km/h, 16.7m/s | 設計速度、制限速度 |
| 長さ | m, km, mm, cm | 150m, 2.5km | 曲線半径、幅員、延長 |
| 勾配 | %, % | 5%, 8% | 縦断勾配、横断勾配 |
| 角度 | 度, °, rad | 30度, 0.52rad | 交角、偏角 |
| 面積 | m², km² | 25m², 1.5km² | 断面積、用地面積 |
| 荷重 | kN, t | 245kN, 25t | 軸重、輪荷重 |
システムは道路構造令の以下の基準に対応しています:
| 項目 | 第1種 | 第2種 | 第3種 | 第4種 |
|---|---|---|---|---|
| 設計速度 | 60-120 km/h | 50-80 km/h | 40-80 km/h | 20-60 km/h |
| 車道幅員 | 3.5m | 3.25m | 3.0m | 2.75m |
| 最大縦断勾配 | 3-5% | 4-6% | 5-7% | 6-8% |
from src.models.japanese_model import JapaneseModel
from src.training.lora_finetuning import LoRAFinetuningTrainer, LoRAConfig
from src.training.training_utils import TrainingConfig
# モデルの初期化 (新しい推奨モデル)
model = JapaneseModel(
model_name="cyberagent/calm3-22b-chat" # または "cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese"
)
# LoRA設定
lora_config = LoRAConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.05,
use_qlora=False
)
# トレーニング設定
training_config = TrainingConfig(
learning_rate=3e-4,
batch_size=4,
num_epochs=3,
output_dir="./outputs/lora_stablelm_3b"
)
# トレーナーの初期化と実行
trainer = LoRAFinetuningTrainer(model, lora_config, training_config)
trainer.train(train_texts=["日本の首都は東京です。", "日本の最高峰は富士山です。"])
DoRAは、LoRAを超える精度と効率性を実現する最新のファインチューニング手法です。
from src.training.dora.dora_implementation import DoRAConfig, train_with_dora
# DoRA設定(LoRAより高精度)
config = DoRAConfig(
rank=32, # LoRAより高いランクでも効率的
alpha=64, # スケーリング係数
dropout=0.1, # ドロップアウト率
use_magnitude_scaling=True # 大きさスケーリング有効化
)
# DoRAでファインチューニング
model = train_with_dora(
base_model_path="cyberagent/calm3-22b-chat",
train_data="data/training_data.jsonl",
output_dir="outputs/dora_model",
config=config
)
vLLMは、PagedAttentionを使用してメモリ効率とスループットを大幅に向上させます。
from src.inference.vllm_integration import VLLMIntegration
# vLLMエンジンの初期化(マルチGPU対応)
engine = VLLMIntegration(
model_path="outputs/trained_model",
tensor_parallel_size=2, # 2GPUで並列化
gpu_memory_utilization=0.9, # GPU使用率90%
max_num_batched_tokens=32768 # バッチ処理の最大トークン
)
# ストリーミング生成(リアルタイム応答)
for token in engine.stream_generate(
prompt="道路設計における最小曲線半径の決定要因について説明してください。",
max_tokens=512,
temperature=0.7
):
print(token, end="", flush=True)
AWQは、精度を維持しながら75%のメモリ削減を実現します。
from src.inference.awq_quantization import AWQQuantizer
# AWQ量子化器の初期化
quantizer = AWQQuantizer(
model_path="outputs/dora_model",
w_bit=4, # 4ビット量子化
group_size=128, # グループサイズ
zero_point=True # ゼロポイント使用
)
# モデルの量子化(キャリブレーションデータ使用)
quantized_model = quantizer.quantize(
calibration_data=calibration_dataset,
num_samples=512 # キャリブレーション用サンプル数
)
# 量子化モデルの保存
quantizer.save_quantized("outputs/model_awq_4bit")
最高のパフォーマンスを実現する統合パイプライン
# Step 1: DoRAでファインチューニング
from src.training.dora.dora_implementation import train_with_dora
dora_model = train_with_dora(
base_model_path="cyberagent/calm3-22b-chat",
train_data="data/training_data.jsonl",
output_dir="outputs/dora_model",
config=DoRAConfig(rank=32, alpha=64)
)
# Step 2: AWQで量子化
from src.inference.awq_quantization import AWQQuantizer
quantizer = AWQQuantizer(model_path="outputs/dora_model")
quantized_model = quantizer.quantize(
calibration_data=calibration_data,
w_bit=4
)
quantizer.save_quantized("outputs/dora_awq_4bit")
# Step 3: vLLMで高速推論
from src.inference.vllm_integration import VLLMIntegration
engine = VLLMIntegration(
model_path="outputs/dora_awq_4bit",
quantization="awq",
tensor_parallel_size=2
)
# 3倍高速、80%メモリ削減で推論実行
response = engine.generate(
prompt="設計速度100km/hの高速道路における安全設計について",
max_tokens=1024
)
詳細な使用方法は IMPLEMENTATION_GUIDE.md を参照してください。
EWCは、以前のタスクの知識を忘れることなく、新しいタスクをモデルに学習させるための手法です。
from src.models.japanese_model import JapaneseModel
from src.training.lora_finetuning import LoRAFinetuningTrainer, LoRAConfig
from src.training.training_utils import TrainingConfig
from src.training.ewc_utils import EWCConfig, EWCManager
# 1. ベースモデルと最初のタスクのデータ
model = JapaneseModel("cyberagent/calm3-22b-chat")
task1_data = ["一般的な知識に関するテキスト...", "歴史に関するテキスト..."]
# 2. 最初のタスクでモデルをファインチューニング
lora_config = LoRAConfig(r=8, lora_alpha=16)
training_config = TrainingConfig(learning_rate=2e-4, num_epochs=2, output_dir="./outputs/task1_lora")
trainer = LoRAFinetuningTrainer(model, lora_config, training_config)
trained_model = trainer.train(train_texts=task1_data)
# 3. EWCの準備 (Fisher情報行列の計算)
ewc_manager = EWCManager(trained_model.model, trained_model.tokenizer)
fisher_matrix = ewc_manager.compute_fisher(task1_data)
# 4. 新しいタスクでEWCを使ってファインチューニング
ewc_config = EWCConfig(enabled=True, ewc_lambda=0.5, fisher_matrix=fisher_matrix)
training_config_task2 = TrainingConfig(learning_rate=1e-4, num_epochs=2, output_dir="./outputs/task2_ewc_lora")
task2_data = ["プログラミングに関するテキスト...", "Pythonのコード例..."]
trainer_task2 = LoRAFinetuningTrainer(
model=trained_model,
lora_config=lora_config,
training_config=training_config_task2,
ewc_config=ewc_config # EWC設定を渡す
)
final_model = trainer_task2.train(train_texts=task2_data)
AI_FT_3/
├── app/ # Webアプリケーション
│ ├── main_unified.py # 統合Webサーバー(稼働中)
│ ├── memory_optimized_loader.py # メモリ最適化ローダー
│ └── static/ # フロントエンドファイル
│ └── logo_teikoku.png # 帝国大学ロゴ
├── templates/ # HTMLテンプレート
│ ├── base.html # ベーステンプレート(ロゴ統合)
│ ├── index.html # メインページ
│ ├── finetune.html # ファインチューニングページ
│ └── models.html # モデル管理ページ
├── static/ # 静的ファイル(templatesと同じレベル)
│ └── logo_teikoku.png # ロゴファイル(Web配信用)
├── src/ # コアライブラリ
│ ├── models/ # モデル関連
│ ├── training/ # ファインチューニング
│ ├── utils/ # ユーティリティ
│ └── rag/ # RAG機能(土木道路設計特化型)
│ ├── indexing/ # 文書インデックス化
│ ├── retrieval/ # ハイブリッド検索・リランキング
│ ├── core/ # クエリエンジン・引用生成
│ ├── document_processing/ # PDF処理・OCR・テーブル抽出
│ ├── specialized/ # 数値処理・バージョン管理
│ └── config/ # RAG設定
├── docker/ # Docker環境
│ ├── Dockerfile
│ └── docker-compose.yml
├── scripts/ # 運用スクリプト
├── outputs/ # 学習済みモデル保存
├── data/ # トレーニングデータ
├── config/ # 基本設定
├── configs/ # DeepSpeed設定
└── docs/ # ドキュメント
├── API_REFERENCE.md
├── LARGE_MODEL_SETUP.md
└── MULTI_GPU_OPTIMIZATION.md
IMPLEMENTATION_GUIDE.mdに詳細な使用方法記載scripts/test_dora_training.py追加scripts/check_docker_dependencies.sh や scripts/check_rag_dependencies.py により、環境の健全性を自動で検証。docs/MONITORING_GRAFANA_GUIDE.md に追加。docs/PERFORMANCE_OPTIMIZATION_GUIDE.md に基づく最適化を実施。docs/NEXT_STEPS_PRODUCTION.md にて、本番環境へのデプロイ手順を詳述。run_phase2_complete_test.sh) を追加。プルリクエストを歓迎します。主な開発ブランチは main です。
git checkout -b feature/new-feature)git commit -m 'Add new feature')git push origin feature/new-feature)このプロジェクトはMITライセンスの下で公開されています。
# 1. クローン
git clone https://github.com/kji-furuta/AI_FT_3.git
cd AI_FT_3
# 2. Ollamaをインストール・起動(新しいターミナルで)
curl -fsSL https://ollama.com/install.sh | sh
ollama serve
# 3. 起動(元のターミナルで)
cd docker && docker-compose up -d --build # 初回のみ
# 2回目以降は: docker-compose up -d
# 4. Webサーバー開始
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# 5. 起動確認
```bash
# ポートの確認
docker exec ai-ft-container netstat -tlnp | grep 8050
# プロセスの確認
docker exec ai-ft-container ps aux | grep uvicorn
# ログの確認
docker logs ai-ft-container --tail 20
メインダッシュボード: http://localhost:8050/
ファインチューニング: http://localhost:8050/finetune
RAGシステム: http://localhost:8050/rag
モデル管理: http://localhost:8050/models
**🚀 5分でファインチューニング・RAG開始!**
### 📊 監視システム(Prometheus + Grafana)
統合監視システムにより、アプリケーションのパフォーマンスとリソース使用状況をリアルタイムで監視できます。
#### 監視システムの起動
```bash
# 監視統合環境の起動(メインアプリケーション + 監視ツール)
./scripts/start_monitoring_with_main.sh
# または個別に起動
./scripts/manage_services.sh start-all # すべて起動
./scripts/manage_services.sh start-app # アプリケーションのみ
./scripts/manage_services.sh start-monitor # 監視ツールのみ
Grafana ダッシュボード: http://localhost:3000
Prometheus: http://localhost:9090
メトリクスエンドポイント: http://localhost:8050/metrics
システムメトリクス
ai_ft_cpu_usage_percent: CPU使用率ai_ft_memory_usage_percent: メモリ使用率ai_ft_gpu_available: GPU利用可能状態ai_ft_gpu_count: GPU数ai_ft_gpu_memory_used_mb: GPU メモリ使用量アプリケーションメトリクス
ai_ft_http_requests_total: HTTPリクエスト数ai_ft_rag_queries_total: RAGクエリ数ai_ft_training_tasks_total: トレーニングタスク数ai_ft_cache_hits_total: キャッシュヒット数# ダッシュボードの自動設定
./scripts/setup_grafana_dashboard.sh
# 状態確認
./scripts/manage_services.sh status
# アプリケーション再起動
./scripts/manage_services.sh restart-app
# ログ確認
./scripts/manage_services.sh logs-app # アプリケーションログ
./scripts/manage_services.sh logs-monitor # 監視サービスログ
# 停止
./scripts/manage_services.sh stop-all # すべて停止
# Ollamaが起動しているか確認
curl http://localhost:11434/api/tags
# Ollamaを再起動
killall ollama
ollama serve
# 静的ファイルの確認
docker exec ai-ft-container ls -la /workspace/static/
# ロゴファイルの存在確認
docker exec ai-ft-container curl -I http://localhost:8050/static/logo_teikoku.png
# コンテナの状態確認
docker ps -a
# ログの確認
docker logs ai-ft-container
# 自動起動スクリプトの実行
docker exec ai-ft-container bash /workspace/scripts/start_web_interface.sh
# ファイル不足の確認
docker exec ai-ft-container ls -la /workspace/app/
# ファイルが不足している場合の対処法
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# 手動起動
docker exec -d ai-ft-container python -m uvicorn app.main_unified:app --host 0.0.0.0 --port 8050 --reload
# モジュールのインポートテスト
docker exec ai-ft-container python -c "import app.main_unified; print('Import successful')"
# ファイル構造の確認
docker exec ai-ft-container ls -la /workspace/app/
docker exec ai-ft-container ls -la /workspace/src/
# 必要に応じてファイルを再コピー
docker cp app/ ai-ft-container:/workspace/
docker cp templates/ ai-ft-container:/workspace/
docker cp src/ ai-ft-container:/workspace/
# 特化機能のテスト
python3 scripts/simple_feature_test.py
# RAGシステムの統合確認
curl http://localhost:8050/rag/health
# システム情報の確認
curl http://localhost:8050/rag/system-info
# ベクトル化エラーのテスト(v2.1.0で修正済み)
docker exec ai-ft-container python test_vector_fix.py
# 必要な依存関係の確認
pip install qdrant-client sentence-transformers transformers
# テキスト処理の確認
python3 -c "
from src.rag.specialized import extract_numerical_values
values = extract_numerical_values('設計速度60km/h')
print(f'抽出結果: {len(values)}個')
"
# 設計基準の確認
python3 -c "
from src.rag.specialized import check_design_standard
result = check_design_standard(60, 'speed', 'km/h')
print(f'検証結果: {result.is_valid}')
"
# Webインターフェースの確認
curl http://localhost:8050/
# RAGシステムの確認
curl http://localhost:8050/rag/health
# システム情報の確認
curl http://localhost:8050/api/system-info