🤖

【LLM】社内文書をセキュアに検索!OllamaとOpen WebUIで構築する完全無料・RAG環境

に公開3件

はじめに

「業務でChatGPTを使いたいけど、情報漏洩が怖い…」
「社内の大量のPDFや仕様書をベースに回答してほしい…」
「でも、コストはかけたくないし、構築も難しそう…」

そんな悩みをお持ちではないでしょうか?

本記事では、Ollama(LLM実行基盤)、Open WebUI(ChatGPTライクなUI)、そしてSearXNG(プライバシー重視のメタ検索エンジン)を組み合わせることで、完全無料かつインターネットにデータを流さないセキュアなRAG(検索拡張生成)環境を構築する方法を解説します。

さらに、Web検索機能も統合し、最新情報にも対応できる最強のローカルLLM環境を目指します。

概要図:Local LLM + RAG Architecture
※本記事の構成イメージ

課題の背景と解決策

企業におけるLLM活用には、常に「セキュリティ」「コスト」「最新情報の欠如」という3つの壁が立ちはだかります。

既存サービスの課題 vs 本記事の解決策

比較項目 ChatGPT Enterprise / Azure OpenAI 本記事の構成 (Local OSS)
セキュリティ 学習データには使われないが、外部送信は必須 完全ローカル完結 (外部送信ゼロ)
コスト 高額な従量課金や月額費用 完全無料 (電気代のみ)
社内データ連携 追加開発や連携設定が必要 D&Dで即RAG化 (PDF/PPT/動画URL対応)
Web検索 Bing検索などが利用可能 SearXNGで広告なし・プライバシー重視の検索

今回は、これらをDocker Composeひとつで一撃で立ち上げるハンズオン形式で紹介します。

アーキテクチャ概要

今回構築するスタックは以下の通りです。すべてDockerコンテナとして稼働します。

  • Ollama: Llama 3やPhi-3などの高性能LLMをローカルで動かすバックエンド。
  • Open WebUI: ユーザー向けのチャットインターフェース。RAG機能(ベクトルDB)やWeb検索統合機能を標準で持っています。
  • SearXNG: 複数の検索エンジン(Google, Bing, DuckDuckGo等)を統合し、トラッキングを除去して検索するメタ検索エンジン。

構築手順 (Step-by-Step)

1. 前提条件

  • Docker Desktop または Docker Engine がインストールされていること
  • Docker Compose (V2) が利用可能であること
    • ターミナルで docker compose version を実行して確認してください。
    • 古い docker-compose (V1) でも動作しますが、本記事では docker compose コマンドを使用します。
  • (推奨) NVIDIA GPU搭載のマシン(CPUのみでも動作しますが、速度が低下します)
    • GPUを使用する場合は NVIDIA Container Toolkit のセットアップが必要です。
Macユーザー向け: Docker Desktopを使わずColimaで構築する場合

Docker Desktopは有料化等の兼ね合いで避けたい場合、Homebrew + Colimaで環境構築が可能です。

# 必要なツールのインストール
brew install docker docker-compose colima

# Colimaの起動(Dockerデーモンの代わりになります)
colima start --memory 4

※ docker compose コマンドが認識されない場合は、~/.docker/config.json にプラグインパスの設定が必要な場合があります(brew install時のCaveatsを参照)。

*   古い `docker-compose` (V1) でも動作しますが、本記事では `docker compose` コマンドを使用します。
  • (推奨) NVIDIA GPU搭載のマシン(CPUのみでも動作しますが、速度が低下します)
    • GPUを使用する場合は NVIDIA Container Toolkit のセットアップが必要です。

2. ディレクトリ作成と設定ファイルの準備

任意のディレクトリを作成し、作業場所とします。

mkdir my-local-llm
cd my-local-llm

3. docker-compose.yml の作成

以下の docker-compose.yml を作成します。これが環境の設計図です。

version: '3.8'

services:
  # 1. LLM Backend
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_storage:/root/.ollama
    # GPUを使う場合は以下のコメントアウトを解除
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #         - driver: nvidia
    #           count: 1
    #           capabilities: [gpu]
    restart: always

  # 2. UI & RAG Orchestrator
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      # Web検索の設定 (SearXNG連携)
      - ENABLE_RAG_WEB_SEARCH=True
      - RAG_WEB_SEARCH_ENGINE=searxng
      - RAG_WEB_SEARCH_RESULT_COUNT=3
      - SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>
    volumes:
      - open-webui_storage:/app/backend/data
    depends_on:
      - ollama
      - searxng
    restart: always

  # 3. Web Search Engine
  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    ports:
      - "8081:8080"
    volumes:
      - ./searxng:/etc/searxng
    environment:
      - SEARXNG_BASE_URL=http://searxng:8080/
    restart: always

volumes:
  ollama_storage:
  open-webui_storage:

※ setup-searxng 等の設定が別途必要な場合がありますが、最もシンプルな構成としています。本格運用時はSearXNGの settings.yml で json フォーマットを有効にする設定が必要です。

4. 起動

docker compose up -d

起動したら、ブラウザで http://localhost:3000 にアクセスします。
初回は管理者アカウントの作成画面が表示されるので、登録してログインしてください(データはローカルに保存されます)。

使ってみよう

モデルのダウンロード

Open WebUIの画面右上の設定アイコン、またはチャット画面からモデルをプル(ダウンロード)します。

Open WebUI チャット画面

日本語性能が良いモデルとして、まずは以下がおすすめです。

  • llama3: ご存知Metaの最新モデル。英語ベースだが日本語もいける。
  • qwen2.5:3b / qwen2.5:1.5b: 日本語性能が非常に高く、動作も軽量。おすすめ。
  • phi3: Microsoftの軽量モデル。PCスペックが低くても動きやすい。

Ollamaのコマンドラインから落とす場合は以下を実行します:

docker exec -it ollama ollama run qwen2.5:3b

軽量検証のため、qwen2.5:1.5bもおすすめです。

RAG: 社内ドキュメントでチャットする

Open WebUIの「フォルダー」機能、またはチャット欄の「+」ボタンからファイルをアップロードします。

対応フォーマット

以下のファイルに対応しています。

  • PDF

  • PowerPoint (pptx)

  • Excel (xlsx), CSV

  • Word (docx)

  • Markdown (md), Text (txt)

  • YouTube動画 (URL)

    • チャット欄に # を入力し、続けてYouTubeのURLを貼り付けると、字幕(Transcript)を読み込んで回答してくれます。
    • ※ローカルのMP4ファイル等の直接アップロードは、音声認識(Whisper)の設定等が別途必要な場合があるため、現状はテキスト化してからのアップロードを推奨します。

引用(Citation)機能で事実確認

Open WebUIの素晴らしい点は、 「引用機能」 です。
回答の末尾に、参照したドキュメントのリンクと、どの部分(チャンク)を使用したかが表示されます。これをクリックすることで原文を確認できるため、ハルシネーション(嘘の回答)のリスクを軽減できます。
RAGによる回答例(保険証申請)

RAGによる回答例(保険証申請)

RAGによる回答例(マイナンバーカード)

RAGによる回答例(マイナンバーカード)

実際のRAGによる回答例。ドキュメントに基づき、正確に回答している様子

ナレッジベース機能(事前のドキュメント登録)

チャットのたびにアップロードするのではなく、「社員規定」「製品マニュアル」などのまとまったドキュメント群を事前にデータベース化しておくことも可能です。

  1. Open WebUIの左メニュー「ワークスペース」を開く。
  2. 「+ ナレッジベース」で新しいナレッジベース(例: company-rules)を作成し、ファイルをアップロード。
    • ※YouTube動画などをナレッジ化したい場合は、別途文字起こししたテキストファイルをアップロードしてください。
  3. チャット画面で #company-rules のようにナレッジベースを呼び出すことができます。

ナレッジベース作成画面

ナレッジベースアップロード画面

これにより、チーム共有の「社内Wiki」的な使い方が可能になります。

Web検索: 最新情報を取得する

チャット欄の下にある「Web Search」トグルをONにするだけで、インターネット検索が可能になります。
裏側ではSearXNGがGoogle検索などを実行し、その結果をLLMに渡して回答を生成しています。

ユースケース例:
「Shineos Inc.の最新のプレスリリースについて教えて」
「今日のXXの株価の動向は?」

本番環境へのデプロイに向けて

社内の検証環境や本番環境として公開する場合、以下の点に考慮が必要です。

  1. セキュリティ (HTTPS化)
    • Open WebUI自体はHTTPです。前段に Nginx や Traefik などのリバースプロキシを置き、SSL/TLS終端を行ってください。
  2. 認証 (Authentication)
    • Open WebUIにはメール/パスワード認証がありますが、企業利用であれば SSO (Single Sign-On) が望ましいです。OAuth 2.0 / OIDCに対応しているため、OktaやGoogle Workspaceアカウントでのログイン設定を行うことを推奨します。
  3. データの永続化とバックアップ
    • docker-compose.yml の volumes で定義した領域(主に /app/backend/data)に、ユーザーデータ、チャット履歴、ベクトルDBが保存されています。このボリュームを定期的にバックアップしてください。
  4. リソース管理
    • 複数人が同時に重い推論(RAGなど)を行うと、GPUメモリが不足する可能性があります。利用人数に応じたGPU選定(VRAM容量)や、Ollamaの並列処理設定(OLLAMA_NUM_PARALLEL)の調整が必要です。

おわりに

もちろん、予算があればChatGPT Enterpriseなどの有料サービスを利用するのも一つの手です。また、特定の少数のドキュメントだけであれば、GoogleのNotebookLMを活用するのも手軽で強力な選択肢でしょう。

しかし、 「全社の膨大なドキュメントを横断検索したい」「機密情報を一切外部に出したくない」「自社専用のUI/UXにカスタマイズしたい」 といったニーズに対しては、今回構築したセキュアな自社RAG環境が最適解となります。

まずは個人のPCや余っているサーバーで立ち上げて、チームメンバーに触ってもらうところから「スモールスタート」してみてはいかがでしょうか?

次のステップとして、より大規模な運用のためのKubernetesへの展開や、カスタムモデルのファインチューニングなどに興味が出てくるかもしれません。

詳細は、後日弊社ブログ記事で公開する予定です。
https://blog.shineos.com/

Discussion

marasuamarasua

興味はあるけど、スモールスタートするスペックってどれくらい必要なんだろう…?

1
株式会社シャイオス株式会社シャイオス

ご質問ありがとうざいます!

Qwen2.5:3bのような非常に軽量なモデルであれば、Mac mini M1(メモリ8GB/ストレージ256GB)で快適に利用可能です。
実際に弊社でも同等スペックのPCで、Web検索を組み合わせたRAGがスムーズに動作することを確認しています。

スモールスタートの場合、推奨スペックの目安は以下のとおりです。

  • メモリ:8GB以上(快適さを重視するなら16GB)
  • GPU:あれば快適(VRAM 3GB以上推奨)
     ※GPUなしでもCPUのみで実用的な速度は確保可能
  • CPU:4コア以上(Core i5相当)
  • ストレージ:空き容量3GB以上(モデル約1.9GB+Ollama+チャット履歴+RAG)

なお、より高性能なモデル(例えば、Qwen2.5:7bモデルのパラメータ数が70億)を使用することで、RAG検索の正確性向上が期待できます。

Qwenモデルに関する参考情報は、以下のURLをご参照ください。
https://qwen.ai/blog?id=qwen2.5

2
marasuamarasua

ありがとうございます!
参考にさせていただきます!

1