oh-my-muse/design-docs/架构-02-核心数据结构与双轨模型.md
zizi 0d0e1d4473 添加产品设计文档
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-20 10:38:31 +08:00

178 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构-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`