主题
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 拼装规则
- 遍历用户选中的维度。
- 单选维度取对应片段;多选维度拼接多个片段。
- 自定义值(
_custom)直接作为一句用户指令原样注入(前缀如「用户额外要求:」)。 - 所有片段汇总成一段「本次写作倾向」,插入到该节点 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)。 - 倾向选择本身不触发大纲级联(级联只由内容/情节改动触发)。