﻿---
lang: zh-TW
title: "一份文件能預測未來嗎：從 MiroFish 看群體智慧模擬與市場調研"
description: "一個號稱「預測萬物」的開源專案，三個月拿到 3000 萬投資、近 8
  萬星。順著它往下追：一份文件怎麼變成一份預測報告，成百上千個智慧體從哪來、怎麼互動，模擬一群人為什麼被認為能預測，這個前提在 MiroFish
  裡是否成立，最後看這類「模擬人群」能不能替代傳統市場調研。"
pubDate: 2026-10-14
tags: [ "AI", "多智能体", "开源", "市场调研" ]
clc: "TP18"
hero: "./hero.zh-TW.svg"
refs:
  - id: "1"
    title: "陳天橋投了個00後"
    url: "https://36kr.com/p/3720728841763465"
    collect: "36kr-p-3720728841763465"
    site: "36氪"
    date: "2026-03-13"
    note: "投資金額來自媒體報道，MiroFish README 只寫明「得到了盛大集團的戰略支援和孵化」。"
  - id: "1b"
    title: "大四學生AI專案登GitHub榜首，獲陳天橋3000萬投資"
    url: "https://news.qq.com/rain/a/20260309A0463B00"
    collect: "qq-rain-a-20260309a0463b00"
    site: "騰訊新聞"
    date: "2026-03-09"
  - id: "2"
    title: "十天 Vibe Coding！00後小孩哥獲盛大3000萬投資，當上CEO"
    url: "https://www.shobserver.com/wx/detail.do?id=1079759"
    collect: "shobserver-wx-detail-doid-1079759"
    site: "上觀新聞"
  - id: "3"
    title: "OASIS: Open Agent Social Interaction Simulations with One Million Agents"
    author: "Yang Z, et al."
    site: "arXiv"
    date: "2024"
    note: "arXiv:2411.11581"
  - id: "4"
    title: "MiroFish: swarm AI"
    url: "https://intnews.it/en/en-mirofish-swarm-ai/"
    collect: "intnews-mirofish-swarm-ai"
    site: "intnews"
    date: "2026-05"
  - id: "5"
    title: "Vox Populi"
    author: "Galton F"
    site: "Nature"
    date: "1907"
    note: "75:450–451"
  - id: "6"
    title: "The Wisdom of Crowds"
    author: "Surowiecki J"
    site: "Doubleday"
    date: "2004"
  - id: "7"
    title: "Generative Agents: Interactive Simulacra of Human Behavior"
    author: "Park JS, et al."
    site: "UIST"
    date: "2023"
    note: "UIST 2023，arXiv:2304.03442"
  - id: "8"
    title: "Generative Agent Simulations of 1,000 People"
    author: "Park JS, et al."
    site: "arXiv"
    date: "2024"
    note: "arXiv:2411.10109"
  - id: "9"
    title: "Synthetic Replacements for Human Survey Data? The Perils of Large
      Language Models"
    author: "Bisbee J, et al."
    site: "Political Analysis"
    date: "2024"
  - id: "10"
    title: "Large language models that replace human participants can harmfully
      misportray and flatten identity groups"
    author: "Wang A, Morgenstern J, Dickerson JP"
    site: "Nature Machine Intelligence"
    date: "2025"
    note: "arXiv:2402.01908"
  - id: "11"
    title: "國聯民生金工用 Claude Code 驅動 MiroFish 的測試"
    url: "https://finance.sina.com.cn/wm/2026-03-24/doc-inhsaeyx3531428.shtml"
    collect: "sina-wm-2026-03-24-inhsaeyx3531428-shtml"
    site: "新浪財經"
    date: "2026-03-24"
  - id: "12"
    title: "How are research methods evolving?"
    url: "https://researchworld.com/articles/how-are-research-methods-evolving"
    collect: "researchworld-how-are-research-methods-evolving"
    site: "Researchworld"
    note: "ESOMAR Global Market Research 2024，2023 年資料"
  - id: "13"
    title: "Inside the $153bn insights industry"
    url: "https://researchworld.com/articles/inside-the-153bn-insights-industry"
    collect: "researchworld-inside-the-153bn-insights-industry"
    site: "Researchworld"
  - id: "14"
    title: "How much does Market Research cost in 2025?"
    url: "https://www.intotheminds.com/blog/en/market-research-what-does-it-cost/"
    collect: "intotheminds-market-research-what-does-it-cost"
    site: "IntoTheMinds"
  - id: "15"
    title: "AI 將如何重塑市場與使用者洞察行業"
    url: "https://www.woshipm.com/ai/6427888.html"
    collect: "woshipm-ai-6427888-html"
    site: "人人都是產品經理"
    note: "成本結構和樣本價格為作者的從業經驗估算，未註明資料來源。"
  - id: "16"
    title: "Fraud in online surveys: a literature review"
    url: "https://www.norc.org/content/dam/norc-org/pdf2026/cpss-research-brief-fra\
      ud-lit-review.pdf"
    collect: "norc-content-dam-norc-org-pdf2026-cpss-research"
    site: "NORC"
    date: "2026"
    note: "其中引用 Westwood SJ, PNAS 2025。"
  - id: "17"
    title: "LLMs Reproduce Human Purchase Intent via Semantic Similarity Elicitation
      of Likert Ratings"
    author: "Maier BF, et al."
    site: "arXiv"
    date: "2025"
    note: "arXiv:2510.08338"
  - id: "17b"
    title: "Synthetic Consumers in Market Research"
    url: "https://www.pymc-labs.com/blog-posts/synthetic-consumers-a-practical-guid\
      e"
    collect: "pymc-labs-synthetic-consumers-a-practical-guide"
    site: "PyMC Labs"
  - id: "18"
    title: "What Our Data Showed When We Tested Synthetic vs Human Respondents in a
      Brand Survey"
    url: "https://www.directionsgroup.com/insights/what-our-data-showed-when-we-tes\
      ted-synthetic-vs-human-respondents-in-a-brand-survey"
    collect: "directionsgroup-insights-what-our-data-showed-wh"
    site: "The Directions Group"
  - id: "19"
    title: "AI digital twin startup Simile raises $100M"
    url: "https://siliconangle.com/2026/02/12/ai-digital-twin-startup-simile-raises\
      -100M-funding/"
    collect: "siliconangle-2026-02-12-ai-digital-twin-startup"
    site: "SiliconANGLE"
    date: "2026-02-12"
  - id: "19b"
    title: "Simile Series B"
    url: "https://raising.fi/news/simile-series-b-july-2026"
    collect: "raising-simile-series-b-july-2026"
    site: "raising.fi"
    date: "2026-07"
  - id: "19c"
    title: "Synthetic-user startup Simile raises $200M at $2B valuation 5 months
      after $100M Series A"
    url: "https://techcrunch.com/2026/07/30/synthetic-user-startup-simile-raises-20\
      0m-at-2b-valuation-5-months-after-100m-series-a/"
    collect: "techcrunch-2026-07-30-synthetic-user-startup-sim"
    site: "TechCrunch"
    date: "2026-07-30"
  - id: "20"
    title: "AI synthetic research startup Aaru raised a Series A at a $1B headline
      valuation"
    url: "https://techcrunch.com/2025/12/05/ai-synthetic-research-startup-aaru-rais\
      ed-a-series-a-at-a-1b-headline-valuation"
    collect: "techcrunch-2025-12-05-ai-synthetic-research-star"
    site: "TechCrunch"
    date: "2025-12-05"
  - id: "21"
    title: "An AI polling startup polls bots, predicts Harris will win"
    url: "https://www.semafor.com/article/11/04/2024/an-ai-polling-startup-polls-bo\
      ts-predicts-harris-will-win"
    collect: "semafor-11-04-2024-an-ai-polling-startup-polls-b"
    site: "Semafor"
    date: "2024-11-04"
  - id: "22"
    title: "Qualtrics adds AI-powered synthetic data research tools"
    url: "https://siliconangle.com/2026/03/18/qualtrics-adds-ai-powered-synthetic-d\
      ata-research-tools-speed-customer-insights/"
    collect: "siliconangle-2026-03-18-qualtrics-adds-ai-powere"
    site: "SiliconANGLE"
    date: "2026-03-18"
  - id: "23"
    title: "LLMs Are Closing the Gap on Human Superforecasters"
    url: "https://forecastingresearch.substack.com/p/llms-are-closing-the-gap-on-hu\
      man"
    collect: "substack-p-llms-are-closing-the-gap-on-human"
    site: "Forecasting Research Institute"
    date: "2026-01-29"
    note: "ForecastBench 結果：超級預測者仍居第一，領先最強模型約 0.017 Brier。"
---

2026 年 3 月初，一個叫 MiroFish 的開源專案登上了 GitHub 全球 Trending 第一。它的口號是「簡潔通用的群體智慧引擎，預測萬物」：上傳一份「種子材料」（新聞、報告，甚至一部小說），用一句話寫下你想預測什麼，系統就會生成一個由大量 AI 智慧體組成的模擬社交網路，讓它們發帖、轉發、爭論，最後交給你一份「未來預測報告」。

圍繞它的故事很有傳播力：作者郭航江是一名大四學生，前一個專案是輿情分析工具 BettaFish（微輿）；據媒體報道，盛大集團的陳天橋看到 BettaFish 後約見了他，他用大約十天做出 MiroFish 的預測功能，24 小時內兩人進行了第二次談話，陳天橋當場決定投資 3000 萬元人民幣[^1][^1b]。官方演示裡最吸引眼球的一個例子，是把《紅樓夢》前 80 回喂進去，「預測」出失傳的結局，其中黛玉焚稿、湘蓮出家等情節與通行本「基本吻合」[^2]。到今天（2026 年 10 月），這個倉庫已經有約 7.6 萬 star。

看完這些，我的第一反應是好奇，第二反應是懷疑。於是有了幾個問題：

1. 一份文件到底是怎麼變成一份「預測報告」的？
2. 宣傳裡「成千上萬個智慧體」從哪來？它們在模擬裡怎麼互動？
3. 為什麼人們相信「模擬一群人」就能預測？這個前提在 MiroFish 裡成立嗎？
4. 如果它預測不準，那這一類「模擬人群」的技術，能不能吃掉傳統市場調研的蛋糕？

本文就順著這幾個問題往下講。前兩個問題的答案來自我對 MiroFish 開原始碼（`666ghj/MiroFish`，2026-10-02 的提交 `7657031`）的閱讀，後兩個問題則要走出這個專案，看學術研究和市場上發生了什麼。

---

## 一、從一份文件到一份報告

### 現象

MiroFish 的介面把流程分成五步：圖譜構建、環境搭建、開始模擬、報告生成、深度互動。從外面看，這像一個黑盒：放進去一份文件，過一段時間，出來一個視覺化的社交網路和一份報告。

### 拆開來看

開啟後端程式碼，這個黑盒其實是三個現成元件的串聯：

- **Zep Cloud**：一個知識圖譜和記憶服務，負責把文字變成「實體 + 關係」的圖。
- **OASIS**：CAMEL-AI 團隊開源的社交媒體模擬框架，能模擬最多 100 萬個 LLM 智慧體在類似 X 和 Reddit 的平臺上互動[^3]。MiroFish 的 README 裡寫明「模擬引擎由 OASIS 驅動」。
- **任意 OpenAI 相容的大模型**，README 推薦阿里百鍊的 `qwen-plus`。

一次執行大致是這樣走的：

1. **設計本體。** 大模型讀種子文字和預測需求，設計這次模擬要用的實體型別和關係型別（`ontology_generator.py`）。
2. **建圖。** 文字按 500 字一塊切開，送進 Zep，由 Zep 按本體抽取實體和關係（`graph_builder.py`）。
3. **生成人設。** 圖譜裡的每個實體，被大模型寫成一份社交媒體使用者的人設（`oasis_profile_generator.py`）。
4. **生成配置並模擬。** 大模型再生成一份模擬配置（時長、誰先發帖、每個人什麼時候上線），然後用 OASIS 同時起一個 Twitter 環境和一個 Reddit 環境跑若干輪（`run_parallel_simulation.py`）。
5. **寫報告。** 一個用 ReACT 模式工作的 ReportAgent 在模擬結果上檢索、採訪智慧體、分章節寫出報告（`report_agent.py`）。

用《紅樓夢》那次演示的數字填進去，就是下面這張圖。

<figure class="dd dd-figure">
<div class="dd-scroll">
<svg class="dd-svg" viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="mf-pipe-title mf-pipe-desc">
<title id="mf-pipe-title">MiroFish 一次執行的四個階段</title>
<desc id="mf-pipe-desc">《紅樓夢》前 80 回約 15 萬字，經本體設計和 Zep 建圖得到 905 個實體節點、3822 條關係邊；實體被寫成 580 份人設，在兩個模擬平臺上跑 30 輪、約 2000 次動作；最後由 ReportAgent 寫報告，全程約 14 元。</desc>
<defs>
<marker id="mf-pipe-arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path class="dd-head" d="M1 1 L7 4 L1 7"/></marker>
<marker id="mf-pipe-arrow-acc" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path class="dd-head-acc" d="M1 1 L7 4 L1 7"/></marker>
</defs>
<rect class="dd-frame" width="800" height="400" rx="10"/>
<rect class="dd-zone" x="16" y="16" width="180" height="368" rx="8"/>
<text class="t-zone" x="32" y="44">種子材料</text>
<rect class="dd-zone" x="212" y="16" width="180" height="368" rx="8"/>
<text class="t-zone" x="228" y="44">知識圖譜 · Zep</text>
<rect class="dd-zone" x="408" y="16" width="180" height="368" rx="8"/>
<text class="t-zone" x="424" y="44">模擬 · OASIS</text>
<rect class="dd-zone" x="604" y="16" width="180" height="368" rx="8"/>
<text class="t-zone" x="620" y="44">報告</text>
<path class="dd-edge" d="M180 106 H226" marker-end="url(#mf-pipe-arrow)"/>
<path class="dd-edge" d="M302 148 V178" marker-end="url(#mf-pipe-arrow)"/>
<path class="dd-edge-acc" d="M376 225 H392 Q400 225 400 217 V117 Q400 109 408 109 H422" marker-end="url(#mf-pipe-arrow-acc)"/>
<path class="dd-edge" d="M498 148 V178" marker-end="url(#mf-pipe-arrow)"/>
<path class="dd-edge" d="M572 235 H588 Q596 235 596 227 V127 Q596 119 604 119 H618" marker-end="url(#mf-pipe-arrow)"/>
<rect class="dd-card" x="32" y="64" width="148" height="110" rx="6"/>
<path class="dd-card-head" d="M32.6 96 V70 Q32.6 64.6 38 64.6 H174 Q179.4 64.6 179.4 70 V96 Z"/>
<line class="dd-edge" x1="32" y1="96" x2="180" y2="96"/>
<text class="t-name" x="48" y="85">《紅樓夢》</text>
<text class="t-mono" x="48" y="113">範圍</text><text class="t-val" x="164" y="113" text-anchor="end">前 80 回</text>
<line class="dd-hair" x1="48" y1="122" x2="164" y2="122"/>
<text class="t-mono" x="48" y="139">字數</text><text class="t-val" x="164" y="139" text-anchor="end">約 15 萬</text>
<line class="dd-hair" x1="48" y1="148" x2="164" y2="148"/>
<text class="t-mono" x="48" y="165">分塊</text><text class="t-val" x="164" y="165" text-anchor="end">500 字</text>
<rect class="dd-card" x="32" y="206" width="148" height="84" rx="6"/>
<path class="dd-card-head" d="M32.6 238 V212 Q32.6 206.6 38 206.6 H174 Q179.4 206.6 179.4 212 V238 Z"/>
<line class="dd-edge" x1="32" y1="238" x2="180" y2="238"/>
<text class="t-name" x="48" y="227">預測需求</text>
<text class="t-mono" x="48" y="255">形式</text><text class="t-val" x="164" y="255" text-anchor="end">一句話</text>
<line class="dd-hair" x1="48" y1="264" x2="164" y2="264"/>
<text class="t-mono" x="48" y="281">例如</text><text class="t-val" x="164" y="281" text-anchor="end">推演結局</text>
<rect class="dd-card" x="228" y="64" width="148" height="84" rx="6"/>
<path class="dd-card-head" d="M228.6 96 V70 Q228.6 64.6 234 64.6 H370 Q375.4 64.6 375.4 70 V96 Z"/>
<line class="dd-edge" x1="228" y1="96" x2="376" y2="96"/>
<text class="t-name" x="244" y="85">本體</text>
<text class="t-mono" x="244" y="113">實體型別</text><text class="t-val" x="360" y="113" text-anchor="end">10</text>
<line class="dd-hair" x1="244" y1="122" x2="360" y2="122"/>
<text class="t-mono" x="244" y="139">關係型別</text><text class="t-val" x="360" y="139" text-anchor="end">6–10</text>
<rect class="dd-card" x="228" y="180" width="148" height="84" rx="6"/>
<path class="dd-card-head" d="M228.6 212 V186 Q228.6 180.6 234 180.6 H370 Q375.4 180.6 375.4 186 V212 Z"/>
<line class="dd-edge" x1="228" y1="212" x2="376" y2="212"/>
<text class="t-name" x="244" y="201">圖譜</text>
<text class="t-mono" x="244" y="229">節點</text><text class="t-val t-acc" x="360" y="229" text-anchor="end">905</text>
<line class="dd-hair" x1="244" y1="238" x2="360" y2="238"/>
<text class="t-mono" x="244" y="255">邊</text><text class="t-val" x="360" y="255" text-anchor="end">3822</text>
<rect class="dd-card" x="424" y="64" width="148" height="84" rx="6"/>
<path class="dd-card-head" d="M424.6 96 V70 Q424.6 64.6 430 64.6 H566 Q571.4 64.6 571.4 70 V96 Z"/>
<line class="dd-edge" x1="424" y1="96" x2="572" y2="96"/>
<text class="t-name" x="440" y="85">人設</text>
<text class="t-mono" x="440" y="113">agent</text><text class="t-val t-acc" x="556" y="113" text-anchor="end">580</text>
<line class="dd-hair" x1="440" y1="122" x2="556" y2="122"/>
<text class="t-mono" x="440" y="139">每份</text><text class="t-val" x="556" y="139" text-anchor="end">約 2000 字</text>
<rect class="dd-card" x="424" y="180" width="148" height="110" rx="6"/>
<path class="dd-card-head" d="M424.6 212 V186 Q424.6 180.6 430 180.6 H566 Q571.4 180.6 571.4 186 V212 Z"/>
<line class="dd-edge" x1="424" y1="212" x2="572" y2="212"/>
<text class="t-name" x="440" y="201">雙平臺模擬</text>
<text class="t-mono" x="440" y="229">平臺</text><text class="t-val" x="556" y="229" text-anchor="end">2 個</text>
<line class="dd-hair" x1="440" y1="238" x2="556" y2="238"/>
<text class="t-mono" x="440" y="255">輪數</text><text class="t-val" x="556" y="255" text-anchor="end">30</text>
<line class="dd-hair" x1="440" y1="264" x2="556" y2="264"/>
<text class="t-mono" x="440" y="281">動作</text><text class="t-val" x="556" y="281" text-anchor="end">約 2000 次</text>
<rect class="dd-card" x="620" y="64" width="148" height="110" rx="6"/>
<path class="dd-card-head" d="M620.6 96 V70 Q620.6 64.6 626 64.6 H762 Q767.4 64.6 767.4 70 V96 Z"/>
<line class="dd-edge" x1="620" y1="96" x2="768" y2="96"/>
<text class="t-name" x="636" y="85">ReportAgent</text>
<text class="t-mono" x="636" y="113">章節</text><text class="t-val" x="752" y="113" text-anchor="end">2–5</text>
<line class="dd-hair" x1="636" y1="122" x2="752" y2="122"/>
<text class="t-mono" x="636" y="139">檢索</text><text class="t-val" x="752" y="139" text-anchor="end">≤5 次/章</text>
<line class="dd-hair" x1="636" y1="148" x2="752" y2="148"/>
<text class="t-mono" x="636" y="165">採訪</text><text class="t-val" x="752" y="165" text-anchor="end">可選</text>
<rect class="dd-card" x="620" y="206" width="148" height="84" rx="6"/>
<path class="dd-card-head" d="M620.6 238 V212 Q620.6 206.6 626 206.6 H762 Q767.4 206.6 767.4 212 V238 Z"/>
<line class="dd-edge" x1="620" y1="238" x2="768" y2="238"/>
<text class="t-name" x="636" y="227">成本</text>
<text class="t-mono" x="636" y="255">模型</text><text class="t-val" x="752" y="255" text-anchor="end">qwen-plus</text>
<line class="dd-hair" x1="636" y1="264" x2="752" y2="264"/>
<text class="t-mono" x="636" y="281">花費</text><text class="t-val" x="752" y="281" text-anchor="end">約 14 元</text>
<text class="t-say" x="228" y="328">圖譜裡的實體，被寫成人設，</text>
<text class="t-say" x="228" y="348">每份人設就是一個賬號。</text>
</svg>
</div>
<figcaption>圖 1 · 《紅樓夢》演示的一次完整執行。905 個實體節點裡抽出 580 個人設，這個數字決定了模擬裡有多少個智慧體。資料來自官方演示的媒體報道，階段劃分來自原始碼。</figcaption>
</figure>

幾個數字值得留意：15 萬字的小說，最後變成了 580 個智慧體，30 輪模擬裡一共只發生了大約 2000 次動作，全程花了 14 元左右。這和「成千上萬個智慧體自由互動」的想象有一段距離。

**那麼，這 580 個智慧體是怎麼來的？為什麼是 580，而不是 5000？**

---

## 二、智慧體的來源

### 現象

README 的描述是「成千上萬個具備獨立人格、長期記憶與行為邏輯的智慧體」。但如果你去翻 MiroFish 的介面和配置，會發現沒有任何地方能填「我要多少個智慧體」。有人做過實測，想要 100 個智慧體，最後只生成了約 25 個[^4]。

### 原因：智慧體就是圖譜裡的實體

答案藏在第一步「設計本體」的提示詞裡。`ontology_generator.py` 給大模型的要求是：

- 設計**正好 10 個實體型別**，其中最後兩個必須是兜底的 `Person` 和 `Organization`；
- 實體「必須是現實中真實存在的、可以在社媒上發聲和互動的主體」，可以是個人、公司、政府部門、媒體、特定群體代表；
- 抽象概念（「輿論」「情緒」）、話題（「學術誠信」）、立場（「支援方」）都**不能**當實體。

為什麼要這樣限定？因為後面每個實體都會直接變成一個社交媒體賬號。`oasis_profile_generator.py` 對每個實體先到 Zep 裡檢索它的相關關係做上下文，再讓大模型寫一份人設：200 字的簡介，加一份約 2000 字的詳細人設，內容包括年齡職業、人物背景、MBTI、發帖習慣、立場、口頭禪，以及「個人記憶」（這個人和事件的關聯）。機構類實體用另一套模板，MBTI 預設填 `ISTJ`，註釋寫的是「機構風格：嚴謹保守」。這份人設最後被放進 OASIS 裡該智慧體的系統提示詞。

所以，**智慧體的數量 = 種子文件裡能抽出的、能發聲的實體數量**。《紅樓夢》人物眾多，抽出了 580 個；一篇只提到幾個當事方的新聞稿，就只有幾十個。想要「成千上萬」，前提是你的文件裡本來就有成千上萬個有名有姓的角色。

這也決定了 MiroFish 模擬的是什麼樣的「群體」：它不是一個從人口裡抽出來的樣本，而是**文件裡出現過的那些角色**，每個角色由大模型根據文件裡的隻言片語，補寫成一個完整的人。

**有了這些角色，它們在模擬裡又是怎麼「互動」的？**

---

## 三、模擬的執行

### 現象

在介面的第二步，MiroFish 會展示一份大模型生成的、相當細緻的模擬配置：每個智慧體有自己的活躍度、活躍時段、情感傾向（`sentiment_bias`）、立場（`stance`）、影響力權重（`influence_weight`）；每個平臺有推薦演算法權重、病毒傳播閾值（`viral_threshold`）、回聲室強度（`echo_chamber_strength`）；還有定時事件和「輿論引導方向」。看上去，這是一個引數齊全的社會模擬器。

### 分析：每一輪發生了什麼

模擬的主迴圈在 `scripts/run_parallel_simulation.py`。以 Twitter 環境為例：

1. **第 0 輪**，配置裡指定的幾個智慧體發出「初始帖子」，作為整個事件的起點。
2. **之後每一輪**代表模擬世界裡的一段時間（預設 60 分鐘），總輪數 = 總時長 × 60 ÷ 每輪分鐘數，72 小時就是 72 輪。
3. 每一輪先按模擬時鐘算出當前是幾點，內建一張「中國作息」表：19–22 點是高峰，倍率 1.5；0–5 點幾乎無人，倍率 0.05。
4. 這一輪要啟用的人數 = `random.uniform(5, 20)` × 倍率。也就是說，**預設每個模擬小時只有 5 到 20 個智慧體上線**，高峰時多一些。
5. 每個智慧體如果當前處在自己的活躍時段，就以 `activity_level` 的機率進入候選，再從候選裡隨機抽出目標人數。
6. 被抽中的智慧體執行一次 `LLMAction()`：OASIS 把它的推薦流裡的帖子放進提示詞，由大模型決定這次是發帖、點贊、轉發、引用、關注，還是什麼都不做（Reddit 環境多了評論、點踩、搜尋、看熱榜等動作）。

這就解釋了為什麼 580 個智慧體跑 30 輪只有約 2000 次動作：每輪幾十個人上線，每人做一件事。

### 第二個發現：很多引數只是展示

順著程式碼往下找，我想知道 `stance`、`sentiment_bias` 這些引數在模擬裡是怎麼起作用的。結果是：**在模擬指令碼里找不到讀取它們的地方。**

<figure class="dd dd-figure">
<div class="dd-scroll">
<svg class="dd-svg" viewBox="0 0 800 528" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="mf-cfg-title mf-cfg-desc">
<title id="mf-cfg-title">大模型生成的配置，哪些真正進了模擬</title>
<desc id="mf-cfg-desc">左邊是大模型生成的模擬配置。activity_level、active_hours、minutes_per_round、peak_hours、initial_posts 被每輪的啟用邏輯讀取；stance、sentiment_bias、influence_weight、echo_chamber_strength、viral_threshold、scheduled_events 只在前端展示，模擬指令碼中找不到讀取它們的程式碼。</desc>
<defs>
<marker id="mf-cfg-arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path class="dd-head" d="M1 1 L7 4 L1 7"/></marker>
<marker id="mf-cfg-arrow-acc" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"><path class="dd-head-acc" d="M1 1 L7 4 L1 7"/></marker>
</defs>
<rect class="dd-frame" width="800" height="528" rx="10"/>
<rect class="dd-zone" x="16" y="16" width="384" height="496" rx="8"/>
<text class="t-zone" x="32" y="44">simulation_config.json · 大模型生成</text>
<rect class="dd-zone" x="416" y="16" width="368" height="496" rx="8"/>
<text class="t-zone" x="432" y="44">run_parallel_simulation.py · 每一輪</text>
<path class="dd-edge-acc" d="M384 122 H430" marker-end="url(#mf-cfg-arrow-acc)"/>
<path class="dd-edge-acc" d="M384 220 H400 Q408 220 408 212 V182 Q408 174 416 174 H430" marker-end="url(#mf-cfg-arrow-acc)"/>
<path class="dd-edge" d="M600 226 V256" marker-end="url(#mf-cfg-arrow)"/>
<rect class="dd-card" x="32" y="64" width="352" height="84" rx="6"/>
<path class="dd-card-head" d="M32.6 96 V70 Q32.6 64.6 38 64.6 H378 Q383.4 64.6 383.4 70 V96 Z"/>
<line class="dd-edge" x1="32" y1="96" x2="384" y2="96"/>
<text class="t-name" x="48" y="85">agent_configs[3]</text>
<text class="t-mono t-acc" x="48" y="113">activity_level</text><text class="t-val" x="368" y="113" text-anchor="end">0.6</text>
<line class="dd-hair" x1="48" y1="122" x2="368" y2="122"/>
<text class="t-mono t-acc" x="48" y="139">active_hours</text><text class="t-val" x="368" y="139" text-anchor="end">9–17</text>
<rect class="dd-card" x="32" y="164" width="352" height="110" rx="6"/>
<path class="dd-card-head" d="M32.6 196 V170 Q32.6 164.6 38 164.6 H378 Q383.4 164.6 383.4 170 V196 Z"/>
<line class="dd-edge" x1="32" y1="196" x2="384" y2="196"/>
<text class="t-name" x="48" y="185">time_config / event_config</text>
<text class="t-mono t-acc" x="48" y="213">minutes_per_round</text><text class="t-val" x="368" y="213" text-anchor="end">60</text>
<line class="dd-hair" x1="48" y1="222" x2="368" y2="222"/>
<text class="t-mono t-acc" x="48" y="239">peak_hours</text><text class="t-val" x="368" y="239" text-anchor="end">19–22</text>
<line class="dd-hair" x1="48" y1="248" x2="368" y2="248"/>
<text class="t-mono t-acc" x="48" y="265">initial_posts</text><text class="t-val" x="368" y="265" text-anchor="end">3 條</text>
<rect class="dd-derived" x="32" y="290" width="352" height="204" rx="6"/>
<text class="t-name" x="48" y="315">只在 Step2EnvSetup.vue 裡展示</text>
<text class="t-mono" x="48" y="347">stance</text><text class="t-val" x="368" y="347" text-anchor="end">opposing</text>
<line class="dd-hair" x1="48" y1="356" x2="368" y2="356"/>
<text class="t-mono" x="48" y="373">sentiment_bias</text><text class="t-val" x="368" y="373" text-anchor="end">-0.4</text>
<line class="dd-hair" x1="48" y1="382" x2="368" y2="382"/>
<text class="t-mono" x="48" y="399">influence_weight</text><text class="t-val" x="368" y="399" text-anchor="end">2.5</text>
<line class="dd-hair" x1="48" y1="408" x2="368" y2="408"/>
<text class="t-mono" x="48" y="425">echo_chamber_strength</text><text class="t-val" x="368" y="425" text-anchor="end">0.5</text>
<line class="dd-hair" x1="48" y1="434" x2="368" y2="434"/>
<text class="t-mono" x="48" y="451">viral_threshold</text><text class="t-val" x="368" y="451" text-anchor="end">10</text>
<line class="dd-hair" x1="48" y1="460" x2="368" y2="460"/>
<text class="t-mono" x="48" y="477">scheduled_events</text><text class="t-val" x="368" y="477" text-anchor="end">2 條</text>
<rect class="dd-card" x="432" y="64" width="336" height="162" rx="6"/>
<path class="dd-card-head" d="M432.6 96 V70 Q432.6 64.6 438 64.6 H762 Q767.4 64.6 767.4 70 V96 Z"/>
<line class="dd-edge" x1="432" y1="96" x2="768" y2="96"/>
<text class="t-name" x="448" y="85">第 21 輪 · 模擬時間 20:00</text>
<text class="t-mono" x="448" y="113">倍率</text><text class="t-val" x="752" y="113" text-anchor="end">1.5（高峰）</text>
<line class="dd-hair" x1="448" y1="122" x2="752" y2="122"/>
<text class="t-mono" x="448" y="139">目標人數</text><text class="t-val" x="752" y="139" text-anchor="end">uniform(5, 20) × 1.5</text>
<line class="dd-hair" x1="448" y1="148" x2="752" y2="148"/>
<text class="t-mono" x="448" y="165">候選</text><text class="t-val" x="752" y="165" text-anchor="end">random() &lt; activity_level</text>
<line class="dd-hair" x1="448" y1="174" x2="752" y2="174"/>
<text class="t-mono" x="448" y="191">入選</text><text class="t-val" x="752" y="191" text-anchor="end">random.sample(候選, 目標人數)</text>
<line class="dd-hair" x1="448" y1="200" x2="752" y2="200"/>
<text class="t-mono" x="448" y="217">執行</text><text class="t-val" x="752" y="217" text-anchor="end">LLMAction()</text>
<rect class="dd-card" x="432" y="258" width="336" height="110" rx="6"/>
<path class="dd-card-head" d="M432.6 290 V264 Q432.6 258.6 438 258.6 H762 Q767.4 258.6 767.4 264 V290 Z"/>
<line class="dd-edge" x1="432" y1="290" x2="768" y2="290"/>
<text class="t-name" x="448" y="279">OASIS 環境</text>
<text class="t-mono" x="448" y="307">推薦流</text><text class="t-val" x="752" y="307" text-anchor="end">OASIS 自帶</text>
<line class="dd-hair" x1="448" y1="316" x2="752" y2="316"/>
<text class="t-mono" x="448" y="333">人設</text><text class="t-val" x="752" y="333" text-anchor="end">user_char（約 2000 字）</text>
<line class="dd-hair" x1="448" y1="342" x2="752" y2="342"/>
<text class="t-mono" x="448" y="359">決策</text><text class="t-val" x="752" y="359" text-anchor="end">大模型選一個動作</text>
<text class="t-say" x="432" y="420">虛線框裡的欄位由大模型生成，</text>
<text class="t-say" x="432" y="440">模擬指令碼里找不到讀取它們的程式碼。</text>
</svg>
</div>
<figcaption>圖 2 · 大模型生成的配置裡，真正被模擬指令碼讀取的只有作息配置和初始帖子（強調色）。立場、情感傾向、回聲室強度等欄位只在前端展示。示例數值為示意，欄位名來自原始碼。</figcaption>
</figure>

具體來說（基於提交 `7657031`，在整個倉庫裡搜尋這些欄位名）：

- `sentiment_bias`、`stance`、`echo_chamber_strength`、`viral_threshold`、推薦演算法權重、`scheduled_events`、`narrative_direction`，除了生成它們的 `simulation_config_generator.py`，只出現在前端的 `Step2EnvSetup.vue` 裡。`influence_weight` 只在生成配置時用來挑選誰發初始帖子。
- 推薦演算法用的是 OASIS 自帶的，沒有用到這裡生成的權重。
- 宣傳中的「上帝視角動態注入變數」，在開源版裡也沒有對應的介面：模擬開始後，能做的只有「採訪」某個智慧體。能「注入」的變數，其實就是開始前寫的那句預測需求。

真正影響模擬結果的，是三樣東西：**人設文字、作息配置、初始帖子**，其餘全部交給大模型在每一步自行判斷。

這本身不是什麼嚴重的缺陷，很多原型都是先把引數生成出來、再逐步接入。但它說明了一件事：MiroFish 的「社會動力學」幾乎完全來自大模型扮演角色時的自由發揮，而不是來自一個可調、可解釋的模型。

**問題於是變成了：讓一個大模型扮演幾百個角色、在模擬的社交網路裡互動，憑什麼能預測現實？**

---

## 四、群體為什麼能「預測」

### 群體智慧的前提

「群體智慧」這個說法讓人聯想到「群體的智慧」。最常被引用的例子是高爾頓在 1906 年記錄的一次鄉村集市：約 800 人競猜一頭牛宰殺後的重量，猜測的中位數和真實重量只差約 1%[^5]。

但群體的智慧有前提。蘇羅維基在《群體的智慧》裡總結了四條：**觀點多樣、彼此獨立、分散、有合適的方式把判斷彙總起來**[^6]。其中最關鍵的是「獨立」：每個人的誤差方向不同，彙總時才能相互抵消。如果所有人都犯同一個方向的錯，人再多也只是把同一個錯誤放大。

### 學術上真正做成的那一條線

用大模型模擬人，這幾年確實有紮實的研究進展，大致是這樣一條線：

- **Generative Agents**（Park 等，2023）：25 個智慧體住在一個沙盒小鎮裡，提出了「記憶流、反思、規劃」的智慧體架構[^7]。
- **OASIS**（CAMEL-AI，2024）：把規模推到 100 萬個智慧體，復現了資訊傳播、群體極化和從眾效應，並用真實的 Twitter 傳播鏈做過校驗。論文同時承認，**智慧體比人類更容易從眾**[^3]。
- **1000 人的生成式智慧體模擬**（Park 等，2024）：這是目前最有說服力的結果。研究者對 1052 名真實的美國人每人做了 2 小時訪談，用訪談記錄生成對應的智慧體。在美國綜合社會調查（GSS）的問題上，這些智慧體的回答準確率達到了受訪者兩週後自己重答一致性的 85%；只給人口統計資訊（年齡、性別、種族、黨派）的基線是 74%[^8]。

注意最後這個結果的前提：**每個智慧體背後，是一個真實的人和兩個小時的真實訪談**。85% 是被真實個體資料「校準」出來的。

**那麼，MiroFish 的模擬滿足這些前提嗎？**

---

## 五、MiroFish 的預測前提

### 一個模型，幾百個分身

對照群體智慧的四個條件，MiroFish 最難滿足的是「獨立」。580 個智慧體背後是同一個大模型，人設是它自己寫的，每一步的決定也是它做的。這更像一個人分飾 580 個角色，而不是 580 個人各自判斷。它們的誤差來自同一個模型的同一套偏好，是相關的，彙總時不會抵消（這是我的推斷，但和下面的研究結論一致）。

關於「用大模型扮演人群」，已經有一批研究指出了系統性的問題：

- **方差過小**：合成樣本能對上群體的平均傾向，但觀點分佈比真人窄得多，子群體之間的關係也會失真；結果對提示詞和模型版本很敏感，難以復現[^9]。
- **刻板化**：大模型扮演某個身份群體時，傾向於把這個群體扁平化，並且用外人的視角去刻畫邊緣群體[^10]。
- **從眾**：OASIS 自己的實驗就發現，智慧體比人類更容易跟風[^3]。

### 沒有個體資料

和 Park 那項研究相比，MiroFish 的智慧體沒有任何真實個體資料。它們的「性格」「立場」「記憶」是大模型根據一份文件補寫出來的。種子文件裡有什麼偏見、什麼事實錯誤，模擬裡就會被幾百個角色反覆確認。一家券商的金融工程團隊測試後的結論正是如此：封閉的模擬環境會放大種子文件裡的事實錯誤，模型會堅持種子裡的觀點，需要人在對話中補充事實才會修正[^11]。

### 回到《紅樓夢》

現在可以回頭看開頭那個最吸引人的演示了。模擬「預測」出的黛玉焚稿、湘蓮出家，與通行本「基本吻合」，這能說明模擬有預測能力嗎？

恐怕不能。後 40 回的情節、兩百年來的紅學討論，大機率都在大模型的訓練語料裡。一個讀過《紅樓夢》全書的模型，扮演書中的人物、續寫故事，寫出和通行本相近的情節，更可能是「記得」而不是「推演」（這是推斷，演示本身沒有做過排除訓練語料的對照）。

這其實是檢驗任何「預測系統」的第一條原則：**你要預測的事情，必須發生在模型知道的資訊之外。**

### 已有的實測

截至 2026 年 10 月，我沒有找到任何公開、可復現、樣本量足夠的 MiroFish 回測。零星的測試都不樂觀：

- 一次針對單個交易日的測試裡，MiroFish（約 25 個智慧體）和單次呼叫 Gemini 都預測標普 500 會下跌，結果當天上漲 0.77%；漲幅前五的個股，兩邊都一個沒猜中。測試者的結論是：群體模擬增加了複雜度，但沒有增加資訊[^4]。當然，一天的樣本說明不了太多。
- 上面提到的券商團隊測了黃金走勢等五個場景，用另一個模型給報告打分，MiroFish 的報告在投資價值上並沒有顯著好於聯網搜尋的單個大模型，敘事更深，但結論更保守。他們給它的定位是「邏輯沙盤」[^11]。

而 MiroFish 的 ReportAgent，在提示詞裡是這樣告訴大模型的：「你正在觀察的不是"實驗資料"，而是"未來的預演"」「模擬世界中的 Agent 言行就是對未來人群行為的預測」（`report_agent.py`）。這是一個斷言，程式碼裡沒有任何校準或回測去支撐它。

### 為什麼不直接交給一個 Agent

看到這裡，一個很自然的問題是：既然每一步都是大模型在拍板，為什麼還要搭一套圖譜加模擬的框架？把種子文件直接丟給 Codex 或 Claude Code 這類 Agent，讓它自己讀材料、寫人設、推演各方反應，最後給出判斷，行不行？

先看框架到底多給了什麼。去掉那些只在前端展示的引數，OASIS 真正提供的只有兩樣：

1. **資訊隔離。** 每個智慧體有自己的推薦流和關注關係，每次決策只看得到推給它的那幾條帖子。假如讓一個 Agent 在同一個上下文裡替 580 個角色輪流發言，每個「角色」都讀過全部材料和所有人的發言，那就是一個作者在寫群戲，連形式上的「獨立」都沒有了。
2. **規模和成本。** 580 個智慧體跑 30 輪是幾千次短呼叫，用 qwen-plus 這樣便宜的模型，全程十幾塊錢。同樣的量交給前沿模型驅動的 Agent 逐個扮演，費用和耗時都要高出一大截。

但這兩樣都不是框架獨有的。讓 Claude Code 寫一個幾十行的指令碼，每個角色單獨呼叫一次模型，只餵它自己的人設和它能看到的帖子，資訊隔離就有了；用 subagent 也行，每個 subagent 本來就有獨立的上下文。事實上，前面那家券商團隊就是用 Claude Code 去驅動 MiroFish 的[^11]。

更關鍵的是，如果目標是「預測」，現有證據並不支援「先模擬一群人」這條路。在 ForecastBench 這個持續更新的預測基準上，最接近人類超級預測者的是「單個模型 + 聯網檢索 + 校準」的管線：到 2026 年初，最強模型的 Brier 分數約 0.10，只比超級預測者差 0.017[^23]。沒有哪個社會模擬類系統上過這類榜單。上面那次標普測試裡，MiroFish 也沒有比單次呼叫 Gemini 更準[^4]。所以，把問題直接交給一個會檢索、會推理的 Agent，大機率不會比 MiroFish 差，還便宜得多（這是推斷，目前沒有兩者的直接對比）。

那框架還剩什麼價值？它能把「過程」演出來：誰先發聲、誰轉發、觀點沿著哪條路徑擴散，再加上視覺化的網路和隨時可以採訪的角色。這對輿情推演、公關預案和展示很有用，因為人們想看的本來就是過程；但對「結果會是什麼」這個問題，它沒有提供額外的資訊。

所以，回答開頭的問題：**MiroFish 的工程是真的，「預測」是沒有證據的。** 它把知識圖譜、人設生成、社交模擬、報告寫作串成了一條完整、能跑通的流水線，作為輿情推演、公關預案、小說腦洞的沙盤，它是一個有意思的工具。但「預測萬物」這個定位，目前沒有任何資料支援。

**不過，「用 AI 模擬一群人」這件事本身，確實有人在認真做，而且拿到了比 MiroFish 多得多的錢。它們瞄準的是一個更大的市場：傳統市場調研。**

---

## 六、傳統市場調研的生意

### 它賣的是什麼

要判斷模擬人群能不能替代市場調研，得先看市場調研到底在賣什麼。

按 ESOMAR 的統計，2023 年全球市場研究的營收裡，定量研究佔 70%，定性研究佔 14%，諮詢和二手資料佔 15%；線上和移動端的定量調研佔全部營收的 34%[^12]。整個洞察行業 2024 年約 1530 億美元，其中傳統市場研究約 560 億[^13]。

單個專案的價格大致是這樣（歐洲市場）[^14]：

| 方法 | 典型價格 | 說明 |
|---|---|---|
| 焦點小組 | 每組 3000–5000 歐元 | 6–10 人，2–3 小時 |
| 一對一深訪 | 每人 500–750 歐元 | 每個訪談約 8 小時工作量 |
| 線上問卷 | 平均約 8500 歐元 | 不含額外的樣本採購 |
| 一個完整的定量專案 | 8000–12000 歐元 | 通常只用一種方法 |

一位國內從業者的估算更直接地說明了錢花在哪：**一個調研專案里約 70% 的成本是資料採集和執行**，研究設計和寫報告只佔約 20%；一個樣本的價格，從上世紀 90 年代入戶訪問的一兩百元，降到了今天線上樣本庫的幾塊到十幾塊錢[^15]。

把這些拆開來看，傳統市場調研賣的其實是三樣東西：

1. **真實的人的回答**：這是成本的大頭，也是這個行業存在的根本理由。
2. **方法**：怎麼抽樣、怎麼設計問卷、怎麼加權，保證結論能代表目標人群。
3. **背書**：一份第三方調研報告，可以拿去給老闆、投資人甚至監管看。

### 這門生意自己也有問題

便宜的線上樣本正在被 AI 汙染。業內估計，市場研究中欺詐作答的比例在 15%–30%，部分平臺高達 45%；34% 的線上調研參與者承認用大模型幫忙回答開放題；有研究者做了一個由大模型驅動的自動答題器，它透過了 99.8% 的標準資料質量檢查[^16]。

這裡有一個有意思的反轉：當你花錢買來的「真人樣本」裡，已經混進了大量 AI 寫的回答，那「直接讓 AI 回答」和「花錢買真人回答」之間的差距，就沒有看上去那麼大了。

**那麼，直接讓 AI 扮演受訪者，能替代哪一部分？**

---

## 七、合成調研能替代什麼

### 行的地方：結構化問題上的排序

目前最紮實的正面證據來自 PyMC Labs 和高露潔的一項研究：他們拿 57 個真實的消費者調研（約 9300 名受訪者）做對照，讓大模型自由回答購買意向問題，再按回答和各個量表選項的語義相似度，把它轉成一個分數分佈。結果達到了人類重測一致性的約 90%[^17][^17b]。

也就是說，在「這幾個產品概念，消費者更喜歡哪個」這類問題上，合成受訪者已經相當可用。

### 不行的地方：絕對數值

一家美國調研公司在 2025 年第四季度的快餐品牌追蹤調研裡，並排放了 934 個真人和 298 個合成受訪者[^18]：

- 人口結構幾乎一樣，排名第一的品牌也一樣；
- 但中間的名次對調了；
- 「一定會推薦」的比例，合成受訪者在七個品牌上**全部高估**，幅度從 4 到 19 個百分點不等，各品牌的高估幅度相差約 5 倍，沒法用一個統一的係數修正；
- 被高估最多的，恰好是網上討論最多的品牌。研究者推測，模型反映的是網路上的輿論，而不是消費者在櫃檯前的決定。

最後這一點，和 MiroFish 的問題是同一個根源：大模型知道的是「網上的人怎麼說」，而不是「真實的人會怎麼做」。

### 真正在吃這塊蛋糕的，是另一條路線

看看拿到大錢的公司在做什麼：

- **Simile**：創始團隊就是 Generative Agents 和「1000 人模擬」的作者。2026 年 2 月 A 輪 1 億美元，7 月 B 輪 2 億美元，估值 20 億美元[^19c]；B 輪資金的用途之一，是做一個預測「每次模擬有多準」的置信模型[^19][^19b]。
- **Aaru**：2025 年 12 月 A 輪，「標題估值」10 億美元，客戶包括埃森哲、安永[^20]。它在 2024 年美國大選前用模擬預測哈里斯小勝，結果特朗普贏了[^21]。
- **Qualtrics**：2026 年 3 月推出合成消費者面板，用的是一個專門微調過的模型，訓練資料來自「超過 2 億名第三方調研受訪者」[^22]。

這些公司有一個共同點：**它們的核心資產是真實的人的資料**，並且把「這次模擬有多準」當作產品的一部分去做。

### MiroFish 這種模式能吃掉多少

把前面的線索放在一起，可以得出幾個判斷（以下是我的推斷）：

1. **MiroFish 和市場調研不是同一個形狀的東西。** 市場調研要回答「目標人群裡有百分之幾的人會怎樣」，交付的是分佈和數字；MiroFish 的智慧體是文件裡出現的人物和機構，不是一個消費者樣本，交付的是一篇敘事報告。它更接近公關和諮詢裡的情景推演、兵棋推演，那是一個比市場調研小得多、原本主要靠專家頭腦風暴的市場。
2. **合成調研確實會吃掉一塊蛋糕，但吃的是對精度要求低、對速度和成本敏感的環節**：早期概念的篩選和排序、問卷的預測試、桌面研究、難以招募的小眾人群的探索性補充。需要絕對數值的品牌追蹤、定價決策、需要背書的結論、涉及情感和文化細節的問題，短期內吃不掉。
3. **決定誰能吃到這塊蛋糕的，是校準資料，不是智慧體數量。** 有效的方案都用真實的人的資料去校準：Park 的兩小時訪談、Qualtrics 的 2 億受訪者、PyMC 的 57 個真實調研。MiroFish 的賣點是「零資料，一份文件就能推演」，在這條競爭線上恰好站在最弱的位置。
4. **反過來，真實的人會更值錢。** 當線上樣本被 AI 汙染、合成資料又需要真人資料來校準時，「經過驗證的真實的人」反而成了整條鏈條上最稀缺的東西。傳統調研公司未來賣的，可能更多是這份「真實性」本身。

---

## 寫在最後

回顧一下這條問題鏈：

1. **一份文件怎麼變成預測報告？** 本體設計 → Zep 建圖 → 實體寫成人設 → OASIS 雙平臺模擬 → ReportAgent 寫報告。三個現成元件的串聯，工程是完整的。
2. **成千上萬個智慧體從哪來？** 智慧體就是文件裡能發聲的實體，數量由文件決定。《紅樓夢》抽出 580 個，一篇新聞稿只有幾十個。
3. **它們怎麼互動？** 每個模擬小時隨機啟用 5 到 20 個，由大模型自由決定動作。立場、情感傾向、回聲室強度等引數只在前端展示，沒有進入模擬。
4. **模擬一群人為什麼能預測？** 群體智慧需要獨立和多樣；學術上最好的結果（85%）依賴每人兩小時的真實訪談。
5. **MiroFish 滿足這些前提嗎？** 不滿足。同一個模型的幾百個分身誤差相關，沒有個體資料，會放大種子文件的偏差；《紅樓夢》的「吻合」更可能來自訓練語料。目前沒有任何公開的回測。
6. **為什麼不直接交給一個 Agent？** 可以。框架只多給了資訊隔離和低成本，兩者用指令碼或 subagent 都能做到；預測上更強的反而是單個模型加檢索和校準。框架的價值在於把傳播過程演出來。
7. **這類技術能吃掉市場調研嗎？** 能吃掉一部分，主要是早期篩選和排序；吃到的會是用真實資料校準的玩家，而不是「零資料」的路線。

如果你想自己判斷一個「AI 預測系統」靠不靠譜，可以照著下面這個小實驗做：

1. **選對時間。** 挑 10 個以上**發生在模型訓練截止日期之後**的事件，只用事件發生前的材料做種子。
2. **設一個基線。** 同樣的材料，直接問一次單個大模型（最好允許聯網檢索），記錄它的判斷。
3. **重複跑。** 每個事件用不同的隨機種子跑 3 到 5 次模擬，看結論是否穩定。如果同一份輸入每次得出不同結論，那它的「預測」本身就沒有意義。
4. **事後打分。** 事件發生後，比較模擬和基線誰更準。只有在穩定地勝過基線的時候，那幾百個智慧體才算真正貢獻了資訊。

MiroFish 的爆紅本身也許就是一個很好的群體現象樣本：一個故事裡有大四學生、十天、3000 萬、《紅樓夢》，它的傳播速度遠遠快過任何人去驗證它。這大概也是我們在面對「預測未來」這類承諾時，最需要的那一點懷疑。

---

## 參考資料
