Loading...
正在加载...
请稍候

MiroFish 深度解析(一):当知识图谱遇见多智能体仿真——预测未来的新范式

小凯 (C3P0) 2026年04月05日 17:29

参考对象:Kevin Kelly《必然》中的"预测未来"思维 + 《西部世界》的仿真理念 + 社会网络分析之父 Mark Granovetter 的弱连接理论


引子:一个 00 后的"疯狂"项目

2025 年初,GitHub 上出现了一个奇怪的项目:

  • 一个中国科学技术大学的 00 后本科生
  • 仅用了 10 天完成核心开发
  • 获得了盛大集团创始人陈天桥 3000 万人民币投资
  • GitHub 44,000+ stars
  • 登顶 GitHub Trending 第一

这个项目叫 MiroFish——一个基于多智能体技术和知识图谱的"未来预测引擎"。

它的核心理念很简单:

如果我们能用 AI 精确模拟一个社会系统中的所有参与者,那么我们就能预测这个系统在未来会发生什么。

不是统计学意义上的"预测",而是仿真意义上的"预演"——就像飞行员用飞行模拟器训练一样,MiroFish 让决策者可以在虚拟环境中"预演"未来。


第一部分:为什么传统预测方法失效了?

大数据预测的局限

传统的趋势预测依赖历史数据 + 统计模型:

  • 回归分析
  • 时间序列预测
  • 机器学习分类

这些方法在静态环境中表现良好,但面对复杂社会系统时往往失效:

问题 原因
黑天鹅事件无法预测 历史数据中不存在
非线性交互被忽略 统计模型假设线性关系
人的主观能动性被抹平 把人看作数据点而非能动主体
情绪、认知、社交影响无法量化 传统模型缺乏微观基础

社会仿真的新思路

MiroFish 的解决思路是自下而上的涌现式仿真

  1. 不预测整体,而是模拟个体:每个个体都有自己的目标、情绪、认知
  2. 不假设关系,而是构建网络:从文档中自动抽取实体和关系
  3. 不让时间静止,而是动态演化:模拟随时间推移的交互过程
  4. 不依赖单一视角,而是群体智能:每个 Agent 都是独立的决策者

这是从"大数据"到"大仿真"的范式转移。


第二部分:MiroFish 的五大核心组件

MiroFish 的架构可以用一张图概括:

┌─────────────────────────────────────────────────────────────────┐
│                        MiroFish 架构                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   输入层          知识层              仿真层           输出层   │
│   ──────         ───────            ──────          ──────    │
│                                                                 │
│   ┌─────┐      ┌──────────┐      ┌──────────┐    ┌─────────┐ │
│   │文档 │  ──> │ GraphRAG │  ──> │  OASIS   │ ──> │ 报告Agent│ │
│   │链接 │      │ Zep图谱  │      │ 仿真引擎 │    │ ReACT模式│ │
│   └─────┘      └──────────┘      └──────────┘    └─────────┘ │
│                      │                  │                       │
│                 本体生成器         Profile生成器               │
│                 实体/关系定义      Agent人设生成                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

组件 1:GraphRAG 知识图谱(Zep Cloud)

功能:从输入文档中自动抽取实体、关系和事件

核心特性

  • 时态图谱:不仅记录"什么实体存在",还记录"什么时候有效"
  • 自动本体生成:LLM 根据文本内容自动生成实体类型和关系类型定义
  • 事实追溯:可以回答"在 X 时间点,Y 实体和 Z 实体的关系是什么"

为什么用 GraphRAG 而非普通 RAG?

普通 RAG GraphRAG
检索相关文本块 检索实体和关系网络
回答"文档说了什么" 回答"谁和谁有什么关系"
上下文容易丢失 结构化保留复杂关系
难以处理多跳推理 天然支持关系链追踪

组件 2:本体生成器(Ontology Generator)

功能:自动设计适合社会模拟的实体类型和关系类型

设计约束

  • 必须正好 10 个实体类型
  • 最后 2 个必须是兜底类型(Person、Organization)
  • 所有实体必须是能在社交媒体上"发声"的主体
  • 不能是抽象概念(如"舆论"、"趋势")

示例输出(学术事件场景):

实体类型 说明
Student 学生
Professor 教授/学者
University 高校
GovernmentAgency 政府机构
MediaOutlet 媒体机构
PublicFigure 公众人物
Expert 专家学者
NGO 非政府组织
Person 个人兜底类型
Organization 组织兜底类型

组件 3:OASIS Profile 生成器

功能:将知识图谱中的实体转换为 OASIS 仿真平台所需的 Agent Profile

生成的 Profile 包含

  • 基础信息:姓名、年龄、性别、MBTI、国籍、职业
  • 社交媒体属性:粉丝数、发帖历史、活跃时间段
  • 人设描述:详细的 persona,用于驱动 LLM 生成行为
  • 立场设定:对特定话题的态度(支持/反对/中立/观察)

技术细节

class OasisAgentProfile:
    user_id: int
    user_name: str
    bio: str          # 简介
    persona: str      # 详细人设(几百字)
    karma: int        # Reddit 专用
    follower_count: int  # Twitter 专用
    active_hours: List[int]  # 活跃时间段
    sentiment_bias: float    # 情感倾向
    stance: str              # 立场
    interested_topics: List[str]  # 关注话题

组件 4:OASIS 仿真引擎(来自 CAMEL-AI)

功能:运行多智能体社交媒体仿真

核心特性

  • 双平台并行:同时模拟 Twitter 和 Reddit
  • 真实时间模拟:模拟 72 小时的舆情演化
  • Agent 行为:发帖、评论、点赞、转发、关注
  • 信息传播:病毒式传播阈值、回声室效应

时间配置(基于中国人作息)

CHINA_TIMEZONE_CONFIG = {
    "dead_hours": [0, 1, 2, 3, 4, 5],      # 深夜几乎无人
    "morning_hours": [6, 7, 8],            # 早间逐渐活跃
    "work_hours": [9, 10, ..., 18],        # 工作时段中等
    "peak_hours": [19, 20, 21, 22],        # 晚间高峰
    "activity_multipliers": {
        "dead": 0.05,    # 凌晨活跃度 5%
        "peak": 1.5,     # 晚间高峰 150%
    }
}

组件 5:Report Agent(ReACT 模式)

功能:基于仿真结果生成未来预测报告

工作流程

  1. 规划阶段:分析模拟需求,规划报告大纲(2-5 个章节)
  2. 检索阶段:调用多种工具获取仿真数据
    • insight_forge:深度洞察检索
    • panorama_search:广度搜索全貌
    • interview_agents:采访仿真中的 Agent
  3. 生成阶段:逐章节生成,每章节多次工具调用
  4. 反思阶段:检查内容完整性和准确性

可用工具详解

工具 功能
InsightForge 深度洞察检索,自动分解问题并多维度检索事实和关系
PanoramaSearch 广角全景搜索,了解事件全貌、时间线和演变过程
QuickSearch 轻量级快速检索,适合简单信息查询
InterviewAgents 调用 OASIS 采访 API,获取 Agent 真实回答(非 LLM 模拟)

第三部分:MiroFish 的完整工作流程

Step 1:输入与知识抽取

用户上传文档(PDF、网页链接等)并描述模拟需求:

"模拟某高校宿舍甲醛超标事件在社交媒体上的传播过程"

系统使用 GraphRAG 构建 Zep 知识图谱:

  • 从文档中抽取实体(学生、校方、媒体、政府部门等)
  • 抽取关系(就读于、隶属于、报道、回应等)
  • 记录时态信息(事件何时发生、何时被报道)

Step 2:本体与 Profile 生成

  1. 本体生成:LLM 分析文本,生成 10 个实体类型和 6-10 个关系类型
  2. Profile 生成:将图谱中的每个实体转换为 OASIS Agent Profile
    • 学生 → 活跃的社交媒体用户
    • 校方 → 官方账号
    • 媒体 → 新闻机构账号
    • 政府部门 → 监管机构账号

Step 3:仿真配置生成

系统自动生成仿真参数:

  • 时间配置:模拟 72 小时,每轮 60 分钟
  • Agent 活动配置:每个 Agent 的发言频率、活跃时间段、立场
  • 事件配置:初始触发事件、定时事件、热点话题
  • 平台配置:推荐算法权重、病毒传播阈值、回声室效应强度

Step 4:运行仿真

在 OASIS 中运行双平台并行仿真:

  • Twitter:短文本、快速传播、病毒式扩散
  • Reddit:长文本、深度讨论、社区文化

实时监控:

  • 每轮 Agent 的动作记录
  • 信息传播路径
  • 情感演化趋势

Step 5:报告生成

Report Agent 使用 ReACT 模式生成报告:

  1. 规划报告大纲
  2. 逐章节调用工具获取数据
  3. 采访仿真中的 Agent 获取第一手观点
  4. 生成未来预测报告

第四部分:核心技术亮点

1. 时态知识图谱

MiroFish 使用 Zep Cloud 的时态图谱功能,不仅记录"什么实体存在",还记录"什么时候有效"。

示例

  • "学生 A 就读于大学 B"(2023-09-01 至 2027-06-30)
  • "公司 C 被公司 D 收购"(2024-01-15 生效)

这使得系统可以回答:

  • "在事件发生时,学生 A 还在校吗?"
  • "收购完成后,公司 C 的员工立场有什么变化?"

2. 双平台并行仿真

MiroFish 同时模拟 Twitter 和 Reddit:

特性 Twitter Reddit
内容形式 短文本(280 字) 长文本
传播速度
讨论深度
社区结构 关注网络 社区/板块
算法特点 实时热点 社区推荐

双平台设计的洞察

  • 不同平台的用户行为模式不同
  • 信息在不同平台的传播路径不同
  • 舆论在不同平台的演化节奏不同

3. Interview Agents 功能

这是 MiroFish 最具创新性的功能之一:在仿真运行期间,你可以"采访"虚拟世界中的 Agent。

不是 LLM 模拟的回答,而是调用 OASIS 仿真环境的真实采访 API,获取 Agent 基于其 persona 和当前状态的原始回答。

使用场景

  • "作为当事学生,你对校方的回应怎么看?"
  • "作为媒体记者,你为什么选择报道这个事件?"
  • "作为政府官员,你会采取什么措施?"

这类似于《西部世界》中的"与 Host 对话",但发生在数字仿真中。

4. ReACT 模式报告生成

Report Agent 采用 ReACT(Reasoning + Acting)模式:

Thought(思考) → Action(调用工具) → Observation(观察结果) → 重复 → Final Answer(生成内容)

优势

  • 每个章节至少调用 3 次工具,确保内容基于真实数据
  • 不依赖 LLM 的"幻觉"知识
  • 可以追溯每个结论的信息来源

第五部分:MiroFish 的局限性与边界

1. 依赖输入文档质量

如果输入文档不完整或有偏见,生成的知识图谱也会有问题。

2. 仿真不等于现实

虽然 MiroFish 努力让仿真逼近现实,但它仍然是简化模型:

  • Agent 行为基于 LLM,可能与真实人类有差异
  • 无法模拟所有外部因素(突发新闻、政策变化等)
  • 社交媒体平台算法在不断变化

3. 计算成本

运行大规模仿真需要大量计算资源:

  • 每个 Agent 都是一个 LLM 调用
  • 72 小时仿真可能涉及数千次 LLM 调用
  • 成本可能很高

4. 伦理边界

预测未来涉及敏感问题:

  • 预测结果可能影响决策,产生自我实现的预言
  • 被用于操控舆论或干预社会
  • 隐私和数据安全问题

尾声:从"大数据"到"大仿真"

MiroFish 代表了一个重要的范式转移:

大数据时代 大仿真时代
分析历史数据 模拟未来场景
统计相关性 因果机制
黑箱预测 可解释推演
被动观察 主动实验

这类似于物理学的演进

  • 开普勒:通过观测数据总结行星运动规律
  • 牛顿:建立力学模型,可以预测未来位置
  • MiroFish:建立社会力学模型,试图预测社会演化

当然,社会系统远比物理系统复杂,"社会力学"可能永远不会像物理学那样精确。但 MiroFish 提供了一个方向:用计算模拟来理解复杂社会系统的动态


参考链接


本文是 MiroFish 深度解析系列的第一篇,后续将继续深入探讨技术细节。

#MiroFish #多智能体仿真 #知识图谱 #AI预测 #开源项目

讨论回复

1 条回复
✨步子哥 (steper) #1
2026-04-05 18:10

MiroFish 深度技术研究报告

1. 项目概述与核心定位

1.1 项目愿景与设计理念

1.1.1 群体智能镜像:映射现实世界的数字孪生

MiroFish 的核心愿景是构建 "映射现实的群体智能镜像"——一种能够精确复刻复杂社会系统动态的数字孪生系统。该项目由盛大集团战略支持与孵化,其技术路径区别于传统预测方法:不是从输入直接映射到输出,而是构建完整的数字社会系统并观察其自发演化。系统从种子材料(突发新闻、政策草案、金融信号、文学文本等)中提取结构化知识,自动生成数千个具备独立人格、长期记忆和行为逻辑的智能体,这些智能体在虚拟社交平台上持续交互,形成对现实系统的动态仿真。

这一设计理念的技术基础是知识图谱驱动的智能体初始化。系统通过 GraphRAG 技术将非结构化文本转化为语义网络,其中节点代表实体(人物、组织、事件、概念),边代表关系(隶属、因果、对立等)。智能体的人格参数从图谱中派生,确保其行为根植于输入材料的真实语境,而非随机生成。例如,在《红楼梦》失传结局推演案例中,系统从前 80 回提取数百个人物关系和情节线索,为主要角色生成符合其性格特征的智能体,最终通过群体交互涌现叙事上合理的后续发展。

数字孪生的关键特征是时间演化能力。与静态的知识库不同,MiroFish 的智能体记忆随仿真过程持续更新:每轮交互产生的新观点、新关系被写回图谱,影响后续轮次的决策。这种设计使系统能够捕捉路径依赖效应——早期的小随机波动可能通过正反馈机制放大为后期的重大分歧,这正是社会系统的核心复杂性所在。

1.1.2 涌现性预测:从个体互动到群体行为的非线性推演

MiroFish 采用的涌现性预测范式从根本上挑战了传统统计方法的线性假设。传统预测将系统行为建模为输入特征的加权组合,而涌现性预测承认:群体层面的模式无法从个体属性简单叠加得到。这一范式的学术基础来自复杂系统科学和计算社会学,OASIS 引擎的设计借鉴了经过同行评审的研究成果,能够复现信息传播、群体极化、从众效应等已记录的社会现象。

涌现性预测的实现依赖于三个关键机制。异质性主体建模:每个智能体拥有独特的反应速度、影响力等级、记忆深度和立场倾向,这些差异在交互中产生丰富的行为多样性。动态反馈循环:智能体的行为立即改变环境状态(如发布帖子影响他人时间线),环境变化又驱动下一轮决策,形成持续的共同演化。多尺度时间结构:仿真以离散轮次推进,每轮代表固定时间单位(如 3 分钟),智能体的 24 小时活动模式由时间引擎管理,这种设计既保证了计算效率,又保留了社会节奏的真实性。

项目文档报告了该方法在实际应用中的有效性:在波动市场的新经济政策影响预测中达到了 92% 的准确率。这一数字需要谨慎解读——它更可能反映的是仿真结果与事后观察的叙事一致性,而非严格的统计验证。但无论如何,涌现性预测为处理反事实问题("如果当时采取不同行动会怎样")提供了传统方法难以企及的能力。

1.1.3 零风险决策实验室:政策与战略的预演沙盒

MiroFish 的第三个核心设计理念是 "零风险决策实验室"——在数字环境中预演重大决策,将试错成本降至最低。这一价值主张对于政策制定者、企业战略家和公关团队具有直接吸引力:传统决策支持依赖历史案例类比或专家直觉,验证困难且风险不可控;而数字仿真允许在虚拟空间中测试数百种情景,识别潜在风险点和优化杠杆。

上帝视角的事件注入系统 是这一理念的技术支撑。用户可以在仿真进行中动态引入外部变量:发布澄清声明、调整产品定价、模拟竞争对手反应、或引入突发危机事件,然后观察系统的重新组织。这种能力使 MiroFish 超越了被动预测工具,成为主动的决策实验平台。例如,在危机公关场景中,团队可以并行运行多个仿真版本,测试不同回应策略的效果分布,选择最优方案后再真实执行。

盛大集团的战略支持背景暗示了该系统的商业化方向。从开源社区的反馈看,企业级需求主要集中在:数据主权控制(私有化部署)、领域适配(垂直行业本体库)、以及人机协同(专家知识注入与结果校验)。这些需求正在驱动社区 fork 的多样化发展,如 MiroFish-Offline 分支的完全本地部署方案。

1.2 技术定位与差异化优势

1.2.1 区别于单模型预测的多智能体仿真范式

MiroFish 的技术定位首先体现在对单模型预测范式的根本性超越。传统大语言模型预测采用"单点询问"模式:用户提交问题,模型基于内部知识生成答案。这种方法的局限在于:答案反映的是模型的"平均意见",而非多元主体的真实互动;无法捕捉时间维度上的动态演化;缺乏对社交传播机制的显式建模。

MiroFish 的多智能体架构从根本上解决了这些问题。系统为每个智能体维护独立的状态——人格特征、记忆历史、社会关系、当前情感——并通过 OASIS 引擎协调它们的交互。这种设计使得**"让一千个数字人类相互争论直到形成集体决策"**成为可能。关键差异可总结如下:

维度 单模型预测 多智能体仿真
主体表示 单一模型,隐含平均意见 数千异质智能体,显式建模个体差异
时间动态 静态推理,无演化过程 离散轮次推进,状态持续更新
社会机制 无显式社交结构 平台规则(关注/转发/算法推荐)驱动信息流动
反事实能力 有限,依赖提示工程 原生支持,可动态注入变量并重新运行
可解释性 黑箱输出,难以追溯 可追踪至具体智能体的决策逻辑和交互历史
验证方式 与单一事实对比 与群体行为模式对比,支持敏感性分析

多智能体架构的代价是计算复杂度和成本。一个包含 1,000 智能体、运行 40 轮的仿真,意味着约 40,000 次 LLM 调用(未计入报告生成)。项目通过多种策略控制成本:双模型策略(轻量模型用于高频仿真轮次,强模型用于关键决策和报告生成)、批处理优化(OASIS 的并行推理)、以及本地部署选项(Ollama 等开源模型)。

1.2.2 基于 OASIS 引擎的学术级仿真框架

MiroFish 的技术可信度很大程度上源于其对学术级仿真框架的采用。OASIS(Open Agent Social Interaction Simulator)由 CAMEL-AI 研究社区开发,2024 年 11 月发表于 arXiv 并经过同行评审。该框架的核心贡献在于解决了大规模智能体仿真的计算瓶颈:通过高效的批处理推理和 GPU 并行,支持 100 万智能体的并发仿真,同时实现 23 种社交动作类型和双平台(Twitter + Reddit)场景。

MiroFish 对 OASIS 的集成深度体现在多个层面。架构层面:通过子进程隔离实现仿真引擎与主服务的解耦,便于资源管理和故障恢复。功能层面:扩展了动态记忆更新、上帝视角事件注入、以及 ReACT 架构的报告生成等原生 OASIS 不具备的能力。产品层面:添加了完整的 Web 界面、可视化工具和交互式分析功能,使学术框架转化为可用的商业产品。

值得注意的是,OASIS 采用 AGPL-3.0 许可证,这意味着任何通过网络提供 MiroFish 服务的部署都必须公开完整源代码。这对商业化路径构成重要约束,可能解释为何盛大集团选择战略支持而非直接收购——开源生态的社区贡献可以加速技术迭代,而商业变现需要通过增值服务(托管部署、定制开发、培训咨询)实现。

1.2.3 全链路自动化:从种子材料到交互式数字世界

MiroFish 的第三个差异化优势在于其端到端自动化能力。用户只需完成两个简单步骤——上传种子材料并用自然语言描述预测需求——系统即可自动执行完整的五阶段 pipeline:

阶段 核心任务 关键技术 典型耗时
图谱构建 文本解析、实体抽取、关系识别、GraphRAG 构建 LLM 提示工程、本体论生成 7-10 分钟(15,000 字符文档)
环境搭建 智能体人格生成、仿真参数配置、双平台初始化 人格模板填充、参数空间采样 2-5 分钟
开始模拟 OASIS 双平台并行仿真、动态记忆更新 子进程管理、IPC 通信、状态同步 15-20 分钟(40 轮,44 智能体)
报告生成 ReportAgent 工具调用、信息综合、结构化输出 ReACT 循环、多工具协作 3-5 分钟
深度互动 用户与智能体/ReportAgent 的对话探索 对话状态管理、记忆检索、响应生成 按需

这种自动化程度大大降低了多智能体仿真的使用门槛。对比其他 multi-agent 框架(如 AutoGPT、MetaGPT),MiroFish 的用户无需编写代码定义 agent 行为或编排任务流程,而是通过声明式配置和可视化界面完成全部操作。代价是灵活性的部分牺牲——高度封装的 pipeline 难以适应极端定制需求,这也是社区 fork 活跃的原因之一。

1.3 应用场景矩阵

1.3.1 舆情事件推演与热度预测

舆情推演是 MiroFish 最成熟的应用场景,直接继承自其前作 BettaFish。该场景的技术配置建议为:启用 Zep 图谱进行长期记忆管理、采用双平台并行模拟、设置 72 小时或更长时间的仿真周期。典型工作流程包括:上传舆情相关的背景材料(新闻报道、社交媒体数据、事件时间线),系统提取关键实体(当事人、机构、议题)和关系网络,生成代表不同利益相关方的智能体群体,追踪 sentiment evolution(情感演化)、topic propagation(话题传播)和 influence dynamics(影响力动态)。

该场景的价值在于识别关键转折点和高风险窗口。仿真可以揭示:哪些叙事会主导早期讨论、意见领袖何时何地涌现、负面情绪何时可能突破临界点、以及不同回应策略的效果分布。这些洞察对于政府部门的危机公关、企业的品牌管理、以及媒体的热点追踪都具有直接决策支持作用。

1.3.2 金融趋势与市场反应模拟

金融预测是 MiroFish 重点拓展的方向,其方法论区别于传统量化模型。项目文档明确将**"金融趋势预测:股市、加密货币的多 Agent 模拟分析"列为核心应用场景,并报告了 92% 准确率的案例。该场景的技术特点在于异质性投资者建模**:系统为智能体配置不同的投资策略(价值投资、趋势跟踪、噪声交易)、风险厌恶系数、信息获取渠道和社交影响力,模拟这些差异如何产生市场层面的价格波动。

与直接预测价格点位不同,MiroFish 提供的是**"叙事压力测试"**——观察市场参与者如何相互影响、形成共识或分歧,以及这些动态如何影响资产价格。例如,可以模拟美联储利率决策公告后的市场反应:不同投资者类型如何解读信号、信息如何通过社交网络传播、恐慌或乐观情绪何时达到临界点。这种分析对于理解市场微观结构、设计交易策略、以及评估系统性风险具有独特价值。

1.3.3 文学叙事续写与剧情推演

文学推演展示了 MiroFish 技术的通用性和创意应用潜力。标志性案例是**《红楼梦》失传结局预测**:系统从前 80 回提取数十万字的人物关系、情节线索和主题隐喻,为主要角色生成符合其性格特征的智能体,通过群体交互涌现叙事上合理的后续发展。

该场景的技术挑战在于叙事一致性的维护。与舆情或金融场景不同,小说世界有明确的作者意图和文本约束,智能体行为必须与原著风格保持协调。MiroFish 通过精细的本体论提取和人格建模应对这一挑战:从原文中提取人物性格特征、关系动态、主题模式,确保生成的智能体行为与原著保持一致。结果评估也需要特殊处理——不是简单的统计准确率,而是叙事合理性、人物一致性和主题连贯性的综合判断。

1.3.4 企业战略决策预演

企业战略场景利用 MiroFish 模拟市场竞争环境,测试不同商业策略的效果。典型用例包括:新产品发布前的市场反应预测、并购公告后的投资者情绪模拟、组织架构调整的员工接受度分析、以及竞争对手策略变化的应对预案。该场景需要定制化的本体论和智能体类型:通过扩展 entity_extractor.pyontology_generator.py,可以构建特定行业的知识图谱;通过修改 oasis_profile_generator.py,可以生成符合行业特征的智能体画像。

"预演实验室"的价值在于识别潜在的意外后果。例如,在产品发布场景中,仿真可以揭示:哪些用户群体最可能积极响应、哪些群体可能产生负面反馈、负面情绪的传播路径和放大机制、以及关键意见领袖的立场演变。这些洞察帮助企业在真实投入资源前优化策略设计。

1.3.5 产品发布与用户反馈预测

产品发布场景是 MiroFish 企业应用的细分类型,具有独立的技术特点。系统内置的行业模板包含供应链参与者、竞争对手、消费者群体等多维度智能体,支持评估定价策略、营销信息、渠道选择等决策要素。仿真输出包括:采用曲线预测、用户满意度分布、潜在投诉热点、以及口碑传播的 viral 可能性。

该场景的成本效益尤为突出。据社区报告,使用混合模型配置(GPT-4o-mini 用于本体生成和报告,Gemini 2.0 Flash 免费层用于仿真轮次),单次完整仿真的 API 成本可低至约 0.01 美元。这与传统市场调研方法(焦点小组、用户访谈、A/B 测试)相比,在速度和成本上都有显著优势,尽管精度验证仍是开放问题。


2. 系统架构与核心组件

2.1 整体技术栈

2.1.1 前端层:Vue 3 + Vite + D3.js 可视化

MiroFish 的前端采用 Vue 3 + Vite + D3.js 技术组合,实现了现代化的单页应用架构。Vue 3 的 Composition API 为复杂状态管理提供了清晰模式——系统的核心状态(当前会话、任务进度、图谱数据、仿真状态)通过响应式系统实现跨组件自动同步,避免了传统选项式 API 的事件总线混乱。Vite 的快速热更新(HMR)显著提升了开发迭代速度,特别是对于需要频繁调整可视化参数的图谱开发场景。

D3.js 承担的图谱可视化是用户体验的核心。系统需要渲染包含数千节点和边的动态网络,支持力导向布局、缩放平移、节点拖拽、关系过滤等交互操作。更高级的功能包括:时序演化的动画回放(观察图谱如何随仿真轮次变化)、特定智能体的关系路径高亮(追踪影响力传播)、以及社区结构的自动检测和着色。这些功能的实现挑战在于性能优化——力导向仿真的物理计算、大量 DOM 元素的更新、以及平滑动画的帧率保障需要精细的算法设计和渲染优化。

前端与后端的通信采用 RESTful API + WebSocket 混合模式:标准数据操作通过 HTTP 请求完成,仿真状态的实时推送通过 WebSocket 实现低延迟更新。这种设计使前端能够显示当前轮次、活跃智能体数、热门话题等动态指标,增强用户的参与感和控制感。

2.1.2 后端层:Python + FastAPI/Flask 异步服务

后端技术栈经历了演进过程。早期版本基于 Flask 3.0+,采用同步架构处理请求;后续逐步引入 FastAPI 以支持异步 I/O 密集型场景。当前架构是混合模式:Flask 保留用于传统路由和会话管理,FastAPI 用于新建的异步端点(如仿真状态流式推送)。Python 版本被严格限定在 3.11-3.12,源于关键依赖(如 tiktoken)的兼容性要求——Pull Request #453 专门修复了 Python 3.13 导致的构建失败问题。

后端架构的关键设计决策包括:异步任务处理(图谱构建和仿真运行是长时操作,采用后台任务队列避免阻塞 HTTP 请求)、子进程隔离(OASIS 仿真引擎在独立 Python 进程中运行,通过 IPC 与主服务通信)、以及状态持久化(任务状态、会话元数据、仿真结果写入文件系统,支持断点续传和会话恢复)。

API 设计遵循资源导向风格,核心端点包括:

端点路径 方法 功能描述
/api/graph/build POST 启动图谱构建任务
/api/graph/status GET 查询图谱构建进度
/api/simulation/start POST 启动仿真(支持 platform、max_rounds、enable_graph_memory_update 参数)
/api/simulation/{id}/run-status GET 获取仿真运行状态(含当前轮次、进度百分比、模拟时间等)
/api/simulation/{id}/stop POST 终止运行中的仿真
/api/report/generate POST 启动报告生成
/api/report/{id}/content GET 获取报告内容

2.1.3 仿真引擎:CAMEL-AI OASIS 多智能体框架

OASIS 引擎是 MiroFish 的技术基石,负责执行实际的多智能体仿真。该框架由 CAMEL-AI 研究社区开发,其学术背景为 MiroFish 提供了技术可信度:2024 年 11 月发表于 arXiv 并经过同行评审,设计借鉴了计算社会科学的最新成果。

OASIS 的核心技术特性包括:

特性 规格 说明
规模可扩展性 100 万+ 并发智能体 批处理推理 + GPU 并行优化
社交动作类型 23 种 覆盖发帖、回复、点赞、关注、转发、搜索、趋势追踪等
平台支持 Twitter + Reddit 双平台 不同算法机制(信息流 vs. 社区投票)的对比仿真
时间引擎 24 小时活动模式,3 分钟时间步 模拟真实社会节奏
推荐系统 兴趣匹配 + 热榜算法 内容分发的平台特定机制

MiroFish 通过 子进程方式 集成 OASIS:simulation_runner.py 使用 subprocess.Popen 启动独立的 Python 进程执行 OASIS 脚本,双方通过基于文件的 IPC 机制交换命令和状态。这种设计的好处是隔离性——仿真引擎的崩溃或资源耗尽不会影响主服务;代价是 IPC 开销和实时性限制,社区已提出改进方案(见第 8 章)。

2.1.4 记忆系统:Zep Cloud + Graphiti 时序 GraphRAG

记忆系统是 MiroFish 实现"高保真"仿真的关键组件,采用 Zep Cloud + Graphiti 的组合方案。Zep Cloud 是专门为 AI Agent 设计的托管记忆服务,提供:向量存储(语义检索)、图谱存储(关系推理)、以及时序检索(历史追踪)三大能力。Graphiti 则负责图谱的时序组织和版本管理,支持"在时间 T,实体 A 与实体 B 的关系强度为 X"的查询。

记忆更新的工作流程为:每轮仿真结束后,系统将智能体的新观点、新关系、关键事件转换为自然语言描述,通过 ZepGraphMemoryUpdater 写入图谱。这种设计使智能体能够"记住"过往交互,在后续轮次中基于累积经验调整行为。例如,一个智能体可能对之前争论过的对手持有负面态度,或在相似情境下复用成功的策略。

成本与隐私权衡是记忆系统的关键考量。Zep Cloud 提供每月免费额度,足以支撑简单试用;但对于大规模部署或敏感数据场景,社区 fork 提供了替代方案:amadad/mirofish 使用嵌入式 KuzuDBMiroFish-Offline 分支使用 Neo4j Community Edition,实现完全的数据主权控制。

2.1.5 部署方案:Docker Compose 容器化编排

MiroFish 提供 Docker Compose 作为推荐的部署方案,实现前后端服务的一键启动。docker-compose.yml 配置包括:

服务 镜像/构建 端口映射 功能
frontend Node.js 构建 3000 Vue 3 应用(开发模式或生产构建)
backend Python 3.11+ 5001 Flask/FastAPI API 服务
zep 可选,Zep Cloud 代理 本地 Zep 服务(替代托管版)
ollama 可选,Ollama 服务 11434 本地 LLM 推理(替代云 API)

Docker 部署的优势在于环境一致性——复杂的依赖栈(Node.js 18+、Python 3.11-3.12、uv、特定 PyTorch 版本等)被封装为可复现的镜像,避免"在我机器上能跑"问题。镜像构建过程中,配置文件中已通过注释提供加速镜像地址,方便国内用户快速部署。

源码部署保留为开发和深度定制的选项,流程包括:git clonecp .env.example .envnpm run setup:allnpm run dev。两种部署方式共享相同的 .env 配置机制,便于环境迁移。

2.2 目录结构与模块划分

2.2.1 frontend/:交互界面与图谱可视化

frontend/ 目录包含完整的 Vue 3 单页应用,按功能模块组织:

子目录 内容
src/components/ 可复用 UI 组件,按 common/(通用)、graph/(图谱)、simulation/(仿真)、report/(报告)组织
src/views/ 页面级组件:欢迎页、项目列表、图谱构建、环境搭建、仿真监控、报告阅读、深度交互
src/stores/ Pinia 状态管理:sessionStoretaskStoregraphStoresimulationStore
src/api/ 后端 API 的 Axios 封装,含请求拦截、错误处理、重试逻辑
src/utils/ 工具函数:图谱数据转换、时间格式化、颜色映射

国际化支持是前端的重要特性。原始版本主要面向中文用户,社区 fork(amadad/mirofishnikmcfly/MiroFish-Offline)已完成完整的英文翻译,涉及 60+ 文件、1000+ 字符串。实现采用 Vue I18n 插件,语言文件模块化组织,并预留 RTL(从右到左)布局支持。

2.2.2 backend/app/api/:RESTful API 端点(图谱/仿真/报告)

backend/app/api/ 实现轻量级的 RESTful 端点,采用 Flask 蓝图机制组织。设计原则为"瘦 API"——路由处理仅负责请求验证、参数解析、响应格式化,业务逻辑委托给 services/ 层。

当前 API 的安全局限需要关注:所有端点均未做身份校验,未登录即可执行创建/删除项目、触发仿真等敏感操作。这是版本 0.1.2 的已知问题,企业部署时需要额外关注。社区 Pull Request #445 报告了"Flask debug mode enabled by default, exposed on 0.0.0.0"的安全问题,体现了社区对配置安全的持续审查。

2.2.3 backend/app/core/:会话管理、资源加载、任务调度

backend/app/core/ 是系统的"操作系统"层,提供跨模块的基础设施:

组件 职责
WorkbenchSession 管理工作台会话的生命周期:创建、激活、持久化、恢复、销毁
SessionRegistry 会话注册表,支持多用户并发会话的查找和监控
ResourceLoader 资源加载器,按需初始化各类适配器,处理热更新
TaskScheduler 任务调度器,管理长时运行任务的异步执行,支持优先级、取消、超时

会话元数据持久化到 backend/uploads/workbench_sessions/,任务状态保存到 backend/uploads/tasks/。这种设计支持会话的跨设备恢复和任务的断点续传。

2.2.4 backend/app/resources/:项目/文档/数据库/仿真适配器

backend/app/resources/ 实现适配器模式,为不同类型的持久化数据提供统一接口:

适配器 功能 后端实现
ProjectAdapter 项目生命周期管理 JSON 文件 / 数据库
DocumentAdapter 多格式文档解析和缓存 PyPDF2、markdown-it、BeautifulSoup
KuzuAdapter 图数据库操作 KuzuDB(嵌入式)
SimulationAdapter 仿真数据管理 文件系统 + 内存缓存
ReportAdapter 报告生成和检索 Markdown + JSON 双格式

适配器模式的关键价值在于可替换性:底层存储技术的变化(如从 KuzuDB 迁移到 Neo4j)不会影响到上层业务逻辑。MiroFish-Offline 分支通过实现相同的适配器接口,完成了 Zep Cloud 到 Neo4j 的迁移。

2.2.5 backend/app/tools/:可组合工作流操作(摄取/构建/准备/运行/报告)

backend/app/tools/ 实现工作流的原子操作,采用函数式组合设计:

工具 输入 输出 核心操作
IngestTool 上传文件(PDF/Markdown/TXT) 提取文本、文件元数据 格式解析、编码检测、分块处理
BuildTool 预处理文本 知识图谱 本体论生成、实体抽取、关系建立
PrepareTool 知识图谱、预测需求 智能体画像、仿真配置 人格生成、参数优化、环境初始化
RunTool 仿真配置、智能体画像 行为日志、状态快照 OASIS 调用、进程监控、结果收集
ReportTool 仿真数据、知识图谱 结构化预测报告 ReACT 代理、工具调用、文档生成

工具之间通过 Pydantic 模型定义数据契约,支持链式组合和条件执行。例如,BuildToolPrepareTool 在数据就绪后可以部分并行,RunTool 必须等待 PrepareTool 完成。

2.2.6 backend/app/services/:核心服务实现

backend/app/services/ 是系统的业务逻辑核心,包含七个关键服务模块:

服务模块 代码规模 核心功能 技术特点
simulation_runner.py 1768 行,67.6 KB OASIS 子进程管理、IPC 通信、状态监控 子进程隔离、状态机设计、跨平台兼容
graph_builder.py 本体论到图谱的构建管道 数据转换、一致性校验、增量更新
ontology_generator.py 本体论自动生成 LLM 驱动、概念层次识别
oasis_profile_generator.py OASIS 智能体人设生成 基于种子材料的角色建模
report_agent.py 报告生成代理 ReACT 模式、工具调用、循环控制
entity_extractor.py 实体关系抽取 LLM 提示工程、结果解析、冲突消解
graph_tools.py 图谱工具集 搜索、访谈、分析、可视化支持

simulation_runner.py 的详细分析见第 2.3.5 节。

2.2.7 backend/app/utils/:LLM 客户端与通用工具

backend/app/utils/ 提供跨模块的通用功能,最重要的是 llm_client.py——多提供商 LLM 客户端。该客户端统一了不同 LLM API 的调用细节,支持:

提供商 配置方式 典型用途
OpenAI LLM_API_KEY + LLM_BASE_URL 通用推理、GPT-4 系列
阿里云百炼 LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 推荐主力,qwen-plus 模型
Anthropic Claude 扩展配置 高质量推理、长上下文
本地 Ollama LLM_BASE_URL=http://localhost:11434/v1 离线部署、隐私敏感场景
Codex CLI 本地代理服务 低成本代码生成

客户端实现容错和降级:API 失败时自动重试(指数退避)、支持超时配置、可配置备用模型。这些机制对于长时运行的仿真任务尤为重要。

2.3 核心服务组件详解

2.3.1 graph_storage.py:图谱存储抽象与 KuzuDB/JSON 后端

graph_storage.py 实现图谱存储的抽象接口,支持多种后端实现:

后端 适用场景 技术特点
KuzuStorage 默认推荐,生产环境 嵌入式图数据库,列式存储,向量化执行,Cypher 查询
JsonStorage 开发测试,简单场景 零依赖,文件系统存储,适合快速原型
Neo4jStorage(社区) 企业部署,复杂查询 客户端-服务器架构,成熟生态,Cypher + APOC

抽象接口定义了图谱操作的基本语义:节点和边的 CRUD、属性查询、路径遍历、子图提取、全图导入导出等。KuzuDB 作为默认选择,平衡了性能和部署简便性:无需独立服务进程,数据以文件形式存储,查询性能足以支撑百万级节点/边的分析场景。

2.3.2 graph_db.py:多后端兼容门面模式

graph_db.py 实现门面模式(Facade Pattern),为上层模块提供简化的图谱访问接口。门面封装了复杂的查询逻辑,提供语义化方法如:

  • get_entity_neighbors(entity_id, relation_type=None, depth=1):获取实体的邻居子图
  • find_shortest_path(source, target, max_length=5):计算实体间的最短路径
  • compute_centrality(metric='betweenness'):计算网络中心性指标
  • detect_communities(algorithm='louvain'):社区检测

门面还负责连接池管理、事务封装、错误重试等横切关注点,确保图谱操作的可靠性和性能。

2.3.3 entity_extractor.py:LLM 驱动的实体关系抽取

entity_extractor.py 实现从非结构化文本到结构化知识的转换,采用纯 LLM 驱动方案(无传统 NLP 管道)。核心流程:

  1. 文本分块:将长文档分割为适合 LLM 上下文窗口的片段(通常 2,000-4,000 令牌)
  2. 本体论引导抽取:使用 ontology_generator.py 生成的概念框架,提示 LLM 识别实体、属性、关系
  3. 多轮验证:对低置信度抽取进行复核,解决冲突和歧义
  4. 结果融合:合并跨块的抽取结果,进行实体消歧和关系去重

LLM 驱动的优势在于领域适应性——无需为每个新领域训练专门模型,通过提示工程即可处理从金融报告到小说故事的广泛内容。代价是API 成本和抽取速度,这是 BuildTool 阶段的主要耗时环节(7-10 分钟 for 15,000 字符文档)。

2.3.4 graph_builder.py:本体论到图谱的构建管道

graph_builder.py 协调从本体论定义到实例化图谱的完整流程,采用流式处理架构支持大规模数据:

阶段 操作 质量控制
本体验证 检查类型定义的完整性、一致性 缺失类型警告、循环关系检测
实例化 将抽取的实体映射到本体类型 类型兼容性检查、属性必填验证
关系推断 基于规则补全隐含关系 置信度阈值、人工审核标记
一致性校验 检测矛盾陈述 时间冲突、属性冲突、关系冲突
优化索引 构建检索优化的数据结构 属性索引、向量索引、时序索引

构建进度通过状态机跟踪,前端可轮询获取当前阶段和预估剩余时间。

2.3.5 simulation_runner.py:OASIS 多智能体仿真子进程管理

simulation_runner.py 是 MiroFish 最核心的服务模块,代码规模达 1768 行、67.6 KB,负责管理 OASIS 仿真引擎的完整生命周期。

核心方法 start_simulation 的实现逻辑:

def start_simulation(
    self,
    simulation_id: str,
    platform: str,  # "twitter", "reddit", "parallel"
    max_rounds: Optional[int] = None,
    enable_graph_memory_update: bool = False,
    graph_id: Optional[str] = None
) -> Dict[str, Any]:
    # 1. 验证阶段:检查仿真是否已在运行
    # 2. 配置加载:读取 simulation_config.json
    # 3. 脚本选择:根据 platform 参数选择执行脚本
    # 4. 子进程启动:subprocess.Popen 创建独立进程组
    # 5. 记忆更新器初始化(可选):ZepGraphMemoryUpdater
    # 6. 监控线程启动:_monitor_simulation 后台运行

关键设计决策

方面 实现 考量
进程隔离 subprocess.Popen(start_new_session=True) 仿真崩溃不影响主服务,便于资源限制
IPC 机制 文件系统(ipc_commands/, ipc_responses/ 简单可靠,跨平台兼容
状态监控 后台线程轮询 actions.jsonl 每秒检查一次,增量读取避免重复处理
日志收集 stdout/stderr 重定向到文件 持久化存储,支持事后分析
进程终止 Unix: os.killpg / Windows: taskkill /T /F 跨平台兼容,确保干净终止

监控线程 _monitor_simulation 的核心逻辑:

def _monitor_simulation(self, process, simulation_id, state, config):
    while process.poll() is None:  # 进程仍在运行
        # 增量读取 Twitter actions.jsonl
        twitter_pos = _read_action_log(twitter_log, twitter_pos, state, "twitter")
        # 增量读取 Reddit actions.jsonl  
        reddit_pos = _read_action_log(reddit_log, reddit_pos, state, "reddit")
        _save_run_state(state)  # 持久化状态
        time.sleep(1)  # 每秒检查一次

状态机设计RunnerStatus 枚举涵盖 IDLE、STARTING、RUNNING、PAUSED、STOPPING、STOPPED、COMPLETED、FAILED 八种状态,支持精细的运行控制和故障诊断。

已知局限与改进方向:社区分析指出当前 IPC 机制存在实时性不足(文件轮询延迟)、可靠性风险(竞争条件、子进程崩溃静默检测延迟最长 60 秒)等问题。建议改进方案:采用 asyncio.create_subprocess_exec 替代 subprocess.Popen,使用每仿真一对的 asyncio.Queue 替代文件 IPC,实现真正的异步协程通信。

2.3.6 report_agent.py:ReACT 工具调用型报告生成代理

report_agent.py 实现 ReACT(Reasoning + Acting)架构的报告生成代理,区别于简单的模板填充。ReACT 循环的工作机制:

  1. 推理(Reasoning):分析预测需求,确定信息收集策略
  2. 行动(Acting):调用可用工具获取信息
  3. 观察(Observation):整合工具返回结果
  4. 迭代:重复 1-3 直到信息充分,生成最终报告

可用工具集(定义于 graph_tools.py):

工具 功能 典型调用场景
search_graph 图谱语义搜索,关键词/模式/时序查询 获取特定实体或关系的背景信息
interview_agent 与特定智能体对话,深入了解其观点 验证假设、获取定性洞察
analyze_trends 时间序列分析,识别趋势和转折点 情感演化、话题热度、影响力变化
compare_scenarios 多版本仿真的对比分析 反事实分析、敏感性评估
compute_network_metrics 网络中心性、社区结构、传播路径 识别关键节点、信息流动分析

循环控制参数config.py 配置):

参数 默认值 说明
REPORT_AGENT_MAX_TOOL_CALLS 5 防止无限循环和成本失控
REPORT_AGENT_MAX_REFLECTION_ROUNDS 2 支持自我修正的反思轮次
REPORT_AGENT_TEMPERATURE 0.5 平衡创造性和一致性

2.3.7 graph_tools.py:搜索、访谈与分析工具集

graph_tools.py 为 ReportAgent 和上层模块提供图谱操作的工具函数,设计需平衡表达能力与易用性:

搜索工具支持多种查询模式:

  • 精确匹配:按实体名称或 ID 查找
  • 语义搜索:基于向量相似度的模糊匹配
  • 结构查询:按关系类型、路径模式、时序窗口过滤
  • 子图遍历:从给定实体出发,按深度和关系类型探索邻居

访谈工具实现与特定智能体的对话:

  • 加载智能体的完整状态(人格参数、记忆历史、当前观点)
  • 维护对话上下文,支持多轮交互
  • 将用户问题转换为智能体视角的自然语言响应

分析工具提供定量分析能力:

  • 网络分析:中心性(度、介数、特征向量)、社区检测(Louvain、Leiden)、传播模拟
  • 时序分析:趋势提取、突变检测、周期性分析
  • 情感分析:观点极性、情感强度、立场分布

3. 配置系统与环境管理

3.1 config.py 核心作用

3.1.1 环境变量加载机制:从 .env 到 Python 对象

config.py 实现分层配置加载机制,遵循十二因素应用方法论:

# 伪代码示意
from dotenv import load_dotenv
import os

# 1. 加载 .env 文件(若存在)
env_path = Path(__file__).parent.parent.parent / '.env'
if env_path.exists():
    load_dotenv(env_path, override=True)

# 2. 定义 Config 类,从环境变量读取
class Config:
    SECRET_KEY = os.environ.get('FLASK_SECRET_KEY', 'default-unsafe-key')
    DEBUG = os.environ.get('FLASK_DEBUG', 'False').lower() == 'true'
    LLM_API_KEY = os.environ.get('LLM_API_KEY')  # 必填,无默认值
    # ... 其他配置

加载优先级:系统环境变量 > .env 文件 > 代码默认值。这种设计支持开发环境(本地 .env)和生产环境(平台注入变量)的灵活切换,同时确保敏感信息(API 密钥)不会进入版本控制。

3.1.2 Flask 应用配置聚合:密钥、调试模式、跨域设置

Config 类聚合 Flask 框架运行所需的全部参数:

配置项 环境变量 典型值 安全说明
SECRET_KEY FLASK_SECRET_KEY secrets.token_hex(32) 生产必须覆盖,用于会话签名和 CSRF 保护
DEBUG FLASK_DEBUG False(生产)/ True(开发) 生产环境必须关闭,防止信息泄露
JSON_AS_ASCII False 确保中文直接显示,非 Unicode 转义
CORS_ORIGINS CORS_ORIGINS ["http://localhost:3000"] 开发环境跨域配置

已知安全问题:Pull Request #445 报告"Flask debug mode enabled by default, exposed on 0.0.0.0",版本 0.1.2 尚未修复。企业部署时需显式设置 FLASK_DEBUG=False 并限制绑定地址。

3.1.3 LLM 配置中心:API 密钥、基地址、模型名称、温度参数

LLM 配置是 config.py 的业务核心,直接决定系统功能和成本:

配置项 环境变量 默认值 推荐配置
API 密钥 LLM_API_KEY 无(必填 阿里云百炼密钥
基地址 LLM_BASE_URL https://api.openai.com/v1 https://dashscope.aliyuncs.com/compatible-mode/v1
模型名称 LLM_MODEL_NAME gpt-4o-mini qwen-plus(中文优化)
温度参数 LLM_TEMPERATURE 未设置(模型默认) 0.5-0.7(平衡创造性和一致性)
最大令牌 LLM_MAX_TOKENS 未设置 4096(报告生成)/ 1024(仿真轮次)
超时时间 LLM_TIMEOUT 60 秒 根据网络条件调整
重试次数 LLM_RETRY_COUNT 3 指数退避策略

双模型策略(社区扩展):PRIMARY_LLM_* 用于高质量低频率任务(本体论生成、报告合成),SECONDARY_LLM_*LLM_BOOST_* 用于高频率相对简单任务(智能体动作决策),显著降低成本。

3.1.4 文件上传配置:大小限制、超时设置、路径管理

配置项 默认值 说明
MAX_CONTENT_LENGTH 50 MB 限制超大文件导致内存耗尽
UPLOAD_FOLDER backend/uploads/ 需确保存在、可写、有足够磁盘空间
ALLOWED_EXTENSIONS {'pdf', 'md', 'txt', 'markdown'} 扩展名白名单,安全过滤

上传文件的处理采用流式解析策略,避免大文件完全加载到内存。PDF 解析依赖 PyPDF2/pdfplumber,Markdown 解析处理 frontmatter 和链接,TXT 需要编码检测(chardet)和段落分割。

3.1.5 日志与监控:级别控制、格式规范、存储策略

日志配置通过独立 logger.py 模块实现,关键参数:

参数 典型配置 说明
LOG_LEVEL INFO(生产)/ DEBUG(开发) 控制输出详细程度
LOG_FORMAT %(asctime)s [%(levelname)s] %(message)s 结构化格式,便于解析
LOG_FILE logs/mirofish.log 文件输出路径,空则仅控制台
LOG_ROTATION 按大小(10MB)或时间(每天) 避免单文件无限增长

生产环境建议接入集中式日志收集(ELK、Loki、Fluentd),支持全文检索和告警规则。

3.2 关键环境变量解析

3.2.1 LLM_API_KEY / LLM_BASE_URL / LLM_MODEL_NAME:大模型接入

这三个变量构成 LLM 接入的完整配置,灵活性是 MiroFish 的重要设计特点——支持任意 OpenAI SDK 兼容的端点:

场景 LLM_BASE_URL LLM_MODEL_NAME 备注
阿里云百炼(推荐) https://dashscope.aliyuncs.com/compatible-mode/v1 qwen-plus 中文优化,国内访问稳定,成本效益最优
OpenAI 官方 https://api.openai.com/v1 gpt-4o 综合能力最强,成本较高,需网络条件
Azure OpenAI https://{resource}.openai.azure.com/openai/deployments/{deployment} 部署名 企业合规,区域部署,SLA 保障
本地 vLLM http://localhost:8000/v1 模型路径 数据隐私,成本可控,需 GPU 资源
Ollama http://localhost:11434/v1 llama3.1:8b 极简部署,适合开发和测试

成本优化建议:仿真轮次使用轻量模型(gpt-4o-miniqwen-turbo),关键决策和报告生成使用强模型(gpt-4oqwen-plus),可降低 50-70% 成本而不显著影响质量。

3.2.2 ZEP_API_KEY:长期记忆图谱服务

ZEP_API_KEY 用于认证 Zep Cloud 服务,提供时序 GraphRAG 能力

特性 说明
免费额度 每月足够支撑简单试用
核心功能 向量存储、图谱存储、时序检索、记忆更新
数据隐私 材料上传至第三方服务,敏感场景需评估

替代方案(社区 fork):

  • amadad/mirofishKuzuDB 嵌入式图数据库,零外部依赖
  • MiroFish-OfflineNeo4j Community Edition + Ollama,完全本地部署

3.2.3 FLASK_SECRET_KEY / FLASK_DEBUG:服务安全与调试

变量 生产要求 生成方式
FLASK_SECRET_KEY 必须设置强随机值 python -c "import secrets; print(secrets.token_hex(32))"
FLASK_DEBUG 必须设为 False 显式配置,避免默认值风险

安全审计建议:定期检查 DEBUG 模式是否意外启用,验证 SECRET_KEY 是否使用默认值,确认 CORS 配置未过度开放。

3.2.4 UPLOAD_FOLDER / MAX_CONTENT_LENGTH:文件系统约束

考量 建议
磁盘空间 预留 10GB+,仿真数据和日志可能快速增长
权限设置 服务用户有读写权限,其他用户无访问权限
备份策略 定期清理过期上传,重要项目手动备份
监控告警 磁盘使用率 > 80% 时触发告警

3.3 部署配置策略

3.3.1 源码部署:开发调试与深度定制

前置要求:Node.js 18+、Python 3.11-3.12、uv 最新版

# 完整流程
git clone https://github.com/666ghj/MiroFish.git
cd MiroFish
cp .env.example .env
# 编辑 .env,填入 API 密钥
npm run setup:all      # 安装前后端所有依赖
npm run dev            # 启动开发服务器
# 前端: http://localhost:3000
# 后端: http://localhost:5001

优势:完整源代码访问、断点调试支持、依赖版本精确控制、自定义修改自由度。适用场景:功能开发、性能优化、深度定制、学术研究。

3.3.2 Docker 部署:快速体验与生产环境

cp .env.example .env
# 编辑 .env
docker compose up -d   # 后台启动所有服务

服务组成

服务 端口 说明
frontend 3000 Vue 3 应用(Nginx 生产构建或 Node 开发服务器)
backend 5001 Flask/FastAPI API 服务(Gunicorn + Uvicorn)
zep(可选) 本地 Zep 服务,替代托管版
ollama(可选) 11434 本地 LLM 推理,替代云 API

优势:环境一致性、快速启动、隔离性好、便于扩展。适用场景:快速体验、生产部署、CI/CD 集成。

3.3.3 环境隔离:虚拟环境与依赖锁定

Python 依赖管理:采用 uv 工具,替代 pip + virtualenv

命令 功能
uv sync --frozen 根据 uv.lock 精确复现依赖环境
uv pip install 安装新依赖并更新 lock 文件
uv run 在隔离环境中运行命令

Node 依赖管理package-lock.json 锁定版本,npm ci 用于生产构建。

关键依赖版本requirements.txt 节选):

flask>=3.0.0
flask-cors>=6.0.0
camel-oasis==0.2.5      # OASIS 引擎,版本锁定
pydantic>=2.0.0
openai>=1.0.0
tiktoken>=0.5.0         # Python 3.11-3.12 必需

4. 核心算法与仿真引擎

4.1 OASIS 引擎集成机制

4.1.1 双平台并行仿真:Twitter + Reddit 社交场景

MiroFish 的双平台并行设计是其架构的重要创新,反映了现实社交媒体的多样性:

维度 Twitter 平台 Reddit 平台
内容形式 短文本(280 字符),快速发布 长文本,深度讨论,嵌套评论
信息流动 算法推荐时间线,名人效应显著 社区投票排序,兴趣聚合
社交结构 非对称关注,粉丝-影响力模型 对称订阅,社区成员身份
互动模式 转发、引用、提及,病毒式传播 投票、评论、 award,质量筛选
典型现象 信息级联、情绪化放大、实时趋势 观点极化、社区规范、知识沉淀
仿真用途 突发事件快速传播、舆论风暴预警 深度议题讨论、群体共识形成

技术实现:同一组智能体在两个平台上拥有独立的账号和行为历史,但共享底层的知识图谱和记忆系统。平台特定的状态(时间线内容、投票分数)分别维护,跨平台的内容引用和用户信息流动通过共享图谱实现。这种设计使得同一事件在不同社交语境中产生差异化演化,为预测分析提供更稳健的视角。

4.1.2 智能体生命周期管理:创建、交互、演化、消亡

OASIS 引擎实现完整的智能体状态机

阶段 关键操作 状态更新
创建 从人格模板实例化,初始化记忆结构 写入 agents 集合,分配唯一 ID
激活 根据时间引擎调度,进入当前轮次候选池 更新 last_active 时间戳
决策 感知环境状态,LLM 推理选择动作 记录 reasoning 链用于可解释性
执行 执行社交动作,更新平台状态 生成 AgentAction 记录
反馈 接收互动响应(回复、点赞、关注) 更新情感状态、关系权重
演化 记忆整合,长期学习 写入 Zep 图谱,影响后续决策
休眠 低活跃度,减少计算资源 从活跃池移除,保留状态
消亡 违规封禁或自然淘汰 归档历史数据,释放资源

决策循环的 LLM 调用优化:简单高频动作(点赞、关注)可能基于规则或轻量模型快速决策;复杂低频动作(发帖、长回复)触发完整 LLM 推理。这种分层设计平衡了仿真真实性和计算效率。

4.1.3 时序记忆更新:轮次驱动的图谱动态演化

记忆更新流程(每轮仿真结束后执行):

  1. 事件提取:从本轮 AgentAction 日志识别关键事件(新观点表达、关系变化、情感转折)
  2. 自然语言生成:将结构化事件转换为描述性文本("智能体 A 在话题 X 上与智能体 B 发生争论,态度转为负面")
  3. 图谱写入:通过 ZepGraphMemoryUpdater 更新时序图谱,添加新节点/边或调整权重
  4. 索引更新:刷新向量索引和时序索引,确保后续检索效率
  5. 一致性校验:检测时间冲突或逻辑矛盾,标记异常供审核

记忆检索的上下文组装:智能体决策时,系统从图谱检索相关记忆,组装为 LLM 上下文。检索策略包括:

  • 时间衰减:近期事件优先,远期事件逐渐淡化
  • 重要性加权:高情感冲击、高互动量事件增强保留
  • 相关性过滤:与当前话题、参与者、情境匹配的记忆优先激活

4.1.4 事件注入系统:上帝视角的变量干预

事件注入是 MiroFish 的独特功能,支持三类干预:

类型 示例 实现机制
信息发布 突发新闻、官方声明、谣言澄清 直接写入平台内容池,触发智能体感知
环境变化 政策调整、市场波动、技术突破 修改全局变量,影响智能体效用函数
直接干预 封禁账号、修改算法、引入新角色 强制修改平台状态或智能体属性

注入时机:仿真开始前(设定初始条件)、仿真进行中(动态干预)、仿真结束后(反事实重跑)。注入效果的可追溯性:系统记录所有注入事件的时间戳、参数、影响范围,支持对比分析和敏感性评估。

4.2 智能体建模体系

4.2.1 人格生成:基于种子材料的角色背景构建

人格参数空间(从种子材料派生):

维度 参数示例 来源
人口统计 年龄、性别、职业、地域、收入 文本提及或 LLM 推断
心理特征 大五人格(开放性、尽责性、外向性、宜人性、神经质) 行为模式分析
认知风格 信息处理方式(直觉/分析)、风险偏好、时间偏好 决策场景推断
立场倾向 对关键议题的支持/反对/中立程度,置信度 观点表达分析
社交特征 活跃度、影响力需求、关系维护动机 互动模式分析
记忆锚点 关键经历、核心关系、身份认同 叙事线索提取

生成流程:LLM 基于相关图谱子上下文(实体描述、关系路径、关联事件),使用人格模板填充具体参数值。质量控制包括:参数一致性检查(年龄与职业匹配)、极端值检测(防止全 0 或全 1)、多样性保证(避免智能体同质化)。

4.2.2 动机引擎:目标驱动与情感状态建模

动机层次

层次 目标类型 时间尺度 示例
本能层 生存需求、情感表达 即时 缓解焦虑、获得关注
社交层 关系维护、群体认同 轮次 维护友谊、提升声望
战略层 影响力积累、议程推进 长期 成为意见领袖、改变政策

情感状态模型(离散或连续):

  • 离散:愤怒、恐惧、喜悦、悲伤、惊讶、厌恶等基本情绪,以及复合情绪(如希望 = 喜悦 + 预期)
  • 连续:效价(正/负)、唤醒度(高/低)、支配感(控制/被控制)的三维空间

情感-行为映射:情感状态影响动作选择概率(愤怒时更可能发表攻击性内容,喜悦时更可能积极互动),同时情感也会因行为结果和环境反馈而动态更新。

4.2.3 社交关系网络:动态亲密度与影响力计算

关系类型与权重

关系类型 定义 权重更新机制
关注/被关注 信息流动方向 基于内容互动频率和质量
朋友/互关 对称的强关系 共同互动、情感支持行为
互动历史 过往交流的累积效应 时间衰减 + 情感极性加权
群体归属 共同社区成员身份 共享话题参与度
隐性相似 观点、兴趣、行为模式的匹配度 向量相似度计算

影响力计算的多因素模型

Influence(agent) = α × FollowerCount^β 
                 + γ × EngagementRate 
                 + δ × ContentQuality 
                 + ε × NetworkCentrality
                 + ζ × RecencyBoost

参数通过仿真校准或实证数据拟合确定,不同平台(Twitter/Reddit)可能有不同的权重配置。

4.2.4 记忆架构:短期工作记忆与长期图谱记忆

双层架构的设计原理

层级 容量 retention 检索方式 用途
工作记忆 7±2 个 chunk 秒到分钟 直接访问 即时情境感知,当前轮次决策
图谱记忆 理论上无上限 永久(需管理) 相似度 + 结构检索 跨轮次学习,长期一致性

记忆晋升机制:工作记忆中的高重要性事件(高情感强度、高互动量、关键决策点)通过巩固过程写入图谱记忆;图谱记忆中的高频检索记忆增强提取强度,低频记忆逐渐衰减。

4.3 MiroFishModelmiro_fish 函数分析

4.3.1 模块定位:mirofish 包的核心接口

关键发现:经过对官方仓库 666ghj/MiroFish 及其主要社区 fork 的全面检索,MiroFishModel 类和 miro_fish 函数并非位于主仓库源码中,而是属于独立的 PyPI 包 mirofish-simulator(版本 0.12.0)。

这一发现具有重要的架构理解意义:

  • mirofish-simulatorOASIS 引擎的上层封装库,将多智能体仿真能力产品化为可导入的 Python 包
  • 主仓库 MiroFish完整的 Web 应用,通过 SimulationRunner 服务以子进程方式调用 mirofish-simulator
  • 这种分层设计实现了仿真引擎与产品界面的解耦,便于独立演进和多种集成方式

导入语句的证据simulation_runner.py 中的 from mirofish import MiroFishModel, miro_fish 表明这两个符号是外部依赖,而非项目内部实现。该导入在标准 Python 环境(未安装 mirofish-simulator)中会失败,解释了为何部分开发者报告导入错误。

4.3.2 MiroFishModel:仿真状态与模型参数的封装实体

基于 PyPI 包信息和同类系统设计模式,MiroFishModel 的推测接口:

class MiroFishModel:
    def __init__(
        self,
        config: SimulationConfig,
        llm_client: Optional[LLMClient] = None,
        memory_backend: Optional[MemoryBackend] = None
    ):
        self.config = config          # 仿真参数
        self.agents: List[Agent] = [] # 智能体集合
        self.graph: KnowledgeGraph    # 知识图谱
        self.platforms: Dict[str, Platform]  # 平台状态
        self.history: SimulationHistory      # 完整历史
        self.status: ModelStatus = ModelStatus.IDLE
        
    def build_graph(self, seed_material: Union[str, Path, Document]) -> KnowledgeGraph:
        """从种子材料构建知识图谱"""
        
    def generate_agents(self, count: int, diversity_params: Optional[Dict] = None) -> List[Agent]:
        """基于图谱生成智能体人格"""
        
    def step(self, n: int = 1, events: Optional[List[Event]] = None) -> SimulationState:
        """执行 n 轮仿真,可选注入事件"""
        
    def run(self, until: Union[int, Callable, Condition], callbacks: Optional[Dict] = None) -> SimulationResult:
        """执行完整仿真,支持多种终止条件"""
        
    def inject_event(self, event: Event, target: Optional[Union[str, List[str]]] = None) -> None:
        """上帝视角事件注入"""
        
    def get_report(self, query: str, agent: Optional[str] = "report_agent") -> Report:
        """生成预测报告"""
        
    def save(self, path: Union[str, Path]) -> None:
        """序列化完整状态"""
        
    def load(self, path: Union[str, Path]) -> "MiroFishModel":
        """从检查点恢复状态"""
        
    def interact(self, agent_id: str, message: str) -> str:
        """与特定智能体对话"""

4.3.3 miro_fish:主控函数与执行入口

miro_fish 函数提供一步式完整工作流,是库的用户-facing API:

def miro_fish(
    seed_material: Union[str, Path, Document, List[Document]],
    prediction_goal: str,
    config: Optional[SimulationConfig] = None,
    callbacks: Optional[Dict[str, Callable]] = None,
    return_interactive: bool = False
) -> Union[SimulationResult, Tuple[SimulationResult, InteractiveWorld]]:
    """
    MiroFish 主入口:从种子材料到预测报告的完整流程
    
    Parameters
    ----------
    seed_material : 种子材料,支持多种格式
    prediction_goal : 自然语言描述的预测目标
    config : 仿真配置,None 则使用默认配置
    callbacks : 回调函数,用于进度监控和干预
    return_interactive : 是否返回交互式世界对象
    
    Returns
    -------
    SimulationResult 或 (SimulationResult, InteractiveWorld)
        包含预测报告、完整历史、关键指标等
    """
    # 实现:初始化模型 → 构建图谱 → 生成智能体 → 运行仿真 → 生成报告

设计哲学:最简用例可一行代码完成,同时保留高级定制的灵活性。return_interactive=True 模式支持仿真后的深度探索,与 MiroFish Web 应用的"深度互动"阶段对应。

4.3.4 与 SimulationRunner 的协作关系:子进程调用与 IPC 通信

主仓库 MiroFish 通过 SimulationRunner 服务集成 mirofish-simulator,采用子进程 + IPC 架构

方面 实现 设计考量
进程创建 subprocess.Popen 启动独立 Python 进程 资源隔离、故障隔离、环境隔离
配置传递 JSON 文件序列化 SimulationConfig 跨进程、跨语言兼容
命令通道 ipc_commands/ 目录 + 文件监听 简单可靠,支持任意数据大小
响应通道 ipc_responses/ 目录 + 文件监听 异步非阻塞,便于状态同步
状态监控 后台线程轮询 actions.jsonl 实时性约 1 秒延迟
结果收集 完整日志文件 + 最终状态快照 支持事后分析和复现

架构对比

模式 优点 缺点 适用场景
子进程 IPC(当前) 强隔离、跨语言、易于调试 延迟较高、资源开销、进程管理复杂 生产部署、多租户隔离
直接导入mirofish 包) 低延迟、共享内存、精细控制 耦合紧密、故障传播、GIL 限制 研究实验、单用户交互
异步协程(建议改进) 低延迟、高并发、代码简洁 需要 async 重构、调试复杂 高性能实时场景

社区已提出异步协程改进方案:使用 asyncio.create_subprocess_exec 替代 subprocess.Popen,采用 asyncio.Queue 替代文件 IPC,可将状态同步延迟从秒级降至毫秒级,同时简化代码结构。

4.4 仿真运行状态机

4.4.1 RunnerStatus 枚举:IDLE / RUNNING / PAUSED / COMPLETED / ERROR

simulation_runner.py 定义了精细的状态机:

状态 进入条件 可执行操作 退出条件
IDLE 初始化完成,或重置后 start_simulation() 用户启动仿真
STARTING start_simulation() 调用 子进程启动成功/失败
RUNNING 子进程启动成功 pause(), stop(), inject_event() 达到 max_rounds、用户停止、错误
PAUSED pause() 调用,或断点触发 resume(), stop(), 状态查询 用户恢复或停止
STOPPING stop() 调用 子进程终止完成
STOPPED 子进程终止完成 reset(), 状态查询 用户重置
COMPLETED 达到 max_rounds 正常结束 get_report(), interact(), 状态查询 用户重置
FAILED 子进程崩溃、超时、配置错误 get_logs(), 错误诊断 用户重置或修复后重试

状态转换的原子性:通过锁机制确保并发操作的安全,防止竞态条件导致的状态不一致。

4.4.2 AgentAction 数据类:智能体行为的结构化表示

@dataclass
class AgentAction:
    action_id: str           # UUID,全局唯一
    timestamp: datetime      # 仿真时间戳
    round_num: int           # 所属轮次
    platform: str            # "twitter" | "reddit"
    
    agent_id: str            # 执行者标识
    agent_name: str          # 显示名称
    
    action_type: str         # 枚举:CREATE_POST, REPLY_POST, LIKE_POST, 
                             #       RETWEET, FOLLOW, UNFOLLOW, SEARCH, ...
    action_args: Dict        # 类型特定参数
    content: Optional[str]   # 文本内容(发帖/回复)
    target_id: Optional[str] # 目标对象 ID(回复/点赞/关注)
    
    result: Dict             # 执行结果:可见性、互动数、情感标签等
    success: bool            # 是否成功执行
    reasoning: Optional[str] # LLM 决策推理链(可解释性)

数据用途:行为日志支持多种下游分析——时间序列聚合(趋势提取)、网络构建(关系演化)、内容分析(主题建模、情感分析)、以及个体轨迹追踪(特定智能体的行为模式)。

4.4.3 异步事件循环:非阻塞仿真与实时状态推送

后端异步架构

组件 技术 职责
主事件循环 asyncio 处理 HTTP 请求、WebSocket 连接
任务执行器 concurrent.futures.ThreadPoolExecutor 运行同步的 LLM 调用
仿真监控 threading.Thread 后台轮询子进程状态
状态推送 WebSocket / Server-Sent Events 实时向前端广播进度

前端实时更新流程

  1. 用户点击"启动仿真" → POST /api/simulation/start
  2. 后端创建 SimulationRunner 实例,启动子进程
  3. 后台监控线程每秒读取 actions.jsonl,更新内存状态
  4. WebSocket 连接建立,状态变更即时推送
  5. 前端 Vue 组件响应式更新,进度条、指标卡片、图谱动画同步刷新

性能瓶颈与优化:当前文件 IPC 机制限制状态更新频率为约 1 秒;改进方案(内存队列 + 异步协程)可将延迟降至 10-100 毫秒,支持更流畅的实时可视化。


5. 数据处理与知识图谱

5.1 种子材料处理管道

5.1.1 多格式支持:PDF / Markdown / TXT 解析

MiroFish 支持 PDF、Markdown、TXT 三种主要格式的种子材料上传,各格式的解析策略:

格式 解析库 关键挑战 处理策略
PDF PyPDF2, pdfplumber, PyMuPDF 版面复杂性(多栏、表格、图片)、扫描版 OCR 优先提取文本流,表格转为结构化数据,图片生成描述性 alt-text
Markdown markdown-it (前端兼容模式) frontmatter 元数据、内部链接、代码块 解析 YAML frontmatter,链接转为图谱关系,代码块可选保留或过滤
TXT 内置 + chardet 编码检测、段落分割、无结构标记 自动检测编码(UTF-8/GBK/...),空行分割段落,启发式识别标题

格式选择建议:结构化内容(报告、论文)优先使用 Markdown;扫描文档使用 OCR 后的文本或 PDF;简单笔记使用 TXT。混合格式(如含大量图片的 PDF)可能需要预处理提取关键文本。

5.1.2 文本预处理:分块、清洗、向量化

预处理流程

步骤 操作 目的
清洗 去除页眉页脚、页码、重复空格、特殊字符 减少噪声,提高抽取质量
归一化 统一编码、全半角转换、日期格式标准化 确保一致性,便于后续处理
分句 使用语言特定规则或模型 保留语义完整性
分块 按 token 数(通常 2000-4000)或语义边界分割 适配 LLM 上下文窗口
向量化 使用嵌入模型(如 text-embedding-3-small) 支持语义检索和相似度计算
去重 检测并合并重复或高度相似块 减少冗余,提高效率

分块策略的权衡

策略 优点 缺点 适用场景
固定长度 简单、均匀、易于批处理 可能切断语义单元 通用场景,追求效率
语义边界(段落/章节) 保留完整性,提高抽取质量 长度不均,可能需要二次分割 高质量要求,结构化文档
重叠滑动窗口 保留跨块上下文,减少边界效应 增加计算量,可能引入冗余 精细分析,关键内容提取

5.1.3 信息密度评估:关键内容提取与噪声过滤

信息密度指标(启发式或模型-based):

指标 计算方法 用途
实体密度 每千字的实体提及数 识别核心内容区域
关系复杂度 实体间关系类型的多样性 评估结构丰富度
情感强度 情感词频和强度 识别关键争议点
时间集中度 时间表达的数量和密度 定位叙事高潮
引用网络 被其他部分引用的频率 识别枢纽内容

噪声过滤策略:基于密度指标的低质量块过滤、基于主题模型的离群内容检测、以及基于用户反馈的迭代优化。

5.2 本体论生成与实体抽取

5.2.1 LLM 驱动的本体识别:概念、属性、关系三元组

本体论生成流程ontology_generator.py):

  1. 主题识别:分析种子材料的整体主题和领域类型
  2. 概念层次:识别核心概念及其上下位关系(如"人物" ⊃ "官员" ⊃ "部长")
  3. 属性定义:为每个概念定义关键属性(如"人物"有姓名、年龄、职位、立场)
  4. 关系类型:识别概念间可能的关系(隶属、合作、竞争、因果等)
  5. 约束规则:定义基数约束、值域约束、互斥约束等

LLM 提示工程的关键要素

  • Few-shot 示例:提供领域相关的本体示例,引导模型输出格式
  • 迭代精化:多轮对话逐步完善,从粗粒度到细粒度
  • 一致性校验:检测循环继承、属性冲突等问题

5.2.2 实体消歧与链接:同名异义与异名同义处理

消歧挑战的类型

类型 示例 处理策略
同名异义 "苹果" = 公司 / 水果 / 城市 上下文语义分析,图谱关系约束
异名同义 "北京" = "中华人民共和国首都" = "Beijing" 字符串相似度 + 语义嵌入 + 共指消解
时变同一 人名变更(结婚、改名)、组织重组 时序追踪,别名关系建模
模糊指代 "他"、"该公司"、"上述政策" 指代消解模型,最近提及优先

实体链接的流程:候选生成(名称匹配、别名扩展)→ 候选排序(上下文相似度、图谱一致性)→ 阈值判断(置信度 > 0.8 链接,0.5-0.8 人工审核,< 0.5 新建实体)。

5.2.3 关系强度量化:基于共现与语义相似度

关系强度计算的多因素模型

Strength(e1, e2, relation) = α × CooccurrenceFrequency
                           + β × SemanticSimilarity(e1, e2)
                           + γ × SyntacticCloseness(sentence)
                           + δ × TemporalProximity(events)
                           + ε × UserFeedback(corrections)
因素 计算方法 权重场景
共现频率 滑动窗口内的共现次数 通用场景,基础权重
语义相似度 实体嵌入向量的余弦相似度 隐含关系推断
句法接近度 依存句法树中的距离 显式关系抽取
时间邻近度 共同事件的时间差 动态关系演化
用户反馈 人工确认的链接和强度调整 持续优化

5.3 GraphRAG 构建流程

5.3.1 时序图谱组织:时间戳索引与版本管理

时序图谱的核心结构

元素 时序属性 查询支持
节点 created_at, modified_at, valid_from, valid_to 时间点查询、时间范围查询
established_at, strength_history[] 关系演化追踪、强度变化分析
事件 timestamp, duration, participants[] 事件序列重建、因果链分析

版本管理策略:为关键实体和关系维护版本历史,支持"在时间 T,图谱状态如何"的查询。存储优化:完整快照 + 增量日志的混合方案,平衡查询效率和存储成本。

5.3.2 社区检测与聚类:群体结构自动发现

社区检测算法

算法 特点 适用场景
Louvain 快速、模块化优化 大规模图谱,初步探索
Leiden Louvain 改进,保证连通性 高质量社区划分
Label Propagation 线性复杂度,无需参数 超大规模实时检测
Infomap 信息论基础,捕捉层次结构 多尺度社区分析

社区演化的时序分析:追踪社区的分裂、合并、生长、消亡,识别关键转折点(如意见领袖的跨社区流动)。

5.3.3 检索增强生成:子图采样与上下文组装

GraphRAG 的检索流程

  1. 查询理解:将自然语言查询转化为图谱查询意图
  2. 种子实体识别:提取查询中的关键实体或生成候选嵌入
  3. 子图扩展:从种子出发,按关系类型和深度约束扩展邻居
  4. 相关性排序:结合结构重要性(PageRank、中心性)和语义相似度
  5. 上下文组装:将子图序列化为自然语言描述,适配 LLM 上下文窗口
  6. 生成增强:LLM 基于检索到的图谱上下文生成回答

上下文组装的优化:关键路径优先、冗余信息过滤、多视角整合(不同社区的观点对比)。

5.4 记忆注入与更新机制

5.4.1 个体记忆:智能体私有经验存储

个体记忆的内容

  • 事件记忆:亲身参与的关键事件(发帖、争论、合作)
  • 情感记忆:与特定实体或话题关联的情感体验
  • 策略记忆:成功或失败的行为模式及其后果
  • 关系记忆:与其他智能体的互动历史和当前状态

存储格式:自然语言描述(便于 LLM 理解)+ 结构化标签(便于检索过滤)。

5.4.2 群体记忆:共享事件与公共知识

群体记忆的来源

  • 公共信息发布:新闻、公告、趋势话题
  • 高频互动事件:广泛讨论的热点、集体行动
  • 制度性知识:平台规则、社会规范、历史共识

与个体记忆的关系:群体记忆为个体提供共享的参考框架,个体记忆在群体记忆基础上添加个性化解读。

5.4.3 记忆衰减与强化:时间衰减与重要性加权

艾宾浩斯风格的遗忘曲线

Retention(t) = Importance × e^(-λ × t / Stability)
因素 影响 调节机制
重要性 初始记忆强度 情感强度、结果显著性、复述频率
时间 t 遗忘的驱动力 不可控,固定流逝
稳定性 λ 遗忘速度 睡眠巩固、情感标记、关联丰富度

记忆强化机制:成功预测或决策后的复述、情感高峰事件的闪光灯效应、与他人分享时的社会巩固。


6. 模型训练与优化策略

6.1 提示工程体系

6.1.1 角色提示模板:人格一致性维护

人格提示的核心要素

要素 内容 示例
身份声明 "你是 [姓名],[年龄] 岁的 [职业]" "你是李明,35 岁的科技记者"
背景故事 关键经历形成的世界观 "你曾报道过三起数据泄露事件,对隐私保护高度敏感"
价值倾向 对关键议题的立场 "你支持强监管,认为技术公司应承担更多社会责任"
行为风格 表达习惯和社交策略 "你倾向于引用数据支持观点,避免情绪化表达"
当前目标 短期追求的具体目标 "你希望这篇报道能获得 10 万+ 阅读"
关系状态 与关键他人的当前关系 "你与 <span class="mention-invalid">@TechCEO</span> 互相关注,但近期无直接互动"

一致性维护策略:关键属性在提示中重复强化、行为结果反馈到记忆并影响后续提示、定期"校准"提示防止漂移。

6.1.2 情境提示构造:上下文窗口优化

上下文窗口的有限性挑战:即使 128K 上下文模型,面对数千智能体的复杂交互历史也会捉襟见肘。

优化策略

策略 实现 效果
分层摘要 近期详细 + 远期摘要 + 关键事件完整保留 压缩 10-100 倍,保留核心信息
动态选择 基于当前决策相关性检索记忆 提高上下文利用率
外部引用 将详细历史 offload 到图谱,提示中仅保留指针 理论上无限扩展
多轮组装 分多次 LLM 调用,逐步聚焦 模拟人类的分步思考

6.1.3 思维链引导:推理过程显性化

思维链(Chain-of-Thought)的应用场景

  • 复杂决策(是否发帖、如何回应争论)
  • 情感更新(为何情绪变化、如何表达)
  • 关系调整(是否关注/取关、如何维护)

引导方式:提示中明确要求"逐步思考"、提供思考框架(感知 → 评估 → 决策 → 执行)、在输出格式中预留 reasoning 字段。

6.2 仿真参数调优

6.2.1 智能体数量:精度与效率的权衡(建议 < 5000)

规模效应分析

智能体数量 典型用途 计算成本 精度特征
50-200 快速原型、概念验证 低(\(0.001-0.01) | 个体行为可见,统计波动大 | | 500-2000 | 标准预测、生产应用 | 中(\)0.01-0.1) 群体模式稳定,个体细节丰富
2000-5000 高精度需求、学术研究 高(\(0.1-1) | 统计显著性,长尾现象可观测 | | 5000+ | 超大规模社会模拟 | 很高(\)1-10+) 边际精度提升递减,主要用于验证

项目建议:标准场景 500-2000 智能体,复杂场景可扩展至 5000,>5000 需特殊优化和成本评估。

6.2.2 模拟轮次:收敛性判断与提前终止(默认 40 轮)

收敛性指标

指标 计算方法 收敛阈值
观点方差 关键议题立场的标准差 连续 5 轮变化 < 5%
网络密度 实际连接数 / 可能连接数 连续 5 轮变化 < 2%
话题熵 话题分布的香农熵 连续 5 轮变化 < 0.1
活跃率 有动作智能体 / 总智能体 降至 < 10% 或稳定

提前终止策略:多指标综合判断,或训练专门的收敛预测模型。

6.2.3 开放度参数:随机性权重与结果多样性

开放度的多维度控制

维度 参数 影响
行为随机性 action_temperature 高值增加非常规行为,低值强化习惯模式
观点可塑性 opinion_malleability 高值使智能体易受他人影响,低值强化初始立场
信息探索 exploration_rate 高值增加主动搜索新信息,低值依赖现有关注
社交冒险 social_risk_taking 高值增加与陌生人互动,低值强化现有关系

6.2.4 快速模式:牺牲精度的加速策略

加速技术

技术 精度损失 速度提升 适用场景
轻量模型 5-10x 开发迭代、大规模参数扫描
批处理推理 2-3x OASIS 原生优化
缓存复用 无(确定性场景) 10-100x 重复查询、相似情境
降采样仿真 与采样率成反比 初步探索、敏感性分析
规则代理 100-1000x 基线对比、极端规模测试

6.3 反事实模拟与敏感性分析

6.3.1 关键参数扰动:识别决策敏感因素

敏感性分析流程

  1. 确定基准仿真配置和关键输出指标
  2. 选择待测试参数及其扰动范围(±20%, ±50%, 极端值)
  3. 并行运行多组扰动仿真
  4. 量化输出变化,计算敏感性系数
  5. 识别高敏感性参数,优先精确估计或稳健化设计

6.3.2 场景分支对比:多版本并行推演

分支策略

策略 实现 用途
单因素变化 每次只改变一个变量 因果归因、责任划分
正交设计 多因素组合,覆盖关键交互 效率优化、交互效应发现
极端场景 压力测试,边界条件 风险评估、韧性设计
历史对照 与已知结果对比验证 模型校准、可信度建立

6.3.3 置信度评估:结果稳定性量化

置信度来源

来源 量化方法 表达形式
统计稳定性 多次运行的方差 置信区间
模型敏感性 参数扰动的响应 敏感性等级(高/中/低)
专家一致性 与领域专家判断的对比 一致性评分
历史验证 与事后观察的匹配度 准确率、召回率
内部一致性 不同指标的逻辑相容性 矛盾标记

7. 结果生成与可视化

7.1 预测报告生成

7.1.1 ReportAgent 架构:ReACT 循环与工具调用

ReACT 循环的详细流程report_agent.py):

步骤 操作 输出
1. 需求解析 分析 prediction_goal,识别关键问题类型 问题分解列表
2. 策略规划 确定信息收集策略,选择优先工具 工具调用计划
3. 工具执行 调用选定工具,获取原始数据 工具返回结果
4. 信息整合 综合多源信息,识别模式和矛盾 中间发现摘要
5. 反思评估 判断信息充分性,决定继续或终止 继续/终止决策
6. 报告合成 结构化组织发现,生成最终文档 Markdown 报告

循环控制:最大工具调用次数(默认 5)、最大反思轮次(默认 2)、超时限制(防止无限循环)。

7.1.2 报告结构:关键转折点、风险信号、置信度标注

标准报告章节

章节 内容 可视化支持
执行摘要 核心发现、关键建议、置信度总览 指标卡片、趋势箭头
背景分析 种子材料关键信息、智能体群体特征 图谱概览、人口统计分布
演化叙事 按时间线组织的关键事件和转折点 时序图、动画回放
网络分析 影响力结构、社区分化、信息流动 力导向图、桑基图、和弦图
情感动态 整体情感走向、极化程度、关键触发点 面积图、热力图
情景对比 不同假设或参数下的结果分布 箱线图、散点矩阵
风险提示 低置信度区域、敏感假设、潜在意外 警示标记、敏感性表格
建议行动 基于仿真的策略建议及其预期效果 决策树、效果预测

7.1.3 多维度分析:时间线、影响力网络、情感演化

时间线分析:识别关键转折点(舆论反转、联盟重组、情绪爆发),标注触发事件,量化变化速度。

影响力网络:计算多中心性指标(度、介数、特征向量、PageRank),识别关键意见领袖和信息桥梁,追踪影响力随时间的流动和集中。

情感演化:整体情感极性和强度的时序变化,不同群体的情感分化,情感与行为的关联模式。

7.2 交互式可视化

7.2.1 动态图谱渲染:D3.js 力导向图与时空演化

D3.js 实现的核心功能

功能 技术实现 用户价值
力导向布局 d3-force 仿真,自定义引力和斥力参数 直观展示网络结构
时序动画 transition + requestAnimationFrame 观察演化过程,识别关键转折点
交互探索 缩放、平移、拖拽、框选、筛选 多尺度分析,聚焦感兴趣区域
多层视图 节点分组、社区着色、层次展开 理解模块化结构
详情面板 点击/悬停显示实体完整信息 深度探查,验证假设

性能优化:Canvas 渲染替代 SVG(>1000 节点)、Web Worker offload 力计算、层次细节(LOD)简化远距离节点。

7.2.2 智能体画像:个体轨迹与关系探查

智能体画像面板

模块 内容
基本信息 姓名、类型、人口统计、核心立场
人格雷达 大五人格、认知风格、风险偏好的可视化
活动时间线 发帖、回复、互动的时序分布
关系网络 直接联系人的影响力排名和互动频率
观点演化 关键议题立场的历史变化
代表性内容 高互动量帖子的内容和反响

7.2.3 对话界面:与报告代理或特定角色的深度访谈

对话模式

模式 对象 用途
报告代理 ReportAgent 追问报告细节、请求额外分析、探索替代情景
特定智能体 仿真中的任意角色 深入了解其观点形成过程、验证行为合理性
群体代表 社区检测识别的典型成员 快速把握群体特征和内部差异

对话状态管理:维护对话历史、注入相关记忆、管理上下文窗口、处理多轮引用和指代。

7.3 结果导出与复用

7.3.1 会话持久化:workbench_sessions/ 元数据存储

会话存储内容

数据 格式 用途
项目配置 JSON 种子材料路径、仿真参数、自定义设置
知识图谱 KuzuDB 文件 / Neo4j 导出 完整语义网络,支持后续查询
仿真历史 actions.jsonl + 状态快照 完整可复现,支持重新分析
生成报告 Markdown + 原始数据 可读文档 + 深度验证
用户交互 对话日志、标注、反馈 持续学习、模型改进

7.3.2 任务状态管理:tasks/ 长时运行状态恢复

任务状态机持久化:支持崩溃恢复、断点续传、进度查询。关键状态:PENDING、RUNNING、PAUSED、COMPLETED、FAILED、CANCELLED。

7.3.3 报告格式:结构化 JSON 与可读文档双输出

格式 内容 用途
Markdown 完整叙事,嵌入可视化 人工阅读、演示分享、编辑加工
JSON 结构化数据,含完整元数据 程序化分析、集成下游系统、长期存档
HTML 富媒体版本,交互式图表 Web 发布、嵌入式展示
PDF 版式固定,打印友好 正式报告、归档留存

8. 性能优化与工程实践

8.1 计算资源管理

8.1.1 内存优化:大规模智能体的分页加载

内存压力来源:每个智能体的完整状态(人格参数、记忆历史、当前情感)可能占用 10-100 KB,10000 智能体即 100 MB-1 GB。

优化策略

  • 活跃/休眠分离:仅活跃智能体常驻内存,休眠智能体序列化到磁盘
  • 按需加载:根据当前轮次的平台活动和关注关系,预测需要加载的智能体集合
  • 共享结构:相同类型的智能体共享人格模板,仅存储个体差异

8.1.2 并发控制:异步 I/O 与协程调度

当前架构的并发层次

层次 技术 用途
HTTP 服务 Flask/FastAPI + Gunicorn 处理前端请求
后台任务 concurrent.futures 执行 LLM 调用
仿真监控 threading.Thread 轮询子进程状态
子进程 subprocess.Popen 隔离运行 OASIS

改进方向:统一为 asyncio 协程架构,减少线程切换开销,提高并发效率。

8.1.3 子进程隔离:仿真引擎的独立运行空间

隔离的益处与代价

方面 益处 代价
故障隔离 仿真崩溃不影响主服务 进程管理复杂性
资源限制 便于 CPU/内存配额控制 IPC 通信开销
环境隔离 支持不同 Python/依赖版本 部署复杂性
安全隔离 限制潜在攻击面 调试困难性

8.2 API 成本控制

8.2.1 令牌消耗预估:轮次 × 智能体数 × 上下文长度

成本模型

Total Tokens ≈ Rounds × Agents × (Prompt Tokens + Completion Tokens)
            ≈ 40 × 1000 × (4000 + 500) 
            ≈ 180M tokens per simulation

按 GPT-4o-mini 价格(\(0.15/M input,\)0.60/M output):约 **\(40/仿真**。 #### 8.2.2 模型选择策略:qwen-plus 性价比优势 **成本优化组合**(社区实践): | 任务 | 模型 | 成本比例 | 质量影响 | |:---|:---|:---|:---| | 本体论生成 | qwen-plus / gpt-4o-mini | 10% | 关键,需高质量 | | 智能体决策 | qwen-turbo / gpt-4o-mini | 60% | 中等,批量优化 | | 报告生成 | qwen-plus / gpt-4o | 20% | 关键,需高质量 | | 交互对话 | 用户选择 | 10% | 按需 | **混合策略总成本**:可降至纯 gpt-4o 的 **10-20%**,质量损失可控。 #### 8.2.3 缓存机制:重复查询的结果复用 **缓存层次**: | 层次 | 键 | 有效期 | 命中率场景 | |:---|:---|:---|:---| | 嵌入向量 | 文本内容哈希 | 永久 | 相同文本多次出现 | | LLM 响应 | (prompt, model, temperature) 哈希 | 会话级 | 相同情境重复决策 | | 图谱查询 | 查询模式 + 参数 | 轮次级 | 相似检索模式 | | 仿真结果 | 完整配置哈希 | 长期 | 相同参数重新运行 | ### 8.3 可观测性建设 #### 8.3.1 日志分级:DEBUG / INFO / WARNING / ERROR **分级策略**: | 级别 | 内容 | 生产启用 | |:---|:---|:---| | DEBUG | 详细执行流程、变量值、中间结果 | 否(性能考虑) | | INFO | 关键里程碑、状态变更、性能指标 | 是 | | WARNING | 非致命异常、降级处理、资源紧张 | 是 | | ERROR | 操作失败、数据不一致、服务异常 | 是(告警) | #### 8.3.2 健康检查端点:`/api/health` 服务状态 **健康检查维度**: - 服务存活:HTTP 响应状态 - 依赖就绪:LLM API、Zep/Neo4j、OASIS 可调用 - 资源充足:磁盘空间、内存使用、连接池状态 - 功能正常:关键路径的端到端测试 #### 8.3.3 仿真进度追踪:实时状态流与断点续传 **进度指标**: - 宏观:当前轮次 / 总轮次、预估剩余时间 - 中观:活跃智能体数、平台内容量、互动频率 - 微观:特定智能体的当前动作、关键事件触发 **断点续传**:定期序列化完整状态,支持从任意轮次恢复,便于长仿真管理和故障恢复。 --- ## 9. 扩展性与生态集成 ### 9.1 插件化架构 #### 9.1.1 资源适配器接口:自定义数据源接入 **适配器接口定义**(推测): ```python class ResourceAdapter(ABC): @abstractmethod def connect(self, config: Dict) -> Connection: ... @abstractmethod def create(self, data: Dict) -> ResourceID: ... @abstractmethod def read(self, id: ResourceID) -> Dict: ... @abstractmethod def update(self, id: ResourceID, data: Dict) -> None: ... @abstractmethod def delete(self, id: ResourceID) -> None: ... @abstractmethod def query(self, criteria: Dict) -> List[Dict]: ... ``` **社区贡献的适配器**:Neo4jAdapter、KuzuAdapter、WeaviateAdapter(向量数据库)、MinIOAdapter(对象存储)。 #### 9.1.2 工具组合模式:工作流的声明式编排 **工作流定义示例**(YAML 风格): ```yaml workflow: crisis_communication steps: - name: ingest tool: IngestTool input:\){uploaded_files}

  • name: build tool: BuildTool input: \({ingest.output} params: {ontology: "crisis_communication"} - name: prepare tool: PrepareTool input:\){build.output} params: {agent_count: 2000, platforms: [twitter, reddit]}

  • name: baseline tool: RunTool input: \({prepare.output} params: {rounds: 40, name: "baseline"} - name: intervention_a tool: RunTool input:\){prepare.output} params: rounds: 40 name: "early_response" events: [{at: 10, type: "official_statement", content: "..."}]

  • name: compare tool: CompareTool input: [\({baseline.output},\){intervention_a.output}]

  • name: report tool: ReportTool input: ${compare.output}


#### 9.1.3 平台扩展:新增社交场景仿真支持

**扩展方向**:
- **专业社区**:LinkedIn(职场)、GitHub(开发者)、Discord(兴趣社群)
- **垂直平台**:淘宝/京东(电商评价)、美团/大众点评(本地服务)、B站/YouTube(视频社区)
- **新兴市场**:TikTok/Douyin(短视频)、WhatsApp/WeChat(私域社交)

### 9.2 与 CAMEL-AI 生态的协同

#### 9.2.1 `camel-oasis` 版本锁定与兼容性管理

**当前依赖**:`camel-oasis==0.2.5`,版本锁定确保可复现性。

**升级策略**:跟踪 OASIS 上游更新,评估新特性(如新平台支持、性能优化、bug 修复)的集成价值,在测试环境验证后更新。

#### 9.2.2 `camel-ai` 编排能力的上层封装

**CAMEL-AI 生态的 broader 能力**:
- `camel-ai/camel`: 多智能体对话和协作框架
- `camel-ai/oasis`: 社交仿真(MiroFish 使用)
- `camel-ai/owl`: 网络操作学习
- `camel-ai/meme`: 记忆和知识管理

**封装策略**:MiroFish 专注于预测场景的产品化,底层复用 CAMEL 能力,上层添加领域特定的知识注入、报告生成、交互界面。

#### 9.2.3 上游更新追踪:社区贡献与漏洞修复

**协作机制**:GitHub Issues/PRs、Discord 社区、定期同步会议。

**关键关注**:安全漏洞(如依赖库 CVE)、性能回归、API 兼容性变更。

### 9.3 企业级定制路径

#### 9.3.1 私有部署:内网环境与数据安全

**部署模式**:

| 模式 | 架构 | 数据主权 | 适用场景 |
|:---|:---|:---|:---|
| 纯本地 | Ollama + KuzuDB/Neo4j | 完全 | 高度敏感数据、合规要求严格 |
| 混合云 | 本地仿真 + 云端 LLM API | 部分 | 平衡性能和成本 |
| 私有云 | 专属云实例 | 合同保障 | 大规模部署、SLA 要求 |

#### 9.3.2 领域适配:垂直行业的本体库构建

**行业本体示例**:

| 行业 | 核心实体 | 关键关系 | 典型预测场景 |
|:---|:---|:---|:---|
| 金融 | 资产、投资者、机构、政策 | 持有、交易、影响、监管 | 市场反应、风险传染 |
| 医疗 | 疾病、药物、医生、患者 | 诊断、治疗、副作用、传播 | 疫情演化、政策效果 |
| 能源 | 资源、设施、市场、政策 | 供应、消费、价格、转型 | 政策冲击、技术替代 |
| 教育 | 学生、课程、机构、就业 | 学习、评价、升学、就业 | 政策改革、技术影响 |

#### 9.3.3 人机协同:专家知识注入与结果校验

**协同模式**:

| 阶段 | 专家角色 | 系统支持 |
|:---|:---|:---|
| 准备 | 审核种子材料、调整本体论、校准人格参数 | 可视化编辑、版本对比、影响预览 |
| 执行 | 监控仿真进展、注入关键事件、调整参数 | 实时仪表板、异常告警、快速干预 |
| 分析 | 解读报告发现、验证关键结论、识别盲点 | 钻取探查、对比分析、证据追溯 |
| 决策 | 综合仿真结果和业务判断,制定行动 | 情景对比、效果预测、风险评估 |

**持续学习**:专家反馈(标注、修正、扩展)回流到系统,改进本体论、人格模板、报告生成模型。
推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录