Webnovel Writer 章节事实提取实现:accepted_events、state_deltas 与 entity_deltas 数据流
【免费下载链接】webnovel-writer基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200 万字量级 连载创作。项目地址: https://gitcode.com/GitHub_Trending/we/webnovel-writer
Webnovel Writer 是一个基于 Claude Code 的长篇网文辅助创作系统,专门解决 AI 写作中的「遗忘」和「幻觉」问题。它的核心机制之一就是章节事实提取:每写完一章,系统通过accepted_events、state_deltas与entity_deltas三条数据流,把本章发生的新事实结构化地沉淀进状态系统,支撑 200 万字量级的连载创作。
这篇文章面向新手,带你完整看懂这三份数据的字段含义、生成流程和下游去向——不贴大段代码,只用一张数据流图 + 几个最小 JSON 示例。
为什么章节事实提取是长篇网文的命门?
长篇连载最怕的不是文笔,而是写到第 80 章、200 章后 AI「失忆」:
- 角色战力悄悄漂移,前后战力体系打架
- 伏笔埋了不收、收了忘了埋
- 新出场人物没有登记,后续章节张冠李戴
Webnovel Writer 的思路是:每一章的事实必须「入账」,而不是只存在于正文里。入账的入口就是事实提取产物extraction_result.json,它由三个核心数组组成:
| 数据流 | 一句话理解 | 回答的问题 |
|---|---|---|
accepted_events | 事件流水账 | 这一章发生了什么? |
state_deltas | 状态变化单 | 谁的哪个属性从什么变成了什么? |
entity_deltas | 实体登记卡 | 谁新出场/变更了? |
三者分工清晰:事件是「流水」,状态是「余额」,实体是「账本上的账户」。
accepted_events:本章事实的「事件流水」
accepted_events是提取结果里信息密度最高的部分。每条事件必须包含 5 个字段:
event_id:章内稳定 ID,如evt-ch100-001(缺失时系统会按内容哈希自动生成,见 chapter_commit_schema.py)chapter:当前章号event_type:事件类型(枚举见下)subject:主体实体的entity_id(注意:是 ID,不是中文名)payload:该类型事件的必备字段
event_type 共 10 种枚举(定义在>{"event_id": "evt-ch100-001", "chapter": 100, "event_type": "open_loop_created", "subject": "three_year_promise", "payload": {"content": "三年之约提及"}}
新手最容易踩的坑在这里:
- 别名自动归一:写
promise、breakthrough、mystery_introduced这类口语化类型,系统会通过 EVENT_TYPE_ALIASES 自动映射成规范枚举,不用死记硬背。 - subject 必须是 entity_id:投影器按 ID 记账,写「萧炎」而不是
xiaoyan会导致事实记不到正确实体上。 - 摘要里的伏笔必须同步入账:每条埋设的伏笔都要对应一条
open_loop_created事件,否则伏笔管理形同虚设。
state_deltas:角色状态的「前后变化单」
state_deltas记录属性级的变化,每条子项固定 4 个字段:entity_id+field+old+new。
{"entity_id": "xiaoyan", "field": "realm", "old": "斗者", "new": "斗师"}两个新手友好细节(来自>{"entity_id": "hongyi_girl", "action": "upsert", "entity_type": "角色", "payload": {"name": "红衣女子"}}
entity_type枚举:角色 | 组织 | 地点 | 物品 | 势力(默认按「角色」处理)payload里可带is_protagonist: true标记主角,系统会同步主角状态
配合entities_appeared(本章出现的实体 + 置信度),消歧规则很明确:置信度 > 0.8 自动采用,0.5–0.8 采用并告警,< 0.5 标记待人工——保证低置信猜测不会污染账本。
数据流全链路:从正文到五路投影
理解单个字段后,来看它们如何流动。整条链路分三步:
第 1 步 · 提取。由>CHAPTER_COMMIT(.story-system/commits/,唯一事实源头) ├── state → .webnovel/state.json(角色状态、进度、伏笔) ├── index → index.db(实体、关系、别名检索) ├── summary → summaries/(章节摘要) ├── memory → memory_scratchpad.json(长期记忆) └── vector → vectors.db(向量检索)
值得新手注意的是事件路由表(EventProjectionRouter):不同事件类型流向不同投影,而不是无脑全量广播——
open_loop_created/open_loop_closed→ state + memory(伏笔既要看当前状态,也要进长期记忆)relationship_changed/artifact_obtained→ index + vector(重点是实体关系可检索)world_rule_revealed→ memory + vector(世界观规则沉淀为知识)
也就是说:accepted_events是「路由信号源」,state_deltas走 state 投影,entity_deltas触发 index 投影——三份数据在投影阶段各司其职。所有投影执行结果会追加到.webnovel/projection_log.jsonl,哪一路没同步一眼可查。
新手自检:3 个快速验证方法
- 看提交文件:
.story-system/commits/chapter_xxx.commit.json里meta.status是accepted,且projection_status各路由不是pending/failed - 跑体检:
/webnovel-doctor会直接摆出主链与运行状态;某路投影失败可用projections retry补跑,data-agent 不负责修投影 - 看面板:
/webnovel-dashboard只读展示 state、实体图谱与追读力数据,如果新写章节的角色状态没更新,基本可定位到 state 投影
常见误区清单 📌
- ❌ 把
accepted_events等字段包在extraction外层对象里 → schema 直接校验失败 - ❌
subject写角色中文名 → 事实记错实体 - ❌ 伏笔只写进摘要不写事件 → 伏笔台账缺失,后续无法回收
- ❌ 让 contenteditable="false">【免费下载链接】webnovel-writer基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200 万字量级 连载创作。
项目地址: https://gitcode.com/GitHub_Trending/we/webnovel-writer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考