手元の PC で完結するローカル LLM 活用 ― チャット・図の理解・RAG を体験する(Ollama+Open WebUI/CPU/GPU 対応・Windows)

Windows 上で Ollama(推論基盤)と Open WebUI(操作画面)を用い、データを外部送信しないローカル LLM 環境を構築する手順書である。 軽量モデルで動作を確認した後、画像入力に対応する gemma4 系モデルでチャットおよび図・表・数式の読み取りを行う。 RAG(検索拡張生成)は bge-m3 で文書を検索し reranker で再順位付けし、固有情報や最新情報を要する質問への対応力を高める。 図表・数式を含む文書は標準抽出に限界があるため、Docling 連携により表構造や図中テキストを保持し抽出精度を高める。

【目次】

【サイト内の関連ページ】

Windows の基本操作・コマンド操作・設定と、アプリ・開発環境・ローカル AI の導入

はじめに

大規模言語モデル(LLM)は、入力された文に続く次のトークン(語や記号の単位)を確率的に予測する仕組みであり、出力に誤りを含む可能性がある。出力の品質は、プロンプト(モデルへの入力指示)の構成と思考モードのオン・オフに依存する。RAG(Retrieval-Augmented Generation、検索拡張生成)は、LLM が既存資料を検索し、その結果を踏まえて応答を生成することで、固有情報や最新情報を要する質問への対応力を高める仕組みである。ローカル運用(外部サーバへ送信せず手元のマシン内で完結させる運用)により、外部に出せない文書を安全に読み込み・精査・点検できる。

本手順は、Windows 上でローカル LLM 環境を構築し、インストール後の基本動作の確認、RAG(検索拡張生成)の体験、および図(画像)を理解させるマルチモーダル利用を行う。基盤は Ollama、フロントエンド(操作・表示を担うソフトウェア)は Open WebUI である。Open WebUI は Python 3.11 と 3.12 で動作する(2026 年 6 月時点では Python 3.13 には未対応)。本手順では Python 3.12 を用いる前提で記述し、コマンド中の Python312 は Python 3.12 を表す。Python 3.11 を用いる場合は、本手順中の Python312 を Python311 に読み替える。

Ollama には、コンテキスト長(一度に処理できるトークン数の上限)262144 トークンおよび KV キャッシュ q8_0 を設定する。KV キャッシュはモデルが過去のトークンの中間表現を保持する領域であり、q8_0 はこの領域を 8 ビット整数に量子化してメモリ使用量を抑える設定である。これらの設定は最初のインストール時に一度だけ行う。

本手順で用いるモデルは次の 4 種類である。

LFM2.5-1.2B-Instruct はテキスト専用のため、図(画像)を理解させる演習 3・演習 4 では画像入力に対応する gemma4 系モデルを用いる。

前提知識(用語の整理)

本節では、本手順を読み進めるうえで前提となる基本概念を整理する。

LLM(大規模言語モデル)とは

LLM(Large Language Model、大規模言語モデル)は、大量のテキストを学習したニューラルネットワークであり、対話・要約・翻訳などを行う。入力テキストをトークン(語や記号の単位。文字や単語の断片に相当する)に分割し、入力された文に続く次のトークンを確率的に予測することで文章を生成する。モデルの規模はパラメータ数(例:1.2B=12 億)で表される。この仕組み上、出力は確率に基づく予測であり、事実と異なる内容(ハルシネーション:もっともらしいが事実でない出力)を含む可能性がある。

マルチモーダル(画像入力)とは

マルチモーダルとは、テキストだけでなく画像など複数種類の入力を扱える性質をいう。画像入力に対応したモデル(ビジョンモデル)は、図・グラフ・表の画像や、数式・化学式を撮影した画像を読み取り、その内容を説明したり、内容について質問に答えたりできる。本手順では gemma4 系モデルがこれに対応する。

量子化

量子化は、モデル内部の重みパラメータを低ビット精度(例:32 ビット浮動小数点を 4 ビット整数)に圧縮し、ファイルサイズと必要メモリを削減する技術である。精度はある程度低下するが、CPU や少 VRAM の GPU でも実行可能になる。Q4_K_M は 4 ビット量子化の代表的な品質設定で、4 ビットを基本としつつ重要な層のみ精度を保つ方式であり、サイズと精度のバランスが取れている。QAT(Quantization-Aware Training、量子化を考慮した学習)は、学習の段階から量子化を織り込むことで、4 ビットへ量子化してもメモリ使用量を削減しつつ精度低下を抑える手法である。

GPU の利用(CUDA 等)について

本手順の推論エンジンである Ollama は、GPU があれば自動的に検出して利用する(NVIDIA GPU では CUDA、対応 GPU が無い場合は CPU で実行)。利用者が CUDA を明示的に設定する必要はなく、GPU ドライバが導入されていれば自動で使われる。

ローカル運用とは

ローカル運用とは、外部のサーバへデータを送信せず、手元のマシン内で推論を完結させる運用形態である。入力した文書やプロンプトが外部に送信されないため、情報セキュリティの面で利点がある。機密文書を外部の生成 AI サービスに送れない場面でも、ローカル運用なら安全に扱える。

本手順で用いる 2 つの基盤ソフトウェア

Ollama の推論エンジンについて

Ollama は、量子化された GGUF 形式(モデルの重みを圧縮して保存するファイル形式)のモデルを CPU・GPU の両方で実行する推論エンジンを内蔵する。量子化によりモデルサイズを削減して CPU でも実行でき、GPU があれば自動的に利用する。利用者が推論エンジンを直接操作する必要はない。

RAG とは

RAG(Retrieval-Augmented Generation、検索拡張生成)は、ユーザの質問に応じて、事前に登録した資料から関連箇所を検索し、その検索結果を文脈として LLM に渡したうえで応答を生成する仕組みである。これにより、LLM が学習していない固有情報や最新情報を要する質問への対応力が向上する。

コンテキスト長について

コンテキスト長とは、LLM が一度に処理できる入力+出力のトークン数の上限である。本手順では、gemma4:12b-it-qat のコンテキスト長上限である 262144 トークンを基準に設定する。設定値がモデル側の上限を超える場合、Ollama は推論時にモデル側の上限に合わせて動作する。そのため、上限が 128K(131072 トークン)の gemma4:e2b-it-qat でも、上限が 32768 トークンの LFM2.5-1.2B-Instruct でも、同じ設定のまま動作する。コンテキスト長を大きく設定するほど推論時のメモリ使用量が増えるため、メモリに余裕のない PC で応答が遅い場合は、num_ctx を各モデルの上限値(LFM2.5-1.2B-Instruct は 32768、gemma4:e2b-it-qat は 131072)まで下げて再試行する。現在の設定値は ollama show <モデル名> で確認できる。この設定は最初のインストールで一度だけ行う。

使用するモデル

LFM2.5-1.2B-Instruct(動作確認・テキスト専用)

Liquid AI 社の軽量モデルである。パラメータ数約 1.2B(正確には 1.17B)と軽量で動作が速く、英語・アラビア語・中国語・フランス語・ドイツ語・日本語・韓国語・スペイン語の 8 言語に対応する。コンテキスト長は 32768 トークンである。本手順では対話用に調整された Instruct 版を用いる。VRAM 目安は Q4_K_M 量子化時で約 1〜2GB(モデルファイル約 731MB)であり、少 VRAM の GPU や CPU のみの PC でも動作する。テキスト専用のため、画像入力には対応しない。開発元は本モデルを RAG・データ抽出・エージェント用途に推奨し、知識集約的な質問への単独利用は推奨していないため、本手順では動作確認用に位置づける。公式情報:https://www.liquid.ai/blog/introducing-lfm2-5-the-next-generation-of-on-device-ai

gemma4:e2b-it-qat(画像入力対応・軽量)

Google DeepMind のオープンモデル Gemma 4 シリーズの E2B モデル(E2B の「E」は有効パラメータ数(effective parameters)を表し、Per-Layer Embeddings(PLE)という、各層に小さな埋め込みを持たせて効率化する仕組みにより、総パラメータ数より少ない約 2.3B 相当の有効パラメータで動作する Dense モデルである)の QAT 版である。ダウンロード容量約 4.3GB、コンテキスト長 128K(131072 トークン)。テキストに加えて画像入力に対応し、思考モードを備える。ライセンスは Apache 2.0 である。

gemma4:12b-it-qat(画像入力対応・上位)

同シリーズの 12B モデルの QAT 版である。ダウンロード容量約 7.2GB、コンテキスト長 256K(262144 トークン)。e2b より規模が大きく、より高い推論能力を要する判定に適する。テキストに加えて画像入力に対応し、思考モードを備える。ライセンスは Apache 2.0 である。モデル本体の重みは VRAM/メモリで 7〜8GB 程度を占め、これに設定したコンテキスト長に応じた KV キャッシュ分が加わる。目安として、メモリ 16GB クラスの環境で動作させられる。

主要 Python パッケージ、埋め込みモデル

本手順で導入する主要 Python パッケージや埋め込みモデルの役割は次のとおり。

  1. open-webui:UI 本体である。インストール時に依存パッケージ(FastAPI、ChromaDB、sentence-transformers 等)が一括導入される。
  2. bge-m3:BAAI(北京智源人工知能研究院)が公開した多言語の埋め込みモデル(テキストを、意味を表す数値ベクトルに変換するモデル)である。日本語・英語を含む 100 以上の言語と最大 8192 トークンの入力に対応する。出力する Dense ベクトル(文全体の意味を 1 本のベクトルで表現したもの)は 1024 次元である。本手順では RAG の埋め込み(Ollama 経由)に用いる。
  3. bge-reranker-v2-m3:BAAI が公開した多言語の reranker(検索で得た候補を、質問との関連度で再順位付けするモデル)である。bge-m3 と同系統で多言語性能が高く、日本語・英語混在の検索結果の再順位付けに適する。本手順では Open WebUI の Reranking Model として用いる。初回は Hugging Face から約 1 GB のダウンロードが発生する。
  4. docling:PDF・Word・PowerPoint 文書を解析するパーサである。Open WebUI と連携させて RAG の抽出エンジンとして使う場合は、サーバ版の docling-serve を Docker コンテナとして起動し、その URL を Open WebUI に登録する。日本語 PDF、レイアウト付き文書、表・図・数式を含む文書の抽出精度が、標準抽出エンジンより向上する。

本手順の RAG は、文書解析(標準抽出エンジン、または Docling)、意味検索の埋め込み(bge-m3)、検索結果の再順位付け(bge-reranker-v2-m3)が担う。数式・図・グラフ・表を含む文書を扱う場合、これらを機械可読なテキストへ変換するのは前段の文書解析の役割であり、埋め込みモデルと reranker はその変換後のテキストを扱う。図表・数式を含む文書を高い精度で扱う場合は、抽出エンジンとして Docling(docling-serve)を接続する。

Python 3.12 のインストール

Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。

[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]

Windows での Python 3.12 のインストール

以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。

方法 1:winget によるインストール

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。

REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"

REM 現在のセッションにも反映(システムPATHを再取得して連結)
for /f "usebackq tokens=2,*" %A in (`reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path`) do set "PATH=%B"

REM pip / wheel の更新
python -m pip install --no-user -U pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

方法 2:インストーラーによるインストール

  1. Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

Build Tools・CUDA Toolkit・PyTorch のインストール

本章では、C++ ビルドツール、NVIDIA CUDA Toolkit、PyTorch のインストールを行い、GPU を活用した機械学習プログラムを実行する環境を整える。扱う環境は、Windows 搭載パソコンである。

[Build Tools・CUDA Toolkit・PyTorch のインストール手順を見るには、ここをクリック]

Windows での Build Tools for Visual Studio 2026 のインストール

Build Tools for Visual Studio 2026 は、C++ ソースコードを Windows 用バイナリにコンパイルするための開発ツール群である。unsloth 等の一部 Python パッケージは、インストール時に C++ コードのビルドを必要とするため、これらのツールが必須となる。

以下のコマンドは、Build Tools が未インストールの場合は winget で新規インストールし、インストール済みの場合は setup.exe modify でコンポーネントを追加する(バージョンは変更しない)。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

REM ============================================================
REM Visual C++ 再頒布可能パッケージ (VCRedist 2015-)
REM ============================================================
winget install --scope machine --id Microsoft.VCRedist.2015+.x64 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet /norestart"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo VCRedist のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM ============================================================
REM Visual Studio Build Tools + Desktop development with C++
REM (VCTools、MSBuildTools、CMake連携、Clang、Windows 11 SDK)
REM ============================================================
REM 進行中のインストーラーを停止(ロック競合回避。対象プロセスが存在しない場合は
REM taskkillがエラーを返すが、これは想定内であるため出力のみ抑制する)
taskkill /F /IM vs_setup.exe /T >nul 2>&1
taskkill /F /IM vs_installer.exe /T >nul 2>&1
taskkill /F /IM vs_installerservice.exe /T >nul 2>&1
taskkill /F /IM msiexec.exe /T >nul 2>&1

REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM BuildTools のインストールパスを vswhere.exe で取得(メジャーバージョンに依存しない)
set "VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
set "BT_PATH="
for /f "usebackq delims=" %P in (`"%VSWHERE%" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do set "BT_PATH=%P"
if not defined BT_PATH ( color 0c & echo Build Tools のインストールパスを取得できませんでした & ping 127.0.0.1 -n 6 >nul & color )

REM 破損時の修復(任意、動作がおかしくなった場合)
REM if defined BT_PATH "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" repair --installPath "%BT_PATH%" --quiet --norestart
REM 導入確認(インストールパスが表示されれば正常)
"%VSWHERE%" -products * -requires Microsoft.VisualStudio.Workload.VCTools -property installationPath

上記のコマンドでは、Build Tools 本体と Visual C++ 再頒布可能パッケージをインストールし、続いて以下のコンポーネントを追加している。

追加のコンポーネントが必要になった場合は Visual Studio Installer で個別にインストールできる。

Windows での NVIDIA CUDA Toolkit のインストール

NVIDIA CUDA Toolkit は、NVIDIA GPU 上で計算を行うためのコンパイラ・ライブラリ群である。PyTorch や vLLM 等が GPU を利用するために必要となる。GPU を使用しない場合、この手順は不要である。

前提条件:NVIDIA GPU、NVIDIA ドライバ、Build Tools for Visual Studio もしくは Visual Studio が必要である。

インストール中の注意:他のウインドウは閉じておくこと。

【インストールコマンドの実行方法】

管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

REM ============================================================
REM CUDA 12.8
REM ============================================================
winget install --scope machine --id Nvidia.CUDA --version 12.8 -e --silent --disable-interactivity --force --uninstall-previous --accept-source-agreements --accept-package-agreements --override "-s -n"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo CUDA のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM 統合用ファイルのコピー
if exist "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\" (
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "c:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v180\BuildCustomizations\" /Y
    xcopy "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\MSBuild\Microsoft\VC\v170\BuildCustomizations\" /Y /I
) else (
    echo CUDA v12.8 のディレクトリが存在しません。
    ping 127.0.0.1 -n 6 >nul
)

REM 環境変数TEMP, TMPの設定(一時ファイルの保存先を短いパスに変更)
set "TEMP=C:\TEMP"
set "TMP=C:\TEMP"
powershell -NoProfile -Command "$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); foreach($n in @('TEMP','TMP')){ $t=[Microsoft.Win32.RegistryValueKind]::ExpandString; if($k.GetValueNames() -contains $n){ $t=$k.GetValueKind($n) }; $k.SetValue($n,'C:\TEMP',$t) }; $k.Close()"
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TEMP
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TMP

環境変数 TEMP および TMP を C:\TEMP に変更しているのは、後続のインストール処理で長いパス名や空白を含むパス名がエラーの原因となる場合があるためである。

Windows での PyTorch のインストール

https://pytorch.org のインストールガイドに従い、自環境の CUDA バージョンに対応したコマンドを取得して実行する。CUDA バージョンは以下で確認できる。

nvcc --version

管理者権限でコマンドプロンプトを起動し、以下を実行する。cu128 は CUDA 12.8 用のタグである。CUDA バージョンが異なる場合は、上記公式サイトで該当するタグを確認し、URL 末尾の cu128 を置き換えること。

REM numpy と PyTorch(CUDA 12.8 対応 wheel)、pip キャッシュを全削除
set "CUDA_TAG=cu128"
pip install --no-user -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%
if not "%ERRORLEVEL%"=="0" ( color 0c & echo numpy / PyTorch のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

Ollama・モデル・Open WebUI のインストール

[Windows でのインストール・設定手順を見るには、ここをクリック]

Ollama、3 つのモデル(LFM2.5-1.2B-Instruct、gemma4:e2b-it-qat、gemma4:12b-it-qat)、埋め込みモデル bge-m3、Python 3.11、Open WebUI、Git のインストール手順を示す。

設定としては、Ollama の動作パラメータを Machine スコープの環境変数として設定する。内容は、Flash Attention の有効化(OLLAMA_FLASH_ATTENTION=1)、KV キャッシュの 8bit 量子化(OLLAMA_KV_CACHE_TYPE=q8_0)、コンテキスト長の拡張(OLLAMA_CONTEXT_LENGTH=262144)、モデル保存先の C:\Ollama\models への変更(OLLAMA_MODELS)、同時ロードモデル数の 1 への制限(OLLAMA_MAX_LOADED_MODELS=1)、同時処理数の 1 への制限(OLLAMA_NUM_PARALLEL=1)である。

Flash Attention は KV キャッシュ量子化を使用するために必要な機能である。また、同時ロードモデル数を 1 に制限することで、モデル切替時に複数モデルが同時にメモリ上へ残らない設定にしている。

この手順では、スタートメニューに次のショートカットも作成する。

ショートカットは直接複雑なコマンドを保持せず、C:\Ollama に作成される起動用 .cmd ファイルを呼び出す。これにより、引用符や & の解釈による起動失敗を避ける。また、起動用 .cmd 内でも Ollama 用環境変数を明示的に設定するため、Machine スコープ環境変数の反映を待たずに動作する。

ハードウェアの前提

ハードウェア要件の事前確定は難しい。新規に PC を準備する前に、現有の機器で本手順を試行し、性能面の問題の有無を確認したうえで、本格運用のハードウェアを決定する。

インストールコマンドの実行方法

管理者権限でコマンドプロンプトを起動する。

手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」

Machine スコープの環境変数設定、C:\Ollama の作成、Python/Git の Machine スコープインストール、共通スタートメニューへのショートカット作成には管理者権限が必要である。実行時は、次のコマンド全体をコマンドプロンプトにコピー&ペーストする。

REM ============================================================
REM 管理者権限チェック
fltmc >nul 2>&1
if not "%ERRORLEVEL%"=="0" ( color 0c & echo 管理者権限で実行してください & ping 127.0.0.1 -n 6 >nul & color )

REM winget パッケージ一覧のローカルキャッシュを更新
winget source update

REM === 1. Ollama 環境変数を Machine スコープで事前設定 ===
REM   インストール前に設定することで、Ollama 起動時から正しい設定が読み込まれる
powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION','1','Machine'); [Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE','q8_0','Machine'); [Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH','262144','Machine'); [Environment]::SetEnvironmentVariable('OLLAMA_MODELS','C:\Ollama\models','Machine'); [Environment]::SetEnvironmentVariable('OLLAMA_MAX_LOADED_MODELS','1','Machine'); [Environment]::SetEnvironmentVariable('OLLAMA_NUM_PARALLEL','1','Machine')"

REM   現在のコマンドプロンプトにも同じ設定を反映
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_CONTEXT_LENGTH=262144"
set "OLLAMA_MODELS=C:\Ollama\models"
set "OLLAMA_MAX_LOADED_MODELS=1"
set "OLLAMA_NUM_PARALLEL=1"

REM === 2. 使用するモデル名 ===
set "MODEL_LFM=LiquidAI/lfm2.5-1.2b-instruct"
set "MODEL_GEMMA_LIGHT=gemma4:e2b-it-qat"
set "MODEL_GEMMA_12B=gemma4:12b-it-qat"
set "MODEL_EMBED=bge-m3"

REM === 3. 既存の Ollama プロセスを停止(ファイルロック解除のため) ===
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

REM === 4. 既存の Ollama をアンインストール ===
REM   インストール先を C:\Ollama に揃えるため、既存インストールをいったん削除する
winget uninstall --id Ollama.Ollama -e --silent --disable-interactivity --accept-source-agreements

REM   uninstall 後にプロセスが残ることがあるため再度停止
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

REM === 5. モデルフォルダの作成と権限設定 ===
if not exist "C:\Ollama" ( mkdir "C:\Ollama" )
if not exist "C:\Ollama\models" ( mkdir "C:\Ollama\models" )
icacls "C:\Ollama\models" /grant *S-1-5-32-545:(OI)(CI)(M) /T /C

REM === 6. 既存モデルの移動(実行ユーザーのプロファイルに残っている場合) ===
REM   Ollama 停止状態で実行するためファイルロックが起きない
if exist "%USERPROFILE%\.ollama\models" ( robocopy "%USERPROFILE%\.ollama\models" "C:\Ollama\models" /E /MOVE )

REM === 7. Python 3.11 のインストール ===
REM   Open WebUI は Python でインストールするため、先に Python 3.11 を Machine スコープで導入する
winget install --scope machine --id Python.Python.3.11 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.11 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
set "PATH=C:\Program Files\Python311;C:\Program Files\Python311\Scripts;%PATH%"

REM === 8. Ollama のインストール(C:\Ollama) ===
winget install --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Ollama のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM   インストーラが自動起動した Ollama プロセスを停止し、以後は明示した環境変数で起動する
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

REM === 9. Git のインストール ===
winget install --scope machine --id Git.Git -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS=icons,ext\reg\shellhere,assoc,assoc_sh /o:PathOption=Cmd /o:CRLFOption=CRLFCommitAsIs /o:BashTerminalOption=MinTTY /o:DefaultBranchOption=main /o:EditorOption=VIM /o:SSHOption=OpenSSH /o:UseCredentialManager=Enabled /o:PerformanceTweaksFSCache=Enabled /o:EnableSymlinks=Disabled /o:EnableFSMonitor=Disabled"
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Git のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
set "PATH=C:\Program Files\Git\cmd;%PATH%"

REM === 10. PATH の Machine スコープ設定 ===
REM   [Environment]::SetEnvironmentVariable を使用すると、レジストリ値の型が
REM   REG_EXPAND_SZ から REG_SZ に変化し、既存の %var% 形式の変数参照が
REM   展開されてしまう副作用があるため、レジストリを直接操作して型を維持する
powershell -NoProfile -Command "$p='C:\Ollama'; $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()"
powershell -NoProfile -Command "$p='C:\Program Files\Python311'; $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()"
powershell -NoProfile -Command "$p='C:\Program Files\Python311\Scripts'; $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()"
powershell -NoProfile -Command "$p='C:\Program Files\Git\cmd'; $k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); if(($c -split ';') -notcontains $p){$k.SetValue('Path',($c.TrimEnd(';')+';'+$p),$t)}; $k.Close()"

REM   現在のコマンドプロンプトにも PATH を反映
set "PATH=C:\Ollama;C:\Program Files\Python311;C:\Program Files\Python311\Scripts;C:\Program Files\Git\cmd;%PATH%"

REM === 11. Ollama サーバープロセスの起動(モデルダウンロードの前に必要) ===
REM   where や tasklist の判定に依存せず、フルパスで明示的に起動する
start "Ollama Server" /min "C:\Ollama\ollama.exe" serve
timeout /t 15 /nobreak >nul

REM === 12. モデルのダウンロード ===
REM   動作確認用(テキスト専用、約 731MB)
echo %MODEL_LFM% モデルをダウンロード中...
"C:\Ollama\ollama.exe" pull "%MODEL_LFM%"

REM   画像入力対応(軽量、約 4.3GB)
echo %MODEL_GEMMA_LIGHT% モデルをダウンロード中...
"C:\Ollama\ollama.exe" pull "%MODEL_GEMMA_LIGHT%"

REM   画像入力対応(上位、約 7.2GB)
echo %MODEL_GEMMA_12B% モデルをダウンロード中...
"C:\Ollama\ollama.exe" pull "%MODEL_GEMMA_12B%"

echo モデルダウンロード完了

REM === 13. 埋め込みモデルのダウンロード(RAG 演習で使用) ===
echo %MODEL_EMBED% 埋め込みモデルをダウンロード中...
"C:\Ollama\ollama.exe" pull "%MODEL_EMBED%"
echo 埋め込みモデルダウンロード完了

REM === 14. Open WebUI のインストール ===
REM   open-webui パッケージにより、依存パッケージ(FastAPI、ChromaDB、
REM   sentence-transformers 等)が一括インストールされる
REM   管理者実行中でも Administrator ユーザー専用にならないよう、Python 3.11 へ system-wide に入れる
"C:\Program Files\Python311\python.exe" -m pip install --no-user --upgrade pip
"C:\Program Files\Python311\python.exe" -m pip install --no-user --upgrade open-webui

REM === 15. 起動用コマンドファイルの作成 ===
REM   ショートカットに複雑なコマンド列を直接埋め込まず、.cmd ファイル経由で起動する

REM   Ollama 共通環境変数
> "C:\Ollama\ollama-env.cmd" echo @echo off
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_FLASH_ATTENTION=1"
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_KV_CACHE_TYPE=q8_0"
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_CONTEXT_LENGTH=262144"
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_MODELS=C:\Ollama\models"
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_MAX_LOADED_MODELS=1"
>> "C:\Ollama\ollama-env.cmd" echo set "OLLAMA_NUM_PARALLEL=1"

REM   LFM2.5-1.2B-Instruct 起動用
> "C:\Ollama\run-lfm25-1.2b.cmd" echo @echo off
>> "C:\Ollama\run-lfm25-1.2b.cmd" echo call "C:\Ollama\ollama-env.cmd"
>> "C:\Ollama\run-lfm25-1.2b.cmd" echo start "Ollama Server" /min "C:\Ollama\ollama.exe" serve
>> "C:\Ollama\run-lfm25-1.2b.cmd" echo timeout /t 15 /nobreak ^>nul
>> "C:\Ollama\run-lfm25-1.2b.cmd" echo "C:\Ollama\ollama.exe" run %MODEL_LFM%

REM   gemma4:e2b-it-qat 起動用
> "C:\Ollama\run-gemma4-e2b.cmd" echo @echo off
>> "C:\Ollama\run-gemma4-e2b.cmd" echo call "C:\Ollama\ollama-env.cmd"
>> "C:\Ollama\run-gemma4-e2b.cmd" echo start "Ollama Server" /min "C:\Ollama\ollama.exe" serve
>> "C:\Ollama\run-gemma4-e2b.cmd" echo timeout /t 15 /nobreak ^>nul
>> "C:\Ollama\run-gemma4-e2b.cmd" echo "C:\Ollama\ollama.exe" run %MODEL_GEMMA_LIGHT%

REM   gemma4:12b-it-qat 起動用
> "C:\Ollama\run-gemma4-12b.cmd" echo @echo off
>> "C:\Ollama\run-gemma4-12b.cmd" echo call "C:\Ollama\ollama-env.cmd"
>> "C:\Ollama\run-gemma4-12b.cmd" echo start "Ollama Server" /min "C:\Ollama\ollama.exe" serve
>> "C:\Ollama\run-gemma4-12b.cmd" echo timeout /t 15 /nobreak ^>nul
>> "C:\Ollama\run-gemma4-12b.cmd" echo "C:\Ollama\ollama.exe" run %MODEL_GEMMA_12B%

REM   Open WebUI 起動用
> "C:\Ollama\run-open-webui.cmd" echo @echo off
>> "C:\Ollama\run-open-webui.cmd" echo call "C:\Ollama\ollama-env.cmd"
>> "C:\Ollama\run-open-webui.cmd" echo start "Ollama Server" /min "C:\Ollama\ollama.exe" serve
>> "C:\Ollama\run-open-webui.cmd" echo timeout /t 15 /nobreak ^>nul
>> "C:\Ollama\run-open-webui.cmd" echo "C:\Program Files\Python311\Scripts\open-webui.exe" serve

REM === 16. スタートメニュー ショートカット作成 ===
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $p=[Environment]::GetFolderPath('CommonPrograms'); $l=$s.CreateShortcut($p+'\Ollama LFM2.5 1.2B.lnk'); $l.TargetPath='C:\Ollama\run-lfm25-1.2b.cmd'; $l.WorkingDirectory='C:\Ollama'; $l.Save()"

powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $p=[Environment]::GetFolderPath('CommonPrograms'); $l=$s.CreateShortcut($p+'\Ollama Gemma4 e2b.lnk'); $l.TargetPath='C:\Ollama\run-gemma4-e2b.cmd'; $l.WorkingDirectory='C:\Ollama'; $l.Save()"

powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $p=[Environment]::GetFolderPath('CommonPrograms'); $l=$s.CreateShortcut($p+'\Ollama Gemma4 12b.lnk'); $l.TargetPath='C:\Ollama\run-gemma4-12b.cmd'; $l.WorkingDirectory='C:\Ollama'; $l.Save()"

powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $p=[Environment]::GetFolderPath('CommonPrograms'); $l=$s.CreateShortcut($p+'\Open WebUI (Ollama).lnk'); $l.TargetPath='C:\Ollama\run-open-webui.cmd'; $l.WorkingDirectory='C:\Ollama'; $l.Save()"

REM === 17. インストール時に起動した Ollama サーバープロセスを停止 ===
REM   実際の利用時は、各ショートカットから現在のユーザー権限で起動する
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

echo インストール完了
echo Open WebUI はスタートメニューの「Open WebUI (Ollama)」から起動し、ブラウザで http://localhost:8080 を開いてください。

Open WebUI の起動

スタートメニューから Open WebUI (Ollama) を起動する。起動後、ブラウザで次の URL を開く。

http://localhost:8080

初回起動時はアカウント作成画面が表示される。最初に作成したアカウントが Open WebUI の管理者アカウントになる。

RAG 演習で bge-m3 を使用する場合

bge-m3 は Ollama 側にダウンロード済みである。Open WebUI の RAG 機能で使用する場合は、Open WebUI の管理画面で埋め込みモデルとして Ollama の bge-m3 を選択する。

補足

通常のコマンドプロンプトで ollama や git を直接実行する場合、Machine スコープ PATH の反映には新しいコマンドプロンプトの起動、またはサインアウト・再サインインが必要になる場合がある。スタートメニューに作成されたショートカットはフルパスと起動用 .cmd を使用するため、この影響を受けない。

演習 1.基本動作確認(CUI)

Ollama 自体が動作することを確認する。本演習のみコマンドプロンプト(CUI)で行い、LLM のローカル実行(外部サーバへの送信を伴わず、手元のマシン内で完結する推論)を体験する。以降の演習はすべてブラウザ(Open WebUI)で行う。

手順

  1. Ollama でモデル LFM2.5-1.2B-Instruct を実行する
    1. コマンドプロンプトを開き、Ollama を起動する(ollama serve)。

      次のメッセージが出た場合は、すでに Ollama が起動中なので、問題ない。続行する。

    2. 別のコマンドプロンプトで、モデル LFM2.5-1.2B-Instruct を選んで実行する(ollama run LiquidAI/lfm2.5-1.2b-instruct)。
  2. プロンプト記号 >>> が表示されたら、質問を入力する(例:「日本の首都はどこですか?」)。
  3. 応答が返ることを確認する。
  4. /bye を入力して終了する。

ヒント

考察ポイント

演習 2.RAG なしでチャット(ブラウザ)

Open WebUI(フロントエンド)から Ollama(バックエンド)の LLM を呼び出す経路が機能することを、RAG を使わない素のチャットで確認する。本構成はフロントエンドとバックエンドが分離されており、Open WebUI は HTTP 経由で Ollama に問い合わせる。

Open WebUI の起動

通常のコマンドプロンプトを開いて以下を実行する。「管理者として実行」しないこと。

%USERPROFILE%\AppData\Roaming\Python\Python312\Scripts\open-webui serve

Python312 は Python 3.12 を表す。Python 3.11 をインストールしている場合は、この部分を Python311 に読み替える。起動には初回 30 秒〜1 分かかる。

コマンドプロンプトに Uvicorn running on http://0.0.0.0:8080 と表示された後、自動でブラウザが http://localhost:8080 を開く(開かない場合は手動で開く)。

初回アクセス時は管理者アカウント作成画面が表示される。氏名・メールアドレス・パスワードを入力してアカウントを作成する(メールアドレスは Open WebUI 内のローカル認証用であり、外部送信は行われない。実在しないメールアドレスでも作成できる)。

手順

  1. ログイン後、画面左上のモデル選択ドロップダウンを開き、LFM2.5-1.2B-Instruct を選択する。
  2. 画面下部のチャット入力欄に質問(例:「日本の首都はどこか。」)を入力して送信する。
  3. 応答が返ることを確認する。
  4. モデル選択ドロップダウンから gemma4:e2b-it-qat に切り替え、同じ質問を送信して応答を確認する。思考モードを持つ gemma4 系モデルでは、「思考モードを使って、日本語の敬語がなぜ複雑に発達したか説明せよ。」のような質問も試すと、内部の推論過程が観察できる。
  5. モデル選択ドロップダウンから gemma4:12b-it-qat に切り替え、同じ質問を送信して応答を確認する。

ヒント

考察ポイント

演習 3.RAG なしで図を理解させてチャット(ブラウザ)

画像入力に対応したモデル(gemma4 系)に図(画像)を直接添付し、モデル自身のマルチモーダル能力だけで図の内容を読み取らせる。LFM2.5-1.2B-Instruct はテキスト専用のため本演習には使えない。本演習では gemma4:e2b-it-qat または gemma4:12b-it-qat を用いる。

準備するファイル

手順

  1. Open WebUI のチャット画面でモデル gemma4:12b-it-qat(または gemma4:e2b-it-qat)を選択する。
  2. 新しいチャットを開始し、チャット入力欄のクリップ(添付)アイコンから、準備した画像を添付する。
  3. 同じ入力欄に質問を入力して送信する。図の種類に応じて、たとえば次のように問う:
    • グラフの場合:この画像のグラフは何を表しているか。読み取れる最大値とその項目を答えよ。
    • 表の場合:この画像の表から、合計値と、最も大きい数値の行を答えよ。
    • 数式の場合:この画像に写っている数式を読み取り、テキストで書き起こせ。
  4. 応答内容を確認する。
  5. モデルを別のものに切り替え、同じ画像と質問で応答を比較する。

ヒント

考察ポイント

演習 4.RAG ありで図を含む文書を扱う(ブラウザ)

Open WebUI の Knowledge(文書を登録して RAG の検索対象にする機能)を用いて RAG の一連の流れを体験し、あわせて、図・表を含む文書を標準(Default)抽出エンジンで取り込んだ場合の限界を観察する。本演習では、「画像をモデルに直接見せる」方式と、RAG の「文書から抽出したテキストを介する」方式の違いを比較する。

準備 1:RAG の初期設定

  1. 画面右上のユーザーアイコン(または左下のアカウント名)をクリックし、「管理者パネル(Admin Panel)」を開く。

    「設定(Settings)」→「ドキュメント(Documents)」を開く。

  2. 埋め込みモデル:「Embedding Model Engine」を Ollama に設定し、「Embedding Model」に bge-m3 を入力する。
  3. ハイブリッド検索(Hybrid 検索)(ベクトル検索とキーワード検索を併用する検索方式)をオン、 Enrich Hybrid Search Text(ユーザの質問を LLM で言い換え・拡張してからハイブリッド検索を行う機能。クエリの表現揺れを補い検索精度の向上が期待できる)をオン、 リランクモデル(Reranking Model)にBAAI/bge-reranker-v2-m3 を設定(Hugging Face から自動ダウンロードされる。初回は約 1 GB のダウンロードが発生する)。 トップK(Top K)を 5〜10 の範囲で設定する(再順位付け後に LLM に渡す上位件数)。
  4. チャンク(長文を埋め込み計算のために分割した単位)の設定

    チャンクサイズ(Chunk Size)を 1000〜1500 トークン、 チャンクのオーバーラップ(Chunk Overlap)(チャンク間の重複量。境界で文脈が途切れることを防ぐ)を 100〜200 トークンに設定する。

  5. 「Content Extraction Engine」は Default(Open WebUI 内蔵)のままとする(図表・数式を含む文書を高い精度で扱う場合は Docling に切り替える)。
  6. 「保存(Save)」をクリック。

準備 2:テスト用文書の作成

  1. メモ帳で以下のような表を含む文書を作成する:
    架空商店 月別売上表
    
    月       売上(万円)   来客数(人)
    1月      120            300
    2月      95             250
    3月      150            380
    4月      130            340
    
    備考:3月は新商品の発売により売上・来客数ともに最大となった。
    
  2. 「ファイル → 名前を付けて保存」で、エンコードを UTF-8 に設定し 保存する。保存のときのファイル名を覚えておく。
  3. 余裕があれば、図・表を含む PDF も別途用意し、同様にアップロードして比較するとよい(PDF の図・表は標準抽出エンジンでは構造が崩れやすい)。

手順

  1. 画面左側のメニューから「ワークスペース(Workspace)」→「ナレッジベース (Knowledge Base)」を開き、「+ 新しいナレッジベース」ボタンで新規 Knowledge を作成する。名前を「売上資料」とする。
  2. 作成された Knowledge を開き、「ファイルをアップロード」から先ほど作成したファイルをアップロードする。

    アップロード時に内部で、(a)テキスト抽出、(b)チャンク分割、(c)bge-m3 による埋め込み生成、(d)ChromaDB(Open WebUI 内蔵のベクトルデータベース)へのベクトル登録が順に実行される。完了マークが表示されるまで待つ。

  3. 左メニューの「新しいチャット(New Chat)」をクリックし、モデルを選択する。
  4. チャット入力欄で半角の # を入力し、現れた候補から「売上資料」を選択する。入力欄上部に Knowledge 名のチップ(選択中であることを示すラベル)が表示されることを確認する。
  5. 以下の質問を順に送信し、応答を確認する:
    • 質問 A(直接記載):売上が最大の月と、その売上額・来客数を答えよ。
    • 質問 B(複数行の参照):1 月から 4 月までの売上の合計額を求めよ。
  6. 応答に出典表示(参照元のファイル名やチャンクへの参照)が付与される場合は、その表示も確認する。
  7. 比較のため、「新しいチャット」を開始し、今度は Knowledge を選択せず、同じモデルで同じ質問を送信して応答を比較する。

ヒント

考察ポイント

発展:Docling による図表・数式を含む文書の高精度抽出(Docker + docling-serve)

本節は発展ステップである。演習 4 までは Open WebUI の標準(Default)抽出エンジンで完結する。表・図・グラフ・数式・化学式・図中テキストを含む文書では、標準抽出エンジンはこれらの構造を保持できず、表のセルの対応が崩れたり、図中のテキストや数式が取り込まれなかったりする。Docling を Open WebUI の抽出エンジンとして接続すると、表を構造ごと、図中テキストを OCR で、レイアウトを保持したまま取り込めるようになり、RAG の検索・回答精度が向上する。テキスト中心の文書のみを扱う場合は、本節は省略してよい。

Open WebUI で Docling を使うには、Docling を pip install するだけでは不十分で、Docling のサーバ版である docling-serve を別プロセス(Docker コンテナ)として起動し、その URL を Open WebUI に登録する必要がある。Docker は、アプリケーションをコンテナという独立した単位で動かすソフトウェアである。本節では Docker を初めて使用する。

前提条件

【手順 1:Docker Desktop のインストール】

管理者権限でコマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

続いて、次を実行する:

REM Docker Desktop のインストール
winget install --id Docker.DockerDesktop -e --silent --disable-interactivity --accept-source-agreements --accept-package-agreements

インストール後、Windows の再起動が必要な場合がある。再起動後、スタートメニューから Docker Desktop を起動し、初回セットアップ(WSL 2 バックエンドの有効化等)を完了させる。

【手順 2:docling-serve コンテナの起動】

Docker Desktop が起動した状態で、新しいコマンドプロンプト(管理者権限不要)を開き、用途に応じて次のいずれかを実行する。コンテナはポート 5001 で待ち受ける。UVICORN_WORKERS=1 は、複数ワーカー時に発生する「Task Not Found」エラーを避けるための設定である。DOCLING_SERVE_MAX_SYNC_WAIT は同期処理の最大待ち時間(秒)で、大きな文書のタイムアウトを防ぐために既定の 120 秒から延長している。

CPU のみの環境(または GPU を使わない場合):

docker run -d --name docling-serve -p 5001:5001 -e DOCLING_SERVE_ENABLE_UI=true -e UVICORN_WORKERS=1 -e DOCLING_SERVE_MAX_SYNC_WAIT=600 quay.io/docling-project/docling-serve

NVIDIA GPU を使う場合(CUDA 対応イメージ。GPU により OCR・レイアウト解析が高速化する):

docker run -d --name docling-serve --gpus all -p 5001:5001 -e DOCLING_SERVE_ENABLE_UI=true -e UVICORN_WORKERS=1 -e DOCLING_SERVE_MAX_SYNC_WAIT=600 quay.io/docling-project/docling-serve-cu128

起動後、ブラウザで http://localhost:5001/ui を開き、docling-serve の動作確認用 UI が表示されることを確認する(任意で、ここにテスト文書をアップロードして Markdown 出力を確認できる)。

【手順 3:Open WebUI への接続】

  1. Open WebUI の管理者パネル → 設定 (Settings) → Documents を開く。
  2. コンテンツ抽出エンジン (Content Extraction Engine)を Default から Docling に変更する。
  3. 表示される Docling のサーバ URL 欄に、Open WebUI を Windows 上でネイティブに動かしているので http://localhost:5001 を入力する。
  4. 必要に応じて、PDF の解析品質・OCR を設定する。Open WebUI の Docling パラメータ設定欄に以下のような JSON を設定すると、表を高精度モードで抽出し、日本語の図中テキストを OCR で読み取れる:
    {
      "do_ocr": true,
      "pdf_backend": "dlparse_v2",
      "table_mode": "accurate",
      "ocr_engine": "tesseract",
      "ocr_lang": ["jpn", "eng"]
    }

    pdf_backend の値は Docling のバージョンによって異なる。docker logs docling-serve で起動ログを確認するか、Docling のリリースノートで使用中のバージョンに有効なバックエンド名を確認する。ocr_lang は Tesseract では 3 文字コード(日本語 jpn、英語 eng)で指定する。表の構造保持を優先する場合は table_mode を accurate にする。設定画面に当該フィールドが表示されない場合は、Open WebUI のリリースノートで項目名を確認する。

  5. 「保存(Save)」をクリック。

【手順 4:動作確認】

演習 4 と同じ手順で、今度は表・図・数式を含む PDF を Knowledge にアップロードする。アップロード後、その文書に対して表の数値や図中の項目を問う質問を送り、標準抽出エンジンのときと比べて応答精度が向上するかを確認する。

ヒント

考察ポイント

付録:他のモデルを試す

本手順では、動作確認用に LFM2.5-1.2B-Instruct を、画像入力と RAG を含む本体の演習に gemma4:e2b-it-qat と gemma4:12b-it-qat を用いた。Ollama を使うと、モデル名を差し替えるだけで他のモデルも同じ手順で試せる(モデルは初回実行時に自動的にダウンロードされる)。Gemma 4 シリーズには、ほかに 26B クラスの MoE(Mixture of Experts、推論ごとに一部のパラメータのみを活性化する構造)モデル(gemma4:26b-a4b-it-qat、約 16GB、メモリ 32GB 以上推奨)や 31B モデル(gemma4:31b-it-qat、約 19GB)も公開されており、ハードウェアに余裕があれば同じ要領で導入できる。これらのモデルタグは Ollama のモデルライブラリページ(https://ollama.com/library)で最新の正式タグ名を確認してから使用すること。