目前项目只完成了30%左右,欢迎大家一起来pr,另外我建了一个QQ群:1103861504,可以一起来讨论AI写小说问题。俺基本上一天16个小时都在线,有问必回。(QAQ,加个群来讨论吧,作者单机好久了🤣)。

上次那个总结还是太浅,而且结构做的很差,这次重新总结一下。从理论总结使用和设计思路代码框架,三个方面进行总结。

AI辅助网文创作系统——理论总结

本文档整合了项目从理论奠基到架构演进的完整思想体系,作为所有设计文档的理论根基。 阅读本文档可替代逐篇阅读笔记1-17中的理论内容。

一、核心设计哲学

1.1 第一性原理:”故事”与”叙事”分离

本系统的理论根基建立在叙事学的一个核心区分之上:

概念 定义 示例
故事(Fabula) 客观发生的事件序列 “A 打败了 B”
叙事(Discourse) 事件的呈现方式 “从 A 视角的热血复仇 vs 从 B 视角的悲情退场”

传统 AI 写作的根本问题是:用户输入模糊创意,指望 AI 一步到位写出正文。这相当于跳过蓝图设计,直接指挥工人砌砖——没有图纸,工人(AI)只能盲目堆砌材料。

如果不分离”故事”和”叙事”,AI 会在同一轮思考中既想结构又琢磨文笔,结果两头都做不好。“故事”管”讲什么”,”叙事”管”怎么讲”。同一个故事,换一种叙事策略,可以产生完全不同的阅读体验。

1.2 分层创作:从粗到细逐步推进

传统做法是用户给 AI 一段模糊创意,指望一次生成完整正文。这就像没有图纸直接盖楼——工人只能盲目堆砌材料。

本系统将创作过程分解为多个层级,每层有明确的输入输出,自顶向下、逐步细化:

  • 不跳层:不指望从模糊创意一步跳到正文
  • 可介入:每层结束时用户都可以审核修改
  • 可回溯:下游发现问题可打回上游重新处理

1.3 人机协同定位:系统是”副驾驶”

本系统不是全自动生成工具。AI 的定位是辅助而非替代

  • AI 提方案,人做决定
  • 每一层都有人的决策权
  • 全自动模式下已有 AI 监督代理人类决策,但半自动模式下阻塞是真实的——必须等用户操作

二、四层 + 卷纲层模型

2.1 模型总览

L1   种子层       故事愿景       "我要写一个什么样的故事"
L1.5 情节编排层   卷纲           "分成几卷,每卷走向如何"
L2   架构层       章纲           "每章的精确功能序列"
L3   叙事层       带标签草稿      "草稿嵌入叙事指令"
L4   渲染层       精修正文       "扩展打磨成终稿"

2.2 L1 种子层

项目 说明
角色 创作顾问
输入 用户模糊创意
输出 《故事愿景文档》
实现方式 引导式表单/对话式采集

产出内容

  • 核心梗/脑洞:一句话概括故事核心冲突
  • 阅读契约:目标读者群体、核心爽点类型、风格基调(轻松/暗黑/热血/搞笑)
  • 粗略大纲:故事的起承转合,几百字的叙事散文
  • 核心设定:世界观、主角人设(性格+动机+成长方向)、金手指机制
  • 热点/潮流元素(可选):时下热点的融合方式,评估时效性
  • 类型标签与目标平台:明确类型定位(#玄幻 #系统文 #种田文),不同平台策略不同

L1 不依赖 AI 逻辑——这一层的本质是结构化采集器,将用户脑中的模糊创意梳理成系统可读取的格式。AI 在此的角色是”聊出来”,而非”想出来”。

2.3 L1.5 情节编排层

L1 给出的粗略大纲通常是几百字的叙事散文(”主角加入宗门后慢慢变强,最后在大比夺冠”),而 L2 需要结构化的功能序列。从散文到序列的跳跃太大。软件开发不会从需求文档直接跳到函数设计——中间必定有系统设计层处理模块划分。L1.5 就是创作中的系统设计层。

项目 说明
角色 资深作者 + 读者代表(两专家会议)
输入 L1 愿景文档 + 世界书核心层
输出 卷纲 .md(每章 1-3 句方向性描述)
粒度 卷级方向决策,非功能序列

输出格式:以卷为单位,每卷包含:篇幅范围、时间跨度、主线走向、支线安排、本卷高潮、章节概要(每章核心事件+人物出场+情绪基调+衔接说明)、卷末衔接(已回收伏笔、遗留伏笔、下一卷启动条件)。

两专家分工

专家 职责 核心关注
资深作者 创作方向把控 提出分卷方案、判断热点方向、毒点预警。例如”30章后必须开新地图,不然读者疲劳”
读者代表 体验审核 模拟读者情绪、检测疲劳点、质疑合理性。只负责提”哪里可能有问题”,不提出解决方案

L1.5 和 L2 的分工:L1.5 决定”第 31-35 章写秘境探索”,L2 决定”具体功能链怎么排来实现这个探索”。L1.5 讨论方向对不对,L2 执行落地拆解。

2.4 L2 架构层

项目 说明
角色 三专家会议(剧情架构师 + 网络编辑 + 人物设计师)
输入 L1 愿景 + L1.5 卷纲 + 世界书 + RAG
输出 《精修故事大纲》,含多维功能标注
粒度 功能→序列→情节三个层次

叙事学结构概念

  • 功能(Function):故事中最小的叙事单位。如”铺垫”、”阻碍”、”转折”、”获得”。
  • 序列(Sequence):由功能组成的完整叙事句子,具有时间和逻辑关系。分为链状(顺序执行)、嵌入(大序列套小序列)、并列(多条并行)。
  • 情节(Plot):序列按继承原则(时间/因果/空间连接)或理念原则(否定/实现/中心句连接)组合而成的完整故事。

三层粒度

层次 对应 时长 功能
微观序列(爽点/节拍) 单次”装逼打脸”、单次”系统抽奖” 几分钟到十几分钟 提供即时情绪价值
中观序列(剧情单元/副本) “拍卖会篇”、”宗门大比篇” 几十章甚至上百章 完成中期目标,推动阶段性变化
宏观情节 整本书 全书 核心冲突与结局

2.5 L3 叙事层

项目 说明
角色 映射编译器/翻译器
输入 L2 精修大纲(含多维功能标注)
输出 带标签草稿(500-1000字章节草稿,嵌入叙事指令标签)

L3 是整个系统理论的核心创新——效果到技术的确定性映射

理论背景:网文理论和叙事学是两套不同的语言体系:

  • 网文理论属于”效果学”——”欲扬先抑”、”装逼打脸”描述的是读者心理反应,语言是模糊的、经验主义的。
  • 叙事学属于”结构学”——”外聚焦视角”、”慢速扩述”、”自由间接引语”描述的是文本组织方式,语言是精确的、结构主义的。

L3 的使命是把效果学指令编译为结构学指令。这不是让 AI 临场推理哪个视角适合打脸——每次推理结果不同,质量不稳定。而是建立一套确定性的映射规则库

带标签草稿的形态:L3 输出不是纯 JSON 指令表,而是在粗略正文草稿中嵌入叙事标签(如 <视角 type="外聚焦"><节奏 type="慢速扩述"><情绪 type="压抑积累" 强度="↑"> 等)。这些标签在传给 L4 之前经过正则预处理,将简写属性展开为完整提示词约束。

为什么比纯指令好:旧 L3 输出 JSON(”场景1:视角=外聚焦,字数=300”),AI 拿到表格需要自己想象场景。带标签草稿给出了上下文——AI 看到的是一段已经用外聚焦角度写好的草稿,知道”写到这个地方的时候换视角”。

2.6 L4 渲染层

项目 说明
角色 执行者
输入 L3 带标签草稿(经过预处理展开的标签)
输出 精修正文
核心约束 不是自由创作,而是带约束的文本扩展

L4 严格遵守标签中的约束:视角(只写所见不写所想)、节奏(字数控制)、话语模式(句式结构)。标签在 L3→L4 过渡时已转换为完整提示词约束,L4 不需要再次理解标签含义,只需执行。

多技能体系:L4 支持 7 种可切换的技能——初稿扩展、文风调校、删改压缩、描写增强、对话打磨、保守修复、终稿润色。用户可根据实际效果切换技能而非反复修改同一 prompt。

2.7 层间关系:迭代闭环

四层不是不可回退的单行道:

  • L3 发现映射困难可打回 L2 重审
  • L2 发现方向问题可打回 L1.5 重新编排
  • L1.5 可基于 L2 反馈调整卷纲
  • L4 发现标签约束不合理可回传 L3 调整

每一层都有人的决策权——AI 提方案,人做决定。


三、专家会议体系

3.1 为什么需要异质化专家而非单一 Agent

网文创作本质上包含三类互不隶属的能力:

能力 对应的专家 核心思维模式
结构逻辑 剧情架构师 理性推演:因果闭环、序列完整性
市场嗅觉 网络编辑 商业直觉:爽点密度、读者心理
角色共情 人物设计师 代入感:人设一致性、行为动机

在一个 prompt 里同时要求这三种能力时,它们会互相干扰

  • 追求逻辑时压制爽感(”这样更合理但不好看”)
  • 追求爽感时人物崩坏(”为了打脸强行降智配角”)

三位异质化专家各挂专属知识库,各自从专业角度发言,用户担任主编拥有最终决策权——这与真实出版业的选题会模式一致。

3.2 三位核心专家

剧情架构师——故事的”骨架”:

  • 将脑洞拆解为功能与序列,指明每个功能的剧情作用
  • 构建因果闭环,修补逻辑漏洞
  • 确保序列间的因果链完整:铺垫→阻碍→转折→回收

网络编辑——故事的”市场”:

  • 审核商业卖点:识别情节是否符合类型文的”阅读契约”
  • 把控节奏与爽点:设计期待感曲线,控制”压抑-释放”的商业节奏
  • 反馈读者心理:模拟真实读者反应,指出”劝退”或”无趣”的段落
  • 毒点规避:主角圣母、配角降智、节奏拖沓等常见雷区

人物设计师——故事的”血肉”:

  • 分配行动元(主体/客体/发送者/接收者/帮助者/敌对者)
  • 根据人物性格推导行为,防止 OOC(Out Of Character)
  • 区分扁形人物(特性稳定、功能性强)与圆型人物(特性复杂、承载主题)
  • 设计人物互动的张力模式

3.3 三种驱动模式

不同类型的网文有不同的约束优先级。驱动模式决定了专家发言顺序和各自权重

模式 发言顺序 适用场景 原理
人物驱动流 人物设计师 → 剧情架构师 → 网络编辑 文青文、种田文、成长向 角色性格是硬约束,情节围绕人物展开
剧情驱动流 剧情架构师 → 人物设计师 → 网络编辑 无限流、系统文、副本向 剧情是模具,人物填充其中
市场驱动流 网络编辑 → 剧情架构师 ↔ 人物设计师 跟风热点、商业定制 爽点是硬约束,剧情和人物都为其服务

市场驱动流与其他两种不同——编辑与架构师/人物设计师之间是互相迭代的关系,而非单向传递。这是因为商业定制场景下,”什么好看”和”怎么实现”需要更紧密的来回磋商。

3.4 协作模式

模式 行为
semi_auto(半自动) 每位专家发言后暂停,用户审核决策才能继续
full_auto(全自动) 专家自动发言,用户纯旁听;用户随时可插话,插话后自动切回半自动
manual(手动) 用户指定哪一位专家发言,类似点名提问

3.5 L1.5 的两专家

L1.5 的会议结构与 L2 类似但侧重不同——这里不需要逻辑推演和 OOC 检测,需要的是方向决策

专家 职责 约束
资深作者 热点判断、爽点方向、毒点预警、结构经验 主导,提出方向方案
读者代表 读者预期管理、疲劳度检测、代入感评估 只提”哪里可能有问题”,严禁提出”应该怎么写”——这是作者和架构师的事

读者代表必须以读者口吻发言(”我看到第XX章的时候会觉得……”),不负责解决方案。

3.6 架构演进:从独立层级到统一编排层

L1.5 和 L2 最初被设计为两个独立层级(各自有独立的 API 和专家实现)。但后期发现两者的本质相同——都是”取专家队列 → 按序发言 → 流式输出 → 格式化产出”,区别仅在专家组合和默认粒度。因此合并为统一的编排层

  • 不再区分 L1.5 和 L2 作为独立层的概念
  • 专家池统一:资深作者、读者代表、剧情架构师、人物设计师、网络编辑、章节拆分师、讨论总结师
  • 用户可在画布上自由拖拽组合专家,通过连线定义发言顺序
  • 预置三个模板覆盖所有历史使用场景:快速审核(网编)、卷纲规划(作者+读者)、章纲设计(架构+编辑+人物)
  • 旧的 L1.5/L2 API 保留为向后兼容,底层委托给统一引擎

四、数据支撑:长文本记忆问题

AI 创作长篇小说的核心挑战之一是记忆——前文写过什么、人物现在是什么状态、哪些伏笔还没回收。这个问题的解决方案不能是”全塞进上下文窗口”(成本 + 注意力衰减)。

系统用两套互补机制解决这个问题:

世界书 (World Book)           RAG-历史回顾
确定性状态管理                 语义检索过往记忆
"主角现在是金丹期"             "老周第45章说过..."
保证不犯错                    保证不遗忘

世界书维护的是当前已知事实——不需要”猜”,直接查就有。RAG-历史回顾检索的是前文片段的原文——当 AI 需要回想某个角色过去的具体言行时,从向量库中提取相关段落。

注意区分:L2/L3/L4 所需的写作技法知识(爽点公式、映射规则、参考范例)是另一个层面的问题——那是写作知识库,解决的是”怎么写更好”,属于第六章讨论的映射规则库和技法库。本章只讨论”故事记忆”。

4.1 世界书(World Book)

灵感来自 SillyTavern 的触发词上下文注入系统,但扩展为完整的跨层持久化状态层

四层结构

内容 特性
核心层 世界观规则、力量体系、核心设定、阅读契约 永久条目,不随剧情变化
活跃层 人物状态、活跃伏笔、当前道具、势力状态 随剧情实时更新,权重机制
归档层 已完成序列摘要、已回收伏笔、退场人物、版本历史 压缩为一句话概括
索引层 条目-章节映射、关系图、触发词索引 元数据,用于检索

关键机制

  1. 版本链非覆写:主角修为不写”现在是元婴期”,而是 [1-30:筑基]→[31-80:金丹]→[81-今:元婴]。保留完整版本历史比只写当前状态多不了多少 token,但对 AI 理解角色成长弧光至关重要。
  2. 重要性衰减:每个条目标记权重分数——被创作引用 +1,连续 10 章未引用 -1,归零归档。防止世界书无限制膨胀。
  3. 自动压缩:已完成序列从详细描述压缩为摘要。归档层存储”一句话概括+关键数据”。
  4. 增量注入策略:世界书条目不全部注入上下文。L2 专家会议注入核心层+相关活跃层+上一序列摘要;L4 渲染层只注入当前场景相关条目。

世界书管理员 Agent:作为元层后处理,不参与创作讨论。每序列完成后: 读取产出 → 提取变化 → 更新条目 → 冲突检测 → 产出变更摘要。角色类似档案管理员,而非第四位专家。唯一的主动行为是冲突检测——发现新产出与旧设定矛盾时提醒主编。

4.2 RAG-历史回顾

当小说超过百万字时,把前文全塞进上下文不可行:

  1. 成本不可接受:即使 1M 上下文窗口,每轮创作把 200 章全文塞进去,token 费用极高
  2. 注意力衰减:lost-in-middle 问题意味着模型对 prompt 中段的注意力显著低于首尾,全量塞入反而降低质量
  3. 噪音干扰:写第 300 章战斗场景时,第 5 章的日常描写只会分散注意力

RAG-历史回顾的核心价值:精准提取与当前创作相关的前文片段,让模型在有限的注意力预算内获得最相关的历史信息。

数据来源是当前作品的已生成内容,随创作过程持续增长。每完成一个序列即增量索引——先是秒级的关键词索引(保证即时可用),后台异步构建向量索引(~25分钟完成精确索引)。

4.3 多维度检索方案

单纯向量检索存在三个核心问题,本系统针对性设计了改进:

问题一:叙事完整性破坏——机械切片破坏序列逻辑,”打脸”序列被切成碎片。

解决方案多维度语义切片。同一文本按四种维度切分:

维度 切片单位 边界 适用场景
plot(剧情) 序列/事件 序列开始/结束 剧情架构师查询完整情节
character(人物) 角色相关段落 人物出场/退场 人物设计师查询角色行为
emotion(情绪) 情绪段落 情绪转折点 网络编辑评估爽点节奏
function(功能) 叙事功能 功能边界 分析剧情结构

不同专家检索不同维度,而不是所有人都查同一套切片。

问题二:检索噪音——向量相似度不等于语义相关,中文专有名词检索效果尤其差。

解决方案文档增强 + 混合得分

  • 每个序列生成 5 视角改写:情节概述、爽点分析、人物关系、情感弧线、读者问题。增加检索命中入口。
  • 混合得分:vector_score × 0.6 + keyword_score × 0.4

问题三:检索结果碎片化——无法直接支撑决策。

解决方案双库分离

  • 向量库存摘要+标签(快速检索定位)
  • MD 文本库存完整切片(提供完整上下文)

检索流程:查询 → 向量库定位标签 → MD 库读取完整文本 → Agent 智能压缩后注入上下文。

4.4 RAG 的局限与微调路线

RAG 存在根本局限:知识是”外挂”的——模型每次都要检索,无法内化为写作直觉。此外检索片段占用上下文空间、分散当前任务注意力。

策略:短期 RAG 为主(即时可用),中期 QLoRA 微调注入风格和语感(成本 ~100 元),长期混合使用——微调负责”直觉”(爽点判断力、语感),RAG 负责”知识”(具体概念、前文查询)。

4.5 世界书与 RAG 的分工总结

问题 世界书解决 RAG-历史回顾解决
主角修为忘了 查活跃层当前状态 查历次突破的原文详情
伏笔忘了回收 查活跃伏笔列表 查伏笔埋入时的原文
老角色再出场忘了特征 查当前状态条目 查历史出场片段+对话
角色 OOC 查核心特性+行为逻辑 查历史行为模式验证
世界观矛盾 冲突检测自动告警 查历史设定细节对照

——世界书保证”不犯错”,RAG-历史回顾保证”不遗忘”。


五、多维功能标注矩阵

5.1 设计起源

传统叙事学对”功能”的分类(如 Propp 的获得/禁令/违背/斗争/胜利/失败)只是纯动作标签——描述了”角色做了什么”,不关心”这个动作达成了什么效果”。

一个叙事单位(功能),应该从对内(故事内部发生了什么变化)和对外(读者产生了什么反应)两个维度进行标注。

5.2 标注矩阵

对内(故事世界内部)
├── 剧情轴:推进/转折/铺垫/阻碍/回收/承接
├── 人物轴:揭示特性/触发成长/确立关系/制造矛盾/展示能力/施加压力
└── 世界轴:展示设定/营造氛围/建立规则/拓展地图/强化画面感

对外(读者心理层面)
└── 读者五感:
    ├── 期待感(悬念期待/目标期待/反转期待)
    ├── 满足感(伏笔回收/压抑释放/公平回报)
    ├── 代入感(感官代入/情感代入/认知代入)
    ├── 爽感(装逼/打脸/获得/碾压/崇拜)
    └── 惊喜感(反转/揭示/新意)

5.3 标注示例

场景:”拍卖会上,鉴定师老周接过主角的晶核,仪器瞬间爆表”

传统标注:功能类型 = 获得功能

多维标注

标注
剧情轴 转折(打破质疑僵局)+ 铺垫(引出后续交易)
人物轴 揭示特性(老周的专业→震惊)、确立关系(老周从质疑→认可主角)
世界轴 展示设定(修真晶核的能量等级远超此界认知)
读者效果 目标期待(想知道值多少钱)、压抑释放(被嘲讽的憋屈开始释放)、打脸前奏(物理爆表是最直观证据)、新意(不是口头服软,而是仪器爆表)

5.4 序列级聚合

单个功能被标注后,序列层面的功能由其组成功能聚合而成:

  • 剧情定位:以转折为核心、前后有铺垫和回收的完整因果闭环
  • 人物作用:各角色的功能分配和弧光变化
  • 世界作用:力量体系展示、环境设定呈现
  • 读者效果:完整的 V 型情绪曲线,爽感密度评估,结尾是否留有新期待

5.5 标注的实际价值

  1. 暴露”空功能”:如果某个功能只在剧情轴有”推进”,其他轴空白 → 这是”功能性但不好看”的节点,编辑该介入。
  2. 检测情绪断层:如果读者效果在多个连续功能中缺失 → 该序列存在情绪断层,需要调整。
  3. 降低 L3 难度:L3 不再需要自己推断”这段产生了什么读者效果”——这是 L3 最不可靠的一步。现在 L2 直接标注好了,L3 只需查映射表。
  4. 与三专家职责对齐
  • 剧情轴 → 剧情架构师
  • 人物轴 → 人物设计师
  • 世界轴 → 架构师+人物设计师
  • 读者效果 → 网络编辑


六、效果→技术的确定性映射

6.1 双库体系

网文创作指导需要两套知识体系,它们的语言逻辑完全不同:

网文理论(效果学) 叙事学理论(结构学)
关注点 读者的心理反应 文本的组织形式
语言特点 模糊的、经验主义的 精确的、结构主义的
核心概念 爽感、期待感、压抑-释放、黄金三章 聚焦、时限、频率、话语模式
典型表述 “这里要欲扬先抑” “使用内聚焦视角+慢速扩述”

L3 充当“编译器”角色,将模糊的”网文效果指令”翻译成精确的”叙事学技术指令”。这是整个系统最核心的理论创新。

6.2 核心映射规则库

映射规则是写死在数据库里的确定性知识,不是让 AI 每次临场推理。这是”配置优于实现”在创作中的应用。

示例:装逼打脸(压抑-释放)的完整映射

阶段 效果目标 视角选择 节奏控制 话语模式 原理
压抑 积累读者的优越感和期待 反派/路人内聚焦 慢速扩述(细节展开) 大量对话+心理描写 信息差制造读者的上帝视角优势
爆发 爽感释放,逼格确立 外聚焦(客观镜头) 中速等述 短句动词密集 零度写作提升逼格,不解释
余韵 强化满足感,留下回味 自由间接引语 快速概述 震惊反应+留白 直接展示心理崩溃,不议论

其他经典映射

效果目标 视角选择 节奏控制 核心技法
悬念铺设 限制视野 + 叙事空白 慢速扩述→关键处省略 在关键信息处中断或转移视角
战斗场面 外聚焦(开局)→ 零聚焦(全局) 扩述→等述→概述交替 视觉快慢交替,模拟电影剪辑
主角登场 感知型视角 + 陌生化 慢速扩述 通过感官描写拉读者进入现场
扮猪吃虎 内聚焦·配角视角 慢速(配角的愚蠢展开) 读者知道配角不知道,制造优越感

6.3 为什么必须”写死”映射

如果让 AI 自己判断”打脸该用什么视角”,会有三个问题:

  1. 结果不稳定:每次都不同,这次用了外聚焦下次可能用全知视角
  2. AI 不理解原理:选择了某种写法但不知道为什么这么选,只是概率上”常见”
  3. 无法积累改进:人的经验无法固化,每次都是全新推理

将映射规则写死在数据库中后:

  • 系统检索到”打脸”关键词,直接调出预设规则:打脸高潮 → 必须用外聚焦
  • 这是一个确定性的过程,不依赖 AI 的随机推理
  • 映射库可以持续积累——每发现一个新的效果→技法映射关系,就入库一条

6.4 写作技法的三层数据支撑

与第四章讨论的”故事记忆”(世界书 + RAG-历史回顾)不同,本系统的各创作层还需要写作技法知识——这解决的是”怎么写更好”,不是”之前发生了什么”。技法数据是静态知识库,不需要随创作过程动态增长。

L2 层的技法需求

L2 三位专家需要的知识(爽点公式、编辑经验、人物设计经验、序列-功能设计经验)属于”方法论”层面,无法像视角、节奏那样从网文文本中直接提取。可能的来源包括网文理论文章、写作指南书籍、资深作者经验总结。当前策略:这类数据主要靠专家 prompt 中的内置知识和 RAG-历史回顾对同类场景的参考,独立的技法数据库暂未构建。

L3 层的技法需求——映射关系库

L3 需要的核心技法是效果→叙事指令的映射规则(§6.2 中的表格)。这是整个系统的”翻译器”,瓶颈最大。

数据结构设计:

{
  "效果标签": "装逼打脸-压抑阶段",
  "叙事指令": {
    "视角": "内聚焦(反派/路人视角)",
    "节奏": "慢速叙事(扩述/场景)",
    "话语模式": "大量对话+环境描写"
  },
  "理由": "通过无知者的傲慢视角,制造信息差",
  "参考片段": ["..."],
  "关联网文概念": ["欲扬先抑", "期待感悬置"]
}

数据来源:从经典网文/名著中手工标注”效果-技法”对照表。冷启动用预设的核心映射条目(约 50-100 条),渐进迭代中持续补充。

L4 层的技法需求——微观技法库

L4 需要的技法是具体的写作范例——当 L3 标签要求”外聚焦 + 短句 + 动作描写”时,提供参考文本片段供 AI 参考。

数据结构:

{
  "技法标签": ["外聚焦", "动作描写", "短句"],
  "风格": "古龙式冷硬",
  "参考文本": "光头男人敲了敲桌子...",
  "来源": "古龙《流星蝴蝶剑》",
  "适用场景": "打脸高潮、战斗爆发"
}

技法数据与故事记忆的关系

故事记忆(第四章)               写作技法(第六章)
───────────────────            ───────────────────
世界书:当前状态                 映射规则库:效果→技法
RAG-历史:前文检索              微观技法库:参考范例
                               L2 方法论:爽点公式
                               
解决 "不犯错、不遗忘"            解决 "写得好"
数据随创作增长                   数据为静态预设

七、L3/L4 多技能体系

7.1 为什么 L3/L4 不用专家会议

L1/L1.5/L2 都有专家会议(多角色协作),但 L3 和 L4 不同——它们的任务是执行而非决策。不需要多方博弈,需要的是”面对不同情况用不同方法执行”。

类比:

  • L1/L1.5/L2 = 会议室(多方讨论,达成共识)
  • L3/L4 = 工具箱(根据情况选用不同工具)

7.2 L3 的五种技能

技能 定位 使用场景
初稿生成 首次接收 L2 章纲,产出带标签草稿 默认入口
迭代修正 在已有草稿上按用户反馈修改 用户不满意,指出具体问题
换方向重写 同一章纲,不同风格/节奏 对比不同写法
保守写作 严格控制想象空间 AI 写得太飞、设定崩了
加速模式 压缩篇幅,加快叙事节奏 某章太拖

7.3 L4 的七种技能

技能 定位 使用场景
初稿扩展 接收标签草稿,扩展打磨成精修 默认入口
文风调校 保持内容,调整语言风格 要”更古龙”或”更网文化”
删改压缩 缩短篇幅,保留核心 篇幅超了
描写增强 丰富环境、心理、感官细节 文太干瘪
对话打磨 专门优化对话部分 对话生硬
保守修复 检测不合理设定,逐条修正 AI 太异想天开
终稿润色 检查错别字、语病、节奏 内容满意,最后抛光

7.4 技能切换机制

两种模式并存:

  • 手动切换:前端下拉菜单选当前 skill
  • 自动推荐:系统检测到特定模式时建议切换。例如连续 3 次迭代用户还不满意 → 建议”换方向重写”;文本中出现大量修饰词 → 提示”切保守模式?”

7.5 标签语法与预处理

L3 的带标签草稿使用类似 HTML 的结构化标签包裹正文段落。标签类型包括:

标签 作用 关键属性
<视角> 切换叙事视角 type: 外聚焦/内聚焦/不定内聚焦/自由间接引语
<节奏> 控制叙事时间 type: 扩述/等述/概述/静述
<情绪> 情绪目标和强度 type, 强度(↑/↑↑)
<话语模式> 句式结构 type: 短句+动作/大量对话/心理描写/环境烘托
<限制视野> 控制信息量和视角范围 target, 规则
<省略> 告知 L4 此处不写什么 规则
<自由间接引语> 以叙述者口吻转述心理 规则
<转折点> 标记叙事节点 name

预处理流水线

L3 草稿(含原始标签 + 正文)
     ↓
正则匹配所有 <标签名 属性>...</标签名>
     ↓
从映射表查对应完整提示词,注入提示词要求属性
     ↓
传给 L4 的标注后草稿

例如:

输入:  <视角 type="外聚焦">正文</视角>
输出:  <视角 type="外聚焦" 提示词要求="只写外部可见的行为和对话,不进入任何人物的内心。叙述者像一个客观的摄像机。">正文</视角>

八、编排画布与工作流

8.1 从固定流程到可编排流程

早期系统的层级是固定顺序(L1→L2→L3→L4),存在三个问题:

  1. 短篇不需要分卷,L1.5 多余
  2. 长篇可能想 L1→L2→L1→L2 反复迭代
  3. 无法自定义流程——想对比两种章纲方案?没法做

解决方案是将创作流程变成一个可视化的工作台

  • 每个功能环节(L1 种子、专家会议、L3 叙事、L4 渲染、世界书查询、RAG 检索)是画布上的一个工作节点
  • 节点有明确的输入端口(接收什么数据)和输出端口(产出什么内容)
  • 用箭头连接节点,就定义了数据流向和处理顺序
  • 系统预置了默认流程(L1→编排→L3→L4),但用户可以随意增删、重组

8.2 编排画布的核心概念

专家节点:每个专家是一个可拖拽的画布节点,有独立的角色配置(主导/审核/补充)、Agent 中止条件(标签<stop>/阻塞/楼层上限)、读取文件类别配置。所有专家默认启用 Think 模式(thinkingBudget: 10000 tokens)。

群聊容器节点:将多个专家框在一起,形成群聊讨论组。交互方式为 click-to-add——先从左侧工具箱点选专家,再点击容器 body 添加。容器内专家显示为带序号、图标、名称、角色标签的卡片,× 按钮移除。容器高度随专家数量自动增长,不再需要内部连线。

容器配置项:

  • 发言模式:顺序循环(ordered,按加入顺序依次发言)或 @提及驱动(mention_driven,专家互相 @ 形成动态讨论网络)
  • 退出条件:手动(用户停止)/ 全员共识(全部打出<stop>)/ 多数赞同(超过 exitRatio 比例)/ 门禁专家(指定专家定稿)
  • 上下文深度控制:按楼层(最近 N 层发言)或按 token(约 N token 最近历史),两者可同时启用取先触发者

群聊与单专家的区别:群聊中每个专家调用 speakStream()(单次 LLM 发言),而非单专家的 iterate()(多轮 Agent 自我审视)。群聊的”迭代”体现在专家之间的来回对话,而非个人内部反思。群聊产出为一份共享报告({容器名}_群聊_report.md),合并所有专家的发言,而非每个专家各自产出独立报告。

连线类型

  • data_flow:通用数据流(节点间对象传递)
  • 单输入单输出:群聊对外暴露一个输入端口和一个输出端口,类似电路设计中的模块封装——下游只看到”群聊产出了什么”,不关心里面怎么讨论的

8.3 @提及驱动

传统固定顺序(A→B→C→A→B→C…)的局限在于无法应对讨论中自然产生的交叉回应。@提及机制允许:

  • 用户点名:输入 @剧情架构师,指定专家立即发言
  • 专家互相点名:专家输出中包含 @人物设计师 请确认主角行为是否合理,系统自动让被点名者发言
  • 提及驱动模式:没有固定发言顺序,专家通过互相 @ 形成讨论网络

8.4 Agent 迭代与管道模式

区别于会议模式(圆桌讨论),管道模式是一种直线传递的工作方式:

L1 愿景 .md → 资深作者 → 读者代表 → 最终 .md

按连线顺序逐节点处理——同一层有多个节点时可以并行,上层完成后才进入下层。每个节点的输出自动作为下一节点的输入参考。

Agent 迭代:单专家节点不是一次 LLM 调用,而是多轮内部迭代——生成意见 → 自我审视 → 修正定稿。所有专家默认启用 Think 模式,思考过程通过 SSE 流式展示。可配置中止条件:标签 <stop>(AI 自主打标)、阻塞中止(每隔 N 轮暂停等待用户反馈)、楼层上限(maxRounds 到后取最佳或直接接受)。

群聊:多专家在容器内同时讨论,专家之间互相 @ 或按顺序发言。讨论的”轮次”是专家之间的来回对话。退出条件可配:手动 / 全员共识 / 多数赞同 / 门禁专家。

8.5 全自动与手动微操

两种模式不互斥:

  • 全自动:画布连线全部接好,点”运行”,数据从头流到尾
  • 手动微操:不连线或只连部分。每完成一个模块,产出存文档库。用户手动拿文件导入下一个模块
  • 混合:大部分连线全自动,关键环节断开让人工介入

8.6 前端聊天窗口

单专家和群聊使用不同的前端组件:

  • ChatPopup.vue:单专家 Agent 聊天窗口,三栏布局——文档库(左) | 迭代日志+输入框(中) | 文件队列+报告预览(右)
  • GroupChatView.vue:群聊专用组件,中央展示群聊消息流(发言人名称+图标),右侧展示群聊成员列表+退出条件状态+对象文件队列。不再有独立报告预览面板——用户双击文件队列中的文件即可预览内容
  • 两者通过 BroadcastChannel 独立接收各自的事件类型(agent_* vs groupchat*),互不干扰

九、核心概念对照表

本系统概念 对应的叙事学/网文学概念 说明
故事(Fabula) 素材层 客观事件序列
叙事(Discourse) 话语层 事件的呈现方式
功能 Propp 功能/最小叙事单位 故事中最小的叙事单元
序列 Sequence 有因果逻辑的功能链
情节 Plot 序列的组合结构
行动元 Actant 角色在情节中的功能定位
内聚焦 Internal Focalization 限制在某人物的认知范围内
外聚焦 External Focalization 只写可见行为,不写心理
自由间接引语 Free Indirect Discourse 无引号的心理转述
扩述/等述/概述 Duration/Pace 叙事时间与故事时间的比例
效果→技术映射 Fabula→Discourse 编译 L3 的核心任务
世界书 World Info / Lorebook 持久化状态管理
多维标注 Multi-dimensional Annotation 功能的效果标注体系

十、理论创新总结

本系统的理论贡献可以归纳为五个层面:

  1. 分层解耦:将网文创作分解为 L1→L1.5→L2→L3→L4 五个可独立操作的层,每层有明确的理论支撑和输入输出契约。这解决了 AI 长文本生成中”叙事失控”和”一致性差”的根本问题。
  2. 异质化专家会议:不同于通用多 Agent 系统(同质 Agent 生成选项供用户选择),本系统的三位专家是异质化的——各有专业视角和专属知识库,在结构上模拟真实出版业的选题会模式。
  3. 效果→技术的确定性映射:将网文”效果学”(爽感公式)与叙事学”结构学”(视角/节奏/话语模式)通过映射规则库桥接,使模糊的商业写作经验转化为精确的可执行指令。这是整个系统最底层的理论创新。
  4. 数据协同:世界书(当前状态确定性管理)+ RAG-历史回顾(多维度语义检索)两套机制互补,解决了长篇创作中的记忆问题。独立的写作技法数据(映射规则库、微观技法库)为 L3/L4 提供确定性创作指导,与记忆系统是不同层面的支撑。
  5. 多维功能标注:将单个叙事功能的标注从一维(功能类型)扩展为四轴(剧情/人物/世界/读者效果),使抽象的大纲具有了可量化的效果评估体系,直接降低了 L3 的工作难度。

版本:v5.2
更新:2026-05-08

AI辅助网文创作系统——使用与设计思路

本文档介绍系统的使用方法和背后的设计决策。适合需要了解系统如何运作、为什么这样设计的读者。 配合《理论总结》阅读可全面理解项目。

一、系统概览

本系统是一个 B/S 架构的 Web 应用:浏览器打开网页即可使用,后端在本地或服务器上运行。

  • 后端:Node.js + TypeScript + Express.js,端口 7860
  • 前端:Vue 3 单页应用,开发时端口 5173
  • 通信:REST API(操作指令)+ SSE(AI 流式输出,支持 Think 模式)
  • 存储:JSON 文件(核心数据)+ SQLite(日志)+ Chroma(向量检索)
  • LLM:支持所有 OpenAI 兼容接口的模型(GLM-5、DeepSeek、Claude 等)

系统零配置即可运行:不需要 Docker、不需要数据库服务。Chroma 和 SQLite 都是嵌入式运行。


二、快速开始

git clone <仓库地址> && cd talk
./start.sh        # 安装依赖、启动 Node.js 后端

前端开发模式:

cd frontend && npm install && npm run dev

首次使用需要编辑 data/user/config.yaml,填入模型 API 地址和密钥:

llm:
  primary: open_ai_compat
  model: GLM-5                    # 支持 GLM-5、DeepSeek、Claude 等
  api_key: "你的密钥"
  base_url: "https://你的API地址/v1"

三、创作流程

3.1 整体流程

创建项目 → L1 种子(聊创意、生成愿景) → 编排(专家会议讨论大纲)
         → L3 叙事(生成章纲草稿) → L4 渲染(生成正文)

每层产出存入文档库,可在侧边栏随时浏览、对比、管理。不是做完一层才能进下一层——你可以随时回到前面的层重做或调整。

3.2 L1 种子层

目的:把脑海里的模糊创意变成一份结构化的《故事愿景文档》。

操作方式:页面右侧有两个标签页——「表单」和「预览」。

表单标签页

  • 故事要素表单:填写核心梗、目标读者、爽点类型、主角人设、金手指、世界观等
  • 创意对话:和 AI 聊天梳理创意,AI 会逐步引导
  • Skill 按钮:查看和自定义生成提示词
  • 保存表单:把表单内容保存到文档库

预览标签页

  • 生成愿景文档:把表单内容提交给 AI,生成完整的 Markdown 愿景文档
  • Think 模式:AI 思考过程可折叠显示
  • 流式输出:实时显示生成过程
  • 保存/下载:保存到文档库或下载为 .md 文件

数据流

表单内容 → 合并成提示字符串 → AI 流式生成 → Markdown 愿景文档
                                              ↓
                                      保存到文档库 / 下载

设计考虑

  • 表单 + 对话双模式:表单负责结构化收集,对话负责发散创意
  • Skill 功能:用户可自定义提示词,灵活控制 AI 行为
  • Think 模式:展示 AI 思考过程,帮助理解创作意图
  • 愿景文档格式:直接输出 Markdown,方便后续编辑和导入

3.3 编排层(核心交互)

目的:通过专家会议讨论,产出精修大纲。这是系统最核心的交互环节。

三种使用方式

  1. 预设模板(推荐新用户):系统提供三个预设模板——
  • 快速审核:只用网络编辑快速检查大纲质量
  • 卷纲规划:资深作者 + 读者代表讨论分卷方案
  • 章纲设计:剧情架构师 + 网络编辑 + 人物设计师拆解章纲

  1. 拖拽编排(进阶用户):从左侧工具箱拖拽专家到画布,用箭头连接定义发言顺序。可以把多个专家框进一个”容器”形成群聊小组。
  2. 管道模式:不是开会讨论,而是分布式工作节点模型——每个节点独立维护任务队列,并行运行。任务对象沿 DAG 连线流动:上游节点完成后从自己队列删除,塞到下游队列。适合”不需要来回讨论,按步骤依次处理”的场景。

会议交互

  • 会议模式:专家轮流发言,半自动/全自动/手动三种协作模式,支持 @提及 点名
  • 管道模式 v2:任务对象沿 DAG 流动,每个专家节点是 Agent——多轮内部迭代自我审视(所有专家默认启用 Think 模式),产出报告+聊天记录。用户可随时向 Agent 发送反馈指令
  • 群聊:多专家放入群聊容器,click-to-add 交互(先点选工具箱中的专家,再点容器 body 添加)。专家显示为带序号、图标、角色标签的卡片,× 移除。支持顺序循环或 @ 提及驱动发言,退出条件可配(共识/多数赞同/门禁专家)。群聊产出为一份共享报告
  • 流式聊天:单专家使用 ChatPopup.vue(三栏:文档库 | 迭代日志+输入 | 文件队列+报告预览),群聊使用 GroupChatView.vue(中央消息流+输入 | 右侧成员列表+退出条件+文件队列)
  • 断点恢复:管道中断后可从 checkpoint 恢复,自动丢弃不完整轮次
  • ZIP 导出:完整管道产出(配置+对象文件+报告+聊天记录)打包为 ZIP

画布设计

  • 从工具箱拖拽专家节点到画布,箭头连线定义 DAG 数据流
  • 拖拽群聊容器(原”容器”)把多个专家分组,容器内配置发言模式(顺序/@ 驱动)、退出条件、上下文深度
  • 输入源节点:添加多个 .md 文件形成输入队列
  • 输出节点:收集全部产出,管道完成后双击打开输出页面
  • 每个节点可配置:Agent 中止条件(标签<stop>/阻塞/楼层上限)、读取文件类别(input/report/chat_log)
  • 画布设计可保存和加载,不同项目可复用

产出:会议结束后,讨论内容被整理为结构化的大纲。大纲包含功能序列、情绪曲线、人物行动元等信息。

流式聊天窗口

  • 右键节点 → 打开聊天窗口(新浏览器标签页),通过 BroadcastChannel 接收 SSE 事件
  • 专家节点 → ChatPopup.vue:三栏布局——文档库(左 220px) | Agent 迭代日志+输入框(中 弹性) | 文件队列+报告预览(右 320px)。迭代日志用 RoundCard 组件渲染——思考过程(可折叠) + 产出内容(流式更新) + 自评分。agent_complete 后自动归档报告到文件队列,清空聊天区释放 DOM
  • 群聊节点 → GroupChatView.vue:中央消息流(发言人名称+图标+思考+产出)+ 右侧面板(群聊成员列表 + 退出条件状态 + 对象文件队列)。不再有独立报告预览——用户双击文件队列中的文件即可预览 markdown 内容
  • 用户反馈:底部输入框,Enter 发送反馈,”采纳并停止”(专家)/ “结束群聊”(群聊)
  • 输出页面(OutputPage.vue):对象列表 + 专家链路 + 文件统计,支持 ZIP 下载和拖入加载
  • 对象查看(ViewerPage.vue):回放专家完整迭代聊天,切换专家视角,单对象/ZIP 两种模式

设计考虑

  • 预设模板降低了新用户的操作门槛,不需要理解专家体系就能开始
  • 画布拖拽给了高级用户完全的自由度——想用几个专家、什么顺序、几轮,全自定义
  • 统一引擎:L1.5/L2/管道 v2 底层共用编排引擎,API 端点保留向后兼容
  • 管道 vs 会议:管道适合”直线加工”(对象沿 DAG 流动,节点并行处理),会议适合”讨论决策”(专家轮流发言交叉讨论)
  • Agent 迭代:专家不是单次 LLM 调用——多轮内部审视使产出更可靠。中止条件可配置,避免无限循环
  • 群聊:多个专家在容器内同时讨论,适用复杂评审场景。退出条件让讨论不会失控
  • 断点恢复:checkpoint 保存完整对象状态,中断后从中断位置继续而非重新开始
  • ChatPopup 三栏:逐专家清空(性能)+ 文件队列(上游文件可见)+ 报告预览(随时查看产出)

3.4 L3 叙事层

目的:将大纲转化为可执行的写作指令。

操作方式:左侧显示 L2 产出的大纲作为参考,中间是场景编辑器。每个场景可以设置:

  • 视角(外聚焦 / 内聚焦 / 不定内聚焦 / 自由间接引语)
  • 节奏(慢速扩述 / 中速等述 / 快速概述)
  • 话语模式(对话为主 / 动作描写 / 心理描写 / 环境烘托)
  • 预估字数

产出:章纲/细纲,包含每章的场景序列、每个场景的技术指令、整章的情绪曲线和钩子设计。

设计考虑

  • L3 目前是纯指令模式(选择技术参数)。按理论规划,未来会升级为”带标签草稿”模式——AI 直接输出嵌入了 <视角><节奏> 等标签的草稿正文,用户可以看到标签在上下文中的效果
  • 多技能切换能力预留:初稿生成、迭代修正、换方向重写、保守写作、加速模式——用户可根据实际效果切换策略,而不是反复修改同一个 prompt

3.5 L4 渲染层

目的:根据 L3 的写作指令生成正文。

操作方式:左侧显示 L3 章纲作为参考,点击”开始渲染”,正文以流式方式逐字出现(类似 ChatGPT 打字效果)。

产出:完整的章节正文,含字数统计。

设计考虑

  • SSE 流式输出:用户无需等待全文生成,可以边看边判断方向,不满意可以随时中止
  • 约束渲染:L4 不是自由创作——它收到的是 L3 的结构化指令(视角、节奏、字数),必须遵守这些约束
  • 7 种技能预留:初稿扩展、文风调校、删改压缩、描写增强、对话打磨、保守修复、终稿润色

四、数据支撑功能

4.1 世界书

目的:维护故事世界的当前状态——角色修为、势力关系、活跃伏笔、道具归属等。

操作方式:世界书管理页面以表格形式展示所有条目。每个条目包含:

  • 触发词(当上下文中出现这些词时,条目的内容会被自动注入 AI 的 prompt)
  • 内容(条目的具体描述)
  • 优先级(决定多个条目同时触发时的排序)
  • 是否常驻(常驻条目永远在上下文中)

自动管理:每完成一个创作序列后,可以触发”AI 处理序列”——系统自动分析序列内容,提取新角色、状态变化、伏笔设置/回收,更新世界书条目并检测设定冲突。

版本控制:每次修改可以提交一个版本(commit),支持查看历史版本。

设计考虑

  • 触发词机制(借鉴 SillyTavern):不是每次把所有条目塞进上下文——只有与当前讨论相关的条目才会被激活,节省 token 成本
  • 自动管理 + 人工审核:AI 可以自动提取变化,但冲突检测结果会提醒用户确认,不会擅自改写设定
  • 版本链而非覆写:角色的修为变化保留完整历史(”1-30 章筑基→31-80 章金丹→81 章至今元婴”),只比当前状态多几个 token,但 AI 能理解成长弧光

4.2 RAG 检索

目的:从已生成的前文内容中检索相关信息,帮助 AI 保持前后一致。

操作方式

  • 搜索栏输入查询词 → 返回相关前文片段及其相关度得分
  • 支持按标签筛选(如只查某个角色的出场记录)
  • 可手动索引文档(上传章节文本建立索引)

自动检索:在专家会议中,RAG 检索会根据当前讨论内容自动触发,检索结果以”机器人插话”的形式出现在聊天中。

设计考虑

  • 当前 RAG 配置中的 hybrid_retriever 尚未实现,实际运行的是 simple_vector(纯向量检索)
  • 笔记 7 中已实现并测试了完整的混合检索原型(多维度切片 + 向量+关键词混合得分 + 文档增强),待集成进主系统

4.3 文档库

目的:管理所有创作产出——存档、对比、追溯、导入。

操作方式:左侧可折叠的侧边栏,以目录树形式展示所有文档。支持:

  • 创建目录整理文档
  • 拖拽移动文档到不同目录
  • 右键菜单(重命名、导出、归档、删除)
  • 导入外部 .md/.json/.txt 文件
  • 设置某份文档为当前层的”活跃文档”(L1/L2/L3/L4 各层有自己的活跃文档指针)

溯源链:每份文档记录了它的”父文档”——这份 L2 大纲是从哪个 L1 愿景生成的。形成完整的链路:

L1 愿景 → L2 大纲 → L3 章纲 → L4 正文

正文有问题 → 顺着链找到章纲是哪份 → 再找到大纲是哪份 → 定位决策节点。

设计考虑

  • 双轨存储:文档库(用户视角的自由文件管理)与章节管理器(Agent 视角的结构化章节索引)分开。前者管”存档和对比”,后者管”第 N 章的状态和 RAG 索引同步”
  • 自动入库:每次生成产出后自动在文档库存档一份,旧版本不会被覆盖
  • 自动命名:系统根据 AI 摘要(如”废土双界倒爷 + 修真物资流”)自动命名,用户可随时重命名
  • 旧数据迁移:启动时检测旧格式输出文件,自动迁移到文档库

五、设置与配置

系统设置页面提供:

  • LLM 配置:API 地址、密钥、模型选择
  • 流水线配置:默认会议协议、协作模式、最大讨论轮次
  • 查看已注册的模块列表(哪些 LLM 实现、哪些 RAG 策略、哪些专家可用)

自定义专家:用户可以在画布上创建自定义专家——填写名称、角色描述、提示词模板。保存后在当前项目的所有会议中可用。


六、架构设计决策

6.1 为什么选择 B/S 架构

  • 零安装:浏览器打开即用,不需要安装任何客户端
  • 参考 SillyTavern 模式git clone → ./start.sh → 浏览器打开,三步入门
  • 前后端分离:前端独立开发部署,后端专注 API 和模型调用
  • SSE 而非 WebSocket:系统的 AI 流式输出是单向的(服务器→客户端),SSE 更轻量,浏览器原生支持,FastAPI 一行代码实现

6.2 模块化插件体系

所有功能组件遵循”协议优先”原则:

  1. 在 protocols/index.ts 中定义 TypeScript 接口——规定”能做什么”
  2. 编写具体实现类——决定”怎么做”
  3. 通过注册函数注册(如 registerExpert('id', Class)
  4. 配置文件选择使用哪个实现

专家系统——JSON 定义 + ConfigurableExpert

  • 内置 7 位专家从硬编码 TypeScript 类重构为 JSON 定义文件(experts/*.json
  • ConfigurableExpert 统一类读取 JSON 定义,不再需要每个专家一个 .ts 文件
  • 用户自定义专家:在前端画布填写 JSON,保存到项目目录,系统自动加载
  • expertLoader 服务管理内置/自定义专家的发现、加载、CRUD

好处

  • 切换 LLM 只需改配置一个 key,不需要改任何业务代码
  • 新增专家:加一个 JSON 文件即可,无需写 TypeScript
  • 测试时:用 MockLLM 替换真实 LLM,不消耗 API 费用

专家表(7 位内置 + 自定义):

专家 ID 名称 角色
senior_author_v1 资深作者 创作方向把控
reader_representative_v1 读者代表 体验审核
plot_architect_v1 剧情架构师 故事骨架
character_designer_v1 人物设计师 人设一致
web_editor_v1 网络编辑 市场效果
chapter_splitter_v1 章节拆分师 卷→章翻译
discussion_summarizer_v1 讨论总结师 讨论收敛
自定义专家 用户定义 用户编写 JSON 定义

6.3 存储方案的选择

数据类型 存储方式 理由
世界书条目、项目配置、L1-L4 产出 JSON 文件 结构化文档,人类可读可编辑,量不大
会议日志、版本历史 SQLite 只追加不修改,需按时间查询,量大
向量数据 Chroma(嵌入式) 无需单独部署向量数据库服务

不用 PostgreSQL/MySQL 的理由:SillyTavern 全 JSON 也跑得好好的。对于单用户创作工具,SQLite 完全够用。

6.4 SSE 流式设计

所有 AI 生成过程使用 SSE(Server-Sent Events)流式推送:

event: expert_speak
data: {"expert_id": "plot_architect_v1", "content": "基于愿景...", "type": "chunk"}

event: done
data: {"output": {...}}

前端接收策略(两种场景):

场景 方式 原因
POST 请求的流式响应 fetch + ReadableStream EventSource 只支持 GET
GET 请求的流式响应 原生 EventSource 浏览器自动重连,更简单

断线处理:SSE 中断时,前端保留已接收的部分文本。用户可选择”继续”(将断点内容作为上下文续写)或”重来”。

6.5 分布式工作节点模型

编排层的核心架构:每个节点是独立 Worker,维护自己的任务队列,所有节点并行运行。

A节点队列           B节点队列           C节点队列
[对象1, 对象2]     [对象1]            [对象1]
     │                 │                  │
     │ 取出对象1        │ 取出对象1         │ 取出对象1
     │ 处理             │ 处理              │ 处理
     │ 删除,塞给B      │ 删除,塞给C        │ 删除,完成
     ▼                 ▼                  ▼

关键规则

  • 每个节点只看自己的队列——不感知全局状态
  • 任务对象沿 DAG 连线流动:A 完成 → 从 A 队列删除 → 塞到所有下游节点队列尾部
  • 所有节点并行:A 在处理对象2 的同时,B 在处理 A 已塞来的对象1
  • 任务对象累积:每经过一个节点,节点产出追加到对象文件列表中

与集中式调度的区别:不是由一个中央调度器按拓扑层级逐个处理对象。节点不需要知道”当前是第几层”、”总共有多少对象”——只需要知道”我有上游谁、下游谁”以及”我的队列里有任务就处理”。

当前实现状态:ObjectPipelineEngine 是集中式实现,需要重构为分布式模型。

L1.5 和 L2 原本是两套独立代码——各自有 API、各自有专家实现。但底层逻辑相同:取专家队列 → 按序发言 → 流式输出 → 格式化产出。合并为统一的引擎后一套代码处理所有场景。

6.6 协作模式设计

模式 用户参与度 适用场景
semi_auto(默认) 每位专家发言后审核 需要精细把控方向的场景
full_auto 纯旁听,随时可插话 已有经验、快速出稿
manual 手动指定谁发言 深度调试、特定问题咨询

全自动模式下,用户插话后自动切回半自动——这个设计保证了”自动”不会变成”失控”。

6.7 前端技术选型

  • Vue 3(Composition API):模板语法接近 HTML,降低上手难度;中文生态好
  • Vue Flow:用于编排画布,提供拖拽节点和连线功能
  • markdown-it:渲染专家发言中的 Markdown 表格和代码块。流式渲染时需要缓冲不完整的 Markdown 块,以免语法未闭合时乱码
  • BroadcastChannel:编排画布和弹窗聊天窗口之间的消息同步

6.8 已知限制与待完善项

问题 影响 状态
hybrid_retriever 未实现 当前只有纯向量检索,笔记 7 的混合检索方案待集成 待开发
L3/L4 多技能体系 目前仅有默认技能,5+7 技能切换未实现 待开发
WorldBook.revert() 是空方法 版本回滚功能不可用 待开发
tags API 是空桩 L3/L4 标签库端点无实际数据 待开发
L3 映射关系库 向量数据库未构建,映射规则仅靠 prompt 待开发
前端无测试 Vue 页面无自动化测试覆盖 待开发
ObjectPipelineEngine 是集中式实现 节点串行处理,非设计中的分布式并行模型 待重构
L3/L4 多技能体系 目前仅有默认技能,5+7 技能切换未实现 待开发

版本:v5.2
更新:2026-05-08

AI辅助网文创作系统——代码框架

面向开发者的代码结构参考文档。说明目录组织、关键文件职责、模块间调用关系。 配合《理论总结》和《使用与设计思路》阅读可完整理解项目。

一、目录总览

talk/
├── backend-node/                   # Node.js/TypeScript 后端
│   ├── src/
│   │   ├── index.ts                # 应用入口,Express 配置,路由注册
│   │   ├── config.ts               # YAML 配置加载(支持下划线/驼峰兼容)
│   │   │
│   │   ├── protocols/              # 类型定义
│   │   │   └── index.ts            # 所有接口、枚举、类型
│   │   │
│   │   ├── models/                 # 数据模型
│   │   └── pipeline-object.ts  # PipelineObject:创建/累积/序列化/上下文构建
│   │
│   ├── services/               # 业务逻辑层
│   │   │   ├── llm.ts              # LLM 调用(支持 Think 模式)
│   │   │   ├── meeting-engine.ts   # 会议引擎 v1(专家轮流发言)
│   │   │   ├── pipeline-engine.ts  # 流水线引擎 v1(文件队列)
│   │   │   ├── object-pipeline-engine.ts  # 对象管道引擎 v2(Agent 迭代+群聊+checkpoint)
│   │   │   ├── pipeline-workers.ts    # 四种 Worker(输入源/专家/群聊/输出),AsyncQueue 轮询
│   │   │   ├── recovery-manager.ts # 断点恢复(saveCheckpoint/loadCheckpoint/cleanIncompleteRound)
│   │   │   ├── zip-exporter.ts     # ZIP 打包导出(exportPipelineToZip/parseExportZip)
│   │   │   ├── expert-loader.ts    # 专家 JSON 定义加载器(内置+自定义)
│   │   │   ├── project-manager.ts  # 项目 CRUD
│   │   │   ├── worldbook.ts        # 世界书管理
│   │   │   ├── rag.ts              # RAG 检索
│   │   │   └── library.ts          # 文档库管理
│   │   │
│   │   ├── experts/                # 专家实现
│   │   │   ├── base.ts             # 专家基类(speakStream + Agent 迭代 iterate,默认 Think 模式)
│   │   │   └── index.ts            # ConfigurableExpert(JSON 驱动)+ 注册表
│   │   │
│   │   ├── routes/                 # API 路由(Express)
│   │   │   ├── projects.ts         # 项目管理
│   │   │   ├── l1.ts               # L1 种子层(聊天+生成)
│   │   │   ├── meeting.ts          # 编排层(管道启动/反馈/恢复/导出/设计)
│   │   │   ├── l3.ts               # L3 叙事层
│   │   │   ├── l4.ts               # L4 渲染层
│   │   │   ├── worldbook.ts        # 世界书 CRUD
│   │   │   ├── rag.ts              # RAG 搜索/索引
│   │   │   ├── library.ts          # 文档库管理
│   │   │   └── settings.ts         # 系统设置
│   │   │
│   │   └── utils/                  # 工具函数
│   │       ├── sse.ts              # SSE Writer
│   │       └── queue.ts            # AsyncQueue(生产者-消费者)
│   │
│   ├── experts/                    # 专家 JSON 定义文件(7 个内置 + 用户自定义)
│   ├── senior_author_v1.json       # 资深作者
│   ├── reader_representative_v1.json  # 读者代表
│   ├── plot_architect_v1.json      # 剧情架构师
│   └── ...                         # 等 7 个 + 自定义
│
├── __tests__/                  # 单元测试(67 个)
│   │   ├── queue.test.ts
│   │   ├── sse.test.ts
│   │   ├── config.test.ts
│   │   ├── llm.test.ts
│   │   ├── experts.test.ts
│   │   ├── project-manager.test.ts
│   │   ├── worldbook.test.ts
│   │   ├── rag.test.ts
│   │   └── library.test.ts
│   │
│   ├── package.json
│   ├── tsconfig.json
│   └── vitest.config.ts
│
├── frontend/                       # Vue 3 前端
│   └── src/
│       ├── App.vue                 # 根组件 + 顶部导航 + 文档侧边栏
│       ├── main.js                 # 入口 + vue-router 路由(12 条)
│       ├── lib/sse.js              # SSE 流包装器
│       ├── pages/                  # 12 个页面
│       │   ├── Dashboard.vue       # 项目仪表盘
│       │   ├── L1Seed.vue          # L1 种子(聊天+表单+愿景预览)
│       │   ├── Orchestration.vue   # 编排画布入口(SSE + BroadcastChannel)
│       │   ├── ChatPopup.vue       # 三栏聊天弹窗(Agent 迭代/群聊)
│       │   ├── OutputPage.vue      # 输出页面(对象列表 + ZIP 下载/加载)
│       │   ├── ViewerPage.vue      # 对象查看(单对象 + ZIP 模式,切换专家)
│       │   ├── L3Narrative.vue     # L3 叙事
│       │   ├── L4Render.vue        # L4 渲染
│       │   ├── WorldBook.vue       # 世界书管理
│       │   ├── Library.vue         # 文档库详情
│       │   └── Settings.vue        # 系统设置
│       └── components/             # 组件
│           ├── OrchestrationCanvas.vue  # Vue Flow 编排画布(节点配置、连线、预设)
│           ├── ExpertNode.vue           # 专家节点
│           ├── GroupNode.vue            # 群聊容器节点(click-to-add 专家卡片)
│           ├── GroupChatView.vue        # 群聊聊天组件(消息流+成员列表+文件队列)
│           ├── RoundCard.vue            # Agent 轮次卡片(思考+产出+自评)
│           └── library/
│               └── DocumentSidebar.vue  # 文档库侧边栏
│
├── backend/                        # Python 后端(旧版,保留参考)
├── data/                           # 运行时数据
│   ├── user/
│   │   └── config.yaml             # 全局配置
│   └── projects/{id}/              # 项目数据
│       ├── project.json
│       ├── worldbook.json
│       ├── library/
│       ├── outputs/
│       └── logs/
│
└── start.sh                        # 一键启动脚本

二、后端核心机制

2.1 启动流程

index.ts
    │
    ├── 配置 CORS、JSON 解析
    │
    ├── registerAllRoutes(app)
    │   ├── registerProjectRoutes
    │   ├── registerL1Routes
    │   ├── registerMeetingRoutes
    │   ├── registerL3Routes
    │   ├── registerL4Routes
    │   ├── registerWorldbookRoutes
    │   ├── registerRAGRoutes
    │   ├── registerLibraryRoutes
    │   └── registerSettingsRoutes
    │
    └── app.listen(7860)

2.2 LLM 调用(支持 Think 模式)

// services/llm.ts
class OpenAICompatLLM implements LLMProvider {
  async *stream(prompt: string, options: LLMOptions): AsyncGenerator<LLMChunk> {
    const body = {
      model: this.model,
      messages: [{ role: 'user', content: prompt }],
      stream: true
    };
    
    // 启用 Think 模式
    if (options.thinking) {
      body.thinking = { type: 'enabled', budget_tokens: options.thinkingBudget };
    }
    
    // 流式解析响应
    for await (const chunk of response) {
      // GLM/DeepSeek 使用 reasoning_content 字段
      if (delta.reasoning_content) {
        yield { type: 'thinking', content: delta.reasoning_content };
      }
      if (delta.content) {
        yield { type: 'content', content: delta.content };
      }
    }
  }
}

2.3 异步队列(生产者-消费者)

// utils/queue.ts
class AsyncQueue<T> {
  async enqueue(item: T): Promise<void>;
  async dequeue(): Promise<T>;
  
  // 支持异步迭代器
  [Symbol.asyncIterator](): AsyncIterator<T>;
}

// 用于流水线引擎
const queue = new AsyncQueue<FileTask>();
await queue.enqueue(task);  // 生产者
const task = await queue.dequeue();  // 消费者

2.4 核心数据流

编排层采用分布式工作节点模型:每个节点(专家/群聊)是独立 Worker,维护自己的 AsyncQueue,并行运行。

用户请求 → Express 路由
              │
              ├── 获取配置:getConfig()
              ├── 获取服务:getProjectManager() 等
              │
              ├── 编排层:创建各节点 Worker
              │   ├── 每个节点:dequeue → 处理对象 → enqueue 到下游
              │   ├── 节点并行运行,不等待其他节点
              │   └── SSE 流式响应(每个节点独立推送事件)
              │
              ├── 调用 LLM → SSE 流式响应
              │     └── writer.writeData({ type, content })
              │
              └── 保存数据 → JSON 文件

任务对象流动

输入源队列 → A节点队列 → B节点队列 → ... → 输出节点队列
  (每个节点处理完后从自己队列删除,塞到下游所有节点队列)

三、后端各层实现要点

3.1 L1 种子层(routes/l1.ts

关键端点

端点 方法 说明
/l1/chat POST SSE 流式聊天,支持 Think
/l1/generate POST SSE 流式生成愿景文档
/l1/vision GET/POST/PUT 愿景文档 CRUD
/l1/prompt GET 获取默认提示词
/l1/draft GET/POST 表单草稿
/l1/chat-history GET/POST 聊天历史

L1 聊天流程

  1. 读取愿景文档(如果存在)
  2. 构建提示词(聊天历史 + 愿景文档)
  3. 流式调用 LLM(启用 Think)
  4. 返回 thinking + chunk 事件

L1 生成流程

  1. 把表单内容合并成提示字符串
  2. 使用自定义或默认提示词
  3. 流式调用 LLM(启用 Think)
  4. 保存为 Markdown 格式的愿景文档

3.2 编排层(routes/meeting.ts

关键端点

端点 方法 说明
/meeting/start POST SSE 流式启动管道
/meeting/feedback POST 发送用户反馈到指定节点的 Worker
/meeting/output GET/PUT 管道产出
/meeting/design GET/PUT 画布设计
/meeting/resume POST 从断点恢复管道
/meeting/export/:sessionId GET 导出 ZIP
/presets GET 预设模板

核心引擎

  • ObjectPipelineEngine:管理节点 Worker 的创建和生命周期
  • 每个节点 Worker 独立运行:dequeue → 处理 PipelineObject → enqueue 到下游队列
  • 节点间通过 AsyncQueue 传递任务对象
  • SSE 事件由各 Worker 独立推送,BroadcastChannel 广播到前端

处理流程

构建 DAG → 为每个节点创建 Worker + AsyncQueue → 所有 Worker 并行启动
  → 各 Worker: dequeue → agent.iterate() 或 processGroupChat → enqueue 到下游
  → 对象在 Worker 间流动,累积文件 → 输出节点收集最终结果

3.3 文档库(routes/library.ts

数据格式

{
  "documents": [...],
  "directories": ["/"],
  "activeDocs": { "l1": "uid", "l2": "uid" }
}

支持操作

  • 文档 CRUD
  • 目录管理
  • 归档/取消归档
  • 活跃文档设置
  • 溯源链

四、前端关键组件

4.1 SSE 通信模式

// POST 流式(L1、编排层)
const response = await fetch(url, { method: 'POST', body: JSON.stringify(data) });
const reader = response.body.getReader();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  
  // 解析 SSE 格式:data: {...}\n\n
  const data = JSON.parse(line.slice(6));
  
  if (data.type === 'thinking') {
    // 显示思考过程
  } else if (data.type === 'content' || data.type === 'chunk') {
    // 显示正文内容
  }
}

4.2 L1 页面(L1Seed.vue)

核心功能

  • 创意对话(聊天窗口)
  • 表单填写(故事要素)
  • 愿景预览(Markdown 渲染)
  • Skill 编辑(自定义提示词)

数据流

表单 → 生成请求 → SSE 流式接收 → 实时显示
                     ↓
              Think 内容(可折叠)
              正文内容(实时更新)

4.3 编排层前端组件

Orchestration.vue + OrchestrationCanvas.vue

  • Vue Flow 画布,拖拽专家节点/群聊容器/输入源/输出节点
  • 箭头连线定义 DAG 数据流
  • 群聊容器配置:发言模式(顺序/@驱动)、退出条件、上下文深度
  • 节点配置面板:Agent 中止条件、读取文件类别
  • 预设模板 + 画布设计保存/加载
  • SSE 流读取 → BroadcastChannel 广播 → ChatPopup 接收

ChatPopup.vue(单专家三栏布局):

  • SSE 事件处理:pipeline_start_v2、agent_start、agent_round_start、agent_chunk(→’chunk’ 广播)、agent_complete、agent_waiting_user、object_progress、pipeline_complete
  • RoundCard.vue:轮次卡片——思考过程(可折叠) + 产出内容(流式更新) + 自评分
  • 用户反馈:POST /meeting/feedback → 注入 Agent 下一轮迭代
  • 生命周期:agent_complete → 归档报告到文件队列 → 清空聊天区释放 DOM

GroupChatView.vue(群聊专用):

  • SSE 事件处理:group_chat_start、group_chat_round_start、group_chat_member_start、group_chat_chunk(thinking/content)、group_chat_member_complete、group_chat_round_complete、group_chat_complete、object_progress
  • 中央消息流:RoundCard 复用(isGroupChat + speakerName/speakerIcon)
  • 右侧:群聊成员列表(发言中高亮)+ 退出条件状态 + 对象文件队列(双击预览)
  • 群聊产出为共享报告({容器名}_群聊_report.md),非每个专家各自产出

OutputPage.vue(输出页面):

  • 路由 /output?projectId=xxx,双击输出节点或画布完成时进入
  • 读取 sessionStorage ‘pipelineOutput’ 展示对象列表
  • 每个对象行:名称、专家链路、文件统计
  • ZIP 下载 + 拖入 ZIP 加载(JSZip 解析)

ViewerPage.vue(对象查看):

  • 路由 /view?projectId=xxx&objectId=xxx(单对象)或 ?source=zip(ZIP 模式)
  • 三栏:文档库 | 聊天+产出文档 | 专家列表
  • 单对象模式:选专家 → 显示该专家完整迭代聊天
  • ZIP 模式:右侧拆分为对象列表(上) + 专家列表(下)
  • Markdown 渲染报告内容

五、测试

5.1 单元测试(67 个)

cd backend-node && npm test
测试文件 测试数 覆盖内容
queue.test.ts 6 异步队列
sse.test.ts 4 SSE 格式化
config.test.ts 3 配置管理
llm.test.ts 6 LLM 服务
experts.test.ts 11 专家系统
project-manager.test.ts 7 项目管理
worldbook.test.ts 9 世界书
rag.test.ts 7 RAG 检索
library.test.ts 14 文档库

六、扩展指南

6.1 添加新的 LLM 提供商

// services/llm.ts
export class MyLLMProvider implements LLMProvider {
  async invoke(prompt: string, options?: LLMOptions): Promise<string> { ... }
  async *stream(prompt: string, options?: LLMOptions): AsyncGenerator<LLMChunk> { ... }
}

6.2 添加新的专家(JSON 定义)

内置专家:在 backend-node/experts/ 目录创建 JSON 文件:

{
  "expertId": "my_expert_v1",
  "expertType": "我的专家",
  "icon": "📄",
  "description": "专家描述",
  "temperature": 0.7,
  "prompt_template": "你是一位...",
  "role_instructions": {
    "main": "...",
    "review": "...",
    "supplement": "..."
  },
  "self_review_prompt": "请审视并修正你的意见...",
  "agent_defaults": {
    "enableTagStop": true,
    "blockEveryNRounds": 0,
    "maxRounds": 3,
    "onMaxRounds": "accept_last"
  },
  "builtin": true
}

系统启动时 expertLoader.listExperts() 自动发现 /experts/ 目录下所有 JSON 文件。ConfigurableExpert 统一类读取 JSON 定义,无需写 TypeScript。

用户自定义专家:在前端画布填写 JSON → 保存到项目 user/ 目录 → 系统加载。

程序化注册(仍支持):

// experts/index.ts
registerExpert('my_expert', ConfigurableExpert);

七、关键依赖

后端(Node.js)

用途
express Web 框架
cors 跨域支持
js-yaml YAML 配置读写
uuid 项目 ID 生成
better-sqlite3 SQLite(日志)
chromadb 向量数据库
vitest 测试框架

前端(Node.js)

用途
vue 3 前端框架
vue-router 4 路由
@vue-flow/core 编排画布
markdown-it Markdown 渲染
jszip ZIP 打包/解析(导出 + 前端拖入加载)
file-saver 浏览器文件下载
axios HTTP 请求
vite 5 构建工具

版本:v5.2
更新:2026-05-08

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐