こんな方へ特におすすめ
概要
こんにちは。サイオステクノロジーのはらちゃんです!
今回はOSCの展示ブース用開発として、『新世紀エヴァンゲリオン』の意思決定コンピュータ MAGI を、Raspberry Pi 3台 + ローカルLLM(Ollama)で再現してみました。
―― 3体の人格が別々のマシンで議論し、多数決で結論を出す
その設計や速度チューニング、実機を立ち上げる過程でハマった落とし穴まで、実務にも通じる知見をまとめていきます。

背景
MAGI は、3つの独立したコンピュータ Melchior・Balthasar・Casperが、それぞれ異なる人格で同じ議題を判断し、多数決で結論を出す合議システムです。
これをただの1プログラムで再現するのは簡単です。
でも、それだと何かが違う。「1エージェント = 1台の独立コンピュータ」という原作の設定を、そのまま物理的に再現できないだろうか?
武井さんの協力の元、Raspberry Pi を3台並べることにしました。とはいえ、非力な Raspberry Pi でLLMなんてまともに動くのか、と最初は半信半疑でした。
結論から言うと、役割を割り切って軽量モデルとチューニングを重ねれば、合議AIは十分に動きます。
システム構成|3台の Pi + 母艦
役割分担はシンプルです。
- 各Piは、ただの推論バックエンド。Ollama が待ち受けているだけで、人格ごとのプログラムは書きません。
- 母艦(オーケストレータ)となる1台のPCが、合議の進行・集計・画面表示を担当します。今回は PC上の WSL2 で Flask + LangGraph を動かしました。

ブラウザ / kiosk UI
▲ ▼ SSEで投票をリアルタイム配信
母艦 — Flask + LangGraph(合議・集計)
▲ ▼ イーサネット(各Piのollama :11434)
+-----------------+-----------------+-----------------+
| Pi1 Melchior | Pi2 Balthasar | Pi3 Casper |
| Ollama | Ollama | Ollama |
+-----------------+-----------------+-----------------+どのPiがどの人格かは、母艦の `.env` にある各Piの固定IPだけで決まります。人格ごとの特別なコードは無く、role名で接続先を引くだけ。この割り切りのおかげで、Pi側は「モデルを入れて待ち受ける」だけで済みます。
合議フロー|LangGraphで組む2ラウンド投票
合議の本体は LangGraph の StateGraph です。1回目で全会一致なら即確定、意見が割れたら「討論」を挟んで再投票する、という2ラウンド構成にしました。
- prepare:開始を通知
- 3体を並列実行:Melchior / Balthasar / Casper が同時に投票(fan-out)
- 1回目集計:賛成が2票以上なら「可決」
- 分岐:全会一致ならそのまま確定。割れたら 討論 → 再投票 → 再集計
- finalize:評決を確定して配信

各人格には異なる「観点」を与えています。
- Melchior:論理性・合理性・整合性を最重視
- Balthasar:人間要因・感情・受容性を重視
- Casper:現実性・リスク・実務性を重視

実装のキモ|小さいモデルに「JSONだけ」返させる
各人格への問い合わせは1つの関数に集約しています。小さいモデルを安定させるコツは、出力をJSONに固定すること。format="json" と temperature=0 を指定し、role / reason / vote の3項目だけを返させます。
必ずJSONのみで返してください:
{
"role": "{role}",
"reason": "80字以内で簡潔に(必ず日本語で)",
"vote": "approve or reject"
}返ってきた文字列は、 ```json のコードフェンスを剥がし、最初の {` から最後の `} までを抜き出してからパースします。理由が80字を超えたら、途中で切れないよう「最後の句読点」で丸める。小さいモデルは文字数指示を守りきれないので、この後処理は必須でした。
Raspberry Pi で待たせない3つの速度チューニング
非力なPiで素直にLLMを動かすと、1票に何十秒もかかります。体感速度を詰めるために効かせた工夫が主に3つ。
1. コンテキスト長を絞る
- 対応:
num_ctxを既定の 4096 から 1024 へ。 - 根拠: 投票プロンプトは数百字なので、大きな窓は無駄にメモリと時間を食うだけ。
2. 生成トークン数を制限する
- 対応:
num_predict = 128。 - 根拠: 理由は80字上限なのでこれで十分。出力が短いほど速い。
3. モデルをRAMに常駐させる
- 対応:
keep_alive = -1+ 起動時に一度空打ちして先読み。 - 根拠: 初回質問のコールドロード待ちを消せる。
OLLAMA_NUM_CTX=1024 # 4096 → 1024
OLLAMA_NUM_PREDICT=128 # 理由は80字で足りる
OLLAMA_KEEP_ALIVE=-1 # モデルをRAMに常駐このほか、3体を並列実行(直列の約1/3の時間)し、最終要約はLLMを使わず定型文で組み立てて呼び出しを1パス削減しています。
モデル選定|0.5Bの罠を、プロンプトで直す
速度優先でまず qwen2.5:0.5b を使ったところ、奇妙な出力に遭遇しました。
理由には「適切だ」と書いてあるのに、投票は reject となっている、つまり reason と vote が食い違うのです。
原因は集計バグではなく、モデルの出力そのものの矛盾でした。しかも当初のプロンプトは vote を reason より先に書かせていたため、モデルは先に投票を決め打ちしてから、後付けで理由を書いていたのです。
そこで、JSONの並びを reason → vote に変更し、「理由を先に書き、それに一致する投票を選べ/矛盾してはならない」と明示。0.5Bのままでも矛盾が大きく減りました。 最終的に qwen2.5:1.5b に上げると、投票と理由の整合性が安定します。おまけに、num_ctx=1024 のままでも約1300字の長文議題を破綻なく処理できました。
課題|本当に時間を溶かしたのはネットワークとOllama
正直、アーキテクチャよりも実機3台の立ち上げのほうが遥かに大変でした。同じ轍を踏む人のために残しておきます。
Wi-Fiが突然切れる
GUIから静的IPを設定したらWi-Fiが切断。プロファイルからパスワード(PSK)が抜け落ちていました。
解決: プロファイルを削除して nmcli device wifi connect で作り直す。静的化も nmcli でパスワードごと一括指定するのが確実です。
(今回の構成としてはインターネット不要なのでここはスキップできちゃいます。)
Ollamaのサービスが壊れる
unit is masked → ディレクトリ欠落 → ssh: no key found と、1台だけドミノでおかしくなりました。
解決: 中途半端に直すより、完全に削除してから install.sh で入れ直すのが最短でした。
母艦からPiに届かない
Ollamaの既定は 127.0.0.1 待ち受けで、他マシンから見えません。
解決: OLLAMA_HOST=0.0.0.0:11434 を設定して再起動。ss -tlnp | grep 11434 で待ち受けが 0.0.0.0 になっているか必ず確認しましょう。
検証|「意見が割れる議題」で試す
多数決システムの見どころは、票が割れて「討論→再投票」が発動する瞬間です。だから論理・感情・現実の3視点が対立する議題を選びます(例:「AIに人事評価を任せるべきか」「延命治療を中止すべきか」)。
面白かったのは頑健性で、音声入力の変換ミスで議題が多少崩れていても、3体とも妥当な結論に収束しました。むしろ本番では、コンテキスト長よりも音声認識の精度のほうが実害リスクが大きいという気づきが得られました。
母艦を起動して [warmup] done が出て、3体の投票がそろい評決が返ってくれば成功です!

まとめ
「 Raspberry Pi でLLMなんて動くの?」という半信半疑から始めましたが、役割を割り切って設計し、チューニングを重ねることで、合議AIはしっかり動きました。
- MAGI = 3つの人格が多数決で決める合議システム。「1人格 = 1台の Raspberry Pi 」を物理的に再現。
- 構成は3台のPi(Ollama)+ 母艦(Flask + LangGraph)。役割は
.envのURLだけで振り分けるシンプル設計。 - 非力なPiでも、コンテキスト長・生成量・モデル常駐の3点を絞れば実用的な速度で動く。
- 小さいモデルの「投票と理由の矛盾」は、プロンプトの並び替えという小さな工夫で大きく改善できた。
- 一番の敵はAIではなくネットワークとサービス管理。ここを乗り越えれば合議AIは立ち上がる。
今回はイベント会場に向けて軽量・高速に特化させましたが、精度を重視し他のモデルを試していきたいと考えています。
今後も、こうした個人開発を通して得られた知見を、皆さんに共有していきたいと思います!
宣伝
生成AIを活用する開発として、自分専用のRAGを作ることもやりました。興味がある方はぜひのぞいてみてください。

