本日5件のお問い合わせがありました。

✉️FIELDにお問い合わせ

システム開発

GGUFで学習させてRAGを切り替えて回答するシステムを実装しました。

RAGシステム構築 完全ガイド

H2O LLM Studio でファインチューニングしたモデルを Ollama + Open WebUI で動かし、
独自ナレッジベースによる RAG を実現するまでの全工程

全体アーキテクチャ

本システムは大きく4つのレイヤーで構成されています。ユーザーからの質問が各コンポーネントを経由し、ナレッジベースの情報を加味した回答を生成するまでの全体像を示します。

UI Layer API / Orchestration Layer Inference Layer Data / Storage Layer Open WebUI RAG Pipeline (Embedding + Retrieval) Chat API (Prompt Construction) Document Parser (Tika / Docling) Ollama (Model Serving) llama.cpp (GGUF Inference Engine) Qdrant (Vector Database) GGUF Model Files (Fine-tuned Weights) Knowledge Files (PDF, DOCX, etc.) H2O LLM Studio (Fine-tuning)
Open WebUI Ollama llama.cpp H2O LLM Studio Qdrant Tika Docling

1H2O LLM Studioでモデルをファインチューニング

H2O LLM Studioは、コードを一行も書かずにLLMをファインチューニングできるGUIツールです。 社内データやドメイン固有のデータを使い、ベースモデルを自社用途に特化させます。

1-1. Datasetの準備とアップロード

Raw Data 社内FAQ.csv マニュアル.txt 対話ログ.json Q&Aペア.csv 整形 Training Dataset (CSV) instruction | input | output “説明して” | “RAGとは” | “RAGは…” “要約して” | “文章…” | “要約:…” “答えて” | “手順は?” | “1.まず…” Upload H2O LLM Studio Import Dataset Configure Experiment Start Training

H2O LLM Studioが期待するデータセット形式は、CSV/TSVで以下のカラムを含む構成です:

カラム名説明
instructionモデルへの指示(システムプロンプト的役割)「以下の質問に日本語で答えてください」
inputユーザーの入力・質問「RAGとは何ですか?」
output期待される応答「RAGは Retrieval-Augmented Generation の略で…」
Tips: データセットの品質がファインチューニングの結果を大きく左右します。ノイズの少ない、一貫性のあるデータを準備しましょう。最低でも数百件のペアを用意することを推奨します。

1-2. Experimentの作成と設定

データセットをアップロードしたら、次にExperiment(訓練実験)を作成します。ここが最も設定項目が多く、理解が必要なステップです。

Experiment Settings Dataset Settings Train Dataframe: train.csv Prompt Column: instruction Answer Column: output Text Prompt Start: <|user|> Text Answer Start: <|assistant|> LLM Backbone Base Model: meta-llama/… Max Length: 2048 LoRA: Enabled LoRA r: 8 LoRA alpha: 16 Training Parameters Learning Rate: 1e-4 Batch Size: 4 Epochs: 3 Gradient Accumulation: 4 Warmup Ratio: 0.03 Augmentation Token Masking Prob: 0.0 Skip Parent Prob: 0.0 Neftune Noise Alpha: 0.0 * 初回はデフォルト推奨 Prediction Temperature: 0.3 Top K: 0 Top P: 0.9 Repetition Penalty: 1.2 Max Length Generation: 512 Environment Mixed Precision: bf16 GPUs: [0] Seed: 42 Compile Model: false Logging: W&B / None

主要な設定項目の解説

カテゴリ設定項目説明
DatasetPrompt Column入力(質問)が含まれるカラム名を指定
Answer Column出力(回答)が含まれるカラム名を指定
LLM BackboneBase Modelファインチューニングのベースとなるモデル(Llama, Mistral等)
LoRAメモリ効率の良い学習手法。フル学習よりGPUメモリが少なくて済む
Max Length入力トークンの最大長。長いほどメモリを消費
TrainingLearning Rate学習率。大きすぎると発散、小さすぎると収束しない
Epochsデータセット全体を何回繰り返し学習するか
Batch Size一度に処理するサンプル数。GPUメモリに依存
注意: LoRAのrank(r)値を大きくするとモデルの表現力は上がりますが、過学習のリスクも高まります。まずは r=8, alpha=16 から始めて、結果を見ながら調整しましょう。

1-3. 訓練の実行とモデルのエクスポート

Experimentを開始すると、H2O LLM Studioがトレーニングを自動的に実行します。完了後、モデルをエクスポートします。

Training GPU上で学習実行 Validation Loss/Metric確認 Export HF/GGUF形式 GGUF変換 (llama.cpp) 量子化: Q4_K_M / Q5_K_M
# H2OからエクスポートしたモデルをGGUF形式に変換 python llama.cpp/convert_hf_to_gguf.py \ –model ./h2o_exported_model \ –outfile ./model.gguf # 量子化(モデルサイズを削減) ./llama.cpp/llama-quantize ./model.gguf ./model-Q4_K_M.gguf Q4_K_M

2Ollamaにモデルを登録する

GGUFファイルをOllamaに登録し、APIサーバーとして利用可能にします。「モデル工場」でH2Oのexperimentを選択し、Ollamaモデル名を入力するステップです。

model-Q4_K_M.gguf Fine-tuned & Quantized Modelfile FROM ./model-Q4_K_M.gguf PARAMETER temperature 0.3 PARAMETER top_p 0.9 SYSTEM “””あなたは親切な AIアシスタントです。””” Ollama ollama create mymodel ollama run mymodel ここで指定するモデル名「mymodel」がOpen WebUIのチャット画面で選択するモデル名になる
# 1. Modelfile を作成 cat << ‘EOF’ > Modelfile FROM ./model-Q4_K_M.gguf PARAMETER temperature 0.3 PARAMETER top_p 0.9 PARAMETER repeat_penalty 1.2 SYSTEM “””あなたは社内ナレッジに精通したAIアシスタントです。 正確で簡潔な回答を心がけてください。””” EOF # 2. Ollama にモデルを登録 ollama create my-company-model -f Modelfile # 3. テスト実行 ollama run my-company-model “こんにちは、テストです” # 4. API として利用可能に(デフォルト: localhost:11434) curl http://localhost:11434/api/chat -d ‘{ “model”: “my-company-model”, “messages”: [{“role”: “user”, “content”: “テスト”}] }’
Tips: Ollamaはバックグラウンドでllama.cppを使用してモデルの推論を行います。GGUFフォーマットを直接読み込むため、追加の変換は不要です。

3ドキュメント処理パイプライン(Tika / Docling)

RAGで利用するナレッジベースのドキュメントを、LLMが理解できるテキスト形式に変換します。PDF、Word、Excel、PowerPointなど多様な形式に対応するため、TikaとDoclingを活用します。

入力ドキュメント PDF DOCX / DOC XLSX / CSV PPTX HTML / TXT 画像 (OCR) Apache Tika 1000+のファイル形式に対応 メタデータ抽出も可能 Java/REST API Docling PDF特化の高精度パーサー テーブル構造を保持 Python API Chunking テキスト分割 chunk_size: 500 overlap: 50 Embedding ベクトル化 Qdrant Vector Store

Tika vs Docling の使い分け

特徴Apache TikaDocling
対応形式1000+形式(汎用的)PDF中心(高精度)
テーブル抽出基本的なサポート構造を保持した高精度抽出
OCRTesseract連携内蔵OCRエンジン
レイアウト認識限定的高精度なレイアウト解析
実装言語Java (REST API提供)Python
推奨ユースケース多様なファイル形式を一括処理PDFの高精度テキスト抽出
# — Tika: REST APIでドキュメントをテキスト抽出 — # Tikaサーバー起動 docker run -p 9998:9998 apache/tika # テキスト抽出 curl -T document.pdf http://localhost:9998/tika –header “Accept: text/plain” # — Docling: PDFの高精度パース — pip install docling # Python での利用例 from docling.document_converter import DocumentConverter converter = DocumentConverter() result = converter.convert(“document.pdf”) print(result.document.export_to_markdown())

4Qdrant ベクトルデータベース

ドキュメントから抽出・分割されたテキストチャンクをベクトル化して保存し、類似検索を可能にするのがQdrantの役割です。RAGの「Retrieval」部分の中核を担います。

RAG検索フロー User Query 「手順を教えて」 Embedding Model テキスト → ベクトル Query Vector [0.12, -0.45, …] Qdrant Collection: knowledge_base doc_1: [0.11, -0.43, …] doc_2: [0.08, -0.51, …] doc_3: [-0.22, 0.67, …] cosine similarity 検索 検索結果 (Top-K) Score: 0.95 – 「手順は以下の通り…」 Score: 0.87 – 「まず最初に…」 Context + Query → LLMに送信
# Qdrant サーバー起動 docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant # Python でコレクション作成 & ドキュメント登録 from qdrant_client import QdrantClient from qdrant_client.models import Distance, VectorParams, PointStruct client = QdrantClient(host=”localhost”, port=6333) # コレクション作成(ベクトル次元はEmbeddingモデルに依存) client.create_collection( collection_name=”knowledge_base”, vectors_config=VectorParams(size=768, distance=Distance.COSINE) ) # ドキュメントチャンクをベクトル化して登録 client.upsert( collection_name=”knowledge_base”, points=[ PointStruct(id=1, vector=embedding_vector, payload={“text”: “chunk text…”}), # … ] ) # 類似検索 results = client.search( collection_name=”knowledge_base”, query_vector=query_embedding, limit=5 )

5Open WebUI でRAGチャットを構築

すべてのコンポーネントを統合するフロントエンドがOpen WebUIです。ナレッジベースの作成、ファイルのアップロード、モデルの設定をGUIで行えます。

5-1. ナレッジベースの作成

Open WebUI セットアップフロー 1 ナレッジベース作成 ワークスペース → ナレッジベース → New Knowledge 名前と説明を入力 2 ファイルアップロード ナレッジベース編集画面で RAGファイルをアップロード PDF, DOCX, TXT, CSV… 3 モデル設定 ワークスペース → モデル → New Model Ollamaモデル名を指定 ナレッジベースを紐付け チャット実行時の処理フロー User Message Embedding Qdrant Context構築 LLM (Ollama) 検索結果 + ユーザーの質問 → プロンプトに結合 → モデルが回答生成

5-2. Open WebUI のセットアップ手順

# Open WebUI をDocker で起動(Ollama と連携) docker run -d -p 3000:8080 \ –add-host=host.docker.internal:host-gateway \ -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \ -e RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 \ -e VECTOR_DB=qdrant \ -e QDRANT_URI=http://host.docker.internal:6333 \ -v open-webui:/app/backend/data \ –name open-webui \ –restart always \ ghcr.io/open-webui/open-webui:main

設定手順まとめ

  1. ナレッジベース作成: 管理画面 → ワークスペース → ナレッジベース → 「New Knowledge」をクリック。名前と説明を入力して作成。
  2. ファイルアップロード: 作成したナレッジベースの編集画面を開き、RAGに使いたいドキュメント(PDF, DOCX等)をドラッグ&ドロップまたはファイル選択でアップロード。自動的にチャンク分割・ベクトル化される。
  3. モデル作成: ワークスペース → モデル → 「New Model」。Ollamaで登録したモデル名を指定し、先ほど作成したナレッジベースを紐付ける。
  4. チャット開始: チャット画面でモデルを選択して質問すると、自動的にRAG検索が行われ、関連ドキュメントの情報を加味した回答が生成される。

6全体データフロー

最後に、ユーザーが質問を入力してから回答が生成されるまでの全体的なデータの流れを確認しましょう。

End-to-End データフロー 👤 ユーザー 1 Open WebUI 質問受付 2 Embedding 3 Qdrant 類似ベクトル検索 4 Context Builder 検索結果+質問を結合 5 Ollama + llama.cpp Fine-tunedモデルで推論 6 生成されるプロンプト [System] あなたはAIアシスタントです。 以下の参考情報を元に回答して ください。 [Retrieved Context] 手順は以下の通りです… まず最初に… [User Question] 手順を教えてください フロー凡例 1 ユーザーが質問を入力 2 質問をベクトル化 3 Qdrantで類似検索 4 関連チャンクを取得 5 コンテキスト付きでLLMに送信

7技術スタック一覧

技術 役割 公式ドキュメント
H2O LLM Studio GUIベースのLLMファインチューニングツール。コード不要でLoRA等の学習が可能 docs.h2o.ai
llama.cpp C++実装の高速LLM推論エンジン。GGUF形式のモデルを効率的に実行。量子化もサポート GitHub
Ollama LLMのローカル実行環境。llama.cppをラップし、REST APIを提供。モデル管理を簡素化 docs.ollama.com
Open WebUI チャット型WebインターフェースRAG機能内蔵。ナレッジベース管理、モデル切替をGUIで提供 docs.openwebui.com
Apache Tika 汎用ドキュメントパーサー。1000+のファイル形式からテキスト・メタデータを抽出 tika.apache.org
Docling PDF特化の高精度ドキュメントパーサー。テーブル構造やレイアウトを保持した抽出が可能 docling-project.github.io
Qdrant 高性能ベクトルデータベース。コサイン類似度等による高速な近似最近傍検索を提供 qdrant.tech

RAG System Architecture Guide | Built with H2O LLM Studio, Ollama, Open WebUI, Qdrant, Tika, Docling

Yamamoto Yuya

プロフェッショナルとしての高いスキルと知識を持ち、誠実さと責任感を大切にする。常に向上心を持ち、新たな挑戦にも積極的に取り組む努力家。