0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker + Ollama + AnythingLLMでRAG環境を作成しました

0
Posted at

Docker + Ollama + AnythingLLMでRAG環境を作成しました

1. はじめに

この記事では、Docker + Ollama + AnythingLLM を使って、ローカル環境に RAG(Retrieval-Augmented Generation) をGUIで作成する流れを整理します。

RAGを自作する場合、通常は文書読み込み、チャンク分割、Embedding、Vector DB、検索、LLMへのプロンプト投入などを自分で実装する必要があります。

一方、AnythingLLMを使うと、これらの多くをGUIで設定できます。

AnythingLLMの処理フロー

今回は、まずプロトタイプとして、自分のPC上で文書チャットできるRAG環境を作成します。


2. 対象読者

  • ローカルLLMを試したい人
  • OllamaをDockerで使いたい人
  • RAGをGUIで試したい人
  • LangChainやLlamaIndexで自作する前に、RAGの動きを確認したい人
  • 社内文書や技術メモをローカル環境で検索・質問したい人

3. 全体構成

今回の構成は次のとおりです。

AnythingLLMの処理フロー

使用するもの

項目 内容
実行環境 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. 文書をアップロードする

ワークスペースを作成したら、文書をアップロードします。

例として、次のようなファイルを使えます。

  • PDF
  • Markdown
  • テキスト
  • Word文書
  • CSV
  • Webページ情報

アップロード後、AnythingLLM側で文書が処理され、Embeddingされます。

この処理により、質問時に関連する文書チャンクが検索され、LLMの回答に利用されます。


12. RAGとして質問する

文書をアップロードしたら、チャット欄で質問します。

例:

この文書の目的を3行で要約してください。
この仕様書で重要な設定項目を表にしてください。
実装時に注意すべき点を箇条書きで整理してください。

RAGがうまく動いていれば、アップロードした文書の内容を参照した回答が返ります。


13. RAGの処理イメージ

RAGの処理を簡単に整理すると、次のようになります。

AnythingLLMの処理フロー

ポイントは、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. 参考リンク

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?