Skip to content

04 · 标签化倾向系统设计 ​

对应用户核心诉求:在生成大纲、生成正文、润色等关键节点,用「预设标签 chips + 我要输入」的方式,让用户决定这一次生成往哪个方向走,而不是 AI 一锤定音。

参考项目 AI_NovelGenerator 把写作理论(雪花法/角色弧光/悬念三要素)写死在 Prompt 里,所有小说套同一套倾向。本系统把这层控制权交还给用户。


1. 交互模式(UI 基调) ​

统一采用「chips + 我要输入」:

题材/子类型:[太空歌剧] [赛博朋克] [硬科幻] [末日废土] [时间旅行] ... [+ 我要输入]
节奏倾向:  [快节奏爽文] [慢热铺垫] [张弛有度]                    [+ 我要输入]
故事基调:  [热血] [悬疑] [治愈] [暗黑] [诙谐]                    [+ 我要输入]
  • 点击 chip = 选中该预设倾向。
  • 点「我要输入」= 弹出输入框,用户自定义,自定义值等价于一个临时 chip。
  • 多数维度单选,部分维度(如"基调")允许多选组合。

2. 倾向维度定义(按生成节点分组) ​

倾向不是一张大表,而是分节点、分维度。不同生成阶段能选的维度不同。

2.1 生成大纲时 ​

维度key选择性预设 chips
题材/子类型genre单选太空歌剧 / 赛博朋克 / 硬科幻 / 末日废土 / 时间旅行 / 乌托邦反乌托邦 / 第一类接触 / 科幻喜剧 / 玄幻 / 武侠 / 都市 / 悬疑推理 ……
节奏pace单选快节奏爽文 / 慢热铺垫 / 张弛有度
结构structure单选单线推进 / 多线交织 / 双主角 / 群像
基调tone多选热血 / 悬疑 / 治愈 / 暗黑 / 诙谐 / 严肃 / 浪漫
篇幅倾向length_style单选短篇精悍 / 中篇 / 长篇史诗

2.2 生成正文时 ​

维度key选择性预设 chips
详略detail_level单选重情节推进(略写) / 均衡 / 重细节描写(细腻)
对话密度dialogue_density单选多对话(轻快) / 均衡 / 多叙述(厚重)
视角pov单选第一人称 / 第三人称限知 / 全知
情绪强度emotion_intensity单选平实 / 适中 / 浓烈煽情

2.3 润色时 ​

维度key选择性预设 chips
润色风格polish_style多选更文艺 / 更口语化 / 增强画面感 / 强化冲突张力 / 精简冗余 / 统一文风

润色维度只影响文笔,不改情节事实(详见 03-engines.md 润色引擎的硬约束)。


3. 数据落地:倾向如何存 ​

见 02-data-model.md,此处说明用法。倾向以 JSON 存储,不为每个维度建列(维度会增长)。

jsonc
// 一次生成请求携带的倾向对象
{
  "genre": "赛博朋克",
  "pace": "快节奏爽文",
  "tone": ["悬疑", "暗黑"],
  "pov": "第三人称限知",
  "_custom": {            // 用户通过「我要输入」填的,原样保留
    "genre": null,
    "tone": null
  }
}
  • chip 选择存 chip 的显示文案(而非 id),因为最终要拼进 Prompt,文案即语义。
  • 自定义值存进 _custom,与预设区分,便于统计哪些自定义值高频出现 → 可反哺成新预设 chip。

4. 核心机制:倾向 → Prompt 指令(拼装器) ​

这是标签系统的技术本质:每个 chip 对应一段写作指令片段,拼装器按用户选择组装,注入到对应节点的 Prompt。

4.1 指令片段映射表(示例) ​

jsonc
{
  "pace": {
    "快节奏爽文": "情节推进要快,每章都有明确的钩子和爽点,减少铺垫与环境描写,冲突尽早引爆。",
    "慢热铺垫":   "允许充分铺垫,注重人物内心与世界观细节,冲突缓慢累积、后期集中释放。",
    "张弛有度":   "在紧张情节与舒缓段落之间交替,形成节奏起伏。"
  },
  "pov": {
    "第一人称":     "使用第一人称『我』叙述,强化代入感与主观感受。",
    "第三人称限知": "使用第三人称,但视角受限于当前主角,读者只知道主角所知。",
    "全知":         "使用全知视角,可自由切换不同人物的内心与场景。"
  },
  "polish_style": {
    "增强画面感": "强化视觉、听觉、触觉等感官描写,让场景更具画面感,但不得新增或改变情节事实。",
    "精简冗余":   "删减啰嗦、重复、过度修饰的表达,使文字更凝练。"
  }
  // ... 其余维度
}

4.2 拼装规则 ​

  1. 遍历用户选中的维度。
  2. 单选维度取对应片段;多选维度拼接多个片段。
  3. 自定义值(_custom)直接作为一句用户指令原样注入(前缀如「用户额外要求:」)。
  4. 所有片段汇总成一段「本次写作倾向」,插入到该节点 Prompt 的固定占位符 {style_directives}。
(大纲/正文 Prompt 模板中)
...
【本次写作倾向】
{style_directives}
...

这样,Prompt 主体模板(借鉴 AI_NovelGenerator)保持不变,倾向作为可插拔的指令块注入 —— 比参考项目写死的方式灵活得多。


5. 两层作用域 ​

作用域说明存储位置
全局基调整本书的默认倾向,新建项目时设定project.global_tendency(见数据模型)
单次临时覆盖某一章想临时调整(如这章想煽情)随该次生成请求携带,只影响本次,不改全局

生成时的最终倾向 = 全局基调 被 单次临时值覆盖(单次未指定的维度回落到全局)。


6. 倾向预设(用户模板) ​

用户可把调好的一套倾向组合存成命名预设,一键复用。

  • 例:存一套「快节奏 + 热血 + 多对话」为「我的爽文模板」。
  • 存储:tendency_presets 表(见数据模型),is_builtin 区分内置与用户自建。
  • 参考项目无此功能,对高频使用者价值高。

7. 预设 chips 的可维护性 ​

  • chips 清单存在配置文件(如 config/tag_presets.json),而非硬编码在前端,便于增删。
  • 每个 chip 一条记录:{ dimension, label, directive }(directive 即 §4.1 的指令片段)。
  • 新增一个题材 = 加一条配置,前后端都不用改代码。

8. 与其他模块的关系 ​

  • 倾向影响生成结果的风格,但不影响一致性事实 —— 换句话说,改倾向不会让故事圣经里的硬事实失效,两者正交。
  • 润色倾向受润色引擎的「锁情节」约束(见 03-engines.md)。
  • 倾向选择本身不触发大纲级联(级联只由内容/情节改动触发)。

基于 Apache License 2.0 开源