実は、最近デビューしたことがあって、大学でAIの授業をやることに。話が進み、ゼミのローカルLLMを置くことになった。文系で9割が女子のその学部最大ゼミ。耐えられるかわからないけど。
フロントエンドはOpen WebUIを採用。見た目はChat GPTっぽいというか、機能ごとにUIが別れているから、正確には教科書っぽいというのが正しい。また、RAGもTIKAを導入したのである程度使えるはず。文系の学部なので、文章が主体なので。これがうまく行って、本部にLLMとか置いてくれないかなぁ。緊急入手したM1 ProのMacBook Proだと心許ない。
閑話休題
以下、GithubのReadmeからAIにブログを作ってもらったので、少し適当かも。
なぜこんなものを作ったのか?
ローカル環境で完結するLLM基盤を構築したった。
単体のLLMではなく、以下を含むフルスタック構成にした。
- Chat(LLM)
- RAG(検索+生成)
- Web検索
- 画像生成
- MCP(ツール連携)
フルスタック構成にした理由は、Open WebUIって機能がある?と書かれているわりに詳細設定が書かれていない。なので、都度調べるのだが、環境変数1行追加すればいいケースもあれば、外部コンテナが必要、使えるなんていうのもある。実際に機能が実装された辞書みたいのがないととても動かせない。
以下のGitHubに公開した:
👉 https://github.com/masezou/openwebui-fullstack
※これはあくまで構成サンプルであり、セキュリティは考慮していない。クローンして、動くかもしれないが、余計なものが動くだけではなく、セキュリティ的にガラ空き。API、トークンはサンプルなので注意。少なくとも前段にFWを設置する、わからなければ外部公開は絶対にしないこと。
使い方としては、この設定どうするんだっけ?や、何ができるんだっけ?と参照につかって、自身の構成に適用していったほうがいいかもしれない。
構成概要
今回の構成の特徴は以下。
- GPU / CPU ハイブリッド推論
- Pipelineによる処理分離
- RAG + Web検索の統合
- MCPによるツール拡張
- 日本語対応Tikaによるドキュメント解析
なぜ、ハイブリット推論にしたかというと、CPUは遊んでいるし、CPUが遅いということも体験できる。不要なら、CPU用のollamaを消せばいい。
また、ComfyUIで画像生成が利用できるようにも設定してある。ComfyUIは、インストーラー版もあるので、環境さえあれば、簡単に使える。ComfyUIは、インストールして、ネットワークをリッスンさせる、モデルをダウンロードしておく以外、Workflowなどの用意は不要。モデルはCheckpointにrealvisxlV50_v50LightningBakedvae.safetensorsにmodel.safetensorsという名前で置いておくだけ。
アーキテクチャ図

あくまでも概要図で、実際の設定は、compose.ymlと設定ファイルに収められるものは全て設定してある。正直自分でもリストアップができていないが、UIにあるのに事前に設定が必要で、それが設定されていないから使えないというのを極力回避してある。(それがいいかどうかは別として。)
もし、この環境で、動かなかった場合
- UIのどこかで有効、無効が間違っている
- 実は選んでいるモデルが悪い(MCPは特にそう。)
- モデルの個別設定が必要
のいずれかだと思う。
構成コンポーネント
UI
- OpenWebUI
→ Chat / RAG / 画像生成のフロント
LLM
- Ollama(GPU)
- Ollama(CPU)
👉 GPUがメイン、CPUはfallbackやpipeline用
Pipeline
- カスタムPython
- LM Studio連携も可能
👉 推論ルーティングや前処理を担当
RAG
- Qdrant(ベクトルDB)
- Embedding:Ollama
- Rerank:HF系モデル
👉 ローカルで完結
Web検索
- SearXNG
👉 外部API依存なしのメタ検索
ドキュメント解析
- Apache Tika(日本語フル)
👉 PDF / Office / テキストを解析
Tikaに関しては、日本語の環境を追加したので、イメージを作る必要がある。
MCP
- filesystem
- fetch
- memory (Open WebUIの機能とコンフリクトする。)
- time
- sequential-thinking (Owen 3.5だと不要)
👉 ChatGPT的なツール利用をローカル再現
フォルダ構成
openwebui-fullstack/
├── compose.yml
├── data/
│ └── searxng/
│ └── settings.yml
├── mcpo/
│ └── config.json
├── pipelines/
│ └── ollama-lmstudio_manifold.py
└── tika-ja-full/
├── Dockerfile
└── tika-config.xml
なぜこの構成にしたか
① 単体LLMでは限界がある
- 知識は古い
- hallucinationが起きる
👉 RAGで補完
② Web検索を統合したい
- 最新情報を取得
- LLMと統合
👉 SearXNG採用
③ ツール連携が必要
- ファイル操作
- API取得
👉 MCP導入
④ GPU資源の最適化
- 重い処理 → GPU
- 軽い処理 → CPU
👉 Pipelineで分離
実際に使ってみて
良かった点:
- 完全ローカルで閉じる
- 拡張性が高い
- デモ環境として優秀
課題:
- 初回起動が重い
- GPU前提(軽量化余地あり)
- 設定が多い
注意点
この構成は:
- セキュリティ未考慮
- 認証も最小限
- APIキーもダミー
👉 本番利用は非推奨
さらに、イメージ選定は、CUDAイメージがあるものは、全部CUDAイメージにしてあるが、どれもCUDAイメージにしてもそれほど意味がない。Ollamaは、CUDAイメージはなく、通常のlatestでもGPUが使える。VRAMの消費を考えたらGPUをオフにして普通のイメージを使うのが賢明かもしれない。
使い方(概要)
git clone https://github.com/masezou/openwebui-fullstack.git
cd openwebui-fullstack
docker compose build
docker compose up -d
※Tikaはbuild必須
まとめ
Open WebUI 0.9.2でローカルでできることを全て実装した。使うときは、
- 必要な機能に絞る
- FQDN,IPアドレスを合わせる。https化する(マイクが使えない)
- Secret / API Key / Tokenなどの設定
を必ず行うこと。
おわりに
この構成はまだ発展途上だが、
- デモ
- 教育
- 検証環境
- 設定リファレンス
としてはかなり実用的かと思う。