「One Open Source Project a Day(No.43)」MiroFish:群れ知能で未来を予測する

Dev.to / 2026/4/20

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsIdeas & Deep AnalysisTools & Practical UsageModels & Research

要点

  • MiroFishは、数千のAIエージェントをシミュレーションして集団の振る舞いを自然に進化させ、静的なモデルではなく創発的ダイナミクスから予測の軌跡を導く、群れ知能ベースの予測エンジンです。
  • 従来の「データ→学習→数値出力」型の限界を避けつつ、予測を“ストーリー”や構造化されたトレンドレポートとして捉え、群衆が特定のトピックにどう反応するかを再現(リ・エナクト)します。
  • 学ぶポイントとして、知識グラフ構築からインタラクティブなレポーティングまでを含む5段階のシミュレーション・パイプラインや、GraphRAGによるドメイン知識のエージェントへの注入が挙げられています。
  • さらに、Zep Cloudによるセッションをまたぐ永続的な記憶と、“god-mode”による変数注入で実行時のwhat-if分析を行う仕組みも紹介されます。
  • 56k+のスターと8.6k+のフォークを持ち、著者(666ghj)はMiroFishを別プロジェクト(BettaFish)と組み合わせた、データ収集からシミュレーションによる予測までを支えるパイプラインの一部として位置づけています。

はじめに

"個人を予測するな——群れ(スウォーム)をシミュレーションせよ。"

これは「One Open Source Project a Day」シリーズの第43回記事です。本日のプロジェクトは MiroFishGitHub)です。

予測ツールの標準的な定番手順は、データ収集 → モデル学習 → 数値を出力、です。しかしこのアプローチには根本的な盲点があります。モデルは静的である一方、現実世界は動的な相互作用から生まれる、という点です。世論、マーケットの挙動、政策への対応——これらは多数の個々のやり取りから創発する集合的な現象です。線形回帰で「世論の嵐」を当てはめることはできません。

MiroFishは、まったく別のアプローチを取ります。適合(フィッティング)するのではなく、再現するのです。シミュレーションされたプラットフォーム上で何千もの仮想的な「人」を走らせることで、集団の振る舞いが自然に進化し、その軌跡を予測として抽出します。これは数値を予測するのではなく、物語を予測することです。

56k+ Stars, 8.6k+ Forks——マルチエージェント・シミュレーション領域で最も注目されているプロジェクトの一つです。作者は666ghj(BaiFu)。北京郵電大学の学生で、Shanda Groupの支援を受けています。またBettaFish(40.5k Stars)の創作者でもあります。2つのプロジェクトは一緒になって、「データ収集 → シミュレーション予測」の完全なパイプラインを形成しています。

学べること

  • MiroFishの中核となる思想:なぜ群れのシミュレーションは統計的予測より真実に近いのか
  • 5段階のシミュレーション・パイプライン:知識グラフ構築から深いインタラクティブ・レポーティングまで
  • シミュレーションにおけるGraphRAGの役割:ドメイン知識をエージェントに注入する
  • Zep Cloudのセッションをまたぐメモリ:エージェントに持続的な「履歴」の感覚を与える
  • 「God-mode」変数注入:実行時のwhat-if分析

前提条件

  • マルチエージェント・システム(MAS)に関する基本的な理解
  • Pythonの基礎(任意:設定ロジックを理解するため)
  • 世論分析、またはトレンド予測への関心

プロジェクトの背景

これは何?

MiroFishは、群知能による予測エンジンです。数千のAIエージェントで仮想社会を構築し、あるトピックに対して実際の群衆がどう反応するかをシミュレーションし、創発した振る舞いから構造化されたトレンド予測レポートを生成します。

この名前は、集団知性という「創発現象」に着想を得ています。魚群(Fish)が個々の能力をはるかに超えるパターンを形成できるように、人間の社会的ダイナミクスも、個人間の相互作用から生まれ、誰一人が計画できなかった集合的な結果へとつながります。

解決する核心的な課題:

従来のアプローチ:
  過去データ → 統計モデル → 「来月の売上はXになる」
  問題: 理由を説明できない;ブラックスワン事象に対応できない

MiroFishのアプローチ:
  知識を起点に + マルチエージェント・シミュレーション → 集団の振る舞いが進化
  → 「この条件下では、群衆はこのように反応する」
  利点: 説明可能、介入可能(インターベイラブル)、what-if分析をサポート

著者について

  • GitHub: 666ghj
  • 背景: 北京郵電大学の学生。Shanda Groupの支援を受けています
  • 姉妹プロジェクト: BettaFish(40.5k ⭐)— 30以上のプラットフォームからセンチメントデータを収集し、データソースとしてMiroFishに投入
  • ビジョン: 完全なループ:BettaFishが収集 → MiroFishがシミュレートして予測

プロジェクト統計

  • GitHub Stars: 56,400+
  • Forks: 8,600+
  • 最新バージョン: v0.1.2
  • ライセンス: AGPL-3.0(コピーレフト;SaaS配備では改変をオープンソース化する必要があります)
  • 言語内訳: Python 57.6% + Vue.js 41.2%
  • 主要依存関係: CAMEL-AI OASIS、camel-ai 0.2.78、Zep Cloud 3.13.0、GraphRAG、PyMuPDF

主な機能

中核:5段階のシミュレーション・パイプライン

MiroFishは、5つの段階を厳密に順序どおりに実行します:

ステージ1:グラフ構築
  シードドキュメント(PDF/URL)→ PyMuPDFで抽出 → GraphRAGの知識グラフ
  出力:ドメイン知識グラフ(エンティティ + 関係性)

ステージ2:環境設定
  CAMEL-AI OASISが仮想プラットフォームを初期化
  各エージェントにZep Cloudの長期メモリを割り当てる
  知識グラフのコンテキストをエージェントのコンテキストへ注入

ステージ3:並列シミュレーション
  二つのプラットフォームで同時に実行(信頼性検証のため)
  Nラウンドにわたって数千のエージェントが相互作用
  エージェントの振る舞いはLLMによって駆動され、ペルソナプロフィールで制約される

ステージ4:レポート生成
  シミュレーション軌跡を集約
  LLMが集合的な振る舞いパターンを要約
  構造化されたトレンドレポートを生成

ステージ5:深いインタラクション
  ユーザーはレポートに関する自然言語の質問を行える
  「God-mode」変数注入(実行時what-if)をサポート
  RAGがシミュレーション記録を参照して質問に答える

GraphRAG:ドメイン知識を注入する

MiroFishは標準的なRAGの代わりにGraphRAGを使用します。その理由は直感的です:

# 標準RAG:ドキュメント → ベクトル → 類似チャンクを取得
# 問題:「事実は何か」は答えられても、関係性について推論できない
# GraphRAG:ドキュメント → エンティティ抽出 → 関係グラフ → グラフ探索
# 利点:「AはBに影響する。BはCに対して何をするのか?」と推論できる

シミュレーションでは、エージェントは複雑な因果の連鎖(例:「政策XがグループYの振る舞いに影響する」)を理解する必要があります。GraphRAGのグラフ構造は、ベクトル検索だけの場合よりも、この種の関係に基づく推論をはるかにうまく扱えます。

Zep Cloud:記憶するエージェント

すべてのエージェントには、それぞれ独自のZep Cloudメモリ空間が与えられます:

# 各エージェントには永続的なメモリがある
agent_memory = ZepMemory(
    session_id=f"agent_{agent_id}",
    zep_client=zep_client
)

# シミュレーションのラウンド間では、エージェントは「以前の相互作用」を「覚えて」いられる
# これによりエージェントの振る舞いは一貫し、現実の人間の認知により近づく

これにより、マルチエージェント・シミュレーションでよくある問題が解決します。もしエージェントがラウンド間で何もかも「忘れて」しまうと、振る舞いに連続性がなくなり、予測の信頼性が大きく下がってしまいます。

「God-Mode」変数注入

MiroFishの最も特徴的な機能の一つ——実行時に外部変数を注入すること:

# 例:「競合が突然20%値下げしたらどうなる?」
god_mode_injection = {
    ""event"": "competitor_price_cut",
    ""magnitude"": -0.20,
    ""timing"": "round_15",
    ""affected_agents"": "all_consumer_agents"
}

# 注入後、シミュレーションはこの「外部ショック」に対してリアルタイムに応答します
# 出力:グループのセンチメント変化 + 行動進化の軌跡

これにより、MiroFishは「何が起きるか」ツールから「もし私がこれをやったらどうなるか」意思決定支援ツールへと変わります。

デュアルプラットフォーム並列シミュレーション

MiroFishは同じシミュレーションを、2つの独立した仮想プラットフォーム上で同時に実行します:

プラットフォームA ─── 結果A ──┐
                            ├── 信頼度スコアリング + 統合レポート
プラットフォームB ─── 結果B ──┘
  • 両方のプラットフォームが収束 → 高い信頼度での結論
  • プラットフォームが分岐 → 「不確実性ゾーン」としてフラグを立て、ユーザーに注意喚起

BettaFish + MiroFish:完全なパイプライン

[BettaFish]                        [MiroFish]
Weibo / Twitter / Reddit / ...  →  シードデータ → 知識グラフ
センチメントデータ収集        →  アジェント初期化
30+ プラットフォーム            →  シミュレーション → レポート → 予測

2つのプロジェクトは一体となって、現実世界のデータ収集から将来のトレンド予測までをつなぐ「完全なチェーン」を形成します。

クイックスタート

要件:Python 3.10+、Node.js 16+、Docker(推奨)

# クローン
git clone https://github.com/666ghj/MiroFish.git
cd MiroFish

# 環境を設定
cp .env.example .env
# .env を編集:
# - OPENAI_API_KEY(または互換API)
# - ZEP_API_KEY(Zep Cloud アカウント)
# - GRAPHRAG_API_KEY

# オプション1:Dockerのワンコマンド起動(推奨)
docker-compose up -d

# オプション2:手動起動
pip install -r requirements.txt
cd frontend && npm install && npm run build && cd ..
python app.py

http://localhost:5000 にアクセスしてWeb UIを利用します。

最初のシミュレーション

1. シードドキュメントをアップロード(PDF またはURLを入力)
2. シミュレーションパラメータを設定(エージェント数、ラウンド数、トピック)
3. 「Start Simulation」をクリック
4. 約10〜30分待機(エージェント数とAPIの速度によります)
5. 生成されたトレンドレポートを確認し、自然言語でフォローアップ質問を行う

詳細解説

システムアーキテクチャ

┌──────────────────────────────────────────────────────┐
│               フロントエンド層(Vue.js)              │
│  設定 / プログレスモニタ / レポートビューア / チャット    │
└──────────────────────┬───────────────────────────────┘
                       │ REST API
┌──────────────────────▼───────────────────────────────┐
│             バックエンド層(Flask + Python)           │
│  5段階パイプラインのオーケストレーション / ゴッドモードctrl │
└──────┬───────────────┬─────────────────┬─────────────┘
       │               │                 │
┌──────▼──────┐  ┌─────▼──────┐  ┌──────▼─────────────┐
│ 知識層       │  │ シミュレーション │  │ メモリ層           │
│   Knowledge  │  │   Layer       │  │  Zep Cloud         │
│  GraphRAG   │  │  CAMEL-AI     │  │  エージェントごとのメモリ │
│  Knowledge  │  │  OASIS      │  │  ラウンド横断の保持 │
│  graph      │  │  デュアルプラット │  │  永続化               │
│  PyMuPDF    │  │  並列        │  └────────────────────┘
└─────────────┘  └────────────┘

CAMEL-AI OASIS:シミュレーションエンジン

CAMEL-AI OASISは、MiroFishのシミュレーションの中核であり、ソーシャルシミュレーションのために作られています:

from oasis import Environment, Agent, Platform

# 仮想プラットフォームを初期化
platform = Platform(
    name="simulated_weibo",
    max_agents=5000,
    interaction_rules=InteractionConfig(
        max_posts_per_round=10,
        follow_probability=0.3
    )
)

返却形式: {"translated": "翻訳されたHTML"}# 多様なペルソナでエージェントを作成する
agents = [
    Agent(
        id=i,
        persona=PersonaProfile(
            age=random.randint(18, 65),
            occupation=random.choice(occupations),
            political_lean=random.gauss(0, 1),
            activity_level=random.uniform(0.1, 1.0)
        ),
        memory=ZepMemory(session_id=f"agent_{i}"),
        knowledge_context=graphrag_context
    )
    for i in range(5000)
]

# シミュレーションを起動する
env = Environment(platform=platform, agents=agents)
results = env.run(rounds=50, topic="EV 補助金政策")

GraphRAG ナレッジグラフ構築

from graphrag import GraphRAGPipeline

# シードドキュメントからナレッジグラフを構築する
pipeline = GraphRAGPipeline(
    input_dir="./seed_documents",
    output_dir="./knowledge_graph"
)

pipeline.run()
# 出力例:
# Entities: [Tesla, BYD, Subsidy Policy, Consumer Groups, ...]
# Relations: [Tesla → competes → BYD]
#             [Subsidy Policy → stimulates → consumer purchase intent]
#             [Purchase intent → drives → market share]
# ナレッジグラフをエージェントのコンテキストに注入する
context = pipeline.query("EV 市場における重要な要因")

レポート生成:軌跡から洞察へ

def generate_report(simulation_results):
    """シミュレーションの軌跡からトレンドレポートを生成する"""

    # 1. 集計統計
    sentiment_evolution = aggregate_sentiment(simulation_results)
    opinion_clusters = cluster_opinions(simulation_results)
    key_events = detect_tipping_points(simulation_results)

    # 2. LLM による合成
    report_prompt = f"""
    以下のシミュレーションデータに基づいて、トレンド分析レポートを生成してください:
    - 機嫌(センチメント)の推移の曲線: {sentiment_evolution}
    - 意見クラスタ: {opinion_clusters}
    - 重要な転換点: {key_events}

    分析:集団としての最終的なスタンス、主要な駆動要因、起こり得る進化の道筋
    """

    report = llm.complete(report_prompt)

    # 3. デュアルプラットフォーム整合性チェック
    confidence = calculate_confidence(
        results_platform_a=simulation_results["platform_a"],
        results_platform_b=simulation_results["platform_b"]
    )

    return Report(content=report, confidence=confidence)

フロントエンド:Vue.js の可視化

Vue.js のフロントエンドは、包括的な可視化スイートを提供します:

返却形式: {"translated": "翻訳されたHTML"}
  • シミュレーション進捗モニタ: リアルタイムのステージ進捗とエージェントの活動レベル
  • 知識グラフエクスプローラ: GraphRAGによるインタラクティブなエンティティ—関係性グラフ
  • センチメントヒートマップ: シミュレーションラウンドを通じて変化する感情の分布(グループ単位)
  • レポートリーダー: 強調表示され、注釈可能なレポート。自然言語でのフォローアップチャット付き

なぜAGPL-3.0なのか?

AGPL-3.0は、ある特定の点においてGPLよりも厳格です:

MIT/Apache:  修正はクローズドソースのままでもよい(共有せずに商用化できる)
GPL:         修正したコードを配布する場合、オープンソースにする必要がある
AGPL:        修正コードを使ったネットワークサービス(SaaS)であっても、修正内容をオープンソースにしなければならない

→ MiroFishをAGPLで使う場合:それをクラウドサービスとして構築するなら
  自分の変更点をオープンソース化する必要があります。個人の研究やローカルでの利用には制限はありません。

リソース

公式

関連技術

  • CAMEL-AI: https://github.com/camel-ai/camel — マルチエージェントフレームワークの基盤
  • PyMuPDF: PDFドキュメントのパース
  • Docker: 推奨されるデプロイ方法

まとめ

重要なポイント

  1. スウォーム・シミュレーションが統計的フィッティングに取って代わる: MiroFishは過去データを当てはめません — 集団の相互作用を再現します。出力は一点予測ではなく、「行動がどう進化していくか」という物語です
  2. GraphRAGによる知識強化: グラフ構造の知識表現により、エージェントは単なる事実検索ではなく、領域レベルの因果推論を行えます
  3. Zep Cloudのラウンドをまたぐメモリ: シミュレーションの継続性を解決し、エージェントの振る舞いが人間の認知パターンに本物らしく従うようになります
  4. ゴッドモードの仮定(what-if)分析: 実行時の変数インジェクションによって、予測ツールを意思決定支援ツールへと変えます
  5. デュアルプラットフォームの信頼性メカニズム: 一貫性に基づく信頼度スコアリングは、単一の予測よりも不確実性に対して正直です
  6. BettaFish + MiroFishのクローズドループ: 現実世界のデータ収集から将来のトレンド予測までを一貫したパイプラインとして実現します

このような方におすすめ

  • 研究者: 世論ダイナミクス、社会シミュレーション、計算社会科学の分野で活動する研究者
  • プロダクトマネージャー / 市場アナリスト: 市場の反応を見越し、シナリオ分析を回したい意思決定者
  • AIエンジニア: マルチエージェント・シミュレーションのアーキテクチャ、GraphRAGの活用、エージェントのメモリシステムを研究している開発者
  • 独立研究者: スウォーム知能の創発に関心があり、AIを使って複雑な社会システムを理解したい探索者

一緒に座って考える価値のある問い

MiroFishは、AI予測の新しいパラダイムを表します:「モデルフィッティング」から「世界のシミュレーション」へ。マルチエージェント・システムで現実世界を再現することで、より深い問いを投げかけています — そもそも現実とは、ダイナミックな均衡の中にある無数のエージェントの、創発的な結果なのです。おそらく、その創発を本当に理解するには、それに見合う複雑さのシミュレーションが必要なのでしょう。

魚の群れには中央の指揮者がいないのに、見事な集団パターンを形成します。同じように、世論の軌道も同じ目に見えない手によって形作られているのでしょうか?

より役に立つ知識や面白いプロダクトについては、私の個人サイトをご覧ください