Docker + Ollama + AnythingLLMでRAG環境を作成しました
1. はじめに
この記事では、Docker + Ollama + AnythingLLM を使って、ローカル環境に RAG(Retrieval-Augmented Generation) をGUIで作成する流れを整理します。
RAGを自作する場合、通常は文書読み込み、チャンク分割、Embedding、Vector DB、検索、LLMへのプロンプト投入などを自分で実装する必要があります。
一方、AnythingLLMを使うと、これらの多くをGUIで設定できます。
今回は、まずプロトタイプとして、自分のPC上で文書チャットできるRAG環境を作成します。
2. 対象読者
- ローカルLLMを試したい人
- OllamaをDockerで使いたい人
- RAGをGUIで試したい人
- LangChainやLlamaIndexで自作する前に、RAGの動きを確認したい人
- 社内文書や技術メモをローカル環境で検索・質問したい人
3. 全体構成
今回の構成は次のとおりです。
使用するもの
| 項目 | 内容 |
|---|---|
| 実行環境 | Docker / Docker Compose |
| LLM実行 | Ollama |
| RAG GUI | AnythingLLM |
| Vector DB | LanceDB(AnythingLLM側で利用) |
| LLM例 |
llama3.2 など |
| Embedding例 | nomic-embed-text |
| Web UI | http://localhost:3001 |
| Ollama API | http://localhost:11434 |
4. なぜAnythingLLMを使うのか
AnythingLLMは、RAG、ドキュメントチャット、AIエージェントなどをGUIで扱えるオールインワン型のAIアプリです。
特に便利なのは、次の点です。
- PDFやMarkdownなどの文書をGUIでアップロードできる
- ワークスペース単位で文書を管理できる
- OllamaなどのローカルLLMと接続できる
- Embeddingモデルを設定できる
- Vector DBを意識しすぎずにRAGを試せる
- Dockerでセルフホストできる
- ブラウザから利用できる
つまり、RAGの仕組みをコードで全部作る前に、まず動作イメージを確認するための環境として使いやすいです。
5. フォルダー構成
今回は、次のようなフォルダー構成にします。
anythingllm_ollama_rag/
├─ docker-compose.yml
├─ .env
├─ storage/
│ └─ anythingllm/
└─ README.md
storage/anythingllm はAnythingLLMの永続化用フォルダーです。
ここを永続化しておかないと、コンテナを削除したときに、ワークスペース、アップロード文書、チャット履歴などが失われる可能性があります。
6. .env を作成する
まず、.env を作成します。
# AnythingLLMのWeb UIポート
ANYTHINGLLM_PORT=3001
# OllamaのAPIポート
OLLAMA_PORT=11434
# AnythingLLMの保存先
STORAGE_LOCATION=./storage/anythingllm
# AnythingLLM内部で使うシークレット
# 実運用では十分長いランダム文字列に変更してください
JWT_SECRET=change_me_to_a_long_random_string
7. docker-compose.yml を作成する
次に、docker-compose.yml を作成します。
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "${OLLAMA_PORT}:11434"
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
ports:
- "${ANYTHINGLLM_PORT}:3001"
cap_add:
- SYS_ADMIN
environment:
# AnythingLLMの保存先
- STORAGE_DIR=/app/server/storage
- JWT_SECRET=${JWT_SECRET}
# LLMはOllamaを使う
- LLM_PROVIDER=ollama
- OLLAMA_BASE_PATH=http://ollama:11434
- OLLAMA_MODEL_PREF=llama3.2
- OLLAMA_MODEL_TOKEN_LIMIT=4096
# EmbeddingもOllamaを使う
- EMBEDDING_ENGINE=ollama
- EMBEDDING_BASE_PATH=http://ollama:11434
- EMBEDDING_MODEL_PREF=nomic-embed-text:latest
- EMBEDDING_MODEL_MAX_CHUNK_LENGTH=8192
# Vector DBはLanceDBを使う
- VECTOR_DB=lancedb
volumes:
- ${STORAGE_LOCATION}:/app/server/storage
depends_on:
- ollama
restart: unless-stopped
volumes:
ollama_data:
ポイントは、AnythingLLMからOllamaへ接続するURLです。
同じDocker Compose内で起動しているため、次のようにサービス名で接続します。
http://ollama:11434
ホストPCに直接インストールしたOllamaへ、Docker上のAnythingLLMから接続する場合は、環境によって次のように変わります。
Docker Desktopの場合:
http://host.docker.internal:11434
Linuxの場合の例:
http://172.17.0.1:11434
今回は、OllamaもAnythingLLMもDocker Composeで起動するため、http://ollama:11434 を使います。
8. コンテナを起動する
作成したフォルダーで、次を実行します。
docker compose up -d
起動確認は次のコマンドで行います。
docker compose ps
ログを確認する場合は、次を実行します。
docker compose logs -f
Ollamaにモデルを追加する
OllamaコンテナにLLMモデルを追加します。
docker exec -it ollama ollama pull llama3.2
Embedding用モデルも追加します。
docker exec -it ollama ollama pull nomic-embed-text
モデル一覧を確認します。
docker exec -it ollama ollama list
簡単に動作確認します。
docker exec -it ollama ollama run llama3.2
プロンプトが表示されたら、適当に質問して応答が返ることを確認します。
AnythingLLMへアクセスする
ブラウザで次にアクセスします。
http://localhost:3001
初回起動時は、管理者ユーザーの作成や初期設定画面が表示されます。
9. AnythingLLMでOllamaを設定する
画面上で、LLM ProviderとしてOllamaを選択します。
設定例は次のとおりです。
| 設定項目 | 値 |
|---|---|
| LLM Provider | Ollama |
| Base URL | http://ollama:11434 |
| Chat Model | llama3.2 |
| Embedding Provider | Ollama |
| Embedding Base URL | http://ollama:11434 |
| Embedding Model | nomic-embed-text:latest |
| Vector DB | LanceDB |
ここで重要なのは、EmbeddingにはEmbedding用モデルを選ぶことです。
たとえば、llama3.2 はチャット用LLMであり、Embedding用モデルではありません。
Embeddingには、nomic-embed-text のようなEmbeddingモデルを使います。
10. ワークスペースを作成する
AnythingLLMでは、文書や会話を Workspace 単位で管理します。
たとえば、次のように分けると使いやすいです。
| ワークスペース名 | 用途 |
|---|---|
project-docs |
プロジェクト仕様書 |
qiita-notes |
Qiita記事メモ |
manuals |
操作マニュアル |
papers |
論文PDF |
まずは、rag-test のような名前でワークスペースを作成します。
11. 文書をアップロードする
ワークスペースを作成したら、文書をアップロードします。
例として、次のようなファイルを使えます。
- Markdown
- テキスト
- Word文書
- CSV
- Webページ情報
アップロード後、AnythingLLM側で文書が処理され、Embeddingされます。
この処理により、質問時に関連する文書チャンクが検索され、LLMの回答に利用されます。
12. RAGとして質問する
文書をアップロードしたら、チャット欄で質問します。
例:
この文書の目的を3行で要約してください。
この仕様書で重要な設定項目を表にしてください。
実装時に注意すべき点を箇条書きで整理してください。
RAGがうまく動いていれば、アップロードした文書の内容を参照した回答が返ります。
13. RAGの処理イメージ
RAGの処理を簡単に整理すると、次のようになります。
ポイントは、LLMが文書全体を毎回読んでいるわけではないことです。
質問に近い文書チャンクをVector DBから検索し、それをコンテキストとしてLLMに渡しています。
14. GPUを使う場合
OllamaはCPUでも動作しますが、ローカルLLMを快適に使う場合はGPU利用が有効です。
この構成では、GPUを使う主な対象は AnythingLLMではなくOllama側です。
AnythingLLM:GUI、文書管理、RAG、ワークスペース管理
Ollama :LLM推論、Embedding推論 ← GPUを使う主な部分
RAGでは、次の2つの処理で計算負荷が高くなります。
- 回答生成時のLLM推論
- 文書登録時・質問時のEmbedding作成
そのため、Ollama側でGPUを使えるようにすると、回答生成やEmbedding処理が速くなる可能性があります。
この記事では、NVIDIA GPUを使う場合の設定を行います。AMD GPUについては別途記事で載せるつもりです。
14.1. NVIDIA GPUの場合
NVIDIA GPUを使う場合は、ホスト側にNVIDIAドライバとNVIDIA Container Toolkitが必要です。
まず、ホスト側でGPUが認識されているか確認します。
nvidia-smi
次に、DockerコンテナからGPUが見えるか確認します。
docker run --rm --gpus all nvidia/cuda:12.5.0-base-ubuntu22.04 nvidia-smi
この確認が通れば、OllamaコンテナにGPUを渡せる可能性が高いです。
Docker Composeでは、ollama サービスに gpus: all を追加します。
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "${OLLAMA_PORT}:11434"
volumes:
- ollama_data:/root/.ollama
gpus: all
restart: unless-stopped
anythingllm:
image: mintplexlabs/anythingllm:latest
container_name: anythingllm
ports:
- "${ANYTHINGLLM_PORT}:3001"
cap_add:
- SYS_ADMIN
environment:
- STORAGE_DIR=/app/server/storage
- JWT_SECRET=${JWT_SECRET}
- LLM_PROVIDER=ollama
- OLLAMA_BASE_PATH=http://ollama:11434
- OLLAMA_MODEL_PREF=llama3.2
- OLLAMA_MODEL_TOKEN_LIMIT=4096
- EMBEDDING_ENGINE=ollama
- EMBEDDING_BASE_PATH=http://ollama:11434
- EMBEDDING_MODEL_PREF=nomic-embed-text:latest
- EMBEDDING_MODEL_MAX_CHUNK_LENGTH=8192
- VECTOR_DB=lancedb
volumes:
- ${STORAGE_LOCATION}:/app/server/storage
depends_on:
- ollama
restart: unless-stopped
volumes:
ollama_data:
AnythingLLM側の接続先は、CPU構成と同じです。
http://ollama:11434
同じCompose内で起動しているため、localhost:11434 ではなく、サービス名の ollama を使います。
14.2. NVIDIA GPU用のより明示的なCompose指定
環境によっては、gpus: all ではなく、deploy.resources.reservations.devices を使ってGPUを指定する例もあります。
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "${OLLAMA_PORT}:11434"
volumes:
- ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: unless-stopped
まずはシンプルな gpus: all を試し、環境によって動かない場合に上記の書き方を検討するとよいです。
14.3. Windows 11 + Docker DesktopでGPUを使う場合
Windows 11でDocker上のOllamaからGPUを使う場合は、基本的に Docker Desktop + WSL2 + NVIDIA GPU の構成が扱いやすいです。
Windows 11
↓
NVIDIA Driver
↓
Docker Desktop / WSL2 backend
↓
Ollama Docker container
↓
GPU推論
↓
AnythingLLM Docker container
確認手順の例は次のとおりです。
# ホスト側でGPU確認
nvidia-smi
# DockerからGPU確認
docker run --rm --gpus all nvidia/cuda:12.5.0-base-ubuntu22.04 nvidia-smi
# コンテナ起動
docker compose up -d
# モデル取得
docker exec -it ollama ollama pull llama3.2
docker exec -it ollama ollama pull nomic-embed-text
# 動作確認
docker exec -it ollama ollama run llama3.2
もしDocker上でGPU認識がうまくいかない場合は、次を確認します。
- Docker DesktopがWSL2 backendで動いているか
- NVIDIAドライバが新しいか
- NVIDIA Container Toolkitが導入されているか
-
docker run --rm --gpus all ... nvidia-smiが成功するか
14.4. GPUを使う場合の注意点
GPUを使う場合でも、必ずしもすべての処理が高速化されるわけではありません。
| 処理 | GPUの効果 |
|---|---|
| LLMの回答生成 | 大きい |
| Embedding作成 | モデル・構成によって効果あり |
| 文書アップロード | ファイルサイズやPDF抽出処理に依存 |
| Vector DB検索 | GPUよりCPU・ストレージ性能の影響が大きい |
| AnythingLLMの画面操作 | GPU効果は基本的に小さい |
また、GPUメモリが少ない場合、大きなLLMモデルは動かしにくくなります。
最初は軽めのモデルから試すのがおすすめです。
docker exec -it ollama ollama pull llama3.2
より大きなモデルを使う場合は、GPUメモリ、量子化、コンテキスト長、同時利用人数を考慮します。
14.5. CPU構成とGPU構成の使い分け
| 構成 | 向いている用途 |
|---|---|
| CPUのみ | 小規模検証、軽いモデル、RAGの流れの確認 |
| NVIDIA GPU | 快適なローカルLLM、社内プロトタイプ、大きめの文書RAG |
| ホストOllama + Docker版AnythingLLM | 既にホスト側OllamaをGPUで動かしている場合 |
まずはCPU構成でAnythingLLMの流れを確認し、回答速度やEmbedding速度に不満が出てきた段階でGPU構成へ切り替えると進めやすいです。
15. よくあるトラブル
15.1. AnythingLLMからOllamaに接続できない
まず、Ollamaコンテナが起動しているか確認します。
docker compose ps
次に、AnythingLLMとOllamaが同じCompose内にある場合は、接続先が次になっているか確認します。
http://ollama:11434
localhost:11434 にしていると、AnythingLLMコンテナ自身を見に行ってしまうため、接続できません。
15.2. モデルが表示されない
Ollamaにモデルがpullされているか確認します。
docker exec -it ollama ollama list
モデルがない場合は、pullします。
docker exec -it ollama ollama pull llama3.2
15.3. Embeddingモデルが間違っている
チャット用LLMとEmbeddingモデルは別物です。
悪い例:
Embedding Model: llama3.2
良い例:
Embedding Model: nomic-embed-text
Embeddingモデルを変更した場合、既存文書の再Embeddingが必要になる場合があります。
15.4. 回答が遅い
ローカルLLMは、PCのCPU/GPU性能に大きく依存します。
特にCPUのみで大きなモデルを動かすと、回答がかなり遅くなることがあります。
最初は軽めのモデルで試すのがおすすめです。
例:
docker exec -it ollama ollama pull llama3.2
必要に応じて、より小さいモデルや量子化モデルを試します。
15.5. 日本語PDFの精度が低い
日本語PDFでは、次のような原因でRAG精度が落ちることがあります。
- PDF内の文字抽出がうまくできない
- 表が崩れる
- 図の中の文字が抽出されない
- 段組みや縦書きで順序が乱れる
- チャンク分割が文脈と合わない
重要な文書では、PDFだけでなくMarkdownやテキスト化したファイルも試すとよいです。
16. 停止・再起動・削除
停止する場合:
docker compose stop
再起動する場合:
docker compose restart
コンテナを削除する場合:
docker compose down
Ollamaのモデルデータも含めて完全に消す場合は、volumeも削除します。
docker compose down -v
ただし、-v を付けるとOllamaのモデルデータも削除されるため注意してください。
17. 今回の構成のメリット
今回の構成には、次のメリットがあります。
- Docker Composeだけで起動できる
- OllamaもAnythingLLMもローカルで動く
- GUIでRAGを作成できる
- 文書アップロードから質問までが簡単
- Vector DBを深く意識しなくても試せる
- 後からモデルやEmbeddingを変更できる
- 社内文書チャットのプロトタイプにしやすい
18. 注意点
この構成は、まずRAGを試すためのプロトタイプとしては便利です。
ただし、本格運用する場合は、次の点を検討する必要があります。
- ユーザー管理
- アクセス制御
- バックアップ
- モデルの選定
- Embeddingモデルの固定
- 文書更新時の再Embedding
- 機密情報の取り扱い
- GPU利用の有無
- 回答品質の評価
特に、Embeddingモデルを途中で変更すると、既存文書の検索精度に影響する可能性があります。
最初にある程度方針を決めてから、文書を投入するのがよいです。
19. まとめ
この記事では、Docker + Ollama + AnythingLLMを使って、GUIでRAG環境を作成する流れを整理しました。
ポイントは次のとおりです。
- OllamaでローカルLLMを動かす
- AnythingLLMでRAG用GUIを用意する
- Docker Composeでまとめて管理する
- AnythingLLMからOllamaへは
http://ollama:11434で接続する - Embeddingには
nomic-embed-textなどのEmbeddingモデルを使う - 文書をアップロードしてワークスペース単位でRAGを試す
RAGをいきなり自作するよりも、まずAnythingLLMでGUIベースに試すことで、文書分割、Embedding、検索、回答生成の流れを理解しやすくなります。
次のステップとしては、次のような拡張が考えられます。
- GPU対応のOllama構成にする
- 日本語文書向けのEmbeddingモデルを比較する
- Qdrantなど外部Vector DBに切り替える
- 業務文書ごとにワークスペースを分ける
- 社内向けRAGチャットとしてDockerサーバーに配置する
20. 参考リンク
-
AnythingLLM 公式サイト
-
AnythingLLM Docker Installation
-
AnythingLLM: Connecting to localhost
-
AnythingLLM Ollama LLM
-
AnythingLLM Ollama Embedder
-
AnythingLLM GitHub
-
Ollama Docker
-
Ollama GPU Hardware Support
-
Docker GPU access
-
Docker Compose GPU support
-
Docker Desktop GPU support for Windows


