データ漏洩の懸念と「即席」RAGソリューション
企業プロジェクトに従事したり、顧客データを扱ったりする際、OpenAIやClaudeなどの外部サービスにドキュメントをアップロードすることで機密情報が漏洩することは、最大の懸念事項です。以前、LangChainとPythonを使用してRAGを構築する方法を紹介しましたが、ベクトルデータベースの構築からエンベディング処理、ユーザーインターフェースの実装まで手動で行う必要があり、かなりの労力を要しました。
もし、実用的でChatGPTのようなプロフェッショナルなUIをインストール後すぐに使いたいのであれば、AnythingLLMが最良の選択肢です。このツールは、ベクトルデータベース(LanceDB)、エンベディングエンジン、ワークスペース管理など、RAG(検索拡張生成)システムに必要な機能を一つのパッケージに凝縮しています。私はこれを技術チームの社内APIドキュメント検索用に導入しましたが、レスポンスは非常に高速で、各質問に対してわずか1〜2秒で回答が返ってくるほど効率的です。
ハードウェアと環境の準備
システムをスムーズに動作させたい場合、特にローカルでモデルを処理するためにOllamaを併用する場合は、スペックを軽視してはいけません。Ubuntuサーバーに対して推奨される構成は以下の通りです。
- OS: Ubuntu 22.04 LTS または 24.04 LTS (最も安定しています)。
- RAM: 最低8GB。Llama 3やMistralをローカルで実行する場合は、16GB以上を推奨します。
- ストレージ: 20GB以上のSSD空き容量。LanceDBは非常に効率的で、1GBで数万ページのテキストドキュメントを保存できます。
- ツール: DockerおよびDocker Composeがインストール済みであること。
DockerによるAnythingLLMのデプロイ
DevOpsエンジニアやシステム管理者は、管理やバックアップの容易さからDockerを好みます。この方法はアプリケーションをメインシステムから完全に分離し、ライブラリの競合を避けることができます。
まず、データを永続化するためのディレクトリを作成します。これにより、コンテナをアップデートしてもドキュメントが失われることはありません:
export STORAGE_LOCATION=$HOME/anythingllm
mkdir -p $STORAGE_LOCATION
touch "$STORAGE_LOCATION/.env"
次に、docker runコマンドを使用してコンテナを起動します。このコマンドは最新のイメージを自動的にプルします:
docker run -d -p 3001:3001 \
--cap-add SYS_ADMIN \
-v "$STORAGE_LOCATION:/app/storage" \
-v "$STORAGE_LOCATION/.env:/app/server/.env" \
--name anythingllm \
--restart always \
mintplexlabs/anythingllm
注意: --cap-add SYS_ADMINフラグは非常に重要です。これにより、AnythingLLMは複雑なファイル形式を安全に処理するためのサンドボックスプロセスを実行できるようになります。Docker Composeで一括管理したい場合は、以下の設定ファイルを使用してください:
version: '3.8'
services:
anythingllm:
image: mintplexlabs/anythingllm
container_name: anythingllm
ports:
- "3001:3001"
cap_add:
- SYS_ADMIN
volumes:
- ./storage:/app/storage
- ./.env:/app/server/.env
restart: always
RAGシステムの詳細設定
コンテナが起動したら、ブラウザで http://your-server-ip:3001 にアクセスしてセットアップウィザードを開始します。
1. LLMエンジンの設定
これが質問を処理する「脳」となります。主に2つの方向性があります:
- ローカルLLM (Ollama): セキュリティ面で最適な選択です。サーバーにGPUが搭載されている場合は、Ollamaをインストールし、URL
http://172.17.0.1:11434経由で接続します。すべてのデータは100%あなたのインフラ内に留まります。 - クラウドLLM (OpenAI/Claude): サーバーのスペックは低いが高度な知能が必要な場合に適しています。質問文のみが送信され、元のドキュメントはローカルに保持されます。
2. エンベディングとベクトルデータベース
エンベディングはドキュメントを数値ベクトルに変換するプロセスです。AnythingLLMには軽量な内部エンジンが統合されているため、デフォルトのままにすることをお勧めします。ベクトルデータベースには**LanceDB**が使用されます。これは非常に高速なサーバーレスデータベースです。実際に使用したところ、10,000ファイル以下のデータセットであれば、LanceDBはほぼ瞬時に応答し、同クラスのPineconeやChromaDBといった複雑なソリューションを遥かに凌駕するパフォーマンスを発揮します。
3. ワークスペース and データの管理
AnythingLLMの構造は**ワークスペース(Workspace)**に基づいています。「技術部用」や「法務部用」といった権限分けが可能です。
- ワークスペースにアクセスし、Upload documentsを選択します。
- システムはPDF、Docx、TXTのドラッグ&ドロップ、またはURLからの直接取得をサポートしています。
- アップロード後、Move to Workspaceをクリックし、Save and Embedを選択して、システムがデータのチャンク化とデータベースへの保存を開始するようにします。
運用と最適化
アップロードした内容について質問してみましょう。通常のチャットとは異なり、AnythingLLMはどのファイルのどの箇所から引用したか(引用文献:citations)を明示します。これにより、AIの「ハルシネーション(もっともらしい嘘)」を完全に排除できます。
リソース監視
エンベディング処理中はCPU使用率が高くなることがありますが、これは正常な動作です。ただし、RAM使用率が常に90%を超える場合は、並列処理するファイル数を制限するか、リソースをアップグレードする必要があります:
docker stats anythingllm
Nginxリバースプロキシの設定
チームが ai.yourcompany.com のようなプロフェッショナルなドメインでアクセスできるように、フロントエンドに保護レイヤーとしてNginxを使用しましょう:
server {
listen 80;
server_name ai.yourcompany.com;
location / {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
AnythingLLMを使用することで、RAGシステムを一から自作する手間を数週間分短縮できます。これはユーザーにとっての簡便さと、エンジニアにとっての制御性の完璧なバランスを提供します。インストール中に問題が発生した場合は、下のコメント欄でお知らせください。一緒に解決しましょう。

