Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
12 KiB
架构-02:核心数据结构与双轨模型
- 版本:v5
- 更新日期:2026-05-10
- 目标读者:架构/后端/前端/产品
- 阅读时间:30-45 分钟
- 边界说明:这里只定义模型层概念、不变式和归属边界;本文件描述目标模型,不代表当前代码都已实现。精确表结构以
后端-04-统一数据库Schema-v1.md为准,精确接口(API)以后端-05-统一API契约-v1.md为准,精确状态机以架构-04-状态机与约束清单.md为准。
1. 双轨模型:规范数据(Canonical) / 待审层(Shadow) / 归档层(Archive)
1.1 定义
- 规范数据(Canonical):用户认可的真实数据。正文、已确认作品知识、已确认规划项和叙事状态都必须能追溯来源。
- 待审层(Shadow):系统或人工智能(AI)产出的候选、知识草稿、解析结果和风险标记。它是临时层,默认不可信。
- 归档层(Archive):已接受、已拒绝、已过期、被替代或失败的历史对象。它用于审计和回看,不再作为当前待审对象。
一句话:AI 只能写待审层(Shadow);只有用户确认、用户保存正文或章节级确认,才能让内容进入规范数据(Canonical)。
1.2 必须保留的硬边界
- 所有 AI 生成、提取、规划、检查结果都先进待审层(Shadow)。
- 待审对象不能进入正式检索、正式图查询或下一次生成事实。
- 修改后合并必须让旧知识草稿失效,并基于最终正文重新提取。
- 全书解析(Full Parse)的批量确认边界固定为
parse_job_id + chapter_id,同章节内 all-or-nothing,不做跨章节一次性写入。 - 待审层(Shadow)活跃区只保存待审对象;终态对象进入归档层(Archive)或审计记录。
2. 模型层分区
产品入口增加后,模型层不能按 UI 面板膨胀。Muse 的核心模型分为五类:
| 模型分区 | 归属 | 负责什么 | 不负责什么 |
|---|---|---|---|
| 系统级模板与配置 | 管理员(Admin) / Admin BC | 元结构定义(MetaSchema)、字段定义、Prompt 版本、Agent 配置、上下文策略、全局知识库访问策略、评测集和 New-API 同步配置 | 不保存某个普通用户作品的正文或创作取舍 |
| 用户级作品数据 | 普通用户(User) / Content BC | 作品(Work)、章节(Chapter)、文本块(Block)、导入状态、正文版本、作品级绑定 | 不保存系统级 Prompt、Agent 和全局授权规则 |
| 作品级知识数据 | 单个作品 / Knowledge BC | 世界状态(World State)、叙事状态(Narrative State)、实体、关系、事件、属性变化、来源追溯 | 不跨作品共享正式事实,不直接替代全局知识库 |
| 全局知识库与访问策略 | 管理员(Admin) / Admin BC + Knowledge BC | 全局知识库(Global Knowledge Base)、资料集版本、启停、用户或用户组授权、可见/可检索/可生成策略 | 不自动写入任何作品的局域知识库 |
| 局域知识库与用户可见投影 | 单个作品 / Knowledge BC | 局域知识库(Local Knowledge Base)的内部完整知识、用户可见投影(User-visible Projection)、投影水位和来源解释 | 不把系统内部全部事实默认展示给普通用户 |
2.1 用户级作品数据
作品(Work)、章节(Chapter)、文本块(Block)是普通用户创作的内容骨架:
- 作品(Work):单个作品的根对象,绑定作品级模板、导入状态、解析状态和授权上下文边界。
- 章节(Chapter):作品内的顺序结构,承载章节摘要、章节目标和文本块集合。
- 文本块(Block):正文的最小编辑、保存、候选合并和冲突处理单元。
不变式:
- 文本块(Block)级修订号(revision)是强制并发保护。
- 用户保存正文后,正文就是规范数据(Canonical),后续提取失败不得回滚正文。
- 导入正文可以初始化 Canonical 正文;导入后的解析结果仍必须进入 Shadow 等待章节级确认。
2.2 作品级知识数据
作品级知识数据不是一个泛泛的“知识库表单”,而是当前作品的正式事实和叙事运行态:
- 世界状态(World State):人物、地点、物品、组织、规则、事件、时间线、因果链和实体关系。
- 叙事状态(Narrative State):作品、章节或实体维度上的弧线进度、章节意图、角色目标、悬念、张力、节奏和叙事策略。
- 来源追溯:正式知识必须能追溯到文本块(Block)、章节确认、规划项或用户手动操作。
世界状态(World State)和叙事状态(Narrative State)可以被用户通过作品规划台和知识与一致性工作区理解和修正,但底层状态载体仍以 后端-04 和 架构-04 为准。
2.3 全局知识库与局域知识库
全局知识库(Global Knowledge Base)和局域知识库(Local Knowledge Base)的边界如下:
| 类型 | 写入归属 | 进入生成上下文的条件 | 普通用户看到什么 |
|---|---|---|---|
| 全局知识库(Global Knowledge Base) | 管理员维护和授权 | 管理员授权为可用于生成,且当前用户/用户组/作品满足访问策略 | 被授权全局资料的摘要、来源和可用范围 |
| 局域知识库(Local Knowledge Base) | 当前作品自动维护,来自正文、导入解析、规划和用户确认 | 内容已经进入规范数据(Canonical),且元数据允许进入 AI 上下文 | 作品知识、角色设定、世界设定、来源追溯和允许展示的摘要 |
| 用户可见投影(User-visible Projection) | Knowledge BC 从局域知识生成 | 仅作为读模型,不反向成为事实源 | 元数据允许展示、编辑、检索、导出的实体、关系、字段和摘要 |
全局知识库不会因为参与生成就成为作品事实。局域知识库也不会因为用户能看见某些字段,就把系统内部完整知识全部暴露出来。
3. 元结构定义(MetaSchema)边界
3.1 MetaSchema 的角色
元结构定义(MetaSchema)是模板、字段、校验规则、表单渲染和上下文注入的模型边界。普通用户界面里的“创作规则 / 作品模板 / 字段模板”,在底层都映射到 MetaSchema 或其字段定义。
MetaSchema 负责:
- 定义字段类型、必填、枚举、引用和校验规则。
- 定义字段所属领域、作用范围和目标类型。
- 决定哪些字段能进入 UI、AI 上下文、检索、导出或用户编辑。
- 给作品规划、提取、校验和投影提供结构约束。
MetaSchema 不负责:
- 保存 Narrative State 的运行态值。
- 替代作品正文、实体关系、事件时间线或用户确认记录。
- 直接表达每个 UI 面板。
3.2 领域、范围和目标类型
模型层继续使用三维分类:
- 领域(domain):内容(content)、世界(world)、叙事(narrative)。
- 范围(scope):作品(work)、章节(chapter)、实体(entity)、关系(relation)、事件(event)。
- 目标类型(targetType):具体实体、事件、章节或模板类型。
叙事领域(narrative)的字段可以定义“角色弧光、章节意图、悬念、张力、节奏、叙事视角”等结构,但运行态值必须落到叙事状态(Narrative State)等真实载体中,不能只靠 MetaSchema 自身承载。
3.3 元数据可见性字段边界
元数据对象需要表达普通用户可见性和系统使用边界。模型层至少保留这些语义:
| 控制项 | 含义 |
|---|---|
uiVisible |
是否在普通用户界面展示 |
aiContext |
是否允许进入 AI 上下文 |
userEditable |
普通用户是否可以编辑 |
userSearchable |
普通用户是否可以检索 |
exportable |
是否允许随作品导出 |
这些控制项的精确字段名、表结构和接口参数不在本文件定义。这里的模型约束是:
uiVisible=false不等于不能参与 AI 生成;是否进入上下文由aiContext决定。aiContext=true不等于普通用户可见;是否展示由uiVisible决定。userEditable=true不等于越过待审层(Shadow);用户编辑正式知识仍需记录来源和变更。exportable=true只能在用户拥有导出权限且对象属于可导出范围时生效。
4. 作品规划台到模型边界的映射
作品规划台(Planning Desk)是产品入口,不是新的一级模型集合。规划项需要映射到已有的世界状态(World State)、叙事状态(Narrative State)、元结构定义(MetaSchema)、作品(Work)、章节(Chapter)或文本块(Block)边界。
| 规划维度 | 用户语言 | 模型落点 | 说明 |
|---|---|---|---|
| 作品方向 | 题材、类型、主题、读者承诺、基调、禁区、结局方向 | Work + MetaSchema + Narrative State(work) | 作为作品级方向和后续生成约束 |
| 作品结构 | 章节顺序、章节摘要、当前字数、完成状态、近期目标 | Work + Chapter + Narrative State(work/chapter) | 章节骨架归 Content,推进状态归 Narrative State |
| 世界实体 | 角色、地点、物品、组织、规则、关系 | World State + MetaSchema(world/entity/relation) | 正式事实进入局域知识库 |
| 事件时间线 | 重大事件、发生章节、参与角色、因果效果、长期影响 | World State(event/relation) + Narrative State(chapter/entity) | 连接世界事实和剧情推进 |
| 角色弧光 | 目标、动机、弱点、秘密、变化阶段、关系变化 | Narrative State(entity) + World State(entity/relation) | 角色档案事实和弧线进度分层保存 |
| 剧情结构 | 卷、幕、章节、主线、支线、伏笔与回收 | Narrative State(work/chapter) + MetaSchema(narrative) | 约束长期推进,不单独建剧情表单模型 |
| 章节叙事规划 | 章节目标、情节节拍、冲突、结果、下一步钩子 | Chapter + Narrative State(chapter) + Block 上下文 | 近程控制面,承接产品语言里的“情节节拍 / 场景推进” |
| 张力节奏 | 利害关系、阻力、反转、悬念问题、信息释放、高潮密度 | Narrative State(work/chapter) + 风险标记 | 作为检查和生成约束,不做重表单 |
| 叙事策略 | 叙事视角、时态、叙事距离、多视角切换、信息遮蔽 | MetaSchema(narrative) + Narrative State(chapter/work) | 约束章节生成和风格一致性 |
| 文风与质量检查 | 作者声音、句式、节奏、描写密度、风格漂移、一致性风险 | MetaSchema(content/narrative) + 风险标记 + Usage/Audit 评估结果 | 检查结果提示和定位,不自动写正式事实 |
4.1 小说场景(Scene)边界
当前阶段不把小说场景(Scene)升成独立一级模型,也不采用 Outline / Scene 作为两个并列一级模型。产品可以使用“情节节拍 / 场景推进”这类作者语言,但模型归入章节叙事规划,并通过 Chapter、Block 上下文和 Narrative State(chapter)承载。
如果未来需要让 Scene 成为独立模型,必须先补 架构决策记录(ADR),并同步检查表结构、接口、前端状态和章节级确认边界;不能在产品或前端文档里先行假定已经存在。
5. 数据流转规则(模型视角)
5.1 Shadow -> Canonical
待审层(Shadow)进入规范数据(Canonical)的最小条件:
- 待审对象存在、未过期、未被替代。
- 正文合并必须通过文本块(Block)修订号保护。
- 知识草稿必须通过来源快照(Source Snapshot)校验。
- 需要用户确认的对象必须有明确用户决策。
- 成功后待审对象必须迁出活跃区,进入归档层(Archive)或审计历史。
5.2 外部内容 -> Canonical 与 Shadow
- 导入正文是用户动作,可以初始化 Canonical 正文。
- 导入后的全书解析结果仍是待确认知识草稿,必须先进 Shadow。
- 章节确认成功后,该章节范围内可确认对象一次性进入 Canonical;失败时不得部分写入。
5.3 冲突与一致性
- 内容冲突:文本块(Block)修订号不匹配,交给前端冲突处理和重试。
- 知识冲突:新提取事实和已确认事实不一致,只能生成待确认知识或风险标记,由用户取舍。
- 投影不一致:外部检索或图查询投影未追平时,不得把投影结果当事实源;需要通过 PostgreSQL 事实源和覆盖层补齐。
6. 关联阅读
- 系统边界与 BC:
架构-01-系统全貌与边界上下文.md - ADR:
架构-03-关键决策与原则(ADR).md - 生命周期与状态机:
架构-04-状态机与约束清单.md - 系统处理流程:
流程-02-系统处理流程(系统视角).md - 统一数据库表结构:
后端-04-统一数据库Schema-v1.md - 统一 API 契约:
后端-05-统一API契约-v1.md