MiroFish 深度实战:当群体智能遇上 AI 仿真——从零构建多智能体预测系统的生产级完全指南(2026)
引言:从「预测数字」到「重演世界」
传统的预测技术有一个根深蒂固的盲区:它们试图用数学模型去拟合一个本质上是动态博弈的系统。股价模型假设市场参与者的行为服从某种分布,舆情系统假设公众 opinion 的演化遵循线性规律,政策评估工具用回归方程去量化那些本质上不可量化的群体心理。
但现实不是这样的。现实是无数个体基于各自的信息、认知、情绪和利益进行持续交互后涌现出的集体结果——就像鱼群游动时没有中心指挥,却能形成复杂而协调的整体图案。
MiroFish 正是在这个认知基础上诞生的项目。它不是又一个时间序列预测库,也不是一个增强版的 ChatGPT。它是一个群体智能预测引擎:通过构建包含数千个 AI 智能体的虚拟社会,让这些智能体在仿真环境中自由互动,用群体行为的自发演化来预测真实世界的走向。
56k+ Stars、8.6k+ Forks,由北京邮电大学学生白富(666ghj)开发,获盛大集团战略支持与孵化——MiroFish 已经成为多智能体仿真赛道上的现象级开源项目。
本文将从架构原理、核心模块、代码实战、性能优化到生产部署,完整拆解 MiroFish 的技术体系。
一、为什么群体仿真比统计预测更接近真相
1.1 传统预测的根本局限
假设你想预测「如果政府突然宣布新能源车补贴减半,舆论会怎么走?」
传统做法:
# 传统预测:用历史数据拟合
from sklearn.linear_model import LinearRegression
import numpy as np
# 假设我们有历史数据:补贴比例 vs 舆论情感得分
X = np.array([[1.0], [0.8], [0.6], [0.4], [0.2]]) # 补贴比例
y = np.array([0.85, 0.72, 0.60, 0.48, 0.31]) # 舆论得分
model = LinearRegression().fit(X, y)
prediction = model.predict([[0.5]]) # 如果补贴减半
print(f"预测舆论得分: {prediction[0]:.2f}")
# 输出: 预测舆论得分: 0.55
问题在哪?
- 无法解释「为什么」:模型告诉你得分会降到 0.55,但不知道是因为车主群体愤怒、还是行业分析师悲观、还是普通消费者无所谓
- 无法应对突发事件:如果恰好在补贴调整期间有一起新能源车自燃事件呢?历史数据里没有这个场景
- 线性假设太强:舆情演化通常是非线性的,可能存在引爆点、回音室效应、信息级联
1.2 MiroFish 的核心哲学:不拟合,而是重演
MiroFish 的思路完全不同——它不试图用数学公式去拟合历史数据,而是重建整个系统然后观察它会怎么演化。
传统方法:历史数据 → 统计模型 → "得分是 X"
MiroFish:种子知识 + 数千智能体 → 自由交互 → 群体行为涌现 → "在这些条件下,群体会这样演化"
这种范式转换的核心洞察是:
复杂系统的行为无法通过分析个体或简单聚合来预测——它是在个体互动中涌现出来的。想预测涌现,你就必须模拟互动本身。
这就好比你想预测一场足球比赛的比分。你可以统计两队的历史数据、球员能力值、天气条件,然后跑一个回归模型。或者,你可以用 EA Sports FC 让两个 AI 队伍对战一百次,看哪种结果出现得最多。后者更接近真实——因为它模拟了比赛本身的动态过程。
1.3 群体智能的理论基础
MiroFish 的理论基础可以追溯到多个学科:
- 复杂适应系统(CAS):John Holland 提出的理论,认为复杂系统由大量适应性行动者组成,这些行动者通过互动不断学习和改变自身行为,最终涌现出宏观层面的秩序
- 社会仿真(Social Simulation):用计算机模拟社会过程的研究方法,始于 1960 年代的 Schelling 隔离模型
- 基于主体的建模(ABM, Agent-Based Modeling):让每个「主体」遵循简单规则自主行动,观察宏观模式的产生
- 涌现理论:整体大于部分之和——鱼群、蚁群、鸟群都是涌现现象的典型案例
MiroFish 将这些理论通过 LLM(大语言模型)技术实现了工程化落地:每个智能体由 LLM 驱动,具备独立人格、长期记忆和行为逻辑,不再是 ABM 中遵循死板规则的「主体」,而是接近真实人类复杂度的「虚拟人」。
二、项目概览与生态定位
2.1 核心数据
| 指标 | 数据 |
|---|---|
| GitHub Stars | 56,400+ |
| Forks | 8,600+ |
| 最新版本 | v0.1.2 |
| 开源协议 | AGPL-3.0 |
| 技术栈 | Python 57.6% + Vue.js 41.2% |
| 核心依赖 | CAMEL-AI OASIS、Zep Cloud、GraphRAG |
2.2 BettaFish + MiroFish 完整闭环
MiroFish 并非孤立存在——它与作者的另一个项目 BettaFish(40.5k Stars)构成完整的「数据采集 → 仿真预测」流水线:
┌──────────────────────────────────────────────────────────┐
│ 完整预测流水线 │
│ │
│ BettaFish MiroFish │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ 数据采集层 │ │ 仿真预测层 │ │
│ │ │ 种子数据 │ │ │
│ │ 微博/推特 │──────────────→│ 知识图谱构建 │ │
│ │ Reddit/... │ │ 智能体初始化 │ │
│ │ 30+ 平台 │ │ 多轮仿真 │ │
│ │ 情感数据 │ │ 报告生成 │ │
│ └─────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────┘
BettaFish 负责「看现实」:从 30+ 社交媒体和新闻平台采集情感数据、舆情信号;
MiroFish 负责「推未来」:基于种子信息构建虚拟世界,让数千智能体演化出预测结果。
2.3 适用场景
- 舆情分析:预测政策发布后的舆论走向,识别引爆点和回音室效应
- 市场研究:模拟消费者对新产品/价格调整的反应
- 危机公关:在真实危机发生前「预演」不同应对策略的效果
- 文学创作:用红楼梦前 80 回预测后 40 回(MiroFish 已实际演示过)
- 学术研究:计算社会科学、社会仿真、复杂性科学
三、整体架构深度解析
3.1 五层架构
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (Vue.js) │
│ 仿真配置面板 / 实时进度监控 / 知识图谱可视化 / │
│ 情感热力图 / 报告阅读器 / 深度交互聊天界面 │
└──────────────────────────┬──────────────────────────────────┘
│ REST API
┌──────────────────────────▼──────────────────────────────────┐
│ 编排层 (Flask) │
│ 五阶段流水线调度器 / 上帝模式控制器 / API 路由 │
└──────┬────────────────┬─────────────────────┬───────────────┘
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌────────▼────────┐
│ 知识层 │ │ 仿真层 │ │ 记忆层 │
│ GraphRAG │ │ CAMEL-AI │ │ Zep Cloud │
│ 知识图谱 │ │ OASIS 框架 │ │ 智能体长期记忆 │
│ PyMuPDF │ │ 双平台并行 │ │ 跨轮次持久化 │
│ 实体抽取 │ │ 个性注入 │ │ 对话历史管理 │
└─────────────┘ └────────────┘ └─────────────────┘
3.2 五阶段仿真流水线
MiroFish 的核心是其严格的五阶段流水线,每个阶段有明确的输入输出和依赖关系:
阶段1: Graph Building(图谱构建)
输入: 种子文档 (PDF/URL)
处理: PyMuPDF 提取 → LLM 实体抽取 → GraphRAG 构建知识图谱
输出: 领域知识图谱(实体 + 关系)
↓
阶段2: Environment Setup(环境准备)
输入: 知识图谱 + 仿真参数
处理: CAMEL-AI OASIS 初始化 → 实体关系提取 → 角色生成 → 智能体配置注入
输出: 就绪的虚拟环境(含数千已配置智能体)
↓
阶段3: Parallel Simulation(并行仿真)
输入: 就绪的虚拟环境
处理: 双平台同时运行 → 数千智能体交互 N 轮 → 动态时间记忆更新
输出: 仿真轨迹数据(含各轮次的智能体行为记录)
↓
阶段4: Report Generation(报告生成)
输入: 仿真轨迹 + 双平台结果
处理: LLM 聚合轨迹 → 总结群体模式 → 双平台一致性检验
输出: 结构化趋势报告 + 置信度评估
↓
阶段5: Deep Interaction(深度交互)
输入: 仿真结果 + 完整环境状态
处理: RAG 检索仿真记录 → 回答用户追问 → 支持上帝模式注入
输出: 交互式问答 + what-if 模拟结果
四、核心模块深度拆解
4.1 GraphRAG:给智能体注入因果推理能力
MiroFish 使用 Microsoft 的 GraphRAG 而非传统的向量 RAG,这个选择至关重要。
普通 RAG vs GraphRAG 的本质区别:
# 普通 RAG:文档 → 向量化 → 余弦相似度检索
# 只能回答「有哪些事实」,无法推理「A 如何影响 B」
# GraphRAG:文档 → 实体抽取 → 关系图谱 → 图遍历推理
# 可以回答「补贴政策 → 影响消费者信心 → 进而影响什么?」
GraphRAG 的工作流程:
# 伪代码:GraphRAG 知识图谱构建
from graphrag import GraphRAGPipeline
# 1. 从种子文档构建知识图谱
pipeline = GraphRAGPipeline(
input_dir="./seed_documents", # 种子材料:新闻、政策、分析报告
output_dir="./knowledge_graph",
entity_extraction_model="qwen-plus", # 用 LLM 抽取实体和关系
)
pipeline.run()
# 2. 构建后的知识图谱示例:
# 实体: [特斯拉, 比亚迪, 补贴政策, 消费者群体, 锂矿价格, ...]
# 关系: [特斯拉 → 竞争 → 比亚迪]
# [补贴政策 → 刺激 → 消费者购买意愿]
# [锂矿价格 → 影响 → 电动车成本]
# [消费者购买意愿 → 拉动 → 市场需求]
# 3. 将知识图谱注入智能体上下文
context = pipeline.query("新能源汽车市场补贴调整的关键影响链")
# 返回: "补贴减少 → 消费者购车成本上升 → 购买意愿下降 →
# 整体市场需求萎缩 → 竞争加剧 → 龙头企业市场份额可能上升
# 但利润承压 → 中小品牌加速出清"
为什么仿真需要 GraphRAG 而不是普通 RAG?
在 MiroFish 的仿真中,智能体需要理解因果关系链而不是简单的事实匹配。比如,当「补贴减半」这个事件被注入仿真环境时,智能体需要推理出「补贴减半 → 我作为车主的持有成本上升 → 我可能在社交平台抱怨 → 我的抱怨可能影响其他潜在购车者 → 整体舆论降温」。
GraphRAG 的图结构天然支持这类多跳推理,而向量 RAG 只能找到语义相似的文本片段,无法进行结构化的因果推断。
4.2 CAMEL-AI OASIS:仿真引擎核心
MiroFish 的仿真引擎基于 CAMEL-AI OASIS(Open Agent Social Interaction Simulations),这是一个专门为社会仿真设计的多智能体框架。
from oasis import Environment, Agent, Platform
# 初始化虚拟社交平台
platform = Platform(
name="simulated_weibo",
max_agents=5000,
interaction_rules=InteractionConfig(
max_posts_per_round=10, # 每轮每智能体最多发 10 条
follow_probability=0.3, # 随机关注概率
reply_probability=0.5, # 回复概率
repost_probability=0.2 # 转发概率
)
)
# 创建具有不同个性的智能体群
import random
occupations = ["大学生", "程序员", "销售经理", "教师", "自由职业者",
"退休人员", "企业主", "公务员", "媒体人", "新能源车主"]
age_groups = [(18, 25), (25, 35), (35, 45), (45, 55), (55, 70)]
agents = []
for i in range(5000):
age_range = random.choice(age_groups)
agent = Agent(
id=i,
persona=PersonaProfile(
age=random.randint(*age_range),
gender=random.choice(["男", "女"]),
occupation=random.choice(occupations),
political_lean=random.gauss(0, 1), # 政治倾向(正负分布)
tech_savviness=random.uniform(0, 1), # 技术敏感度
activity_level=random.uniform(0.1, 1.0), # 活跃度
influence_score=random.lognorm(0, 0.5), # 影响力(对数正态分布)
),
memory=ZepMemory(session_id=f"agent_{i}"), # 独立长期记忆
knowledge_context=graphrag_context # GraphRAG 知识注入
)
agents.append(agent)
# 启动仿真
env = Environment(platform=platform, agents=agents)
results = env.run(
rounds=50, # 仿真 50 轮
topic="新能源汽车补贴减半政策", # 仿真话题
seed_event="政府宣布新能源车补贴减半", # 种子事件
dynamic_events=[ # 可选的动态事件
{"round": 15, "event": "比亚迪发布新车型,价格不变"},
{"round": 30, "event": "某品牌电动车自燃新闻爆出"},
]
)
OASIS 的关键设计:
- 社会仿真平台抽象:模拟微博/Reddit 等社交平台的行为模式,智能体可以在平台上发帖、回复、转发、关注
- 个性驱动的差异化行为:每个智能体的行为不是随机的,而是由其人格档案(Persona Profile)驱动的。一个 60 岁的退休人员和一个 20 岁的大学生面对同一事件会有截然不同的反应
- 影响力传播机制:高影响力的智能体更容易被其他智能体看到和响应,模拟真实社交网络中的「意见领袖效应」
4.3 Zep Cloud:让智能体拥有跨轮次记忆
多智能体仿真中的一个经典难题:如果智能体每轮都「失忆」,行为就会缺乏连贯性。
想象一下,一个智能体在第 1 轮表达了「支持新能源车补贴」,然后在第 20 轮突然变成了「反对补贴」——不是因为它改变观点了,而是因为它忘了自己之前说过什么。这样的仿真结果显然不可信。
MiroFish 用 Zep Cloud 解决这个问题——为每个智能体分配独立的持久化记忆空间:
# 为每个智能体创建独立的记忆空间
from zep_cloud import ZepMemory
agent_memories = {}
for agent in agents:
agent_memories[agent.id] = ZepMemory(
session_id=f"agent_{agent.id}",
zep_client=zep_client,
# 记忆配置
memory_config={
"max_tokens": 4096, # 每智能体最大记忆容量
"retention_strategy": "summarize", # 记忆满时自动摘要
"importance_decay": 0.95, # 记忆重要性衰减因子
}
)
# 仿真轮次中更新记忆
def simulation_round(agent, platform_state, round_num):
# 1. 检索相关记忆
relevant_memories = agent_memories[agent.id].search(
query=platform_state.current_topic,
limit=5
)
# 2. 生成行为(结合当前状态 + 历史记忆 + 个性)
action = agent.decide(
current_context=platform_state,
memory=relevant_memories,
persona=agent.persona
)
# 3. 将本轮行为写入记忆
agent_memories[agent.id].add(
content=f"Round {round_num}: {action.summary}",
metadata={"round": round_num, "sentiment": action.sentiment}
)
return action
记忆系统的技术细节:
- 独立会话隔离:每个智能体的记忆完全隔离,互不干扰。5000 个智能体就有 5000 个独立的 Zep 会话
- 自动摘要机制:当记忆超过容量限制时,Zep 会自动对旧记忆进行 LLM 驱动的摘要压缩,保留关键信息
- 语义检索:智能体可以根据当前情境检索最相关的历史记忆,而不是机械地按时间顺序读取
- 情感一致性:记忆系统会追踪智能体在各轮次中的情感变化,确保行为演化的合理性
4.4 「上帝模式」变量注入:运行时 What-If 分析
这是 MiroFish 最具创造力的功能之一——在仿真运行过程中动态注入外部事件或条件变化:
# 定义「上帝模式」注入事件
god_mode_events = {
"scenario_1": {
"round": 15,
"event": "竞争对手突然降价 20%",
"description": "特斯拉全线车型降价 20%,引发市场震动",
"affected_agents": "all_consumer_agents", # 影响所有消费者智能体
"expected_impact": "消费者观望情绪加重"
},
"scenario_2": {
"round": 25,
"event": "政府紧急补充购车补贴",
"description": "地方财政紧急出台地方性补贴弥补缺口",
"affected_agents": "all_agents",
"expected_impact": "部分对冲负面情绪"
}
}
# 注入后,仿真引擎实时响应
# 智能体在下一轮交互中会「看到」这些新事件
# 然后根据自己的角色、记忆、性格做出反应
这使得 MiroFish 不仅能预测「会发生什么」,还能回答「如果我这样做,会发生什么」。
实际应用场景:
- 政策沙盘:「如果我们在第 2 周发布正面新闻稿,能缓解多少负面舆情?」
- 竞争分析:「如果竞品在下周发布新产品,我们的用户流失预估?」
- 危机预案:「如果在仿真进行到第 20 轮时出现自燃事故新闻,不同应对方案的效果对比?」
4.5 双平台并行仿真与置信度机制
MiroFish 同时在两个独立的虚拟平台上运行相同的仿真:
┌─ 平台 A:微博风格仿真
种子材料 ──→ 初始化 ─┤
└─ 平台 B:Reddit 风格仿真
│
▼
结果一致性分析
│
┌─────────┴─────────┐
│ │
高度一致 → 高置信度 结果发散 → 标记不确定
输出综合结论 提示用户审慎解读
设计原理: 不同社交平台的用户行为模式存在系统性差异(微博的快速情绪传播 vs Reddit 的理性讨论倾向)。如果在两种截然不同的平台环境下,仿真结果仍然趋同,说明这个预测结论具有较强的鲁棒性。
def evaluate_confidence(results_a, results_b):
"""评估双平台仿真结果的一致性"""
# 1. 情感趋势一致性
sentiment_corr = np.corrcoef(
results_a.sentiment_trajectory,
results_b.sentiment_trajectory
)[0, 1]
# 2. 观点分布一致性(KL 散度)
opinion_kl = kl_divergence(
results_a.opinion_distribution,
results_b.opinion_distribution
)
# 3. 关键事件时序一致性
event_alignment = temporal_alignment_score(
results_a.key_events,
results_b.key_events
)
# 综合置信度
confidence = 0.4 * sentiment_corr + 0.3 * (1 - min(opinion_kl, 1)) + 0.3 * event_alignment
return ConfidenceScore(
overall=confidence,
sentiment_agreement=sentiment_corr,
opinion_divergence=opinion_kl,
event_alignment=event_alignment
)
五、从零搭建:生产级部署完全指南
5.1 环境准备
系统要求:
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| Python | ≥3.11, ≤3.12 | 3.11.x |
| Node.js | 18+ | 20 LTS |
| 内存 | 8 GB | 16 GB+ |
| 磁盘 | 10 GB | 50 GB SSD |
| GPU | 无硬性要求 | NVIDIA GPU(可选,用于本地 LLM) |
所需 API Key:
- LLM API Key:支持任何兼容 OpenAI SDK 格式的 API(推荐阿里云百炼 Qwen-Plus,性价比高)
- Zep Cloud API Key:免费月度额度足够简单使用
- GraphRAG:使用 LLM API 即可
# 1. 克隆项目
git clone https://github.com/666ghj/MiroFish.git
cd MiroFish
# 2. 配置环境变量
cp .env.example .env
# 3. 编辑 .env 文件
.env 配置(关键项):
# LLM API 配置(兼容 OpenAI SDK 格式)
# 推荐:阿里云百炼平台 qwen-plus 模型
# 注意:仿真消耗大量 token,建议先用少量轮次测试
LLM_API_KEY=sk-your-api-key
LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
LLM_MODEL_NAME=qwen-plus
# Zep Cloud 配置(免费月度额度)
# 注册地址: https://app.getzep.com/
ZEP_API_KEY=your-zep-api-key
# 仿真参数
SIMULATION_MAX_AGENTS=500 # 智能体数量(建议测试时 50-100)
SIMULATION_MAX_ROUNDS=20 # 仿真轮次(建议测试时 5-10)
5.2 安装与启动
# 方式一:一键安装(推荐)
npm run setup:all
# 方式二:分步安装
npm run setup # 安装 Node 依赖(前端)
npm run setup:backend # 安装 Python 依赖(后端,自动创建虚拟环境)
# 启动开发环境
npm run dev
# 前端: http://localhost:3000
# 后端: http://localhost:5001
Docker 部署(生产环境推荐):
# 一键启动
docker compose up -d
# 默认端口映射:
# 前端: 3000
# 后端: 5001
# 查看日志
docker compose logs -f
# 停止
docker compose down
生产环境建议的 Docker Compose 扩展:
# docker-compose.prod.yml
version: '3.8'
services:
backend:
image: mirofish/backend:latest
deploy:
resources:
limits:
memory: 8G
cpus: '4'
environment:
- LLM_API_KEY=${LLM_API_KEY}
- ZEP_API_KEY=${ZEP_API_KEY}
- REDIS_URL=redis://redis:6379
depends_on:
- redis
frontend:
image: mirofish/frontend:latest
ports:
- "3000:3000"
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
command: redis-server --maxmemory 2gb --maxmemory-policy allkeys-lru
volumes:
redis_data:
5.3 第一次仿真:端到端实战
以下是一个完整的仿真实战流程,从准备种子材料到获取预测报告:
Step 1:准备种子材料
种子材料是仿真的「原材料」——可以是新闻文章、政策文件、数据分析报告、甚至是小说文本。
# 示例:使用一篇关于新能源汽车补贴的政策分析作为种子
mkdir -p seed_documents
# 将 PDF 或 URL 添加到种子目录
Step 2:配置仿真参数
# simulation_config.json
{
"simulation_config": {
"num_agents": 200, # 智能体数量(测试用 200,生产用 2000-5000)
"num_rounds": 15, # 仿真轮次
"time_config": {
"minutes_per_round": 30, # 每轮模拟 30 分钟
"total_simulation_hours": 7.5 # 总仿真时长
},
"topic": "新能源汽车补贴减半对消费市场的影响",
"prediction_requirement": "分析补贴减半后消费者群体行为变化趋势"
},
"platform_config": {
"platform_a": {
"style": "weibo",
"interaction_rules": {
"max_posts_per_round": 3,
"follow_probability": 0.3,
"reply_probability": 0.5
}
},
"platform_b": {
"style": "forum",
"interaction_rules": {
"max_posts_per_round": 2,
"reply_probability": 0.7,
"thread_depth": 5
}
}
},
"god_mode_events": [
{
"round": 8,
"event": "特斯拉宣布全系降价 15%",
"type": "external_shock"
}
]
}
Step 3:运行仿真
# 通过 Web 界面
# 1. 访问 http://localhost:3000
# 2. 上传种子文档
# 3. 设置仿真参数
# 4. 点击「开始仿真」
# 或通过 API
curl -X POST http://localhost:5001/api/simulation/start \
-H "Content-Type: application/json" \
-d @simulation_config.json
Step 4:解读仿真报告
仿真完成后,MiroFish 生成的报告通常包含以下维度:
## 仿真结果报告(示例结构)
### 1. 总体情感演化
- 初始状态:中性偏积极(0.65/1.0)
- 第 8 轮(特斯拉降价后):急剧下滑至 0.42
- 最终稳定:0.55/1.0
### 2. 观点聚类
- 群体 A(45%):观望派——等待政策落地再决定
- 群体 B(30%):悲观派——认为市场将萎缩
- 群体 C(25%):乐观派——认为短期阵痛长期利好
### 3. 关键转折点
- 第 8 轮:特斯拉降价事件,成为最大情绪引爆点
- 第 12 轮:部分消费者开始接受新价格体系
### 4. 双平台置信度
- 情感趋势一致性:0.87(高)
- 观点分布一致性:0.79(中高)
- 综合置信度:0.83
5.4 深度交互模式
仿真完成后,你可以:
# 1. 向报告追问
query = "为什么特斯拉降价反而让消费者更悲观?"
answer = rag_search(query, simulation_records)
# 2. 与具体智能体对话
agent_conversation = chat_with_agent(
agent_id=42, # 指定某个虚拟「人」
question="你作为新能源车主,对补贴减半怎么看?"
)
# 3. 注入新的 what-if 变量
new_scenario = inject_god_mode_variable(
variable="政府推出以旧换新补贴",
target_round="post_simulation" # 在仿真结束后追加分析
)
六、性能优化与成本控制
6.1 Token 消耗分析
MiroFish 的主要成本来自 LLM API 调用。一次完整仿真的 Token 消耗大致如下:
Token 消耗估算(200 智能体 × 15 轮):
知识图谱构建:
种子文档解析:~5,000 tokens
实体抽取 × 100 实体:~50,000 tokens
关系构建 × 200 关系:~30,000 tokens
小计:~85,000 tokens
环境初始化:
智能体个性生成 × 200:~100,000 tokens
知识上下文注入 × 200:~200,000 tokens
小计:~300,000 tokens
仿真阶段(每轮):
每智能体行为生成:~2,000 tokens
200 智能体 × 15 轮 = 6,000,000 tokens
双平台 = 12,000,000 tokens
小计:~12,000,000 tokens
报告生成:
轨迹聚合 + LLM 总结:~20,000 tokens
小计:~20,000 tokens
总计估算:约 12,400,000 tokens
这只是一次中等规模仿真。 5000 智能体 × 50 轮的完整仿真可能消耗 1-2 亿 tokens。
6.2 成本优化策略
# 策略 1:分层智能体——不是所有智能体都需要用最强模型
class TieredAgentConfig:
"""智能体分层配置"""
LEADER = {
"model": "qwen-plus", # 意见领袖用强模型
"ratio": 0.05, # 5% 的智能体
"post_frequency": 3, # 发帖频率高
}
ACTIVE = {
"model": "qwen-turbo", # 活跃用户用中等模型
"ratio": 0.25, # 25%
"post_frequency": 2,
}
LURKER = {
"model": "qwen-turbo", # 潜水者用轻量模型
"ratio": 0.70, # 70%
"post_frequency": 0.5, # 很少发帖
}
# 这种分层可以将 LLM 成本降低 50-60%,同时保持仿真质量
# 策略 2:渐进式仿真
# 不一开始就跑 50 轮,先跑 10 轮看趋势
# 如果趋势已经明显,可以提前终止
# 策略 3:智能体缓存
# 相似类型的智能体可以共享部分推理结果
# 比如 100 个"大学生"智能体的行为模式可能高度相似
# 策略 4:本地 LLM
# 对于隐私敏感的仿真,可以用 Ollama 部署本地模型
# 但需要权衡推理速度和质量
6.3 仿真质量优化
# 1. 智能体多样性的黄金比例
# 太同质 → 仿真结果单一,失去预测价值
# 太异质 → 噪声太大,无法提取有效信号
ideal_diversity_config = {
"persona_diversity": {
"age_range": [(18, 25), (25, 35), (35, 50), (50, 70)],
"occupation_count": "10-15 种",
"political_spectrum": "覆盖全谱,但不均匀分布(符合真实人口分布)",
},
"influence_distribution": {
"model": "lognormal", # 对数正态分布
"params": (0, 1), # 少数高影响力 + 大量低影响力
},
"activity_distribution": {
"model": "pareto", # 帕累托分布(二八定律)
"params": (1.5,), # 20% 的用户产生 80% 的内容
}
}
# 2. 仿真轮次的收敛判断
def check_convergence(sentiment_trajectory, window=5, threshold=0.02):
"""判断仿真是否已收敛(群体行为趋于稳定)"""
if len(sentiment_trajectory) < window * 2:
return False
recent = sentiment_trajectory[-window:]
previous = sentiment_trajectory[-2*window:-window]
# 比较最近 N 轮和之前 N 轮的方差
recent_var = np.var(recent)
previous_var = np.var(previous)
# 如果方差下降到阈值以下,认为已收敛
return recent_var < threshold and recent_var < previous_var
# 收敛后可以提前终止仿真,节省成本
七、进阶:自定义仿真场景
7.1 舆情危机模拟
# 场景:公司产品出现质量问题,需要评估不同公关策略的效果
crisis_simulation_config = {
"seed_materials": [
"产品问题相关新闻报道",
"公司历史舆情数据(BettaFish 采集)",
"行业同类事件的案例分析",
],
"num_agents": 300,
"num_rounds": 25,
"topic": "某手机品牌电池鼓包事件舆论演化",
"god_mode_events": [
{"round": 5, "event": "社交媒体上出现大量投诉帖子"},
{"round": 10, "event": "官方发布道歉声明(策略A)"},
{"round": 15, "event": "第三方检测机构出具报告"},
{"round": 20, "event": "官方宣布免费更换电池方案"},
]
}
# 对比实验:
# 实验 1:在第 10 轮发布道歉声明
# 实验 2:在第 10 轮保持沉默,第 15 轮发布道歉
# 对比两组仿真的舆情演化轨迹
7.2 红楼梦结局预测
MiroFish 已经实际演示过这个场景——用红楼梦前 80 回作为种子材料,让数千智能体基于对前 80 回的理解来「讨论」后 40 回可能的走向。
red_mansion_config = {
"seed_materials": ["红楼梦前80回全文"],
"num_agents": 500,
"num_rounds": 40,
"topic": "红楼梦第81-120回的情节走向",
"persona_override": {
"types": ["红学研究者", "普通读者", "文学评论家", "曹雪芹风格模仿者"],
"ratio": [0.1, 0.5, 0.2, 0.2]
},
"special_instructions": "基于前80回的伏笔、人物关系和叙事逻辑,推演后续可能的情节发展"
}
7.3 金融市场情绪模拟
market_simulation_config = {
"seed_materials": [
"近期宏观经济数据",
"央行货币政策报告",
"主要行业分析报告",
"BettaFish 采集的金融社交媒体情感数据",
],
"num_agents": 500,
"num_rounds": 30,
"topic": "降息政策对 A 股市场情绪的影响",
"agent_types": {
"institutional_investor": {"ratio": 0.1, "influence": "high"},
"retail_investor": {"ratio": 0.6, "influence": "medium"},
"analyst": {"ratio": 0.1, "influence": "high"},
"media": {"ratio": 0.05, "influence": "very_high"},
"regulator": {"ratio": 0.05, "influence": "very_high"},
"foreign_investor": {"ratio": 0.1, "influence": "high"},
},
"output_metrics": [
"market_sentiment_index",
"sector_rotation_signals",
"risk_on_risk_off_ratio",
"information_cascade_events",
]
}
八、技术挑战与未来展望
8.1 当前技术瓶颈
- LLM 成本:大规模仿真(5000+ 智能体 × 50+ 轮)的 Token 消耗可能达到数亿级别,成本是主要瓶颈
- 仿真速度:当前架构是串行调用 LLM API,即使分批并行,完成一次大规模仿真仍需数小时
- 幻觉问题:智能体由 LLM 驱动,可能产生不符合其角色的幻觉行为,影响仿真真实性
- 可复现性:LLM 的随机性导致相同配置的仿真可能产生不同结果,双平台并行部分缓解了这个问题
8.2 可能的演进方向
- 混合架构:将高频、低复杂度的行为(如浏览、点赞)用规则引擎处理,只有需要深度推理的行为才调用 LLM,大幅降低成本
- 模型蒸馏:将大规模仿真的行为模式蒸馏到小模型中,后续可以用小模型快速复现类似场景
- 实时仿真:接入真实社交网络数据流(通过 BettaFish),实现实时舆情仿真和预警
- 多模态仿真:不仅模拟文本交互,还加入图像、视频传播的仿真,更接近真实的社交媒体生态
8.3 开源协议选择的影响
MiroFish 采用 AGPL-3.0 协议,这意味着:
- 个人研究/本地使用:完全自由,无限制
- 修改后分发:必须以相同协议开源
- 网络服务(SaaS):必须向用户提供源代码
这个选择体现了作者对「知识开放」的坚持,但也意味着商业公司如果想在内部部署修改版 MiroFish,需要评估合规风险。
九、总结
MiroFish 代表了 AI 预测领域的一次范式转换:
从「模型拟合」到「世界仿真」——不是用统计模型去猜测一个数字,而是重建整个系统,让它自己演化出答案。
这种范式的核心价值在于:
- 可解释性:你能看到每个智能体为什么做出某种反应,群体行为是如何一步步演化的
- 可干预性:通过「上帝模式」注入变量,可以回答 what-if 问题,这是传统预测做不到的
- 可扩展性:同一个系统可以用于舆情预测、市场研究、政策评估、文学创作等完全不同的场景
- 工程完整性:从 BettaFish 数据采集到 GraphRAG 知识注入、从 Zep 记忆管理到双平台置信度评估,每个环节都有完整的技术实现
当然,MiroFish 也面临着成本、速度、可复现性等实际挑战。但随着 LLM 成本持续下降、推理速度不断提升,这些障碍正在逐步消解。
鱼群游动时没有中心指挥,却能形成壮观的整体图案。MiroFish 正在用同样的逻辑,试图理解和预测人类社会中最复杂的集体现象。这不是预测的终结,而是预测的重新开始。
项目地址: https://github.com/666ghj/MiroFish
配套数据采集项目: https://github.com/666ghj/BettaFish
在线 Demo: https://666ghj.github.io/mirofish-demo/
核心依赖:
- CAMEL-AI OASIS — 多智能体仿真引擎
- GraphRAG — 知识图谱构建
- Zep Cloud — 智能体长期记忆