【第1回】UGREEN NASでAIエージェントは動く? DXP2800にDockerとOllamaを入れて試した話
UGREEN DXP2800を買った。写真のバックアップとか、TimeMachineとか、ファイル共有とか、まぁNASとしては普通に使ってたんだけど、ある日ふと思った。
【第1回】UGREEN NASにAIボットを住まわせたら想像以上に大変だった話
NAS、ストレージだけに使うのもったいなくない?
「このNAS、Intel N100載ってるんだよな…… Dockerも動くし、AIでも動かしてみるか」
きっかけはDiscordだった。仲間うちのサーバーで「AI botがいたら便利じゃない?」という話になり、じゃあNASに住まわせたら24時間動くし電気代も安いし最高じゃん、と。軽いノリで始めたこのプロジェクトが、まさかここまで沼にハマることになるとは、この時点では想像もしていなかった。
ちなみにDXP2800のスペックはこんな感じ。
CPU: Intel N100(4コア、最大3.4GHz)
RAM: 8GB DDR5
ストレージ: HDD 2ベイ + M.2 SSD スロット
OS: UGOS(Debian ベース、Docker対応)
N100はPassMarkで5000点超え。ちょっとしたデスクトップPC並みの性能がある。「LLMくらい動くやろ」と軽く考えていた。この楽観が後々の苦労の始まりだったわけだが。
OpenClawとの出会い
DiscordとAIを繋ぐ方法を調べ始めた。Discord.jsで自作ボットを書くか、既存のフレームワークを使うか。自作だとDiscord APIのゲートウェイ接続やメッセージハンドリング、会話のセッション管理など、けっこうやることが多い。
そんなとき見つけたのがOpenClawだ。AI エージェントのメッセージルーターとして、Discordのチャットを受け取ってLLMに投げて、返答をDiscordに返してくれる。要するに橋渡し役。
構成はシンプルで:
Discordメッセージ → OpenClaw → LLM → OpenClaw → Discord返答Node.js製で、`npm install` して設定ファイル(`openclaw.config.json`)をいじれば動く。Discordボットのトークンと、LLMのAPIキーを設定に書くだけ。「これならいける」と思った。
設定で特に便利だと感じたのは、Discordのチャンネルごとにボットの振る舞いを変えられること。メンションで反応するか、特定のプレフィックス(`!claw` など)で反応するか。DMでの1対1チャットも対応している。DM認証にはペアリングコードが必要で、セキュリティ面もちゃんと考えられていた。
まずはOllamaでローカルLLM
最初はお金をかけたくなかったので、OllamaでローカルLLMを動かすことにした。OllamaはDockerイメージが公式で提供されているので、Docker Composeで OpenClaw と一緒に立ち上げる構成にした。
NASにSSHで入って、Dockerファイルを配置する。
sudo mkdir -p /volume1/docker/ai-stack
cd /volume1/docker/ai-stack`docker-compose.yml` を書いて、Ollama と OpenClaw のコンテナを定義。ネットワークを共有して、OpenClaw から `http://ollama:11434` でアクセスできるようにする。
sudo docker compose up -dコンテナが起動したら、Ollamaにモデルをダウンロードする。
sudo docker exec ollama ollama pull llama3.2:3bDXP2800のRAMは8GB。llama3.2:3bなら約2〜3GBで収まるから、ギリギリいける計算。ダウンロードが終わったら、ちゃんとモデルが入ったか確認。
curl http://localhost:11434/api/tagsよし、入ってる。Discordから話しかけてみる。
返事が来た。
いや、正直ちょっと感動した。自分のNASの中で動いてるAIがDiscordで喋ってる。クラウドのAPIを叩いているわけじゃない。このNASの中のCPUで推論が走って、その結果がDiscordに返ってきている。すごくないか。しかも電気代はNAS全体で月数百円。24時間動かしっぱなしでもほぼコストゼロだ。
……でも、精度がちょっと
感動も束の間、すぐに現実に直面する。
llama3.2:3bは軽量モデルだ。パラメータ数30億。ChatGPTやClaudeが数千億パラメータと言われている中で、3bは本当に小さい。簡単な質問——「東京の天気は?」「Pythonでリストのソートは?」くらいなら答えてくれる。
でも、ちょっと複雑なことを聞くと途端に怪しくなる。
というか返答が遅い、遅すぎる。
返答待ちの時間、NASのCPU温度はどんどん上昇していく・・・。
「NAS上で24時間動くAI」というロマンは達成したものの、実用性を考えるとローカルLLMには限界があると感じ始めた。
3bモデルの限界一覧(体感):
長い文脈を覚えていられない — 5往復もすると最初の話題を忘れる
日本語の敬語や自然な表現が苦手 — 翻訳調の日本語になりがち
コード生成の精度が低い — 構文エラーが頻発、ライブラリの使い方も古い
複数ステップのタスクが壊滅的 — 「これ調べて、まとめて、表にして」みたいな指示がまず通らない
ハルシネーション(嘘)が多い — 自信満々に間違った情報を返す
「もうちょっと賢いモデル入れたら?」と思うかもしれない。7bモデル(llama3.2:7b)なら多少マシになるはず。でも試してみたら、8GBのRAMではスワップが大量に発生して、1つの返答に30秒以上かかるようになった。その間NAS全体がモッサリして、ファイル共有にまで影響が出始めた。NAS本来の仕事ができなくなっては本末転倒だ。
1bモデル(llama3.2:1b)に落とすことも考えたが、3bですら実用に耐えないのに1bにしたらさらに精度が下がる。それはもう「AIと会話している」というより「おみくじを引いている」に近い体験になりそうだった。
ローカルLLMの夢は一旦ここで諦めることにした。じゃあどうするか?答えは一つ。クラウドのAPIを使う——つまり、Claude APIへの切り替えだ。
次回:Claude APIに切り替えて精度は爆上がり。でもそこから本当の地獄が始まった——
次の記事 → 【第2回】ローカルLLMに限界を感じてClaude APIに切り替えたら、エラーとの戦いが始まった
