AnythingLLM : RAGがプロダクション対応で ローカル
AnythingLLM(Mintplex Labs)は、Dockerを使って数分でデプロイできるオープンソースのRAGプラットフォームで、ローカルのOllamaバックエンドを企業向けのドキュメントアシスタントに変えます。自作のRAGではLlamaIndex、Chroma、UIを組み合わせる必要がありますが、AnythingLLMは、互いに隔離されたワークスペース、マルチユーザー対応、組み込みエージェント、REST APIを含むスタック全体を提供します。このAnythingLLM RAGチュートリアルでは、Dockerでのインストール手順全体、Ollamaとの接続、ワークスペースの作成、エージェント、そしてアプリケーションから利用できるようにAPIを公開する方法を紹介します。
#なぜAnythingLLMなのか?
AnythingLLMは、ローカルRAGのエコシステムで明確な役割を占めています。文書を扱う部分ではOpen WebUIよりも設計方針が明確で、自作のLlamaIndexスクリプトよりもシンプルで、Streamlitのデモよりも本番運用に適しています。このプロジェクトはオープンソース(MIT)で、2023年から継続的にコミットを行っているチーム、Mintplex Labsが開発を支えています。
- 隔離されたワークスペース
- 各ワークスペースには、それぞれ専用の文書コーパス、LLM、埋め込み、システムプロンプトがあります。法律関連の RAG とカスタマーサポート用の RAG を混在させることはありません。
- マルチユーザー機能を標準搭載
- 認証、ロール(管理者/マネージャー/ユーザー)、ワークスペースごとの権限を備えています。Pythonで素のRAGを実装する場合のように、リバースプロキシとBasic認証を組み合わせる必要はありません。
- 切り替え可能なLLMバックエンド
- Ollama、LM Studio、llama.cpp server、vLLM、およびクラウド API(OpenAI、Anthropic など)。インデックス化済みの文書を変更せずに、エンジンを切り替えられます。
- 組み込みエージェント
- Webスクレイピング、SQL実行、計算、Web検索、ドキュメントの保存は、チャット内で@agentを使って呼び出せます。さらにLangChainを組み合わせる必要はありません。
- ネイティブREST API
- APIエンドポイント /api/v1/workspace/{slug}/chat により、任意のアプリケーションが指定されたワークスペースに接続できます。レスポンスフォーマットは安定し、ドキュメント化されています
#前提条件
あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
- Docker
- Mac/WindowsではDocker Desktop、LinuxではDocker Engine。Composeは必須ではありません — 起動には docker run だけで十分です。
- Ollamaがインストールされ、正常に動作している
- デーモンは http://localhost:11434 で応答する必要があります。ollama listで確認してください。Ollamaがまだインストールされていない場合は、先にインストールしてください。このチュートリアルでは、Ollamaがデフォルトのバックエンドです。
- Ollamaで使うLLMモデル
- 最低でも、qwen3.5:9b(コンテキスト長256k、画像入力対応)やgranite4.2:8bのような8〜9Bのモデルを使用すること。フランス語のRAGで品質を求めるなら、VRAM容量が許す場合はmistral-small(24B)またはqwen3.8:27bを選択肢とすること。
- 埋め込みモデル
- nomic-embed-text(デフォルト)、または多言語でより高い品質を求めるならbge-m3。ollama pull nomic-embed-textで取得する。
- RAM / VRAM
- コンテナ用の RAM は最低 8 GB、16 GB あれば余裕があります。GPU 側で必要なメモリ容量は、選ぶ Ollama モデルによって異なります(9B Q4 で約 6~7 GB、24B Q4 で約 14 GB)。
- 4GBのディスクスペース
- コンテナ、内部SQLiteデータベース、ベクトルデータベース(デフォルトはLanceDB)用です。文書量に応じて容量を増やすこと。
#1. Docker のインストール
公式イメージは、Docker Hubのmintplexlabs/anythingllmで公開されています。Mintplexは安定版タグ(latest、render)を維持しており、イメージにはNode.js、APIサーバー、フロントエンド、ベクトルデータベースとしてのLanceDB、収集用ワーカーがすべて含まれています。
- 01ストレージフォルダを作成してくださいAnythingLLMはすべてのデータ(設定、ベクトル、ドキュメント)をボリュームに永続的に保存します。ホスト上で専用のフォルダを作成し、イメージのアップデート時にデータを失わないようにしてください。
- 02コンテナを起動以下のコマンドは、ストレージフォルダをマウントし、ポート3001を公開して、SYS_ADMINを有効にします(一部の内部スクレイパーがPDFやウェブページをレンダリングするために必要です)。
- 03UIを開くコンテナが起動すると、http://localhost:3001 でインターフェースを利用できます。初回起動時には、設定ウィザードが管理者パスワードとLLMバックエンドの設定を案内します。
#2. Ollama をバックエンドとして接続
http://localhost:3001 に初めてアクセスすると、AnythingLLM の初期設定が始まり、LLM Provider、埋め込みモデル、ベクトルデータベースの指定と管理者アカウントの作成を求められます。設定は後から Settings でも行えます。
- 01LLM Provider → Ollamaリストから Ollama を選択してください。ベースURLを入力してください:http://host.docker.internal:11434(Mac/Windows)または http://172.17.0.1:11434(Linuxのデフォルト)。
- 02チャットモデルの選定ドロップダウンメニューには、Ollama のモデル一覧が表示されます。メインの LLM を選択してください(例:フランス語での品質と VRAM 使用量のバランスを重視するなら mistral-small (24B)、VRAM がさらに限られているなら qwen3.5:9b)。モデルが対応している場合は、コンテキストウィンドウを 8192 または 16384 に設定してください。
- 03Embedding Provider → Ollamaエンベディングにも同じバックエンドを使うか、Ollamaに埋め込みモデルを読み込みたくない場合はNative(内蔵のローカルモデル)を選ぶ。AnythingLLMでフランス語を扱うなら、nomic-embed-textで十分ですが、bge-m3(Ollama経由)のほうが優れています。
- 04Vector DatabaseデフォルトのLanceDBをそのまま使用してください。組み込み型で、外部依存がなく、数十万チャンクまでは高い性能を発揮します。すでに別の環境でQdrantやChromaを管理している場合は、ここでそれらを設定することもできます。
#3. ワークスペース、ドキュメントおよび埋め込み
ワークスペースはAnythingLLMの基本単位です。文書群、LLM、チャットの設定、関連する会話をひとまとめにします。通常は、法務、サポート、人事、技術動向の調査といった分野ごとにワークスペースを作成します。
- 01ワークスペースの作成左側のサイドバー → New Workspace。わかりやすい名前(例:"contrats-2026")を付けてください。スラッグは自動生成され、APIのURLで使用されます。
- 02ドキュメントのアップロードワークスペース内のアップロードアイコンをクリックしてください。AnythingLLM は PDF、DOCX、TXT、MD、CSV、EPUB など、さまざまな形式をサポートしています。また、Web URL または GitHub リポジトリへのリンクを指定することも可能です。内部のスクレイパーがコンテンツを取得します。
- 03Move to Workspace + Embedアップロードしたファイルは、まず「Document Picker」(一時領域)に入ります。インデックスを作成するファイルを選び、「Move to Workspace」を実行してください。AnythingLLM はテキストをチャンクに分割し、Ollama を使って埋め込みを計算して、LanceDB に保存します。
- 04システムプロンプトの設定Workspace settings → Chat Settings → Prompt。ここで役割を設定します(「あなたは法務アシスタントです。常に契約書の該当条項を正確に引用してください」)。検索のtop-K(Document Similarity Threshold)もここで設定します。
- Chunk size
- デフォルトは1000文字で、重複部分は20文字。各条項が重要な法的契約書では500文字に減らす。コードブロックを含む技術文書では1500文字に増やす。
- Embeddingモデル
- nomic-embed-text(768次元)は高速ですが、フランス語での精度はそこそこです。bge-m3(1024次元、多言語対応)は、フランス語コンテンツで精度が10~15%向上します。mxbai-embed-largeは、両者の中間に位置する良い選択肢です。
- チャットモードとクエリモード
- Chat は会話履歴と RAG を使用します。Query は RAG に厳密に限定されたモードで、ドキュメント内に該当する情報がなければ、LLM は回答を拒否します。ハルシネーションが許されない用途には、Query が適切な設定です。
#4. 内蔵エージェント
AnythingLLMはRAGだけにとどまらず、エージェントシステムも搭載しています。チャットで@agentを呼び出すと、LLMがスキル(ツール)を使って文書データベースの外から情報を取得できるようになります。LangChainを使ったり、ツール呼び出しのコードを書いたりする必要はありません。機能が組み込まれています。
- web-browsing
- エージェントがURLを開き、ページを読み取ります(生のHTMLだけではなく、レンダリングされたDOMを読み取ります)。RAGに含まれていない情報についてアシスタントに回答させるのに役立ちます。
- web-scraping
- 別の方法:ページをスクレイピングし、ドキュメントとしてワークスペースに追加します。必要に応じてその場でコーパスを充実させるのに便利です。
- save-document
- エージェントは文書(要約、まとめ)を生成し、ワークスペースに保存します。「10本の記事を読む → ノートを作成する」といったワークフローに役立ちます。
- sql-connector
- PostgreSQL/MySQLのデータベースを接続すると、エージェントがSQLクエリを作成・実行し、分析に関する質問に回答できます。当然ながら、読み取り専用のSQLアカウントと組み合わせて使用してください。
- rag-memory
- 会話をまたいで保持される長期記憶。エージェントは事実を保存し、将来のセッションで取り出すことができます。
#5. APIを公開する
アプリケーション(内部チャットボット、Slackプラグイン、ビジネス統合)にAnythingLLMを接続するには、REST APIが標準的なインターフェースです。各ワークスペースは、そのコーパスに限定されたエンドポイントになります。
- 01APIキーの生成Settings → API Keys → Generate New API Key。キーを記録してください。表示されるのは一度だけです。クライアントアプリケーションごとに1つなど、複数作成し、個別に失効させることもできます。
- 02ワークスペースのslugを識別するワークスペースを開いているときに、URLで確認できます:.../workspace/contrats-2026 → slug = contrats-2026。
- 03curlでテストメインのエンドポイントはPOST /api/v1/workspace/{slug}/chatです。ヘッダーはAuthorization: Bearer YOUR_KEY、JSON形式のリクエストボディにはmessageとmode(chatまたはquery)を指定します。
#トラブルシューティング
- "Could not reach Ollama at ..."
- 最もよくあるエラーです。URLを確認してください。Dockerコンテナ内から見ると、localhostはホストを指しません。MacやWindowsではhost.docker.internalを、LinuxではブリッジのIPアドレスまたは--network hostを使用してください。
- 埋め込みが非常に遅い
- Ollamaでモデルをpullしていない場合、埋め込みモデルはデフォルトでCPU上で動作します。埋め込みプロバイダーとしてOllamaを明示的に指定し、インデックス作成中にollama psでGPUが稼働していることを確認してください。
- RAGが見つかるはずの文章を検索できない
- よくある原因は3つです。チャンクが大きすぎる(1000文字から500文字に減らしてください)、埋め込みモデルのフランス語性能が低い(bge-m3に切り替えてください)、またはワークスペース設定のDocument Similarity Thresholdが厳しすぎることです。
- エージェントがツール呼び出しを繰り返す
- モデルの能力が足りません。glm-4.7-flash、可能ならqwen3.8:27b、またはmistral-smallに切り替えてください。エージェントには、ツール使用向けのファインチューニングを受けていない極小モデル(2~3B)を使わないでください。
- コンテナが数時間後に強制終了される
- カーネルのOOM:Dockerに割り当てられているメモリが不足しています。Docker Desktopでは、RAMの上限を8~16GBに引き上げてください(Settings → Resources)。
- イメージの更新
- docker pull mintplexlabs/anythingllm:latestを実行し、その後docker rm -f anythingllmを実行して、同じボリュームを指定してrunを再実行します。$HOME/anythingllm内のデータは保持されます。
#さらに詳しく
進みたい方向に応じて:
- AnythingLLM をノーコードの代替案と比較
- 「Ollamaでコードを書かずにローカルRAGを使う(Open WebUI、AnythingLLM)」では、同じOllamaバックエンドを使って、Open WebUIと直接比較しています。
- フランス語のエンベディングを最適化する
- 「フランス語の最優秀埋め込みモデル」では、bge-m3、Solon、E5を比較し、AnythingLLM向けの適切な設定を紹介しています。
- 本番環境のスタックをさらに発展させる
- 「Docker ComposeでLLMをプロダクション環境にデプロイする」では、AnythingLLMをTraefikのリバースプロキシ、外部Qdrant、自動バックアップと組み合わせる方法を示します。
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。