河川・ダム・砂防の技術基準を対象とした Gemma 3(INT4/INT8)+ Ollama によるRAGベンチマークシステム
このプロジェクトは、国土交通省の河川・ダム・砂防技術基準をナレッジベースとして、Gemma 3モデル(量子化INT4/INT8)を使用したRAG(Retrieval-Augmented Generation)システムのベンチマーク評価を行います。
- 知識ベース: 河川・ダム・砂防の技術基準(Markdown形式、8ドキュメント)
- LLMモデル: Gemma 3 (2B) - INT4/INT8量子化版(Ollama)
- ベクトルDB: FAISS(高速類似度検索)
- 埋め込みモデル: intfloat/multilingual-e5-base(768次元、日本語対応)
- ベンチマーク: 200問の技術的質問
- 評価指標: EM、F1、BLEU、ROUGE、応答時間、メモリ使用量
- GPU対応: NVIDIA RTX 4060 Ti(CUDA 12.9)で高速推論
gemma3-rag/
├── data/
│ └── kasensabo_knowledge_base/ # 技術基準データ(Markdown)
│ ├── 00_training_overview_2025.md
│ ├── 01_training_chousa_2025.md
│ ├── 02_training_keikaku_kihon_2025.md
│ ├── 03_training_keikaku_shisetsu_2025.md
│ ├── 04_training_sekkei_2025.md
│ ├── 05_training_ijikanri_kasen_2025.md
│ ├── 06_training_ijikanri_dam_2025.md
│ └── 07_training_ijikanri_sabo_2025.md
├── questions/
│ └── bench_questions_200.json # ベンチマーク質問(200問)
├── scripts/
│ ├── build_index.py # インデックス構築
│ ├── run_rag.py # RAG実行
│ ├── evaluate.py # 評価指標計算
│ └── run_benchmark.py # ベンチマーク実行
├── index/
│ └── faiss_index/ # FAISSインデックス(生成される)
├── results/ # ベンチマーク結果(生成される)
├── config.yaml # 設定ファイル
├── requirements.txt # Python依存関係
└── README.md # このファイル
- Python 3.12以上
- Ollama 0.12.11以上(インストール済み)
- 16GB以上のRAM推奨
- (オプション)NVIDIA GPU(CUDA対応)でGPU推論が可能
# Ollamaのインストール(Windows)
# https://ollama.ai/ からダウンロード
# Gemma 3モデルのダウンロード
ollama pull gemma:2b-instruct-q4_K_M
ollama pull gemma:2b-instruct-q8_0# 依存パッケージのインストール
pip install -r requirements.txt
# NLTKデータのダウンロード
python -c "import nltk; nltk.download('punkt'); nltk.download('punkt_tab')"主要パッケージ:
- llama-index-core 0.3.79
- llama-index-llms-ollama
- llama-index-embeddings-huggingface
- faiss-cpu(ベクトル検索)
- transformers、sentence-transformers(埋め込みモデル)
- scikit-learn、nltk、rouge-score(評価指標)
# 別のターミナルでOllamaサーバーを起動
ollama serve
# GPU使用確認(NVIDIA GPUの場合)
nvidia-smiGPU設定確認:
- Ollamaが自動的にGPUを検出(CUDA対応)
- ログに "inference compute" と GPU名が表示されることを確認
- GPUメモリ使用量: INT4で約2.5GB、INT8で約3-4GB
# プロジェクトルートで実行
python scripts/build_index.py実行内容:
data/kasensabo_knowledge_base/内の8つのMarkdownファイルを読み込み- テキストをチャンク分割(サイズ512、オーバーラップ50)
- multilingual-e5-baseで埋め込みベクトル生成(768次元)
- FAISSに保存(
index/faiss_index/) - 約6,471チャンクを処理
所要時間: 約1〜2分
出力例:
==================================================
Gemma3 RAG - Index Building
==================================================
[1] Loading documents from: data/kasensabo_knowledge_base
✓ Loaded 8 documents
[2] Initializing embedding model: intfloat/multilingual-e5-base
✓ Embedding model loaded
✓ Chunk size: 512, Overlap: 50
✓ Embedding dimension: 768
[3] Initializing FAISS at: index/faiss_index
✓ FAISS initialized
[4] Building vector index...
Generating embeddings: 100%|████████████| 6471/6471 [01:15<00:00, 85.83it/s]
✓ Index built successfully
python scripts/run_rag.py実行の流れ:
- モデル選択(INT4またはINT8)
- 3つのテスト質問で動作確認
- 応答時間とソースノード数を表示
出力例:
==================================================
Gemma3 RAG - Query Execution Demo
==================================================
Available models:
1. gemma:2b-instruct-q4_K_M (INT4)
2. gemma:2b-instruct-q8_0 (INT8)
Select model (1 or 2): 2
Initializing RAG system with gemma:2b-instruct-q8_0...
✓ Embedding model initialized: intfloat/multilingual-e5-base
✓ Index loaded from: index/faiss_index
✓ Query engine created with model: gemma:2b-instruct-q8_0
==================================================
Running test queries...
==================================================
[Query 1] 河川の計画高水流量とは何ですか?
Response time: 1.35s
Response: 計画高水流量とは、河川計画において設定される...
Source nodes: 3
[Query 2] ダムの洪水調節方式について教えてください。
Response time: 1.01s
Response: ダムによる洪水調節方式は、洪水流出の特性、調節効率...
Source nodes: 3
システムプロンプト:
- 日本語で回答するように設定済み
- 河川・ダム・砂防技術の専門家として応答
- コンテキスト情報に基づいた正確な回答を生成
python scripts/run_benchmark.py実行内容:
questions/bench_questions_200.jsonから200問を読み込み- INT4モデル(gemma:2b-instruct-q4_K_M)で全質問を実行
- INT8モデル(gemma:2b-instruct-q8_0)で全質問を実行
- 評価指標を計算(EM、F1、BLEU、ROUGE)
- 結果を
results/に保存
所要時間: 約15〜30分(GPU使用時)
生成ファイル:
results/benchmark_results_INT4.json- INT4モデルの全結果results/benchmark_results_INT8.json- INT8モデルの全結果results/benchmark_comparison.csv- モデル比較表
中断と再開:
- 50問ごとに中間結果を自動保存
- Ctrl+Cで中断可能
- 次回実行時に続きから再開
# 結果ディレクトリの確認
ls results/
# JSON形式の詳細結果
# results/benchmark_results_INT4.json
# results/benchmark_results_INT8.json
# CSV形式の比較結果
# results/benchmark_comparison.csv比較CSVの例:
Model,EM,F1,BLEU-1,BLEU-2,ROUGE-1,ROUGE-L,Avg_Response_Time,Avg_Memory_MB
INT4,0.15,0.42,0.38,0.22,0.45,0.40,0.85,2541
INT8,0.18,0.48,0.42,0.26,0.49,0.44,1.12,3200
| 指標 | 説明 |
|---|---|
| Exact Match (EM) | 完全一致率(0 or 1) |
| F1 Score | トークンレベルのF1スコア |
| BLEU-1/2/3/4 | n-gram一致率 |
| ROUGE-1/2/L | リコール重視の類似度 |
| 指標 | 説明 |
|---|---|
| Response Time | クエリ応答時間(秒) |
| Memory Usage | メモリ使用量(MB) |
| 項目 | INT4 (q4_K_M) | INT8 (q8_0) |
|---|---|---|
| 応答時間(初回) | 5.20秒 | 4.86秒 |
| 応答時間(2回目以降) | 0.84-1.12秒 | 0.67-1.01秒 |
| GPUメモリ使用 | 約2.5GB | 約3-4GB |
| 日本語回答品質 | 良好 | 良好〜優秀 |
| 項目 | INT4 (q4_K_M) | INT8 (q8_0) | 備考 |
|---|---|---|---|
| 応答速度 | ◎ 高速(0.84-1.12秒) | ◎ 高速(0.67-1.01秒) | GPU使用時 |
| GPUメモリ | ◎ 少(2.5GB) | ◯ 中(3-4GB) | RTX 4060 Ti |
| 応答精度 | ◯ 良好 | ◯ 良好〜優秀 | INT8の方がやや高精度 |
| F1スコア | 0.40〜0.50(推定) | 0.45〜0.55(推定) | 技術文書特有の難易度 |
| 適用場面 | 高速応答重視、メモリ制約 | 精度重視、バランス型 |
特徴:
- INT4: より高速でメモリ効率が良い(GPU推論で1秒以下も可能)
- INT8: 精度と速度のバランスが良い(推奨)
- 両モデルともGPU推論で実用的な速度を達成
config.yamlを編集して、以下をカスタマイズできます:
# 埋め込みモデルの変更
embedding:
model_name: "intfloat/multilingual-e5-base" # 1.1GB、768次元
# model_name: "intfloat/multilingual-e5-large" # 2.5GB、1024次元(高精度)
# model_name: "intfloat/multilingual-e5-small" # 470MB、384次元(軽量)
device: "cuda" # GPUを使用する場合は "cuda"、CPUの場合は "cpu"
# チャンクサイズの調整
index:
chunk_size: 512 # 大きくすると文脈が広がるが処理が重くなる
chunk_overlap: 50 # オーバーラップを増やすと境界での情報損失が減る
# RAGパラメータ
rag:
temperature: 0.1 # 低いほど決定的、高いほど創造的
similarity_top_k: 3 # 類似チャンクの取得数(1-5推奨)
# モデルの追加・変更
models:
- name: "gemma:2b-instruct-q4_K_M"
quantization: "INT4"
- name: "gemma:2b-instruct-q8_0"
quantization: "INT8"
# 他のモデルを試す場合:
# - name: "gemma:7b-instruct-q4_K_M"
# quantization: "INT4"# Ollamaサービスの起動確認
ollama list
# モデルが存在するか確認
ollama run gemma:2b-instruct-q4_K_M "Hello"
# Ollamaサービスを手動起動
ollama serve# NVIDIA GPU確認
nvidia-smi
# Ollamaのログを確認(GPU検出メッセージを確認)
# "inference compute" でGPU情報が表示されるはず対処法:
- CUDAドライバーを最新版に更新
- Ollamaを再起動して自動検出させる
# インデックスを再構築
python scripts/build_index.pyquestions/bench_questions_200.jsonの形式例:
[
{
"id": 1,
"question": "河川の計画高水流量とは何ですか?",
"answer": "基本高水のピーク流量から洪水調節施設による調節流量を差し引いたもの",
"category": "河川計画"
},
...
]scripts/evaluate.pyを拡張して、独自の評価指標を追加できます:
class RAGEvaluator:
def custom_metric(self, prediction: str, reference: str) -> float:
# カスタム評価ロジック
pass- LLM: Gemma 3 (2B) - Google開発のオープンLLM
- 量子化: INT4 (q4_K_M) / INT8 (q8_0) - モデル圧縮
- 推論エンジン: Ollama 0.12.11 - ローカルLLM実行環境
- RAGフレームワーク: LlamaIndex 0.3.79 - RAGパイプライン構築
- ベクトルDB: FAISS - Facebook AI開発の高速類似度検索
- 埋め込みモデル: multilingual-e5-base - 多言語対応(768次元)
llama-index-core==0.3.79
llama-index-llms-ollama
llama-index-embeddings-huggingface
llama-index-vector-stores-faiss
faiss-cpu
transformers
sentence-transformers
torch
scikit-learn
nltk>=3.9.2
rouge-score
psutil
pyyaml==6.0.2
- バグ報告: Issue作成
- 機能提案: Pull Request歓迎
- ベンチマーク結果の共有: Discussionで共有
MIT License
tk-yasuno
- 環境構築: Python 3.12、Ollama、依存パッケージ
- インデックス構築: FAISS + multilingual-e5-base(768次元)
- RAGシステム: 日本語対応システムプロンプト付き
- GPU推論: NVIDIA RTX 4060 Ti上で高速推論確認
- 動作確認: INT4/INT8両モデルでテスト成功
- フルベンチマーク実行: 200問で INT4 vs INT8の詳細比較
- 結果分析: カテゴリ別(河川/ダム/砂防)の精度分析
- パラメータチューニング: temperature、top_k、chunk_sizeの最適化
- 埋め込みモデル比較: base vs large での精度差検証
- レポート作成: ベンチマーク結果の可視化と考察
- 🚀 本番展開: API化、Webインターフェース追加