手元の 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 を用いる場合は、本手順中の Python312Python311 に読み替える。

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

本手順で用いるモデルは、いずれも CPU のみの PC や少 VRAM の GPU でも動作する点が共通する。

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 ドライバが導入されていれば自動で使われる。Ollama は後述の llama.cpp を基盤とする。

ローカル運用とは

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

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

Ollama の基盤について

Ollama は、C++ 実装の推論エンジン llama.cpp を基盤とする。llama.cpp は量子化によりモデルサイズを削減し CPU でも実行できる仕組みで、GPU があれば自動的に利用する。利用者が llama.cpp を直接操作する必要はない。

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 では応答が遅くなることがある。この設定は最初のインストールで一度だけ行う。

使用するモデル

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 とされる(Hugging Face 上の当該モデルのライセンスファイルで最新情報を確認すること)。

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

同シリーズの 12B モデルの QAT 版である。ダウンロード容量約 7.2GB、コンテキスト長 256K(262144 トークン)。e2b より規模が大きく、より高い推論能力を要する判定に適する。テキストに加えて画像入力に対応し、思考モードを備える。ライセンスは Apache 2.0 とされる(Hugging Face 上の当該モデルのライセンスファイルで最新情報を確認すること)。QAT による軽量化で 12B 規模でもメモリ 16GB クラスのノート PC で動作しうるが、ディスク空き容量・メモリに余裕のある環境を前提とする。

主要 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 を起動して接続する(後述の発展節を参照)。日本語 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\""

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\") -and (';'+$c+';' -notlike \"*;$s;*\")){[Environment]::SetEnvironmentVariable('Path',\"$p;$s;$c\",'Machine')}"

方法 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 VC++ ランタイム
winget install --scope machine --id Microsoft.VCRedist.2015+.x64 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet /norestart"

REM ============================================================
REM Visual Studio Build Tools + Desktop development with C++
REM (VCTools、MSBuildTools、CMake連携、Clang、Windows 11 SDK)
REM ============================================================
REM 進行中のインストーラーを停止(ロック競合回避)
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

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 --includeRecommended --quiet --norestart --nocache
) 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"
)

REM 破損時の修復(任意、動作がおかしくなった場合)
REM "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" repair --installPath "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools" --quiet --norestart

REM 導入確認(インストールパスが表示されれば正常)
"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -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 NVIDIA CUDA Toolkit 12.8 をシステム領域にインストール
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"

REM 環境変数TEMP, TMPの設定(一時ファイルの保存先を短いパスに変更)
mkdir C:\TEMP
setx TEMP "C:\TEMP" /M
setx TMP "C:\TEMP" /M

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

Windows での PyTorch のインストール

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

nvcc --version

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

pip install --no-user -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

以降の章では、必要に応じて題材に応じた必要なソフトウェアを追加する。

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

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

本章では、Ollama3 つのモデル(LFM2.5-1.2B-Instruct、gemma4:e2b-it-qat、gemma4:12b-it-qat)、埋め込みモデルbge-m3Open WebUIGitのインストール手順を示す。

設定としては、Ollama の動作パラメータを Machine スコープの環境変数として設定しており、その内容は、Flash Attention の有効化(OLLAMA_FLASH_ATTENTION=1)、KV キャッシュの 8bit 量子化(OLLAMA_KV_CACHE_TYPE=q8_0)、コンテキスト長をデフォルトの 4096 から 262144 への拡張(OLLAMA_CONTEXT_LENGTH=262144)、モデル保存先の C:\Ollama\models への変更(OLLAMA_MODELS)である。Flash Attention は KV キャッシュの量子化に必要な高速化機能である。その他、gemma4:e2b-it-qat 起動用のスタートメニュー ショートカット作成を行う。

ハードウェアの前提

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

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

管理者権限コマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。winget の --scope machine オプションでシステム全体にインストールするには、管理者権限が必要である。実行時はコマンド全体をコマンドプロンプトにコピー&ペーストする。

REM ============================================================
REM 管理者権限チェック
net session >nul 2>&1
if errorlevel 1 ( echo [エラー] 管理者権限で実行してください & pause & exit /b 1 )

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

REM === 1. Ollama 環境変数を Machine スコープで事前設定 ===
REM   インストール前に設定することで、Ollama 起動時から正しい設定が読み込まれる
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE', 'q8_0', 'Machine')"
REM   コンテキスト長:Ollama のデフォルトは 4096。
REM   ここでは gemma4:12b-it-qat の上限 262144 に設定する
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH', '262144', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MODELS', 'C:\Ollama\models', 'Machine')"
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_CONTEXT_LENGTH=262144"
set "OLLAMA_MODELS=C:\Ollama\models"

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

REM === 3. モデルフォルダの作成と権限設定 ===
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 === 4. 既存モデルの移動(ユーザープロファイルに残っている場合) ===
REM   Ollama 停止状態で実行するためファイルロックが起きない
if exist "%USERPROFILE%\.ollama\models" robocopy "%USERPROFILE%\.ollama\models" "C:\Ollama\models" /E /MOVE
if exist "%USERPROFILE%\.ollama\models" rd /s /q "%USERPROFILE%\.ollama\models"

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

REM === 6. Ollama のインストール(Inno Setup) ===
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
winget install --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"
winget upgrade --id Ollama.Ollama -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/DIR=C:\Ollama"

REM === 7. Ollama のパス設定(システム PATH に未登録の場合のみ追加) ===
powershell -NoProfile -Command "$p='C:\Ollama'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\")){[Environment]::SetEnvironmentVariable('Path',\"$c;$p\",'Machine')}"

REM   Ollama のパスを現在のセッションに反映
set "PATH=C:\Ollama;%PATH%"

REM === 8. Ollama サービスの起動(モデルダウンロードの前に必要) ===
where ollama >nul 2>&1
if errorlevel 1 echo Ollama のパスが見つかりません。再起動後に再実行してください。 & exit /b 1
tasklist /fi "imagename eq ollama.exe" | find "ollama.exe"  2>&1
if errorlevel 1 start "" "C:\Ollama\ollama.exe" serve & timeout /t 10 /nobreak

REM === 9. モデルのダウンロード ===
REM   動作確認用(テキスト専用、約 731MB)。
echo LFM2.5-1.2B-Instruct モデルをダウンロード中...
ollama pull LiquidAI/lfm2.5-1.2b-instruct
REM   画像入力対応(軽量、約 4.3GB)
echo gemma4:e2b-it-qat モデルをダウンロード中...
ollama pull gemma4:e2b-it-qat
REM   画像入力対応(上位、約 7.2GB)
echo gemma4:12b-it-qat モデルをダウンロード中...
ollama pull gemma4:12b-it-qat
echo モデルダウンロード完了

REM === 10. 埋め込みモデルのダウンロード(RAG 演習で使用) ===
echo bge-m3 埋め込みモデルをダウンロード中...
ollama pull bge-m3
echo 埋め込みモデルダウンロード完了

REM === 11. Open WebUI のインストール ===
REM   open-webui パッケージにより、依存パッケージ(FastAPI、ChromaDB、
REM   sentence-transformers 等)が一括インストールされる
python -m pip install --no-user --upgrade pip
python -m pip install --no-user --upgrade open-webui
python -m pip uninstall -y open-webui
python -m pip install --user --upgrade open-webui

REM === 12. 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"

REM   Git のパスを現在のセッションに反映
set "PATH=C:\Program Files\Git\cmd;%PATH%"

REM === 13. スタートメニュー ショートカット作成 ===
REM   gemma4:e2b-it-qat 起動ショートカット(CUI で質問・応答を行う)
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('CommonPrograms')+'\Ollama Gemma4 e2b.lnk'); $l.TargetPath='cmd.exe'; $l.Arguments='/k \"start cmd /k ollama serve ^& timeout /t 3 /nobreak ^>nul ^& ollama run gemma4:e2b-it-qat\"'; $l.Save()"

echo インストール完了

演習 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)抽出エンジンで取り込んだ場合の限界を観察する。本演習では、演習 3 の「画像をモデルに直接見せる」方式と、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)を 510 の範囲で設定する(再順位付け後に LLM に渡す上位件数)。
  4. チャンク(長文を埋め込み計算のために分割した単位)の設定

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

  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 パラメータ設定欄(Open WebUI のバージョンによっては表示される項目名が異なる場合がある。設定画面に当該フィールドが表示されない場合は、Open WebUI のリリースノートを確認すること)に以下のような JSON を設定すると、表を高精度モードで抽出し、日本語の図中テキストを OCR で読み取れる:
    {
      "do_ocr": true,
      "pdf_backend": "dlparse_v2",
      "table_mode": "accurate",
      "ocr_engine": "tesseract",
      "ocr_lang": ["jpn", "eng"]
    }

    pdf_backend の値は Docling のバージョンによって異なる場合がある。dlparse_v2 が現行の代表的な指定値だが、docker logs docling-serve で起動ログを確認するか、Docling のリリースノートで使用中のバージョンに有効なバックエンド名を確認すること。ocr_lang は Tesseract では 3 文字コード(日本語 jpn、英語 eng)で指定する。数式・化学式を多く含む文書では table_modeaccurate にすると構造保持が向上する。

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

手順 4:動作確認

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

ヒント

考察ポイント

付録:他のモデルを試す

本手順では、動作確認用に 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)で最新の正式タグ名を確認してから使用すること。