Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ラズパイ×ローカルLLMで“MAGIシステム”を作る 〜3体のAIによる合議制マルチエージェン...

ラズパイ×ローカルLLMで“MAGIシステム”を作る 〜3体のAIによる合議制マルチエージェント〜/magibypi

Avatar for Noriyuki TAKEI

Noriyuki TAKEI

August 01, 2026

More Decks by Noriyuki TAKEI

Other Decks in Technology

Transcript

  1. CODE : 378 FILE:MAGI_SYS EX_MODE:OFF PRIORITY:AAA LOCAL LLM × RASPBERRY

    PI × MULTI-AGENT ラズパイ3台で MAGIシステム を動かす 30年前のアニメに出てきた「合議制AI」を、 ローカルLLMとマルチエージェントで現実に持ってく る話
  2. Noriyuki TAKEI 武井 宜行 Information • Microsoft MVP for AI

    Platform • サイオステクノロジー株式会社 blog https://tech-lab.sios.jp/ X @noriyukitakei core skill Azureによる クラウドネイティブなアプリ開発 Favorites • • • • • スカッシュ スキー 走ること ストリートファイター6 PCデスクまわりの環境改善 books 10月発売予定!! Coming Soon Claude Codeによる AI駆動開発
  3. SPEAKER 自己紹介 WHO WHY お名前 なぜこれを作ったのか 所属 / 役割 ・「面白そう」以外の理由は、正直あとから付けた

    担当している仕事 ・若手が最新技術に触れる口実として、題材の強さは効く ひとことプロフィール TAKEAWAY 今日持ち帰ってほしいこと ・ローカルLLM × マルチエージェントは、もう趣味の予算で試せる ※ 顔写真をここに配置 MAGI SYSTEM / SIOS ・コードは驚くほど短い。今日から真似できる 02 / 29
  4. AGENDA 本日お話しすること 全45分 / うち実機デモ 約8分 01 MAGIシステムとは何だったのか エヴァを知らない人向けの5分解説 5分

    02 なぜ今、手のひらサイズで作れるのか 30年で何が変わったのか 5分 03 システム構成 ハード・ネットワーク・コスト 6分 04 実装解説 LangGraph / Ollama / 合議ロジック 05 実機デモ ラズパイ3台が本当に審議します 8分 06 ハマりどころと、これから 作ってみて分かったこと 7分 + 質疑応答 3分 / MAGI SYSTEM SIOS / 11分 スライドとソースコードは後日公開します 03 / 29
  5. SECTION 01 MAGIシステム — 3体のAIが多数決で結論を出す装置 『新世紀エヴァンゲリオン』(1995) に登場する意思決定支援システム ▸ 3体の独立したスーパーコンピュータ BALTHASAR

    -2 MELCHIOR-1 / BALTHASAR-2 / CASPER-3 ▸ 開発者の人格を3つの側面に分けて移植 承認 「科学者」「母親」「女性」— つまり評価の観点が違う MAGI CASPER-3 否決 MELCHIOR1 否決 2体が否決 → 否決。多数決で機械が結論を出す ▸ 3体が別々に思考し、合議制で結論を出す 劇中では 2/3 の多数決で可決・否決が決まる ▸ 意見が割れて膠着する描写もある そこが物語上のスリルになっていた 「巨大な計算機が3つ、部屋を埋め尽くしている」絵として描かれていた MAGI SYSTEM / SIOS 05 / 29
  6. SECTION 01 エンジニアの目で見ると、これは完全に「マルチエージェント」 劇中のMAGIがやっていること 2026年の私たちが呼んでいる名前 ▸ 独立した3つのエージェント ▸ マルチエージェント (Multi-Agent)

    ▸ 同じ議題を、異なる観点で評価 ▸ ロール/観点を変えたプロンプト設計 ほぼ同義 ▸ 結果を集約して多数決 ▸ アンサンブル・多数決による集約 ▸ 割れたら議論して再評価 ▸ エージェント間の討議 (debate) つまりMAGIは、30年前に描かれたマルチエージェント・アーキテクチャ。 だから今、 素直に実装できる。 MAGI SYSTEM / SIOS 06 / 29
  7. SECTION 02 部屋いっぱいの巨大計算機が、机の上に収まった 1995 — 劇中の描写 2026 — 今回つくったもの -

    フロアを埋める専用ハードウェア ▸ Raspberry Pi 5 (8GB) × 3台 — 手のひら → - 国家プロジェクト級の開発体制 サイズ ▸ 調達コスト 約15万円 - 専任のオペレーターが常駐 何が変わったのか — 3つだけ 01 02 03 小型モデルが実用になった Ollama がLLMをHTTPサーバにした SBCの性能が上がった 4B級+量子化なら、8GBのSBCでも「まともな モデルを落として起動するだけ。あとは Raspberry Pi 5 は 8GB / 64bit。ローカル推論 日本語で答える」ところまで来た :11434 を叩けばよい が現実的な土台になった MAGI SYSTEM / SIOS 08 / 29
  8. SECTION 02 使った技術は、この4つだけ 特別なものは何も使っていません HARDWARE RUNTIME MODEL ORCHESTRATION Raspberry Pi

    5 (8GB) Ollama 小型モデル (4B級) LangGraph 手のひらサイズの64bit Linux機 ローカルLLMをHTTPで叩けるよ 量子化して 8GB に載るサイズ。 エージェントの流れをグラフで 。 うにする。 7B以上はスワップして厳しかっ 宣言的に書く。 1台 = MAGI 1体。物理的に独立 ポート 11434 に投げるだけ。 た。 並列・分岐・再実行が数行で表 させると、 JSON強制オプションが後で効い モデル選定は実機で要検証。 現できる。 見た目の説得力が段違いになる てくる。 今回の構成はノード11個。 。 requirements.txt はこれだけ langgraph MAGI SYSTEM / SIOS / langchain-ollama / Flask / python-dotenv 09 / 29
  9. SECTION 03 全体構成 — エージェント本体1台 + ラズパイ3台 MELCHIOR-1 Raspberry Pi

    5 (8GB) + Ollama 観点: 論理性・合理性 エージェント本体 (PC) INPUT ブラウザ / curl LangGraph — 審議フロー Flask + SSE — 画面配信 L2 SWITCH ギガビット BALTHASAR-2 Raspberry Pi 5 (8GB) + Ollama 観点: 人間要因・感情 HDMI CASPER-3 Raspberry Pi 5 (8GB) + Ollama 観点: 現実性・リスク DISPLAY 投影用モニタ / Chrome kiosk HTTP → :11434 (Ollama API) ポイント: 推論はラズパイ側、指揮はPC側。1台=1体にしたのは性能ではなく「3台並んでいる絵」が欲しかったから MAGI SYSTEM / SIOS 11 / 29
  10. SECTION 03 全体構成 — エージェント本体1台 + ラズパイ3台 投影用モニタ エージェント 本体

    L2スイッチ ローカルLLM (on Ollama) MAGI SYSTEM / SIOS ローカルLLM (on Ollama) ローカルLLM (on Ollama) 11 / 29
  11. SECTION 03 調達したもの — 合計 約15万円 品名 用途 Raspberry Pi

    5 (8GB) 単価 数 合計 MAGI 3体の本体。ここが主 コスト 44,000 3 132,000 L2スイッチ 3台とPCを閉じたLANで繋ぐ 2,000 1 2,000 LANケーブル (1m) スイッチ〜各機 800 4 3,200 12,000 1 12,000 モニター (24インチ) MAGI画面の投影用 合計 149,200 ※ 価格は企画時点(2026年前半)の参考値です。 ※ ケース・電源アダプタ・microSDは別途。当日の実費に差し替えてください。 COST DOWN 実費はもっと安くなる モニター・L2スイッチ・LANケーブルは 情シスから借用可。実質 約13.2万円。 TRADE-OFF 一番効くのはラズパイ台数 1台構成なら約4.4万円で成立する。 「3台並ぶ絵」に11万円出す判断。 TIPS SDカードと電源に注意 本体価格に含まれない付属品で 数千円ずつ積み上がる。要確認。 MAGI SYSTEM / SIOS 12 / 29
  12. SECTION 03 ソフトウェア構成 — 3層に分かれている ・ Chrome (kiosk モード) で全画面表示

    DISPLAY 表示層 ・ Server-Sent Events で審議の進行を受け取る ・ HTML/CSS/JS 1ファイル (418行) だけ AGENT エージェント層 ・ Python + LangGraph — 審議フローを定義 ・ Flask — 画面配信 と /run エンドポイント ・ magi.py 1ファイル (377行) だけ INFERENCE 推論層 (ラズパイ×3) ・ Raspberry Pi OS (64bit) ・ Ollama をサービス起動し :11434 で待機 ・ 4B級の量子化モデルを事前に pull しておく MAGI SYSTEM / SIOS 13 / 29
  13. SECTION 04 3体の違いは、プロンプトの「観点」一文だけ MELCHIOR-1 BALTHASAR-2 CASPER-3 観点 (viewpoint) 観点 (viewpoint)

    観点 (viewpoint) 論理性・合理性・整合性を最重視す 人間要因・感情・受容性を重視する 現実性・リスク・実務性を重視する ひとことで言うと「人はどう感じるか」 ひとことで言うと「本当に回せるのか」 る ひとことで言うと「筋が通っているか」 違いはここだけ — モデルもプロンプトの残りも全部同じ ask_agent("Melchior", "論理性・合理性・整合性を最重視する", question) ask_agent("Balthasar", "人間要因・感情・受容性を重視する", question) ask_agent("Casper", "現実性・リスク・実務性を重視する", question) ▸ 同じモデル・同じ議題でも、観点を変えるだけで結論が割れる。ここが面白いところ。 MAGI SYSTEM / SIOS 15 / 29
  14. SECTION 04 LangGraph で審議フローを組む 並列は「エッジを増やす」だけ START prepare から3ノードへ add_edge するだけで3体が同時に走る。

    prepare threadingもasyncも書かない。 fan-out melchior balthasar casper 分岐は conditional_edges aggregate_first_votes YES 全会一致 なら即決 賛成 0 or 3 票 ? NO → 討議へ 票が割れた(1票 or 2票)ときだけ討議フェーズへ。 全会一致ならスキップして即決する。 debate debate は要約するだけ melchior_revote balthasar_revote casper_revote 3体の票と理由を1つの文字列にまとめ、 「参考情報」として再投票に渡すだけ。 aggregate_final_votes finalize → END ノード11個・エッジを張るだけ。 このフロー全体が、約40行のグラフ定義。 MAGI SYSTEM / SIOS 16 / 29
  15. SECTION 04 / CODE コード① — 3台のラズパイに繋ぐ magi.py — LLMの初期化

    MIGRATION クラウドからの差し替えは3行 from langchain_ollama import ChatOllama AzureChatOpenAI → ChatOllama に置換。 # ラズパイ1台 = MAGI 1体。IPを分けるだけで物理的に独立する エンドポイントとAPIキーの代わりに def unit(host: str) -> ChatOllama: return ChatOllama( model="qwen3:4b", ラズパイのIPを書くだけで動く。 # 8GBに載る4B級モデル base_url=f"http://{host}:11434", # Ollama の待受ポート format="json", # ★JSONを強制させる temperature=0, # 毎回同じ判断にしたい ) LLM = { "Melchior": KEY POINT format="json" が効く LLMは頼んでもJSON以外を返す。 Ollamaのこのオプションで出力を unit("192.168.10.11"), "Balthasar": unit("192.168.10.12"), "Casper": unit("192.168.10.13"), JSONに固定でき、パース失敗が激減。 → 詳細はハマりどころで。 } .env に書くのは ラズパイ3台のIPアドレスとモデル名だけ。 APIキーもトークン課金も、もう存在しない。 MAGI SYSTEM / SIOS 17 / 29
  16. SECTION 04 / CODE コード② — エージェント1体の中身 magi.py — 1体に意見を聞く

    SIMPLE def ask_agent(role, viewpoint, question, extra_context="") -> dict: prompt = f""" あなたは {role} です。 観点: {viewpoint} ← ここが3体の唯一の違い エージェント1体 = 関数1つ 「役割」「観点」「議題」を渡して、 JSONで票と理由を返してもらうだけ。 フレームワークらしい記述はゼロ。 難しいことは何もしていない。 議題: {question} LangGraph のノードにする 参考情報: ← 再審議のときだけ中身が入る {extra_context} 必ずJSONのみで返してください: {{"role": "...", "vote": "approve or reject", "reason": "100字以内"}} """ def melchior_node(state): return {"melchior_opinion": ask_agent("Melchior", "論理性・合理性・整合性を 最重視する", state["question"])} return json.loads(LLM[role].invoke(prompt).content) ▸ 3体分は、観点の文字列を差し替えたコピー。それだけ。 MAGI SYSTEM / SIOS 18 / 29
  17. SECTION 04 / CODE コード③ — 集計は、ただの多数決 magi.py — 票を数える

    判定はこの3パターンだけ def aggregate_first_votes_node(state): votes = [state["melchior_opinion"], 3 : 0 全会一致で可決 即決 state["balthasar_opinion"], state["casper_opinion"]] 2 : 1 多数決で可決 討議へ approve = sum(1 for v in votes if v["vote"] == "approve") 1 : 2 多数決で否決 討議へ return {"first_approve_count": approve, 0 : 3 全会一致で否決 即決 "first_decision": "approved" if approve >= 2 else "rejected"} ▸ 2/3 で可決 — 劇中の合議制をそのまま条件式にしただけ ▸ 票数で丸める — 1体が変な答えを返しても、多数決なら吸収できる ▸ LLMを信じすぎない設計 — 集約ロジックは自分で書いて握っておく MAGI SYSTEM / SIOS 19 / 29
  18. SECTION 04 / CODE コード④ — 意見が割れたら、もう一度審議する ここが一番作っていて面白かった部分 分岐 —

    割れているかどうかで行き先を変える def route_after_first_aggregate(state) -> str: # 3票一致(0 or 3)なら即決。割れたら討議へ if state["first_approve_count"] in (0, 3): return "finalize" return "debate" WHY IT WORKS 2周目は「他の2体の意見」が見える 1周目: 参考情報は空 → 自分の観点だけで判断 2周目: 3体の票と理由が参考情報に入る → それを読んで、意見を変えることがある builder.add_conditional_edges("aggregate_first_votes", route_after_first_aggregate, {"finalize": "finalize", "debate": "debate"}) 討議 — 3体の主張を1つの文字列にまとめる def debate_node(state): summary = f""" Melchior: {…["vote"]} / {…["reason"]} Balthasar: {…["vote"]} / {…["reason"]} Casper: {…["vote"]} / {…["reason"]} """ return {"debate_summary": summary} MAGI SYSTEM / SIOS ここが一番「MAGIっぽい」 劇中でも3体は意見が割れて膠着した。 割れたら討議して再投票する、という 一手間を入れるだけで、単なる多数決が 「合議」に見えるようになる。 # 要約して渡すだけ 20 / 29
  19. SECTION 04 / UI 「それっぽさ」の9割は、画面が作っている サーバ側 — Server-Sent Events で流すだけ

    @app.route('/events') def events(): q = queue.Queue() def gen(): while True: yield f"data: {q.get()}\n\n" return Response(gen(), mimetype='text/event-stream') ブラウザ側 — 受け取って色を変えるだけ var evt = new EventSource('/events'); evt.onmessage = function(e){ // thinking:on → 3パネルを点滅させる // {"agent":"melchior","vote":"approve"} // → 緑にして「承認」を表示 実際の画面。緑=承認 / 赤=否決。CSSだけで作っている ▸ WebSocketは不要 — 一方通行なのでSSEで足りる ▸ Chrome kiosk で全画面 — ブラウザのUIを消すと一気に「装置」になる }; MAGI SYSTEM / SIOS 21 / 29
  20. SECTION 05 デモの見どころ / 議題 01 3台が同時に唸り出す fan-out。LEDとファンで「並列で考えている」のが見える 審議にかける議題 「通勤中の電車の中でトイレは我慢したほうがいいですか?」

    02 1体ずつ結論が確定する 推論が終わった順にパネルが緑/赤に変わる 03 割れたら再審議に入る 2:1 になると討議フェーズへ。ここが出たら当たり 04 遅さが「重々しさ」になる 「金曜の夜に本番リリースしてもよいか」 「このプロジェクトに新しい言語を採用すべきか」 「会議は原則30分にすべきか」 ★ 会場からも議題を募集します ラズパイの推論は遅い。それが逆に演出として効く ▸ 意見が割れやすい議題ほど面白い。「正解のない問い」を選ぶこと。 MAGI SYSTEM / SIOS 23 / 29
  21. SECTION 05 / RESULT 実際に動かすとこうなる デモが動かない場合はこちらで説明します DECISION 結果: 1 :

    2 で否決 BALTHASAR は承認、MELCHIOR と CASPER が否決 → 多数決で否決。 OBSERVATION 観点で結論が変わっている 「人間要因」を見る1体だけが承認。 観点の分離がちゃんと効いている。 EXPLAINABLE 理由もちゃんと返る 各パネルには reason が紐づく。 モニタにMAGI画面、手前にラズパイ3台、右のターミナルに推論ログが流れる MAGI SYSTEM / SIOS なぜその判断かを説明できる。 24 / 29
  22. CONCLUSION まとめ 01 02 03 04 MAGI SYSTEM 30年前の「巨大計算機」は、15万円で机に載る SFが描いた合議制AIは、もう趣味の予算で再現できる範囲に来ている

    鍵は Ollama × LangGraph の2つ ローカルLLMをHTTPサーバにして、フローをグラフで書く。それだけで多エージェントになる コードは驚くほど短い(合計800行弱) エージェント1体は関数1つ。合議は sum() 一行。今日から真似できる 「面白そう」から入ると、最新技術が勝手に身につく マルチエージェントもローカルLLMも、題材が強いと学習が続く / SIOS 28 / 29