問題の概要:Open WebUIでRAG機能が有効化できない
OllamaとOpen WebUIを組み合わせて、ローカル環境でRAG(Retrieval-Augmented Generation)機能を構築しようとする際、以下のような問題に遭遇することがあります。
- Open WebUIの「RAG」タブや「ドキュメント管理」セクションが表示されない、またはグレーアウトしている。
- ドキュメントをアップロードしようとすると、「No embeddings model found」や「Embeddings model is not loaded」といったエラーメッセージが表示される。
- アップロードしたドキュメントに対して質問を投げても、その内容を参照した回答が得られない。
エラーメッセージ例:
Error: No embeddings model found. Please load an embeddings model first.
あるいは
RAG features are disabled because no embeddings model is available.
この問題は、RAGのコア機能である「埋め込み(Embeddings)」を生成するための専用モデルがOllamaに読み込まれていない、またはOpen WebUIがそのモデルを認識できていないために発生します。
原因の解説:なぜRAG機能が有効化されないのか
RAGを機能させるには、主に以下の3つのコンポーネントが適切に設定されている必要があります。
1. LLM(大規模言語モデル)
質問に最終的に回答を生成するモデルです(例: `llama3.2`, `mistral`, `qwen2.5`など)。これは通常、Ollamaで`ollama run`コマンドを使用する際に指定するモデルであり、多くのユーザーが最初にプルするモデルです。
2. エンベディングモデル(埋め込みモデル)
RAG機能において最も見落とされがちな部分です。このモデルは、アップロードしたドキュメント(PDF, TXT, Wordなど)のテキストを「ベクトル」と呼ばれる数値のリストに変換(ベクトル化)する役割を担います。変換されたベクトルは、ベクトルデータベースに保存され、後で類似検索に使用されます。LLMとエンベディングモデルは目的が異なり、通常は別々の専用モデルが必要です。
3. ベクトルデータベース
エンベディングモデルで生成されたベクトルを保存・検索するためのデータベースです。Open WebUIはデフォルトでChromaDBを使用しますが、設定によりLanceDBなどにも切り替えられます。
根本的な原因は、Ollamaサーバーにエンベディングモデルがプル(ダウンロード)・ロードされていないこと、またはOpen WebUIの設定がそのモデルを指し示していないことにあります。LLMモデルだけではRAGは動作しません。
解決方法:ステップバイステップでのRAG有効化手順
以下の手順で、確実にRAG機能を有効化しましょう。
ステップ1: 適切なエンベディングモデルの選択とプル
まず、Ollamaがサポートするエンベディングモデルをプル(ダウンロード)します。代表的なモデルは`nomic-embed-text`です。これはテキスト埋め込みに特化しており、性能と速度のバランスが良いとされています。
# ターミナルで以下のコマンドを実行
ollama pull nomic-embed-text
実行後、以下のコマンドでモデルがリストに表示されることを確認します。
ollama list
NAME ID SIZE MODIFIED
nomic-embed-text:latest a1b2c3d4e5f6 4.5 GB 2 hours ago
llama3.2:latest g7h8i9j0k1l2 4.7 GB 1 day ago
もし`nomic-embed-text`がうまく動作しない場合、他のエンベディングモデル(例: `mxbai-embed-large`, `all-minilm`)を試してみてください。
ステップ2: Open WebUIの設定(docker-compose.yml)の確認と修正
Open WebUIをDocker Composeで起動している場合がほとんどです。`docker-compose.yml`ファイルを編集して、環境変数でエンベディングモデルを明示的に指定する必要があります。
# docker-compose.yml の例
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434 # macOS/Windowsの場合
# - OLLAMA_BASE_URL=http://172.17.0.1:11434 # Linuxの場合、ホストのIPを指定
- OLLAMA_EMBEDDINGS_MODEL=nomic-embed-text # 追加する環境変数
restart: always
volumes:
open-webui-data:
ポイント:
- `OLLAMA_EMBEDDINGS_MODEL`環境変数を追加し、その値にステップ1でプルしたモデル名(`nomic-embed-text`)を設定します。
- `OLLAMA_BASE_URL`の設定も重要です。Dockerコンテナ内からホストマシンのOllamaサービスに接続するためのURLです。OSによって記述が異なります。
ステップ3: Open WebUIコンテナの再起動
設定を変更したら、Docker Composeを再起動して変更を反映させます。
# docker-compose.ymlがあるディレクトリで実行
docker-compose down
docker-compose up -d
ステップ4: Open WebUI内での確認と動作テスト
ブラウザでOpen WebUI(通常は http://localhost:3000)にアクセスします。
- 左側のナビゲーションバーに「RAG」または「ドキュメント」というタブがアクティブになっていることを確認します。
- 「Workspace」を作成し、その中で「Upload Document」をクリックして、テスト用のテキストファイルやPDFをアップロードしてみます。エラーメッセージが表示されず、アップロードが成功すれば、エンベディングモデルは正しく認識されています。
- チャットインターフェースに戻り、使用するLLM(例: `llama3.2`)を選択します。チャット画面の上部や設定に、「ドキュメントを参照する」や「Retrieve Context」といったオプションが現れるので、それを有効にし、先ほどアップロードしたワークスペースを選択します。
- 「日本で一番高い山は?」といった一般的な質問ではなく、アップロードしたドキュメントにしか書かれていない情報(例: 社内規程の特定の条項、個人のレポートの内容など)について質問し、モデルがその文脈から正しく回答を生成するかテストします。
コード例・コマンド例:トラブルシューティング集
ケース1: モデルはプルしたが、Open WebUIが認識しない
Ollamaサーバーのログを確認し、モデルが要求されているか見てみます。
# Ollamaサーバーのログを表示(別ターミナルで)
ollama serve
# または、すでにサービスとして動いている場合はログを追跡
# (システムによってコマンドは異なります。例: `journalctl -u ollama -f`)
その上で、Open WebUIコンテナ内からOllamaサーバーにアクセスできるか、モデルがリストされるかテストします。
# Open WebUIコンテナ内に入る
docker exec -it open-webui /bin/bash
# コンテナ内からOllamaサーバーにcurlで問い合わせ
curl http://host.docker.internal:11434/api/tags # macOS/Windowsの場合
# 応答に `nomic-embed-text` が含まれているか確認
ケース2: 異なるエンベディングモデルを試したい
まず新しいモデルをプルし、`docker-compose.yml`の環境変数を変更して再起動します。
ollama pull mxbai-embed-large
# docker-compose.yml を編集
# OLLAMA_EMBEDDINGS_MODEL=mxbai-embed-large
docker-compose down && docker-compose up -d
ケース3: ベクトルDBのリセット
ドキュメントのアップロードに失敗したままになっているなど、ベクトルデータベースが不安定な場合、データをリセットできます。Open WebUIのデータボリュームを削除します(アップロードした全ドキュメント情報が失われるので注意)。
docker-compose down -v # -v オプションでボリュームも削除
docker-compose up -d
まとめ・補足情報
OllamaとOpen WebUIでRAG機能を有効化するには、「LLMモデル」とは別に「エンベディングモデル」を明示的にプルし、Open WebUIの設定でそのモデル名を指定するという2点が最も重要な手順です。この設定を怠ると、「No embeddings model found」エラーが発生し、高度なドキュメント対話機能が使えません。
また、本番環境やより高度な利用を想定する場合は、以下の点にも留意すると良いでしょう。
- モデルのバージョン指定: `nomic-embed-text:latest` のように`latest`タグを使うと、予期せぬモデル更新による挙動変化が起こる可能性があります。可能であれば特定のバージョン(`nomic-embed-text:v1.5`など)を指定すると安定します。
- ハードウェアリソース: エンベディングモデルもメモリを消費します。LLMとエンベディングモデルを同時にロードするため、特にRAMが少ない環境(8GB以下)では、軽量なLLMとエンベディングモデルの組み合わせを検討してください。
- Open WebUIのアップデート: Open WebUIは活発に開発が続いており、RAG関連のUIや設定方法がアップデートで変わる可能性があります。公式ドキュメントやGitHubのIssueも参照することをお勧めします。
以上の手順を踏むことで、ローカル環境のOllamaとOpen WebUIを用いて、外部ドキュメントの知識を参照しながら回答を生成する、強力なRAGシステムを構築・利用できるようになります。