架构¶
World Simulation Engine 是一个本地优先的模拟应用,由 React 前端、FastAPI 后端、Neo4j 图数据库,以及由 LangGraph 编排的模拟流水线组成。核心设计选择是:自然语言不是事实来源。LLM 组件负责提出结构化动作、状态变更、记忆和叙事,而代码负责路由、校验、图持久化、时间推进和审计记录。
本节把 README 中简短的架构摘要展开成几个主要视角:
| 页面 | 内容 |
|---|---|
| 模拟生命周期 | 一个用户回合如何从文本进入动作提案、图状态提交、记忆更新、叙事和呈现。 |
| 组件地图 | 主要运行时组件,以及每一层负责什么。 |
| 后端 | FastAPI 启动、路由、服务、供应商适配器和生成流。 |
| 前端 | React/Vite 页面结构,以及 UI 如何映射到后端资源。 |
| 持久化 | Neo4j store、媒体存储、已提交事实、快照、审计记录和派生认知状态。 |
| 后台模拟 | 前台用户回合如何与离场角色活动共存。 |
系统容器¶
flowchart LR
User["用户浏览器"] --> Frontend["React + Vite 前端"]
Frontend -->|"HTTP / streaming API"| Backend["FastAPI 后端"]
Backend --> Simulator["WorldSimulator<br/>LangGraph 编排"]
Backend --> DBService["DatabaseService<br/>类型化 store facade"]
Backend --> Storage["StorageService<br/>媒体与 prompt 文件"]
Simulator --> Components["LLM 模拟组件"]
Components --> LLM["LLM 供应商<br/>Ollama、OpenAI-compatible 等"]
Simulator --> Image["图像服务<br/>ComfyUI"]
Simulator --> Voice["语音服务<br/>AllTalk / whisper.cpp"]
DBService --> Neo4j["Neo4j 图数据库"]
Storage --> Files["内容寻址文件"]
classDef committed fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20
classDef proposed fill:#fff8e1,stroke:#f9a825,color:#5d4037
class DBService,Neo4j,Storage,Files committed
class Components,LLM,Image,Voice proposed
前端不会直接访问 Neo4j 或供应商 API。它调用后端,由后端为每次操作解析已配置的供应商、模型档案、prompt、workflow 和图状态。
边界¶
| 边界 | 归属 | 说明 |
|---|---|---|
| 浏览器状态与交互 | 前端 | 路由、编辑器、聊天视图、媒体控件、配置表单。 |
| API 契约 | FastAPI routers | 世界、模拟、实体、配置、媒体、prompt、回合和生成运行的资源端点。 |
| 模拟编排 | WorldSimulator |
构建并运行 LangGraph,管理运行锁、快照、离场队列和副作用触发器。 |
| LLM 行为 | 组件 prompt 和模型配置 | 组件产出结构化结果,通常会在使用前修复并校验。 |
| 已提交事实 | Neo4j stores | 物理状态、回合、记忆、关系、主观断言、情绪、配置、审计和快照。 |
| 二进制或 JSON 媒体 | StorageService 加媒体图节点 |
图像、语音文件、prompt media 和 workflow media 存储在 Neo4j 外部,并通过图记录关联。 |
核心原则¶
模拟器区分三类数据:
- 私有上下文:有角色作用域的视角、记忆、关系、主观断言和情绪,用来生成提案。
- 拟议状态:LLM 输出的结构化结果,可以被校验、协调、修复、拒绝或重做。
- 已提交事实:通过数据库服务写入的图变更和回合记录。
最重要的架构规则是:LLM 输出不会仅仅因为被生成就成为事实。只有在校验器、场景协调器、状态提交器和数据库提交路径接受之后,它才会成为事实。