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 生成行为 - **立场设定**:对特定话题的态度(支持/反对/中立/观察) **技术细节**: ```python 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 行为**:发帖、评论、点赞、转发、关注 - **信息传播**:病毒式传播阈值、回声室效应 **时间配置(基于中国人作息)**: ```python 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 GitHub**: https://github.com/666ghj/MiroFish - **Zep Cloud**: https://www.getzep.com/ - **OASIS (CAMEL-AI)**: https://github.com/camel-ai/oasis - **GraphRAG**: https://microsoft.github.io/graphrag/ - **Kevin Kelly《必然》**: 预测未来的 12 个技术趋势 --- *本文是 MiroFish 深度解析系列的第一篇,后续将继续深入探讨技术细节。* #MiroFish #多智能体仿真 #知识图谱 #AI预测 #开源项目

讨论回复

1 条回复
✨步子哥 (steper) #1
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.py` 和 `ontology_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` 使用嵌入式 **KuzuDB**,`MiroFish-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 clone` → `cp .env.example .env` → `npm run setup:all` → `npm run dev`。两种部署方式共享相同的 `.env` 配置机制,便于环境迁移。 ### 2.2 目录结构与模块划分 #### 2.2.1 `frontend/`:交互界面与图谱可视化 `frontend/` 目录包含完整的 Vue 3 单页应用,按功能模块组织: | 子目录 | 内容 | |:---|:---| | `src/components/` | 可复用 UI 组件,按 `common/`(通用)、`graph/`(图谱)、`simulation/`(仿真)、`report/`(报告)组织 | | `src/views/` | 页面级组件:欢迎页、项目列表、图谱构建、环境搭建、仿真监控、报告阅读、深度交互 | | `src/stores/` | Pinia 状态管理:`sessionStore`、`taskStore`、`graphStore`、`simulationStore` | | `src/api/` | 后端 API 的 Axios 封装,含请求拦截、错误处理、重试逻辑 | | `src/utils/` | 工具函数:图谱数据转换、时间格式化、颜色映射 | **国际化支持**是前端的重要特性。原始版本主要面向中文用户,社区 fork(`amadad/mirofish`、`nikmcfly/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 模型**定义数据契约,支持链式组合和条件执行。例如,`BuildTool` 和 `PrepareTool` 在数据就绪后可以部分并行,`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`** 的实现逻辑: ```python 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`** 的核心逻辑: ```python 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` 实现**分层配置加载机制**,遵循十二因素应用方法论: ```python # 伪代码示意 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-mini`、`qwen-turbo`),关键决策和报告生成使用强模型(`gpt-4o`、`qwen-plus`),可降低 50-70% 成本而不显著影响质量。 #### 3.2.2 `ZEP_API_KEY`:长期记忆图谱服务 `ZEP_API_KEY` 用于认证 Zep Cloud 服务,提供**时序 GraphRAG 能力**: | 特性 | 说明 | |:---|:---| | 免费额度 | 每月足够支撑简单试用 | | 核心功能 | 向量存储、图谱存储、时序检索、记忆更新 | | 数据隐私 | 材料上传至第三方服务,敏感场景需评估 | **替代方案**(社区 fork): - `amadad/mirofish`:**KuzuDB** 嵌入式图数据库,零外部依赖 - `MiroFish-Offline`:**Neo4j 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 最新版 ```bash # 完整流程 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 部署:快速体验与生产环境 ```bash 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 `MiroFishModel` 与 `miro_fish` 函数分析 #### 4.3.1 模块定位:`mirofish` 包的核心接口 **关键发现**:经过对官方仓库 `666ghj/MiroFish` 及其主要社区 fork 的全面检索,`MiroFishModel` 类和 `miro_fish` 函数**并非位于主仓库源码中**,而是属于独立的 **PyPI 包 `mirofish-simulator`**(版本 0.12.0)。 这一发现具有重要的架构理解意义: - `mirofish-simulator` 是 **OASIS 引擎的上层封装库**,将多智能体仿真能力产品化为可导入的 Python 包 - 主仓库 `MiroFish` 是 **完整的 Web 应用**,通过 `SimulationRunner` 服务以子进程方式调用 `mirofish-simulator` - 这种分层设计实现了**仿真引擎与产品界面的解耦**,便于独立演进和多种集成方式 **导入语句的证据**:`simulation_runner.py` 中的 `from mirofish import MiroFishModel, miro_fish` 表明这两个符号是外部依赖,而非项目内部实现。该导入在标准 Python 环境(未安装 `mirofish-simulator`)中会失败,解释了为何部分开发者报告导入错误。 #### 4.3.2 `MiroFishModel`:仿真状态与模型参数的封装实体 基于 PyPI 包信息和同类系统设计模式,`MiroFishModel` 的推测接口: ```python 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: ```python 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` 数据类:智能体行为的结构化表示 ```python @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 人机协同:专家知识注入与结果校验 **协同模式**: | 阶段 | 专家角色 | 系统支持 | |:---|:---|:---| | 准备 | 审核种子材料、调整本体论、校准人格参数 | 可视化编辑、版本对比、影响预览 | | 执行 | 监控仿真进展、注入关键事件、调整参数 | 实时仪表板、异常告警、快速干预 | | 分析 | 解读报告发现、验证关键结论、识别盲点 | 钻取探查、对比分析、证据追溯 | | 决策 | 综合仿真结果和业务判断,制定行动 | 情景对比、效果预测、风险评估 | **持续学习**:专家反馈(标注、修正、扩展)回流到系统,改进本体论、人格模板、报告生成模型。