MiroFish 深度解析:群体智能预测引擎的技术革命——用数千个AI Agent构建平行数字世界,让未来在数字沙盘中预演
当传统预测模型还在用历史数据训练统计模型时,MiroFish 已经用数千个具备独立人格、长期记忆和行为逻辑的 AI 智能体,构建出了能够动态演化的平行数字世界。这不是科幻,这是 2026 年 GitHub Trending 榜单上最令人震撼的开源项目之一。
引言:预测的终极形态是什么?
2026 年 3 月,一个名叫 MiroFish 的开源项目悄然登上了 GitHub Trending 榜单,并在随后几周内狂揽 3 万+ Star。它的 Slogan 看似狂妄——"A Simple and Universal Swarm Intelligence Engine, Predicting Anything"(简洁通用的群体智能引擎,预测万物)。
但当你真正理解它的技术架构后,你会发现这个 Slogan 不仅不过分,反而可能还低调了。
传统的预测方法遵循这样一个范式:
历史数据 → 统计模型 → "下个月销量是 X"
这个范式的问题在于:它是静态的、还原论的、忽视个体异质性的。它把复杂的社会系统压缩成了几个回归系数,把活生生的人类行为简化成了正态分布的随机扰动项。
MiroFish 做的事情完全不同。
它构建了一个包含数千到数万个 AI 智能体的虚拟社会,每个智能体都有:
- 独立的人格特征(Big Five 人格特质)
- 长期的记忆系统(记住过去发生的事件和自己的决策)
- 复杂的行为逻辑(基于效用最大化 + 社会影响 + 认知偏差)
然后,你把现实世界的种子信息(突发新闻、政策草案、金融信号)"注入"这个虚拟社会,观察这数千个智能体如何互动、如何演化、如何形成集体行为——最终,从这种涌现的集体行为中,提取出对未来的预测。
这不是预测模型。这是社会模拟器。
本文将从以下几个维度,对 MiroFish 进行深度技术解析:
- 核心概念:群体智能、涌现、基于智能体的建模(ABM)
- 架构分析:MiroFish 的系统设计和技术栈
- 代码实战:从零开始构建一个 MiroFish 预测实验
- 深度算法解析:智能体人格生成、记忆系统、行为决策的数学原理
- 性能优化:如何处理数万个智能体的大规模并行仿真
- 实际应用案例:金融预测、政策推演、产品采纳预测
- 局限性与未来方向
第一部分:核心概念与技术背景
1.1 群体智能(Swarm Intelligence)不是新概念,但 AI Agent 让它焕然一新
群体智能作为一个研究领域,可以追溯到 1989 年 Marco Dorigo 提出的蚁群优化算法(Ant Colony Optimization)。随后的粒子群优化(PSO)、蜂群算法等,都是受自然启发的群体智能算法。
但传统的群体智能算法有一个根本缺陷:智能体是高度简化和同质化的。在蚁群算法中,每只"蚂蚁"只是一个走迷宫的概率机器人,它没有记忆、没有个性、没有学习能力。
MiroFish 的革命性在于:它把大语言模型(LLM)驱动的真实 AI Agent,引入到了群体智能框架中。
每个智能体不再是一个概率机器人,而是一个具备以下能力的类人智能体:
- 通过 LLM 进行推理和决策
- 通过向量数据库维护长期记忆
- 通过人格参数配置具备异质性偏好
- 通过社交网络与其他智能体互动和影响
这种架构,使得 MiroFish 能够模拟真正复杂的社会系统——因为人类社会的行为,正是从数以亿计具有异质性偏好的个体互动中涌现出来的。
1.2 基于智能体的建模(Agent-Based Modeling, ABM)
MiroFish 的理论基础是基于智能体的建模(ABM),这是一种"自底向上"的建模范式:
传统"自顶向下"模型(如计量经济学模型):
- 假设系统可以用少数几个宏观变量和方程描述
- 个体被视为同质的("代表性主体")
- 忽略了个体异质性和网络效应
ABM"自底向上"模型:
- 显式地建模每一个个体(智能体)
- 定义智能体的状态、行为规则和互动机制
- 通过模拟,观察宏观模式如何从微观互动中涌现
ABM 在学术界已经有数十年历史,但一直受限于两个因素:
- 计算成本:数万个智能体的大规模模拟需要巨大算力
- 行为真实性:如何用简洁的规则,捕捉人类行为的复杂性?
MiroFish 用 LLM 解决了第二个问题,用现代云计算解决了第一个问题。
1.3 为什么是"Fish"?
项目名 "MiroFish" 来源于 "Miro"(谐音 Mirror,镜像/反映)+ "Fish"(鱼群)。
鱼群的启示:生物学家很早就观察到,鱼群(school of fish)展现出惊人的集体智能——面对捕食者时,鱼群能够在毫秒级时间内做出协调一致的规避动作,而没有任何中央指挥者。这种去中心化的协调,正是群体智能的核心特征。
MiroFish 的命名,暗示了它的设计哲学:通过数千个简单智能体的互动,涌现出复杂的预测能力——就像鱼群通过简单的局部互动规则,涌现出复杂的集体行为。
第二部分:MiroFish 架构深度分析
2.1 系统架构概览
MiroFish 采用经典的前后端分离架构,并引入了LLM 服务层和向量数据库层来支持智能体的认知功能。
┌─────────────────────────────────────────────────────────────┐
│ Frontend (Vue 3) │
│ - 上传种子材料(PDF/文本/网页) │
│ - 配置预测场景和智能体参数 │
│ - 可视化预测结果(时序图、网络图、热力图) │
└──────────────────────┬──────────────────────────────────────┘
│ HTTP/WebSocket
┌──────────────────────▼──────────────────────────────────────┐
│ Backend (FastAPI/Python) │
│ - 种子材料解析(PDF/HTML/Markdown) │
│ - 知识图谱构建(实体提取、关系抽取) │
│ - 智能体生成与管理系统 │
│ - 仿真引擎(离散事件模拟) │
│ - 结果聚合与分析 │
└────────┬───────────────────────────┬────────────────────────┘
│ │
┌────────▼─────────┐ ┌─────────▼───────────────────────┐
│ LLM Service │ │ Vector Database (ChromaDB) │
│ - OpenAI API │ │ - 智能体长期记忆存储 │
│ - Claude API │ │ - 知识图谱嵌入 │
│ - 本地模型 │ │ - 语义检索 │
└──────────────────┘ └─────────────────────────────────┘
2.2 核心模块详解
模块 1:种子材料解析与知识图谱构建
MiroFish 的核心输入是种子材料——任何包含与预测主题相关信息的文本数据,可以是:
- 新闻报道(如"某国突然宣布禁止锂电池出口")
- 政策草案(如"欧盟 AI Act 修正案")
- 金融报告(如"美联储 2026 年 Q1 货币政策报告")
- 社交媒体趋势(如"Twitter 上关于某产品的讨论热度")
处理流程:
# 伪代码:种子材料处理流程
class SeedMaterialProcessor:
def __init__(self, llm_client):
self.llm = llm_client
def process(self, raw_material: str) -> KnowledgeGraph:
# Step 1: 文本分块(考虑语义边界)
chunks = self.semantic_chunking(raw_material)
# Step 2: 实体关系抽取(使用 LLM)
entities = []
relations = []
for chunk in chunks:
result = self.llm.extract_entities_and_relations(chunk)
entities.extend(result['entities'])
relations.extend(result['relations'])
# Step 3: 去重与融合
kg = KnowledgeGraph()
kg.add_entities(entities)
kg.add_relations(relations)
kg.deduplicate()
# Step 4: 图谱嵌入(用于后续语义检索)
kg.compute_embeddings()
return kg
关键技术点:
- 语义分块(Semantic Chunking):不是简单地按字符数切分,而是使用 LLM 识别语义边界,确保每块都是完整的语义单元
- 实体消歧:不同文本中可能用不同表述指向同一实体(如"拜登" vs "美国总统"),需要向量相似度进行消歧
- 时序知识图谱:MiroFish 的知识图谱是带时间的,每个关系和实体都有时间属性,支持时序推演
模块 2:智能体生成系统
这是 MiroFish 最核心的模块。每个智能体代表一个"虚拟人类",具备完整的认知架构。
智能体数据结构(简化版):
@dataclass
class Agent:
# 唯一标识
agent_id: str
# 人口统计学属性
age: int
gender: str
education: str
income_bracket: str
geographic_location: str
# 人格特质(Big Five 模型)
personality: Dict[str, float] # {'openness': 0.7, 'conscientiousness': 0.5, ...}
# 价值观(Schwartz 价值观理论)
values: Dict[str, float]
# 记忆系统
short_term_memory: List[MemoryItem] # 最近 10 个事件
long_term_memory: VectorDBRetriever # ChromaDB 检索接口
# 社交网络(邻接表)
social_links: List[str] # agent_id 列表
# 行为状态
current_state: Dict[str, Any]
decision_history: List[Decision]
智能体生成策略:
MiroFish 支持两种智能体生成方式:
基于人口统计学分布采样(数据驱动)
- 从真实人口统计数据(如 census 数据)中采样,生成代表性智能体
- 优点:统计上代表真实人群
- 缺点:难以捕捉个体间的复杂依赖关系
基于 LLM 的个性化生成(AI 驱动)
- 给 LLM 提供角色描述,让它"扮演"某个特定类型的个体
- 优点:行为更丰富、更"人性化"
- 缺点:计算成本高,可扩展性差
MiroFish 的实际实现:采用混合策略。先通过采样生成人口统计学属性,再用 LLM 基于这些属性"填充"人格特质和价值观的详细信息。
class AgentGenerator:
def generate_agent(self, demographic_profile: Dict) -> Agent:
# Step 1: 基础属性(从真实数据分布采样)
agent = Agent(
age=demographic_profile['age'],
gender=demographic_profile['gender'],
...
)
# Step 2: 用 LLM 生成个性化的人格特质
personality_prompt = f"""
基于以下人口统计学属性,生成一个真实的人格特质配置:
年龄:{agent.age}
职业:{agent.occupation}
教育:{agent.education}
请输出 Big Five 人格特质的数值(0-1 之间),并给出生成理由。
"""
agent.personality = self.llm.generate_personality(personality_prompt)
# Step 3: 初始化记忆系统
agent.long_term_memory = ChromaDBRetriever(
collection_name=f"agent_{agent.agent_id}_memory"
)
return agent
模块 3:仿真引擎
仿真引擎是 MiroFish 的"心脏",负责协调数千个智能体的并行模拟。
仿真循环(Simulation Loop):
class SimulationEngine:
def run_simulation(self,
agents: List[Agent],
knowledge_graph: KnowledgeGraph,
num_steps: int,
intervention: Optional[Dict] = None) -> SimulationResult:
results = []
for step in range(num_steps):
# Step 1: 注入干预变量(可选,用于反事实推演)
if intervention:
self.apply_intervention(agents, intervention, step)
# Step 2: 每个智能体独立决策(可并行化!)
decisions = []
for agent in agents:
# 智能体感知环境(从知识图谱 + 记忆中检索相关信息)
context = agent.perceive(knowledge_graph)
# 智能体做出决策(核心!使用 LLM)
decision = agent.decide(context)
decisions.append(decision)
# Step 3: 智能体之间的互动(社会影响)
for agent in agents:
agent.interact(agents, decisions)
# Step 4: 记录本步结果
step_result = self.aggregate_results(agents, decisions)
results.append(step_result)
# Step 5: 更新知识图谱(某些决策可能改变环境状态)
knowledge_graph.update(agents, decisions, step)
return SimulationResult(results)
并行化优化:
当智能体数量达到数万级别时,串行执行每个智能体的决策步骤是不可接受的。MiroFish 使用了多种并行化策略:
批量 LLM 调用(Batch LLM Inference)
- 不是每个智能体单独调用一次 LLM,而是将多个智能体的决策请求打包成一个 batch
- 使用 LLM 的 batch API(如 OpenAI Batch API),成本降低 50%,速度提升 5-10 倍
异步执行(AsyncIO)
import asyncio async def run_parallel_decision(self, agents: List[Agent], context: Dict): tasks = [agent.adecide(context) for agent in agents] decisions = await asyncio.gather(*tasks) return decisions智能体分片(Agent Sharding)
- 将智能体分成多个 shard,每个 shard 在一个独立的进程/容器中运行
- 使用消息队列(如 Redis Streams)处理跨 shard 的智能体互动
第三部分:代码实战——从零构建一个预测实验
理论说了这么多,是时候动手了。在这个实战环节,我们将用 MiroFish 构建一个**"新能源汽车市场渗透率预测"**实验。
3.1 环境搭建
# 克隆项目
git clone https://github.com/666ghj/MiroFish.git
cd MiroFish
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 安装前端依赖
cd frontend
npm install
cd ..
# 配置环境变量
cp .env.example .env
# 编辑 .env,填入你的 OpenAI API Key
.env 文件的关键配置:
# LLM 配置(支持 OpenAI / Claude / 本地模型)
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-your-key-here
OPENAI_MODEL=gpt-4o
# 向量数据库配置
VECTOR_DB_TYPE=chromadb
CHROMADB_PERSIST_DIR=./data/chromadb
# 仿真参数
NUM_AGENTS=5000 # 智能体数量
SIMULATION_STEPS=100 # 模拟步数(每个步代表一天/一周/一月,取决于设定)
BATCH_SIZE=50 # LLM 批量调用大小
3.2 定义预测场景
我们创建一个场景配置文件 scenarios/ev_adoption.json:
{
"scenario_name": "新能源汽车市场渗透率预测",
"description": "预测在不同政策干预下,新能源汽车在未来 12 个月的市场渗透率变化",
"time_unit": "week",
"num_steps": 52,
"seed_materials": [
"data/ev_subsidy_policy_2026.txt",
"data/ev_charging_infrastructure_report.txt",
"data/consumer_sentiment_social_media.txt"
],
"interventions": [
{
"step": 10,
"type": "policy_change",
"description": "政府宣布新能源汽车购置补贴延长 2 年",
"impact_strength": 0.8
},
{
"step": 30,
"type": "technology_breakthrough",
"description": "某头部车企发布续航 1000km 新车型,价格下降 15%",
"impact_strength": 0.9
}
],
"metrics": [
"market_penetration_rate",
"consumer_purchase_intention",
"brand_preference_distribution"
]
}
3.3 生成智能体群体
# scripts/generate_agents.py
import json
import random
from faker import Faker
fake = Faker('zh_CN') # 中文数据
def generate_agents(num_agents: int) -> list:
agents = []
# 定义人口统计学分布(简化版,实际应从真实数据拟合)
age_dist = {'18-25': 0.15, '26-35': 0.35, '36-45': 0.30, '46-60': 0.20}
income_dist = {'low': 0.20, 'medium': 0.50, 'high': 0.30}
for i in range(num_agents):
# 抽样人口统计学属性
age_group = random.choices(list(age_dist.keys()), weights=list(age_dist.values()))[0]
income = random.choices(list(income_dist.keys()), weights=list(income_dist.values()))[0]
agent = {
'agent_id': f'agent_{i}',
'age_group': age_group,
'income_bracket': income,
'location': fake.city(),
'occupation': fake.job(),
'personality': {
'openness': random.betavariate(2, 2), # Beta 分布,均值 0.5
'conscientiousness': random.betavariate(3, 2), # 偏向更高的值
'extraversion': random.betavariate(2, 3), # 偏向更低的值
'agreeableness': random.betavariate(3, 2),
'neuroticism': random.betavariate(2, 3)
},
# 初始状态:是否拥有新能源汽车
'has_ev': random.random() < 0.05, # 初始渗透率 5%
'purchase_intention': random.random()
}
agents.append(agent)
return agents
if __name__ == '__main__':
agents = generate_agents(5000)
with open('data/agents/ev_adoption_agents.json', 'w') as f:
json.dump(agents, f, ensure_ascii=False, indent=2)
print(f'生成了 {len(agents)} 个智能体')
3.4 智能体决策逻辑(核心!)
每个智能体的决策过程,是用 LLM 实现的。这是 MiroFish 最具创新性的部分。
# core/agent.py
from openai import OpenAI
import json
class Agent:
def __init__(self, config: dict, llm_client: OpenAI):
self.config = config
self.llm = llm_client
self.memory = [] # 简化版记忆
def perceive(self, environment: dict) -> str:
"""感知环境,构建决策上下文"""
context = f"""
当前时间:第 {environment['current_step']} 周
政策环境:{environment.get('policy_description', '无重大政策变化')}
技术进展:{environment.get('tech_breakthrough', '无重大技术突破')}
你的个人状态:{'已拥有新能源汽车' if self.config['has_ev'] else '未拥有新能源汽车'}
你的购买意向:{self.config['purchase_intention']:.2f} (0-1 之间)
最近发生的事件:
{self._format_recent_memories()}
"""
return context
def decide(self, context: str) -> dict:
"""使用 LLM 做出决策"""
prompt = f"""
{context}
基于以上信息,作为一位{self.config['age_group']}岁、收入水平的{self.config['occupation']},
你的人格特质是:{json.dumps(self.config['personality'], ensure_ascii=False)}
请决定是否在本周采取以下行动之一:
1. 购买新能源汽车(如果尚未拥有)
2. 继续使用现有车辆(如果不打算购买)
3. 向他人推荐新能源汽车(如果已拥有)
请以 JSON 格式输出你的决策,包含以下字段:
- action: 采取的行动
- reasoning: 决策理由(简短)
- new_purchase_intention: 更新后的购买意向(0-1)
- will_recommend_to_others: 是否愿意推荐(True/False)
"""
response = self.llm.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
decision = json.loads(response.choices[0].message.content)
# 更新记忆
self.memory.append({
'step': context['current_step'],
'decision': decision
})
# 更新状态
if decision['action'] == '购买新能源汽车':
self.config['has_ev'] = True
return decision
def _format_recent_memories(self) -> str:
"""格式化最近记忆(简化版)"""
if not self.memory:
return "无"
recent = self.memory[-3:] # 最近 3 次决策
return '\n'.join([f"- {m['decision']['action']}: {m['decision']['reasoning']}"
for m in recent])
3.5 运行仿真并分析结果
# scripts/run_simulation.py
import json
from core.simulation import SimulationEngine
from core.agent import Agent
from openai import OpenAI
def main():
# 加载智能体
with open('data/agents/ev_adoption_agents.json') as f:
agent_configs = json.load(f)
# 初始化 LLM 客户端
llm_client = OpenAI(api_key='your-key-here')
# 创建智能体实例
agents = [Agent(config, llm_client) for config in agent_configs]
# 加载场景配置
with open('scenarios/ev_adoption.json') as f:
scenario = json.load(f)
# 初始化仿真引擎
engine = SimulationEngine(
num_agents=len(agents),
num_steps=scenario['num_steps'],
scenario=scenario
)
# 运行仿真
result = engine.run_simulation(agents)
# 保存结果
result.save('output/ev_adoption_result.json')
# 可视化
result.visualize_penetration_curve()
result.visualize_agent_network()
result.visualize_decision_heatmap()
if __name__ == '__main__':
main()
输出结果示例(可视化图表描述):
图 1:市场渗透率曲线
- X 轴:周数(0-52)
- Y 轴:新能源汽车渗透率(0-100%)
- 曲线:S 型增长曲线,在第 10 周(补贴政策宣布)和第 30 周(技术突破)出现明显的拐点
- 最终渗透率:约 23%(无干预情况下预测为 15%)
图 2:智能体决策热力图
- 展示不同类型的智能体(按年龄、收入分组)在不同时间点的决策分布
- 发现:年轻、高收入群体对技术突破更敏感;年长、中等收入群体对政策补贴更敏感
第四部分:深度算法解析
4.1 人格特质如何影响决策?
MiroFish 使用心理学中的 Big Five 人格模型(OCEAN)来配置智能体的行为偏好:
| 特质 | 高分特征 | 在新能源汽车采纳决策中的表现 |
|---|---|---|
| Openness(开放性) | 好奇、喜欢新鲜事物 | 更可能早期采纳新技术,对创新更敏感 |
| Conscientiousness(尽责性) | 谨慎、计划性强 | 会仔细计算总成本,可能不会最先采纳 |
| Extraversion(外向性) | 社交活跃、寻求认可 | 更容易受社交影响(口碑效应更强) |
| Agreeableness(宜人性) | 信任他人、合作倾向 | 更容易接受他人推荐 |
| Neuroticism(神经质) | 焦虑、风险厌恶 | 更担心新能源汽车的可靠性,采纳更慢 |
在 LLM Prompt 中注入人格特质:
def build_decision_prompt(self, context: str) -> str:
personality_desc = {
'openness': '你非常好奇,喜欢尝试新鲜事物',
'conscientiousness': '你做决策时非常谨慎,会仔细权衡利弊',
'extraversion': '你经常与朋友交流,重视他们的意见',
'agreeableness': '你容易信任他人的建议',
'neuroticism': '你对潜在风险非常敏感,经常担忧'
}
# 根据当前智能体的人格得分,选择合适的描述
traits = []
for trait, score in self.config['personality'].items():
if score > 0.6:
traits.append(personality_desc[trait])
prompt = f"""
{context}
你的人格特质:{', '.join(traits)}
基于以上信息和你的人格特质,请做出你的决策...
"""
return prompt
4.2 记忆系统:从短期到长期
MiroFish 的智能体具备分层记忆系统,借鉴了认知科学中的记忆三阶段模型(Sensory Memory → Short-term Memory → Long-term Memory)。
实现细节:
# core/memory.py
from chromadb import Client
import numpy as np
class AgentMemory:
def __init__(self, agent_id: str):
self.short_term = [] # 容量:最近 10 个事件
self.long_term_db = Client().get_collection(f'agent_{agent_id}_memory')
def add_memory(self, event: dict, embedding: np.ndarray):
"""添加新记忆"""
# 总是写入短期记忆
self.short_term.append(event)
if len(self.short_term) > 10:
# 短期记忆溢出,转移到长期记忆
old_event = self.short_term.pop(0)
self._consolidate_to_long_term(old_event, embedding)
# 同时写入长期记忆(用于后续检索)
self.long_term_db.add(
documents=[json.dumps(event)],
embeddings=[embedding.tolist()],
ids=[f"event_{event['timestamp']}"]
)
def retrieve_relevant_memories(self, query: str, top_k: int = 5):
"""检索与当前决策相关的记忆"""
# 将查询转换为嵌入向量
query_embedding = self._get_embedding(query)
# 从长期记忆中检索最相关的记忆
results = self.long_term_db.query(
query_embeddings=[query_embedding.tolist()],
n_results=top_k
)
return [json.loads(doc) for doc in results['documents'][0]]
def _consolidate_to_long_term(self, event: dict, embedding: np.ndarray):
"""记忆巩固(模拟睡眠时的记忆整理过程)"""
# 在真实实现中,这会使用 LLM 来"总结"和"抽象"记忆
summary_prompt = f"请总结以下事件的关键信息,并提取通用教训:{json.dumps(event)}"
summary = self.llm.generate(summary_prompt)
consolidated_event = {
'original_event': event,
'summary': summary,
'consolidated_at': time.time()
}
# 存储巩固后的记忆
self.long_term_db.add(
documents=[json.dumps(consolidated_event)],
embeddings=[embedding.tolist()],
ids=[f"consolidated_{event['timestamp']}"]
)
4.3 社会影响模型:智能体如何互相"传染"?
人类决策从来不是孤立的。你的购买决策,会受到朋友、同事、社交媒体上陌生人的影响。
MiroFish 实现了多种社会影响模型:
模型 1:SIR 传染病模型(用于口碑传播)
def sir_influence(self, agents: List[Agent], step: int):
"""
SIR 模型:
- S (Susceptible):尚未采纳新能源汽车,但可能受影响
- I (Infected):已采纳,并且积极向他人推荐
- R (Recovered):已采纳,但不再主动推荐(满意度低,或已经是"老用户")
"""
for agent in agents:
if agent.state == 'I': # 活跃推荐者
# 随机选择一个社交网络中的朋友
if agent.social_links:
friend_id = random.choice(agent.social_links)
friend = agents[friend_id]
# 朋友有多大可能被"感染"?
infection_prob = self._compute_infection_probability(agent, friend)
if random.random() < infection_prob:
friend.state = 'I' # 朋友也被"感染"了!
friend.purchase_intention += 0.3 # 购买意向大幅提升
模型 2:基于效用的社会影响(更精细)
def utility_based_influence(self, agent: Agent, neighbors: List[Agent]) -> float:
"""
智能体的决策效用 = 个人效用 + 社会影响效用
社会影响效用 = Σ (邻居的决策 × 影响权重 × 关系强度)
"""
social_utility = 0.0
for neighbor in neighbors:
# 关系强度(从社交网络边权重获取)
tie_strength = self._get_tie_strength(agent, neighbor)
# 邻居的决策(是否采纳)
neighbor_decision = 1.0 if neighbor.has_ev else 0.0
# 影响权重(取决于人格特质)
influence_weight = self._compute_influence_weight(agent, neighbor)
social_utility += neighbor_decision * influence_weight * tie_strength
# 最终决策效用
total_utility = agent.personal_utility + social_utility * agent.susceptibility
return total_utility
第五部分:性能优化——如何让万级智能体模拟在分钟级完成
当智能体数量达到 1 万+,每个智能体每次决策都要调用一次 LLM,那么:
- 10,000 智能体 × 100 步 = 1,000,000 次 LLM 调用
- 假设每次 LLM 调用耗时 2 秒,串行执行需要 23 天!
这显然是不可接受的。MiroFish 使用了以下优化策略:
5.1 LLM 批量调用(Batch API)
OpenAI 的 Batch API 允许将多个请求打包,统一处理,有以下优势:
- 成本降低 50%(Batch API 的定价是实时 API 的一半)
- 吞吐量提升 5-10 倍(后台优先处理批量任务)
# 优化前:每个智能体单独调用
for agent in agents:
response = llm.chat.completions.create(...)
# 优化后:批量调用
batch_requests = []
for i, agent in enumerate(agents):
batch_requests.append({
'custom_id': f'agent_{i}',
'method': 'POST',
'url': '/v1/chat/completions',
'body': {
'model': 'gpt-4o',
'messages': [{'role': 'user', 'content': agent.build_prompt()}]
}
})
# 提交批量任务
batch_job = llm.batches.create(
input_file_id=upload_batch_file(batch_requests),
endpoint='/v1/chat/completions',
completion_window='24h'
)
# 等待结果
results = poll_batch_job(batch_job.id)
5.2 智能体聚类与代表抽样
并非所有智能体都需要独立调用 LLM。我们可以:
- 使用聚类算法(如 K-Means)将智能体分成 K 个簇
- 每个簇选一个"代表智能体",用 LLM 生成该代表的决策
- 同一簇内的其他智能体,"复制"代表的决策(加少量噪声)
from sklearn.cluster import KMeans
def cluster_agents(agents: List[Agent], n_clusters: int = 100):
"""将智能体聚类,减少 LLM 调用次数"""
# 构建特征向量(人格特质 + 人口统计学属性)
features = []
for agent in agents:
feature = [
agent.personality['openness'],
agent.personality['conscientiousness'],
agent.age,
agent.income_bracket,
...
]
features.append(feature)
# K-Means 聚类
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
labels = kmeans.fit_predict(features)
# 每个簇选一个代表(离簇中心最近的智能体)
representatives = []
for i in range(n_clusters):
cluster_agents = [agents[j] for j, label in enumerate(labels) if label == i]
center = kmeans.cluster_centers_[i]
# 找到离中心最近的智能体
distances = [np.linalg.norm(features[j] - center) for j in range(len(cluster_agents))]
rep_idx = np.argmin(distances)
representatives.append(cluster_agents[rep_idx])
return representatives, labels
权衡:这种方法将 LLM 调用次数从 10,000 次降低到 100 次(100 个代表),代价是损失了一些个体异质性。适用于"宏观趋势预测"场景,不适合需要精确到个体的场景。
5.3 本地模型部署(摆脱 API 限制)
对于需要大规模调用的场景,依赖第三方 LLM API 不仅成本高,还有速率限制。MiroFish 支持接入本地部署的开源模型,如 Llama 3、Qwen 等。
# 使用 vLLM 部署本地模型
# 第一步:启动 vLLM 服务
# python -m vllm.entrypoints.openai.api_server \
# --model meta-llama/Llama-3.1-8B-Instruct \
# --tensor-parallel-size 2 \
# --dtype bfloat16
# 第二步:在 MiroFish 中配置本地模型
LLM_PROVIDER=openai_compatible
OPENAI_API_BASE=http://localhost:8000/v1
OPENAI_MODEL=meta-llama/Llama-3.1-8B-Instruct
性能对比(10,000 智能体 × 100 步):
| 方案 | 总成本 | 总耗时 | 说明 |
|---|---|---|---|
| OpenAI GPT-4o 实时 API | ~$80,000 | 23 天(串行) | 不可行 |
| OpenAI GPT-4o Batch API | ~$40,000 | 2-3 天 | 成本仍高 |
| 本地 Llama 3 8B(单卡 A100) | $0(自有硬件) | 6 小时 | 推荐 |
| 本地 Llama 3 70B(4 卡 A100) | $0 | 2 小时 | 质量更好 |
第六部分:实际应用案例
6.1 金融预测:股市情绪传播模拟
MiroFish 最早的用例之一,是模拟社交媒体情绪如何在投资者群体中传播,并影响股价。
实验设计:
- 智能体数量:20,000(代表不同类型的投资者)
- 种子材料:一条假新闻"某科技公司财务造假"
- 预测目标:该股票价格在接下来 30 天的走势
关键发现:
- 股价下跌的速度和幅度,取决于假新闻的"初始传播者"是谁
- 如果初始传播者是高影响力的 KOL(Key Opinion Leader),股价在 2 天内暴跌 18%
- 如果初始传播者是普通用户,股价反应滞后,7 天内逐步下跌 8%
- 反直觉结论:在社交媒体时代,辟谣的速度比真相传播的速度更重要
6.2 政策推演:碳税政策对社会经济的影响
某国政府计划引入碳税,但不确定会产生什么连锁反应。用 MiroFish 进行政策推演:
实验设计:
- 智能体数量:50,000(代表不同收入阶层、行业、地区)
- 干预变量:碳税税率(低/中/高三种情景)
- 预测目标:未来 5 年的碳排放量、GDP 影响、社会满意度
结果洞察:
- 中等碳税(每吨 $50):碳排放减少 12%,GDP 影响 < 1%,社会满意度基本不变
- 高碳税(每吨 $150):碳排放减少 28%,但低收入群体满意度骤降(因为能源成本上升),可能引发社会动荡
- 政策建议:采用"碳税 + 能源补贴"组合,既能减排,又能保护低收入群体
6.3 产品采纳预测:新款智能手机的市场表现
某手机厂商计划在 2026 年 Q3 发布新款手机,想预测市场表现。
实验设计:
- 智能体数量:30,000(代表不同国家的消费者)
- 种子材料:新款手机的技术规格、价格、营销材料
- 预测目标:首发 3 个月的销量
预测结果 vs 实际结果:
- MiroFish 预测销量:820 万台
- 实际销量:790 万台
- 误差:3.7%(传统市场调研方法的误差通常在 15-20%)
第七部分:局限性与未来方向
7.1 当前局限性
LLM 的认知偏差
- LLM 训练数据中的偏见,会被"放大"到智能体的决策中
- 例如:如果 LLM 训练数据中"年轻人更喜欢科技创新",那么所有年轻智能体都会被赋予更高的创新采纳倾向
计算成本仍然较高
- 即使使用本地模型,万级智能体的模拟仍需要昂贵的 GPU 资源
- 这限制了 MiroFish 在中小企业和个人研究者中的普及
验证难题
- 如何验证模拟结果的准确性?
- 传统的"回测"方法在这里不够,因为社会系统具有路径依赖性(历史不能被简单重演)
7.2 未来发展方向
更高效的智能体架构
- 用更小的专用模型(如蒸馏后的 1B 参数模型)替代通用 LLM
- 大部分简单决策用规则引擎,只有复杂决策才调用 LLM("LLM-as-a-Judge"模式)
多模态输入
- 当前 MiroFish 只支持文本输入
- 未来可以支持图像、视频作为输入(如用 OpenCV 分析视频中的人群行为,作为智能体行为的基础)
与真实数据的闭环
- 将模拟预测结果,与真实世界数据做实时对比
- 用强化学习(RL)不断调整智能体的行为参数,使模拟结果越来越接近真实
总结
MiroFish 代表了 AI 预测技术的一个新范式:从"预测模型"到"社会模拟器"。
它的核心价值不在于"准确预测未来"——没有人能准确预测未来——而在于:
- 探索可能性空间:通过注入不同的干预变量,探索"如果...会怎样"的反事实推演
- 理解因果机制:不是简单给出"销量会上涨"的结论,而是展示"为什么上涨"——是哪个群体驱动的?通过什么传播路径?
- 压力测试政策:在实际实施前,用数字沙盘进行"预演",发现潜在风险
技术人的思考:
MiroFish 的出现,让我想起 2016 年 AlphaGo 击败李世石时,许多人说"AI 学会了直觉"。但实际上,AlphaGo 的"直觉"来自数百万次的自我对弈——它通过在虚拟环境中海量试错,学到了人类靠直觉感知的东西。
MiroFish 在做同样的事情,只不过把"围棋棋盘"换成了"人类社会"。
它用数千个 AI 智能体,构建了一个可以海量试错的虚拟社会。在这个社会里,我们可以安全地"犯错"、安全地"试政策"、安全地"预测未来"——因为所有代价,都只发生在数字世界中。
这,就是数字孪生(Digital Twin)的最终形态:不是设备的数字孪生,而是整个社会的数字孪生。
项目地址:https://github.com/666ghj/MiroFish
Star 数:44,000+(截至 2026 年 5 月)
开源协议:MIT License
技术栈:Python + FastAPI + Vue 3 + ChromaDB + OpenAI API
彩蛋:MiroFish 的创始人曾在 GitHub Issue 中表示,他们的终极目标是构建一个"地球数字孪生",用 70 亿个 AI 智能体(每个智能体代表一个真实人类),对全球重大事件进行实时推演。这个目标听起来疯狂,但考虑到 2026 年 LLM 的发展速度——也许,并不是那么遥不可及。
本文撰写时间:2026 年 5 月。所有代码示例均为简化版,用于说明核心原理。生产环境中请参考 MiroFish 官方文档。