手元の PC で完結するローカル LLM ― RAG と複数モデルのクロスチェックで、外部に出せない文書を読み込み・推敲・点検する(Ollama+Open WebUI/CPU/GPU 対応・Windows)

目次

【概要】 大規模言語モデル(LLM)は、入力された文に続く次のトークンを確率的に予測する仕組みであり、出力に誤りを含む可能性がある。RAG(検索拡張生成)は、LLM が既存資料を検索し、その結果を踏まえて応答を生成することで、固有情報や最新情報を要する質問への対応力を高める仕組みである。ローカル運用、複数モデルの併用、複数段階の判定により、応答の精度と情報セキュリティを高めることができる。

本ページでは、Windows 上に Ollama と Open WebUI を導入し、文書を外部サービスに送信せず、手元の PC 内で読み込み・要約・推敲・不備検出・相互矛盾検出を行う環境を構築する。

スライド資料

[PDF], [パワーポイント] (同じ内容, クリックしてダウンロード)

動画

[動画]

はじめに

本手順は、Windows 上でローカル LLM 環境を構築し、インストール後の基本動作、RAG、複数モデルによるクロスチェック、長文文書の点検を行う。基盤は Ollama、フロントエンドは Open WebUI である。

重要な設定として、Ollama には KV キャッシュ q8_0、Flash Attention、有効ロードモデル数 1、並列数 1 を設定する。これにより、モデル切替時のメモリ圧迫を避け、授業用 PC での動作を安定させる。

なお、コンテキスト長は最初から全モデル共通で 262144 トークンには設定しない。コンテキスト長を大きくすると KV キャッシュが大きくなり、モデル本体が小さくてもメモリ不足や極端な低速化が起こり得るためである。本手順では通常運用の既定値を 32768 とし、冊子全文や長文規程を一括投入する必要がある場合だけ、後述の「長文用コンテキスト設定」でモデル別に 131072 または 262144 を指定する。

本手順で用いるモデルは、次の 2 段階で導入する。

  1. 最初に、最軽量の動作確認用モデル LFM2.5-1.2B-Instruct と、埋め込みモデル bge-m3 を導入する。Ollama、Open WebUI、RAG の基本動作を確認する。
  2. 次に、一段上のモデル gemma4:e2b-it-qat と、上位の gemma4:12b-it-qat を追加する。さらにメモリに余裕がある場合のみ、gemma4:26b-a4b-it-qat を追加する。26B モデルは任意であり、コピー&ペーストで自動的に実行されないよう、別コマンドとして分離している。

前提知識(用語の整理)

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

LLM(Large Language Model、大規模言語モデル)は、大量のテキストを学習したニューラルネットワークであり、対話・要約・翻訳・校閲などを行う。入力テキストをトークンに分割し、入力された文に続く次のトークンを確率的に予測することで文章を生成する。この仕組み上、出力は事実と異なる内容を含む可能性がある。

学習と推論

学習はモデルのパラメータを更新する工程、推論は学習済みモデルに入力を与えて応答を得る工程である。本手順では学習やファインチューニングは扱わず、学習済みモデルによる推論のみを行う。

量子化と GGUF

量子化は、モデル内部の重みパラメータを低ビット精度に圧縮し、ファイルサイズと必要メモリを削減する技術である。GGUF は llama.cpp 系ツールで用いられるモデル形式であり、Ollama も内部で llama.cpp 系の仕組みを利用する。

GPU の利用について

Ollama は、対応 GPU があれば自動的に利用する。NVIDIA GPU では CUDA、Apple Silicon では Metal、対応 GPU がない場合は CPU で実行される。利用者が本手順内で CUDA を明示的に設定する必要はない。

ローカル運用とは

ローカル運用とは、入力文書やプロンプトを外部の生成 AI サービスへ送信せず、手元の PC 内で推論を完結させる運用形態である。ただし、モデルや Python パッケージの初回ダウンロード時にはインターネット接続を使用する。

RAG とは

RAG(Retrieval-Augmented Generation、検索拡張生成)は、ユーザの質問に応じて、事前に登録した資料から関連箇所を検索し、その検索結果を文脈として LLM に渡したうえで応答を生成する仕組みである。学内規程、教科書、学習指導要領、過去問題、社内規程など、モデルが事前学習していない固有情報を扱うときに有効である。

コンテキスト長について

コンテキスト長とは、LLM が一度に処理できる入力と出力の合計トークン数の上限である。長くすると長文を一括投入できるが、KV キャッシュのメモリ使用量が増える。本手順では通常運用の既定値を 32768 とし、長文一括検査が必要な場合のみモデル別の長文用設定を作成する。

動作確認用モデル:LFM2.5-1.2B-Instruct

本手順では、最初に Liquid AI 社の LFM2.5-1.2B-Instruct を使用する。軽量で動作が速く、Ollama と Open WebUI の動作確認に適している。

公式情報:https://www.liquid.ai/blog/introducing-lfm2-5-the-next-generation-of-on-device-ai

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

  1. open-webui:ブラウザで LLM を利用するための UI 本体である。本手順では通常ユーザーの Python 仮想環境にインストールする。
  2. sentence-transformers:埋め込みの基礎演習で使用する。Open WebUI と同じ仮想環境に導入する。
  3. docling:PDF、Word、PowerPoint などを解析し、Markdown 等に変換する文書パーサである。演習 5 では Python から直接呼び出す。
  4. bge-m3:多言語の埋め込みモデルである。Open WebUI の RAG では Ollama 経由で使用する。
  5. bge-reranker-v2-m3:検索候補を質問との関連度で再順位付けするモデルである。Open WebUI の Reranking Model として使用する。

前準備

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' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

Python の開発環境 Visual Studio Code のインストールと Python 用の設定

Python の開発環境Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を整える。

[Windows での Visual Studio Code のインストールと Python 用の設定手順を見るには、ここをクリック]

Windows での Visual Studio Code のインストールと Python 用の設定手順

1. VS Code と拡張機能のインストール

以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.

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

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

インストールコマンド


REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
winget uninstall -e --id Microsoft.VisualStudioCode --silent --disable-interactivity --accept-source-agreements
rmdir /s /q C:\ProgramData\vscode-extensions 2>nul
rmdir /s /q "%APPDATA%\Code" 2>nul
rmdir /s /q "%USERPROFILE%\.vscode" 2>nul
rmdir /s /q "%LOCALAPPDATA%\Microsoft\vscode-update" 2>nul

REM VS Code をシステム領域に新規インストール
winget install --scope machine --id Microsoft.VisualStudioCode -e --silent --accept-source-agreements --accept-package-agreements

REM 全ユーザー共有の拡張機能フォルダ
mkdir C:\ProgramData\vscode-extensions 2>nul
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" 2>nul
del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" 2>nul
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"

REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f

REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"

REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions
echo === セットアップ完了 ===

2. Python インタプリタの選択

同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.

  1. コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(Ctrl+Shift+P
  2. Python: Select Interpreter と入力する
  3. 表示される一覧から,使用する Python(例:C:\Program Files\Python312\python.exe)を選択する.

Python プログラム実行手順

[Windows での Python プログラム実行手順を見るには、ここをクリック]

Windows での Python 実行手順(Visual Studio Codeを使用)

プログラムファイルの作成と保存

  1. 左サイドバーの「エクスプローラー」アイコン(Ctrl+Shift+E)をクリックする
  2. 「NO FOLDER OPENED」(作業対象フォルダが未選択の状態)と表示される場合は,「Open Folder」をクリックし,プログラムを保存するフォルダを選択する

    続いて「フォルダを信用するか」を確認する画面(フォルダ内のコードを実行してよいか確認する VS Code の仕組み)が表示されるので,チェックして Yes を選択する

  3. フォルダ名の右側に表示される「新しいファイル」アイコンをクリックする
  4. ファイル名(例:aitask.py.ファイル名は何でも良い)を入力し Enter を押す.拡張子は .py(Python ファイルを示す拡張子)とする
  5. 実行したいコードを選択し,Ctrl+C でコピーする.VS Code のエディタ領域に Ctrl+V で貼り付ける
  6. Ctrl+S で保存する

プログラムの実行

  1. エディタ右上の三角形「▷」アイコン(Run Python File:現在開いている Python ファイルを実行するボタン)をクリックする.または,エディタ上で右クリックし「ターミナルで Python ファイルを実行」を選択する
  2. VS Code 下部のターミナル(コマンドの入出力を表示する画面)に,実行結果(print 関数の出力等)が表示される
  3. tkinter(Python 標準の GUI ライブラリ)のファイル選択ダイアログを使うプログラムを実行した場合は,ダイアログが開くので対象画像を選択する
  4. VS Code 下部のターミナルで実行結果を確認する.OpenCV ウィンドウ(OpenCV が画像を表示するために開く専用ウィンドウ)が開いた場合はそちらも確認する.OpenCV ウィンドウは,マウスクリックでウィンドウをアクティブ(操作対象の状態)にしてからキーを押すと終了する

Ollama、LFM2.5-1.2B-Instruct モデルのインストール

まず最軽量の動作確認用モデル LFM2.5-1.2B-Instruct と、RAG 用の埋め込みモデル bge-m3 を導入する。あわせて、Ollama のモデル保存先、KV キャッシュ、通常運用のコンテキスト長、同時ロード数を設定する。

ハードウェアの前提

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

管理者権限でコマンドプロンプトを起動する。実行時はコマンド全体をコピー&ペーストする。

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

REM === 0. 本ガイドで使うモデルタグ ===
REM モデルタグが変わった場合は、この部分だけ変更する
set "MODEL_LFM=LiquidAI/lfm2.5-1.2b-instruct"
set "MODEL_EMBED=bge-m3"

REM === 1. Ollama の配置先とモデル保存先 ===
set "OLLAMA_ROOT=C:\Ollama"
set "OLLAMA_MODEL_DIR=C:\Ollama\models"

winget source update

REM === 2. Ollama 環境変数を Machine スコープで設定 ===
REM 262144 を全モデル共通にしない。通常運用の既定値は 32768 とする。
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_FLASH_ATTENTION', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_KV_CACHE_TYPE', 'q8_0', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_CONTEXT_LENGTH', '32768', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MAX_LOADED_MODELS', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_NUM_PARALLEL', '1', 'Machine')"
powershell -NoProfile -Command "[System.Environment]::SetEnvironmentVariable('OLLAMA_MODELS', 'C:\Ollama\models', 'Machine')"

REM 現在のコマンドプロンプトにも反映
set "OLLAMA_FLASH_ATTENTION=1"
set "OLLAMA_KV_CACHE_TYPE=q8_0"
set "OLLAMA_CONTEXT_LENGTH=32768"
set "OLLAMA_MAX_LOADED_MODELS=1"
set "OLLAMA_NUM_PARALLEL=1"
set "OLLAMA_MODELS=%OLLAMA_MODEL_DIR%"

REM === 3. 既存 Ollama プロセスを停止 ===
taskkill /IM ollama.exe /F >nul 2>&1
taskkill /IM "ollama app.exe" /F >nul 2>&1

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

REM === 5. 既存モデルの移動 ===
if exist "%USERPROFILE%\.ollama\models" robocopy "%USERPROFILE%\.ollama\models" "%OLLAMA_MODEL_DIR%" /E /MOVE
if exist "%USERPROFILE%\.ollama\models" rd /s /q "%USERPROFILE%\.ollama\models"

REM === 6. Ollama のインストール ===
winget uninstall --id Ollama.Ollama -e --silent --disable-interactivity --accept-source-agreements
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"

REM === 7. PATH 設定 ===
powershell -NoProfile -Command "$paths=@('C:\Ollama',(Join-Path $env:LOCALAPPDATA 'Programs\Ollama')); $c=[Environment]::GetEnvironmentVariable('Path','Machine'); foreach($p in $paths){ if((Test-Path $p) -and (';'+$c+';' -notlike ('*;'+$p+';*'))){$c=$c+';'+$p} }; [Environment]::SetEnvironmentVariable('Path',$c,'Machine')"
set "PATH=C:\Ollama;%LOCALAPPDATA%\Programs\Ollama;%PATH%"

REM === 8. Ollama サービス起動 ===
start "Ollama Server" /min cmd /c ollama serve
timeout /t 10 /nobreak >nul

REM === 9. 動作確認用モデルの取得 ===
echo LFM2.5-1.2B-Instruct モデルをダウンロード中...
ollama pull "%MODEL_LFM%"

REM === 10. RAG 用埋め込みモデルの取得 ===
echo bge-m3 埋め込みモデルをダウンロード中...
ollama pull "%MODEL_EMBED%"

REM === 11. 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"
set "PATH=C:\Program Files\Git\cmd;%PATH%"

REM === 12. CUI 起動用バッチとショートカット作成 ===
(
echo @echo off
echo start "Ollama Server" /min cmd /c ollama serve
echo timeout /t 3 /nobreak ^>nul
echo ollama run %MODEL_LFM%
) > "C:\Ollama\run-lfm.cmd"

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

echo インストール完了

演習 1.Ollama の動作確認(CUI)

Ollama 自体が動作することを確認する。

  1. スタートメニューから「Ollama LFM2.5 1.2B」を実行する。
  2. チャット用ウィンドウにプロンプト記号 >>> が表示されたら、質問を入力する。
  3. 応答が返ることを確認する。
  4. /bye を入力して終了する。

質問例:

日本の首都はどこですか?

LFM2.5-1.2B-Instruct による動作確認の準備

次に Open WebUI を導入する。Open WebUI は通常ユーザーの Python 仮想環境にインストールする。管理者権限で --user インストールを行うと、管理者ユーザー側のプロファイルに入ることがあるため、本手順では仮想環境に統一する。

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

通常のコマンドプロンプトを起動し、以下を実行する。管理者として実行しない。

REM ============================================================
REM Open WebUI 用 Python 仮想環境
REM Python 3.11 を使う場合は py -3.12 を py -3.11 に読み替える

set "OWUI_VENV=%LOCALAPPDATA%\open-webui-venv"

py -3.12 -m venv "%OWUI_VENV%"

"%OWUI_VENV%\Scripts\python.exe" -m pip install --upgrade pip
"%OWUI_VENV%\Scripts\python.exe" -m pip install --upgrade open-webui sentence-transformers

REM インポート確認
"%OWUI_VENV%\Scripts\python.exe" -c "import open_webui; print('open-webui OK')"
"%OWUI_VENV%\Scripts\python.exe" -c "import sentence_transformers; print('sentence-transformers OK')"

REM Open WebUI 起動用バッチ作成
> "%USERPROFILE%\Start-Open-WebUI.cmd" echo @echo off
>> "%USERPROFILE%\Start-Open-WebUI.cmd" echo start "Ollama Server" /min cmd /c ollama serve
>> "%USERPROFILE%\Start-Open-WebUI.cmd" echo timeout /t 5 /nobreak ^>nul
>> "%USERPROFILE%\Start-Open-WebUI.cmd" echo set HOST=127.0.0.1
>> "%USERPROFILE%\Start-Open-WebUI.cmd" echo set PORT=8080
>> "%USERPROFILE%\Start-Open-WebUI.cmd" echo "%OWUI_VENV%\Scripts\open-webui.exe" serve

REM ユーザーのスタートメニューにショートカット作成
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $l=$s.CreateShortcut([Environment]::GetFolderPath('Programs')+'\Open WebUI Local.lnk'); $l.TargetPath=$env:USERPROFILE+'\Start-Open-WebUI.cmd'; $l.WorkingDirectory=$env:USERPROFILE; $l.Save()"

echo Open WebUI のインストール完了

演習 2.インストール完了の確認

新しい通常のコマンドプロンプトを起動し、以下のコマンドを順に実行する。

REM Ollama のバージョン表示
ollama --version

REM 登録済みモデルの一覧
ollama list

REM Python のバージョン表示
py -3.12 --version

REM Open WebUI 仮想環境内の Python
"%LOCALAPPDATA%\open-webui-venv\Scripts\python.exe" --version

REM 主要 Python パッケージのインポート可否確認
"%LOCALAPPDATA%\open-webui-venv\Scripts\python.exe" -c "import open_webui; print('open-webui OK')"
"%LOCALAPPDATA%\open-webui-venv\Scripts\python.exe" -c "import sentence_transformers; print('sentence-transformers OK')"

REM open-webui 実行ファイルの確認
dir "%LOCALAPPDATA%\open-webui-venv\Scripts\open-webui.exe"

REM 設定済み環境変数の確認
echo OLLAMA_MODELS=%OLLAMA_MODELS%
echo OLLAMA_CONTEXT_LENGTH=%OLLAMA_CONTEXT_LENGTH%
echo OLLAMA_FLASH_ATTENTION=%OLLAMA_FLASH_ATTENTION%
echo OLLAMA_KV_CACHE_TYPE=%OLLAMA_KV_CACHE_TYPE%
echo OLLAMA_MAX_LOADED_MODELS=%OLLAMA_MAX_LOADED_MODELS%
echo OLLAMA_NUM_PARALLEL=%OLLAMA_NUM_PARALLEL%

考察ポイント

演習 3.Open WebUI の動作検証(ブラウザ)

Open WebUI から Ollama のモデルを呼び出せることを確認する。

  1. スタートメニューから「Open WebUI Local」を実行する。あるいは、通常のコマンドプロンプトで以下を実行する。
    "%USERPROFILE%\Start-Open-WebUI.cmd"
  2. ブラウザで http://localhost:8080 を開く。
  3. 初回アクセス時は管理者アカウントを作成する。
  4. モデル選択欄から LiquidAI/lfm2.5-1.2b-instruct を選択する。
  5. 質問を入力し、応答が返ることを確認する。

質問例:

日本の首都はどこか。

演習 4.Open WebUI の初期設定(PDF 読み込み・RAG のための準備)

PDF・Office 文書の読み込みおよび RAG に向けた初期設定を行う。

  1. Open WebUI の管理者パネルを開く。
  2. Settings → Documents を開く。
  3. Embedding Model Engine を Ollama に設定する。
  4. Embedding Model に bge-m3 を入力する。
  5. Enable Hybrid Search をオンにする。
  6. Reranking Model に BAAI/bge-reranker-v2-m3 を入力する。
  7. Top K を 510 に設定する。
  8. Chunk Size を 10001500 に設定する。
  9. Chunk Overlap を 100200 に設定する。
  10. Content Extraction Engine は当面 Default のままとする。
  11. 保存する。

演習 5.Docling による文書の構造化抽出(文書解析の基礎)

RAG パイプラインの前段にあたる「文書解析」を体験する。この演習では、Open WebUI への接続ではなく、Docling を Python から直接呼び出す。

準備:Docling のインストール

set "OWUI_VENV=%LOCALAPPDATA%\open-webui-venv"

"%OWUI_VENV%\Scripts\python.exe" -m pip install --upgrade docling
"%OWUI_VENV%\Scripts\python.exe" -c "import docling; print('docling version:', getattr(docling, '__version__', 'unknown'))"

作業フォルダの作成

mkdir C:\work\docling-test
cd /d C:\work\docling-test

C:\work\docling-testsample.pdf または sample.docx を置く。

Python コード

from pathlib import Path
from docling.document_converter import DocumentConverter

base_dir = Path(r"C:\work\docling-test")

pdf_path = base_dir / "sample.pdf"
docx_path = base_dir / "sample.docx"

if pdf_path.exists():
    input_path = pdf_path
else:
    input_path = docx_path

print(f"読み込み対象: {input_path}")

converter = DocumentConverter()
result = converter.convert(str(input_path))

markdown_text = result.document.export_to_markdown()

output_path = base_dir / "sample.md"
with open(output_path, "w", encoding="utf-8") as f:
    f.write(markdown_text)

print(f"変換完了:{output_path} に出力")
print("先頭 500 文字:")
print(markdown_text[:500])

上のコードを C:\work\docling-test\extract_docling.py として保存し、以下で実行する。

"%LOCALAPPDATA%\open-webui-venv\Scripts\python.exe" C:\work\docling-test\extract_docling.py

考察ポイント

演習 6.埋め込みベクトルと意味的類似度(埋め込みの基礎)

RAG の中核概念である埋め込みを体験する。

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer("BAAI/bge-m3")

sentences = [
    "猫がソファの上で眠っている。",
    "ネコがソファーで寝ています。",
    "犬が庭で走り回っている。",
    "今日の株価は大きく下落した。",
    "The cat is sleeping on the sofa.",
]

embeddings = model.encode(sentences, convert_to_numpy=True)

norms = np.linalg.norm(embeddings, axis=1, keepdims=True)
normalized = embeddings / norms
similarity_matrix = normalized @ normalized.T

print("埋め込みベクトルの形状:", embeddings.shape)
print()

print("コサイン類似度行列:")
print("         ", "  ".join([f"S{i}" for i in range(len(sentences))]))
for i, row in enumerate(similarity_matrix):
    print(f"S{i}:", "  ".join([f"{v:+.3f}" for v in row]))

print()
for i, s in enumerate(sentences):
    print(f"S{i}: {s}")

上のコードを embedding_similarity.py として保存し、以下で実行する。

"%LOCALAPPDATA%\open-webui-venv\Scripts\python.exe" embedding_similarity.py

考察ポイント

演習 7.Open WebUI の Knowledge による RAG(検索拡張生成の体験)

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

架空教科書作成委員会の規程(教科書冊子の校閲に関する内規)

第1条 教科書冊子の校閲は、最低 2 名の異なる教員が独立に行う。
第2条 校閲後、不備が見つかった場合は、修正案を「修正提案票(様式 7)」に記入する。
第3条 校閲完了の期限は試験日の 14 日前とする。
第4条 校閲対象は、設問本文、選択肢、配点、参照図表の整合性、および冊子全体の用語統一とする。
第5条 校閲記録は試験日から 3 年間保管する。
第6条 学外公開を伴う試験(模擬試験、外部公開答案を含む)の校閲については、校閲者 2 名のうち少なくとも 1 名は当該教科の専任教員でなければならない。

上の内容を %USERPROFILE%\test_regulation.txt として UTF-8 で保存する。

手順

  1. Open WebUI を起動し、http://localhost:8080 を開く。
  2. Workspace → Knowledge を開く。
  3. 新規 Knowledge を作成し、名前を「校閲規程」とする。
  4. test_regulation.txt を追加する。
  5. 新しいチャットを開始し、モデル LFM2.5-1.2B-Instruct を選択する。
  6. チャット入力欄で # を入力し、「校閲規程」を選択する。
  7. 以下の質問を送信する。
教科書冊子の校閲は何名で行うか。校閲記録の保管期間とあわせて答えよ。
外部公開する模擬試験の答案を、非常勤講師 2 名で校閲することは本規程上認められるか。根拠条文とあわせて答えよ。

考察ポイント

演習 8.単一設問の不備検出(条件不足・複数解の検出)

あなたは教科書のレビュアーである。次の設問に不備(条件不足・矛盾・複数解・図表参照不能)がないか検出せよ。不備があれば指摘のみを返し、解答は試みるな。

設問:ある長方形の面積は 24 平方センチメートルである。この長方形の周の長さを求めよ。

考察ポイント

演習 9.誤字・送り仮名・係り受けの検出

あなたは教科書のレビュアーである。次の設問本文に、誤字、送り仮名の誤り、係り受けの不整合がないか検出せよ。検出した場合は該当箇所と問題点を指摘せよ。

設問:次の文章を読み、問いに答えなさい。山田氏は研究室で長年に渡り実験を続けて、その成果を学界に発表する事を決断した。しかし、彼の研究は同僚から疑問視するられている部分もあり、論文の投稿前に再度の検証が必要であると考えていた。問い:山田氏が直面している課題を述べよ。

考察ポイント

演習 10.思考モード オン/オフ の比較

思考モードに対応するモデルで、演習 8 と同じプロンプトを「思考モードオフ」と「思考モードオン」で実行し、応答を比較する。

考察ポイント

gemma4:e2b-it-qat・gemma4:12b-it-qat モデルのインストール(任意で 26b-a4b-it-qat)

LFM2.5-1.2B-Instruct の動作確認後、一段上のモデルとして gemma4:e2b-it-qatgemma4:12b-it-qat を導入する。gemma4:26b-a4b-it-qat は任意であり、メモリとディスク容量に余裕がある場合だけ別途導入する。

本節のモデルタグは、Ollama 側で利用可能であることを前提とする。タグ名を変更する場合は、コマンド冒頭の MODEL_GEMMA_E2BMODEL_GEMMA_12BMODEL_GEMMA_26B の値だけを変更する。

管理者権限でコマンドプロンプトを起動し、以下を実行する。

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

REM === 0. モデルタグ ===
set "MODEL_GEMMA_E2B=gemma4:e2b-it-qat"
set "MODEL_GEMMA_12B=gemma4:12b-it-qat"
set "MODEL_GEMMA_26B=gemma4:26b-a4b-it-qat"

set "OLLAMA_ROOT=C:\Ollama"

REM === 1. Ollama サービス起動 ===
start "Ollama Server" /min cmd /c ollama serve
timeout /t 10 /nobreak >nul

REM === 2. 本番モデルの取得 ===
echo gemma4:e2b-it-qat モデルをダウンロード中...
ollama pull "%MODEL_GEMMA_E2B%"

echo gemma4:12b-it-qat モデルをダウンロード中...
ollama pull "%MODEL_GEMMA_12B%"

REM === 3. 26B モデルは任意 ===
REM メモリとディスクに余裕がある場合だけ、別節の 26B 用コマンドを実行する。

REM === 4. CUI 起動用バッチ作成 ===
(
echo @echo off
echo start "Ollama Server" /min cmd /c ollama serve
echo timeout /t 5 /nobreak ^>nul
echo ollama run %MODEL_GEMMA_E2B%
) > "%OLLAMA_ROOT%\run-gemma4-e2b.cmd"

(
echo @echo off
echo start "Ollama Server" /min cmd /c ollama serve
echo timeout /t 5 /nobreak ^>nul
echo ollama run %MODEL_GEMMA_12B%
) > "%OLLAMA_ROOT%\run-gemma4-12b.cmd"

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

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

echo インストール完了

26B モデルを使う場合だけ追加で実行

メモリ 32GB 以上を目安とし、余裕がある場合だけ実行する。

set "MODEL_GEMMA_26B=gemma4:26b-a4b-it-qat"

start "Ollama Server" /min cmd /c ollama serve
timeout /t 10 /nobreak >nul

ollama pull "%MODEL_GEMMA_26B%"

(
echo @echo off
echo start "Ollama Server" /min cmd /c ollama serve
echo timeout /t 5 /nobreak ^>nul
echo ollama run %MODEL_GEMMA_26B%
) > "C:\Ollama\run-gemma4-26b.cmd"

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

長文用コンテキスト設定(必要時のみ)

通常は OLLAMA_CONTEXT_LENGTH=32768 のまま使う。冊子全文、長大な規程群、契約書群などを一括投入する必要がある場合だけ、十分なメモリを備えた PC で長文用のモデルエイリアスを作成する。

12B モデルを 262144 トークンで使う例

set "MODEL_GEMMA_12B=gemma4:12b-it-qat"

echo FROM %MODEL_GEMMA_12B%> C:\Ollama\Modelfile-gemma4-12b-ctx262k
echo PARAMETER num_ctx 262144>> C:\Ollama\Modelfile-gemma4-12b-ctx262k

ollama create gemma4:12b-it-qat-ctx262k -f C:\Ollama\Modelfile-gemma4-12b-ctx262k

Open WebUI では、通常モデルではなく次のモデルを選択する。

gemma4:12b-it-qat-ctx262k

注意

演習 11.本番モデルの登録確認と動作検証

ollama list

以下が表示されることを確認する。

CUI で動作を確認する。

ollama run gemma4:e2b-it-qat
ollama run gemma4:12b-it-qat

終了する場合は /bye を入力する。

演習 12.複数モデルクロスチェック(単一設問の不備検出)

演習 8 と同一のプロンプトを複数モデルで実行し、指摘内容の一致/不一致を判定する。

あなたは教科書のレビュアーである。次の設問に不備(条件不足・矛盾・複数解・図表参照不能)がないか検出せよ。不備があれば指摘のみを返し、解答は試みるな。

設問:ある長方形の面積は 24 平方センチメートルである。この長方形の周の長さを求めよ。

判定ルール

演習 13.冊子横断検出(設問間のヒント・誘導・解答漏洩)

あなたは教科書のレビュアーである。次の設問 1 から設問 3 までを通読し、設問間にヒント、誘導、解答漏洩がないか相互参照で検出せよ。検出した場合は該当箇所と問題点を指摘せよ。

設問 1:以下の三角形 ABC の面積を求めよ。底辺は 5cm、高さは 4cm である。

設問 2:三角形の面積は「底辺 × 高さ ÷ 2」で求められる。この公式を用いて、底辺 3cm、高さ 2cm の三角形の面積を求めよ。

設問 3:底辺 6cm、高さ 8cm の三角形の面積を求めよ。

考察ポイント

演習 14.二段プロンプト戦略(不備検出 → 通常解答)

第一段:不備検出

あなたは教科書のレビュアーである。次の設問 1 および設問 2 について、不備(条件不足・矛盾・複数解・図表参照不能)の有無を最優先で検出せよ。不備がある場合は解答を試みず、不備の内容のみを指摘せよ。不備がない場合は「不備なし」とのみ返答せよ。

設問 1:ある長方形の面積は 24 平方センチメートルである。この長方形の周の長さを求めよ。

設問 2:底辺 6cm、高さ 8cm の三角形の面積を求めよ。

第二段:不備なし設問のみ解答

次の設問に解答せよ。

設問:底辺 6cm、高さ 8cm の三角形の面積を求めよ。

期待される解答

24 平方センチメートル

演習 15.国語教科冊子の品質チェック(総合演習)

本演習で扱う品質チェックの観点

  1. 誤字・脱字・送り仮名・表記ゆれ
  2. 係り受けの不整合・主述の不一致
  3. 設問条件の不足・矛盾・複数解
  4. 図表・本文・選択肢の参照整合性
  5. 設問間のヒント・誘導・解答漏洩
  6. 選択肢の唯一性・排他性
  7. 用語・配点・指示語の冊子内一貫性

サンプル冊子

【国語 小テスト(サンプル)】
配点:各問 10 点

問 1 次の文章を読み、後の問いに答えなさい。
 「言葉は人と人とを繋ぐ橋である。私たちは日常において、絶えず言葉を交わし、互いの考えを伝え合っている。しかし、その言葉が時に誤解を生む事もある。なぜなら、同じ言葉でも受け取り方は人によって異なるからだ。」
 問い:筆者が「言葉」をどのようなものとして捉えているか、本文中から十字以内で抜き出しなさい。

問 2 次の文の傍線部の主語を答えよ。
 「彼は昨日、図書館で借りた本を友人に貸してあげた、その本は今日返ってきた。」

問 3 次の語の対義語を答えなさい。配点:各 5 点
 (1)需要 (2)抽象

問 4 次の文章の内容として最も適切なものを、下のアからエの中から一つ選べ。
 「読書は知識を広げる行為であり、また想像力を養う営みでもある。本を読むことは、他者の経験を追体験する事につながる。」
 ア 読書とは知識を広げる行為のみを指す。
 イ 読書は想像力を養うためだけの活動である。
 ウ 読書は気晴らしのための娯楽の一種である。
 エ 読書は知識を広げ、想像力を養い、他者の経験を追体験することにつながる。

問 5 上記の問 4 で扱った「読書」について、あなた自身の経験に基づいて百二十字以内で論じなさい。

問 6 次の文章中の傍線部「これ」が指す内容を答えなさい。
(※本文省略)

検査用プロンプト

あなたは国語の教科書冊子のレビュアーである。次の冊子全体について、以下の 7 観点で不備を検出せよ。検出した場合は、該当箇所(問番号と本文・選択肢の引用)と、どの観点に該当するか、何が問題かを示せ。検出しなかった場合は「該当なし」と返答せよ。解答そのものは出力するな。

観点:
1. 誤字・脱字・送り仮名・表記ゆれ
2. 係り受けの不整合・主述の不一致
3. 設問条件の不足・矛盾・複数解
4. 図表・本文・選択肢の参照整合性(参照先の本文や図表が冊子内に存在するか)
5. 設問間のヒント・誘導・解答漏洩
6. 選択肢の唯一性・排他性
7. 用語・配点・指示語の冊子内一貫性

冊子:
(ここにサンプル冊子を貼り付ける)

演習 16.長文・機密文書の相互矛盾検出(ローカル環境の特徴を生かす総合演習)

本演習では、ローカル環境、長文コンテキスト、複数モデルのクロスチェックを組み合わせ、複数文書をまたいで生じる条文間の矛盾を検出する。

テスト用文書

==== 文書A:就業規則(抜粋) ====
第12条 在宅勤務を希望する従業員は、勤務予定日の3営業日前までに所属長へ申請する。
第13条 在宅勤務時の標準勤務時間は9時から18時とし、休憩は1時間とする。
第27条 機密情報を含むファイルは、会社支給端末にのみ保存し、私物端末への保存を禁止する。
第31条 時間外勤務の上限は1か月あたり45時間とする。

==== 文書B:テレワーク実施ガイドライン ====
2.1 テレワークの申請は、実施日の前日17時までに上長へ届け出るものとする。
2.4 テレワーク時の勤務時間は10時から19時を標準とする。
3.2 業務データは、セキュリティ対策を施した私物端末への保存を認める。
5.1 育児・介護を理由とするテレワークは、当日朝までの申請を認める。

==== 文書C:情報セキュリティ基本方針 ====
4.1 いかなる業務データも、会社が認証した端末以外への保存を一律に禁止する。
4.3 時間外勤務は原則として月40時間を超えてはならない。
6.2 在宅勤務の標準勤務時間は、就業規則に定める時間に準ずる。

プロンプト

あなたは社内規程の整合性をチェックする監査担当である。次に示す複数の社内文書(文書A・文書B・文書C)を通読し、文書をまたいで矛盾している箇所を検出せよ。同一文書内ではなく、異なる文書の条項どうしが食い違っているものを対象とする。検出した各矛盾について、(1)関係する条項を文書名と番号つきで引用し、(2)どう食い違っているかを述べ、(3)どちらを優先すべきか判断材料(上位規程か、より厳しい基準か、例外規定か)を示せ。解決策の押し付けはせず、矛盾の指摘と論点整理にとどめよ。

文書群:
(ここに文書を貼り付ける)

想定される矛盾

長文が入りきらない場合や、262144 トークン設定でメモリ消費が大きい場合は、全文貼り付けではなく Knowledge に文書群を登録して RAG で検査する。

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

図表、数式、化学式、図中テキストを含む PDF を RAG で扱う場合は、Open WebUI の標準抽出エンジンでは構造が十分に保持されないことがある。その場合は docling-serve を別プロセスとして起動し、Open WebUI から接続する。

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

管理者権限でコマンドプロンプトを起動し、以下を実行する。

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

winget install --id Docker.DockerDesktop -e --silent --disable-interactivity --accept-source-agreements --accept-package-agreements

インストール後、Windows の再起動が必要な場合がある。再起動後、Docker Desktop を起動し、タスクトレイの Docker アイコンが実行中になるまで待つ。

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

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

docker rm -f docling-serve

docker run -d --name docling-serve -p 127.0.0.1:5001:5001 -e DOCLING_SERVE_ENABLE_UI=true quay.io/docling-project/docling-serve

NVIDIA GPU を使う場合:

docker rm -f docling-serve

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

起動後、ブラウザで次を開く。

http://localhost:5001/ui

手順 3:Open WebUI への接続

  1. Open WebUI の管理者パネル → Settings → Documents を開く。
  2. Content Extraction Engine を Docling に変更する。
  3. Docling Server URL に次を入力する。
    http://localhost:5001
  4. Docling パラメータ欄は、最初は空欄のままとする。
  5. 保存する。

OCR 言語やテーブル詳細設定は、Docling と Open WebUI のバージョン差で指定形式が変わることがあるため、まず既定設定で動作確認する。表や図中文字の抽出品質をさらに調整する段階で、利用中の Open WebUI の設定画面に合わせてパラメータを設定する。

手順 4:停止と再開

docker stop docling-serve
docker start docling-serve

考察ポイント

付録:他のモデルを試す・推論ツールの選択

本手順では、動作確認用に LFM2.5-1.2B-Instruct、本番検証用に gemma4:e2b-it-qat、gemma4:12b-it-qat、任意で gemma4:26b-a4b-it-qat を扱った。Ollama を使うと、モデル名を差し替えることで他のモデルも同じ構成で試せる。

Ollama

本手順で使用する推論基盤である。モデル管理、ローカル API、OpenAI 互換 API を提供する。

LM Studio

GUI 中心で使いたい場合の選択肢である。本手順では扱わない。

vLLM

高スループットや複数同時リクエスト向けの推論基盤である。本手順では扱わない。

高速化用の補助モデルについて

名称に assistant と付く補助モデルは、単独の会話モデルではなく、投機的デコーディングなどで本体モデルと組み合わせて使うためのドラフターである場合がある。校閲や判定そのものを担うモデルとして扱う前に、単独で利用可能なチャットモデルかどうかを確認する。