新项目,从零开始。目标 T0 级叙事系统。 技术栈:TypeScript + PostgreSQL + DeepSeek。
- 不是旧 NarrativeOS 的改造
- 不是 AI 自动写书机
- 不是设定管理工具
- 一个"叙事操作系统"——作者提供构思,系统负责推演、代写、检测冲突
- 作者做审美裁判,系统干体力活
| 组件 | 选择 |
|---|---|
| 语言 | TypeScript(整个项目统一) |
| 图存储 | PostgreSQL(先用 JSONB + 关系表模拟图,不上 Neo4j) |
| LLM | DeepSeek |
| 交互 | CLI(终端内自然语言交互) |
| 向量 | pgvector(语义检索) |
用户输入(一句话构思 / 流派标签)
│
▼
┌──────────────────┐
│ 种子生成 Agent │ ← LLM 根据梗概 + 标签,生成初始六维图谱
│ (LLM-native) │ 无预设模板,不依赖流派基因库
└────────┬─────────┘
▼
┌──────────────────┐
│ 初始图谱 │ ← 15-30 个节点 + 关系(Reality + Information)
│ (六维快照) │
└────────┬─────────┘
▼
┌──────────────────────────────────────────────────────┐
│ 叙事可能性检测器 │
│ (Narrative Possibility Detector) │
│ │
│ Tier 1: 图拓扑扫描(常驻代码逻辑,零 LLM 成本) │
│ - 扫描实体冲突边(空间撞车、敌对关系) │
│ - 计算节点中心度,筛选高危能动者子图 │
│ │
│ Tier 2: 规则与伏笔密度审查(Drizzle Hook,低成本) │
│ - 计算子图内未回收伏笔密度 │
│ - 检查信息不对称(谁不知道什么) │
│ - 若未达阈值 → 保持巡航模式 │
│ │
│ Tier 3: LLM 流派审美终审(轻量模型,仅阈值触发) │
│ - 注入流派 Prompt,评估戏剧势能 │
│ - 若压力爆表 → 切入冲刺模式 │
└──────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ 双模态输出 │
│ │
│ 巡航模式(日常过渡段): │
│ - 用户输入一句构思,系统直接生成 2000 字正文 │
│ - 正文 → Parser Agent → 逆向萃取 → 沉淀/过滤 │
│ │
│ 冲刺模式(高压冲突段): │
│ - 系统弹出「叙事压力来源报告」 │
│ - 展示:冲突来源、涉事实体、未回收伏笔 │
│ - 用户选择走向,或手动输入自定义事件 │
└──────────────────────────────────────────────────────┘
所有引擎的输出统一落在一张图上,不再各自存表。
| 维度 | 说明 | 例子 |
|---|---|---|
| 时空 | 空间位置 + 时间线 | "贝克兰德"(城市)、"1349年"(时间) |
| 实体 | 存在的一切"东西",带属性 | 克莱恩(人物)、0-08(封印物) |
| 关系 | 实体之间的连接 | 克莱恩 ─属于→ 塔罗会 |
| 规则 | 控制变化的法则 | 序列7→序列6需要魔药+扮演+仪式 |
| 事件 | 已发生的事(一次规则执行) | 克莱恩晋升序列6 |
| 信息 | 谁知道什么 / 不知道什么 | 克莱恩不知道阿蒙来了 |
- 不加第七维。叙事价值是信号的强度,不是新的数据类型。
- 不加认知层(Belief Graph)。Phase 2 再考虑。
- 元定义每个项目自己声明:诡秘之主项目定义"序列"是实体类型,"晋升"是关系类型。系统不硬编码。
撒种(项目初始化)
│ 用户填:一句话梗概 + 流派标签
│ Agent 理解确认 → 生成初始图谱
▼
发芽(图谱生长 + 检测器介入)
│ 检测器扫描初始图谱,发现第一个叙事可能性
│ CLI 展示:世界名片 + 牌局上的角色 + 弦已绷紧的冲突
│ 用户选择走向 → 图谱更新
▼
写作(巡航 / 冲刺双模态循环)
│ 巡航模式 → 系统代写 → Parser 萃取 → 沉淀过滤
│ 冲刺模式 → 用户选走向 → 事件写入 → 图谱更新
│ 循环直到完本
每次图谱变更(新事件 / 新实体 / 关系更新)
│
▼
Tier 1: 图拓扑连通性扫描
- 纯代码逻辑,不调 LLM
- 找出冲突边密集的子图
- 筛掉 90% 无关节点
│
▼ 仅对高危子图继续
Tier 2: 规则与伏笔密度审查
- Drizzle Hook 级别,低成本
- 计算伏笔密度、信息不对称数量
- 低于阈值 → 保持巡航,不打断用户
│
▼ 仅阈值突破时
Tier 3: LLM 流派审美终审
- 调用轻量模型(如 DeepSeek Flash)
- 评估戏剧势能,包装为文本选项
- 压力爆表 → 切入冲刺模式
Step 1: LLM 自由生成正文
- 不打断创作流,不查图谱
- 写出 2000 字
Step 2: Parser Agent 逆向萃取
- 提取所有名词性实体
- 与图谱已有节点比对
- 标记未知实体为三类:
类型 A:一次性氛围修饰词 → 随正文走,不入图谱
类型 B:可能的重要实体 → 入临时缓冲区
类型 C:明显幻觉/设定冲突 → 拦截报错
Step 3: 沉淀过滤
- 类型 B 引用计数 ≥ 3 或用户显式提及 → 发起确权确认
- 用户确认 → 正式写入永久图谱
- 用户否决 → 留在临时缓冲区或丢弃
narrative-os-v2/
├── package.json
├── tsconfig.json
├── packages/
│ ├── detector/ # 叙事可能性检测器(心脏)
│ │ ├── src/
│ │ │ ├── topology-scanner.ts # Tier 1: 图算法
│ │ │ ├── tension-calculator.ts # Tier 2: 伏笔/规则密度
│ │ │ ├── llm-evaluator.ts # Tier 3: LLM 审美终审
│ │ │ ├── types.ts # 图谱类型定义
│ │ │ └── index.ts
│ │ └── test/
│ │ └── test-context.json # MVP 测试数据
│ │
│ ├── cli/ # CLI 交互层
│ │ ├── src/
│ │ │ ├── init.ts # 项目初始化(种子生成)
│ │ │ ├── cruise.ts # 巡航模式(代写正文)
│ │ │ ├── sprint.ts # 冲刺模式(候选断点)
│ │ │ ├── parser.ts # Parser Agent(逆向萃取)
│ │ │ ├── settings-sink.ts # 设定沉淀(确权确认)
│ │ │ └── index.ts
│ │ └── ...
│ │
│ ├── graph/ # 六维图谱存储层
│ │ ├── src/
│ │ │ ├── schema.ts # Drizzle 表定义
│ │ │ ├── queries.ts # 图谱查询
│ │ │ ├── mutations.ts # 图谱写入
│ │ │ └── index.ts
│ │ └── ...
│ │
│ ├── llm/ # LLM 客户端(封装 DeepSeek)
│ │ └── src/
│ │
│ └── shared/ # 共享类型定义
│ └── src/
│ ├── types.ts # 六维图谱类型
│ ├── events.ts # 事件类型
│ └── constants.ts # 常量
│
├── docker-compose.yml # PostgreSQL + pgvector
└── README.md
$ narrative-os init
> 请输入一句话梗概:一个穿越到诡秘世界成为占卜家的故事
> 选择流派标签:[诡秘/克苏鲁, 穿越, 智斗]
[系统正在生成你的世界...]
你的世界:灰雾之城
廷根市笼罩在永不停歇的灰雾中。
牌局上的人:
克莱恩 —— 占卜家,序列9,对未来隐隐不安
老尼尔 —— 值夜者前辈,知道一些不该知道的事
??? —— 一个注视着他的存在
弦已绷紧:
[1] 晋升材料短缺 —— 下一份魔药材料下落不明
[2] 值夜者的怀疑 —— 老尼尔开始注意到异常
[3] 灰雾的低语 —— 一个声音在重复一个名字
你想先处理哪个?(1-3):
---
日常写作时:
narrative-os> 写一章过渡,克莱恩坐火车去贝克兰德,路上复盘线索
[系统代写中... 2000 字已生成]
[检测到异常实体「红月草」,暂存缓冲区]
[图谱已更新:克莱恩位置 → 贝克兰德]
实现三个文件,不依赖任何现有代码:
伪造一个极简世界的六维图谱快照:
- 5 个实体节点(2 个敌对势力 + 1 个主角 + 1 个中立角色 + 1 件物品)
- 1 条冲突边(敌对关系)
- 1 条未回收伏笔
- 1 条信息不对称
TypeScript,不调 LLM:
- 遍历节点,找到冲突边密集的子图
- 标记高危子图
- 输出冲突来源列表
- 数据结构与后续 PostgreSQL 表结构保持 1:1 映射
演示 CLI 输出:
- 显示"弦已绷紧"格式的冲突报告
- 模拟用户选择后,打印"已推进"信息
验证标准: 跑 npx tsx src/cli-demo.ts 后,终端能打印出类似「弦已绷紧」的三条冲突信息。这个验证通过,说明检测器逻辑成立。
| 阶段 | 内容 | 时间 |
|---|---|---|
| Phase 1 | 检测器 MVP(test-context.json + topology-scanner + cli-demo) | 1-2 周 |
| Phase 2 | CLI 框架 + 种子生成 Agent + 项目初始化流程 | 2-3 周 |
| Phase 3 | 巡航模式(代写正文 + Parser 净化管道) | 3-4 周 |
| Phase 4 | 冲刺模式(候选断点 + 压力报告 + 图谱更新) | 3-4 周 |
| Phase 5 | 全流程串联测试 + 一个完整短篇验证 | 2-3 周 |
总计:约 3-4 个月完成可用的第一版。