Skip to content

tk-yasuno/gemma3-rag

Repository files navigation

Gemma3 RAG KasenSabo MVP

河川・ダム・砂防の技術基準を対象とした 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                         # このファイル

🚀 セットアップ

1. 前提条件

  • Python 3.12以上
  • Ollama 0.12.11以上(インストール済み)
  • 16GB以上のRAM推奨
  • (オプション)NVIDIA GPU(CUDA対応)でGPU推論が可能

2. Ollamaのインストールと設定

# Ollamaのインストール(Windows)
# https://ollama.ai/ からダウンロード

# Gemma 3モデルのダウンロード
ollama pull gemma:2b-instruct-q4_K_M
ollama pull gemma:2b-instruct-q8_0

3. Python環境のセットアップ

# 依存パッケージのインストール
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(評価指標)

4. Ollamaサービスの起動

# 別のターミナルでOllamaサーバーを起動
ollama serve

# GPU使用確認(NVIDIA GPUの場合)
nvidia-smi

GPU設定確認:

  • Ollamaが自動的にGPUを検出(CUDA対応)
  • ログに "inference compute" と GPU名が表示されることを確認
  • GPUメモリ使用量: INT4で約2.5GB、INT8で約3-4GB

5. インデックスの構築

# プロジェクトルートで実行
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

📊 使用方法

1. 単一クエリのテスト

python scripts/run_rag.py

実行の流れ:

  1. モデル選択(INT4またはINT8)
  2. 3つのテスト質問で動作確認
  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

システムプロンプト:

  • 日本語で回答するように設定済み
  • 河川・ダム・砂防技術の専門家として応答
  • コンテキスト情報に基づいた正確な回答を生成

2. フルベンチマークの実行

python scripts/run_benchmark.py

実行内容:

  1. questions/bench_questions_200.jsonから200問を読み込み
  2. INT4モデル(gemma:2b-instruct-q4_K_M)で全質問を実行
  3. INT8モデル(gemma:2b-instruct-q8_0)で全質問を実行
  4. 評価指標を計算(EM、F1、BLEU、ROUGE)
  5. 結果をresults/に保存

所要時間: 約15〜30分(GPU使用時)

生成ファイル:

  • results/benchmark_results_INT4.json - INT4モデルの全結果
  • results/benchmark_results_INT8.json - INT8モデルの全結果
  • results/benchmark_comparison.csv - モデル比較表

中断と再開:

  • 50問ごとに中間結果を自動保存
  • Ctrl+Cで中断可能
  • 次回実行時に続きから再開

3. 結果の確認

# 結果ディレクトリの確認
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)

📈 期待される比較結果

実測値(NVIDIA RTX 4060 Ti)

項目 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"

🛠️ トラブルシューティング

1. Ollamaに接続できない

# Ollamaサービスの起動確認
ollama list

# モデルが存在するか確認
ollama run gemma:2b-instruct-q4_K_M "Hello"

# Ollamaサービスを手動起動
ollama serve

2. GPUが認識されない

# NVIDIA GPU確認
nvidia-smi

# Ollamaのログを確認(GPU検出メッセージを確認)
# "inference compute" でGPU情報が表示されるはず

対処法:

  • CUDAドライバーを最新版に更新
  • Ollamaを再起動して自動検出させる

3. FAISSインデックスが見つからない

# インデックスを再構築
python scripts/build_index.py

📝 質問データの形式

questions/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


🎓 実装状況と次のステップ

✅ 完了した実装

  1. 環境構築: Python 3.12、Ollama、依存パッケージ
  2. インデックス構築: FAISS + multilingual-e5-base(768次元)
  3. RAGシステム: 日本語対応システムプロンプト付き
  4. GPU推論: NVIDIA RTX 4060 Ti上で高速推論確認
  5. 動作確認: INT4/INT8両モデルでテスト成功

🔄 次のステップ

  1. フルベンチマーク実行: 200問で INT4 vs INT8の詳細比較
  2. 結果分析: カテゴリ別(河川/ダム/砂防)の精度分析
  3. パラメータチューニング: temperature、top_k、chunk_sizeの最適化
  4. 埋め込みモデル比較: base vs large での精度差検証
  5. レポート作成: ベンチマーク結果の可視化と考察
  6. 🚀 本番展開: API化、Webインターフェース追加