📋 記事の概要
この記事は、「Pi(pi-coding-agent)」というオープンソースのコーディングエージェントを、ローカルLLM(Qwen-3.6-35B MoE)で動かすための実践的な環境構築ガイドです。商用エージェント(Claude Codeなど)の月額費用(最大200ドル/月)を回避し、プライバシーを保ちつつ、手持ちの限られたハードウェア(VRAM 6GBのGPU)で実用的なAIコーディング環境を構築する方法を詳解しています。
ローカルLLM
Pi エージェント
Qwen-3.6-35B
llama.cpp
Docker サンドボックス
セキュリティ
🔥 重要ポイント
1. なぜローカルLLMエージェントなのか?
- コスト問題: Claude Code等の商用エージェントは月額200ドル(約3万円)かかることも。個人開発者には重荷。
- プライバシー: クラウドモデル利用時、データが分析・学習に使われるリスクがゼロではない。
- 課金文化への批判: エンジニアの本質は「コスト最適化しながら最高のプロダクトを提供すること」。単に課金してボタンを押すだけなら誰でもできる。
💡 選ばれたエージェント:「Pi」
pi.devで公開されているオープンソースのコーディングエージェント。ウェブ検索機能も備えており、ローカルLLMで駆動可能。
2. 選択したモデル:Qwen-3.6-35B (MoE)
- 使用した量子化モデル:
unsloth/Qwen3.6-35B-A3B-GGUF
- Qwenシリーズはコーディング能力が極めて高く、ツール呼び出し(Function Calling)の成功率でGemma-4を上回ることが多い
- MoE(Mixture of Experts)構造のため、VRAM 6GBの弱GPUでも実用的な速度で動作
3. 検証環境(決して最新ではない!)
| コンポーネント | スペック |
| CPU | Ryzen 7(やや旧型) |
| RAM | 32GB (DDR4-2400MHz) |
| GPU | GTX 1660 Super(VRAM 6GB) |
| OS | Pop_OS 22.04 |
VRAM 6GBでも、MoEモデルなら実用的な速度で動作するとのこと。
4. 推論サーバー(llama.cpp)のセットアップ
弱いGPUを限界まで使い倒すため、選択肢はllama.cpp一択。VRAMを最大活用しつつ、溢れた分をRAMでカバー。
- CUDA対応ビルドで、必要なバイナリのみターゲット指定(ディスク節約)
- コンテキストサイズ131072、KVキャッシュはq8_0で量子化
--no-mmap、CPU range指定、リアルタイム優先度設定で最適化
- 温度0.6 / top-p 0.95 / top-k 20 のサンプリング設定
- thinking機能を保持するチャットテンプレートオプション
./build/bin/llama-server \
-m Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf \
--port 8001 --host 0.0.0.0 \
-c 131072 --fit on \
-ctk q8_0 -ctv q8_0 \
-ot "exps=CPU" --no-mmap \
--threads 8 --cpu-range 0-7 --cpu-strict 1
5. Dockerによるサンドボックス環境設計
AIエージェントは「諸刃の剣」。ファイル編集やコマンド実行を許可する=システムを破壊するリスク。そこでDockerサンドボックス化を実施。
- ベースイメージ:node:20-slim
- Neovim、prettier、eslint、ruff、pyrightを同梱(エージェント自身にコード整形させる)
- 高速Python管理ツール「uv」を導入
- 隔離されたサンドボックスユーザー(UID: 5000)で実行
6. AIエージェントの権限設計(重要!)
⚠️ AIエージェントは100%信用しない — LLMは確率的にトークンを出力するため、万が一の暴走に備える必要がある。
- プロセスの完全分離: UID 5000を設定し、ホストユーザー(UID 1000)とは異なる権限を付与。
rm -rf /home/userを実行しても自分の閉じた世界しか触れない。
- 監査証跡: エージェントが作成したファイルはすべてUID 5000が所有者になり、「自分が書いたコード」と「AIが生成したもの」を一目で見分けられる。
- ファイル共有: Linux ACLs(Access Control Lists)で、ホストユーザーとエージェント両方がストレスなく読み書きできる環境を構築。
7. コンテナの「要塞化」(Hardening)
Dockerのデフォルトは、カーネルレベルでは意外と「ガバガバ」。カーネル権限(Linux Capabilities)を一部保持したまま起動するため、プロンプトインジェクション等のリスクに対応する要塞化を実施。
cap_drop: [ALL]でカーネル権限を完全剥奪
- (後半セクションでさらに詳細なセキュリティ設定を解説)