novel-writer-cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/agents/chapter-writer.md +142 -0
- package/agents/character-weaver.md +117 -0
- package/agents/consistency-auditor.md +85 -0
- package/agents/plot-architect.md +128 -0
- package/agents/quality-judge.md +232 -0
- package/agents/style-analyzer.md +109 -0
- package/agents/style-refiner.md +97 -0
- package/agents/summarizer.md +128 -0
- package/agents/world-builder.md +161 -0
- package/dist/__tests__/character-voice.test.js +445 -0
- package/dist/__tests__/commit-prototype-pollution.test.js +45 -0
- package/dist/__tests__/engagement.test.js +382 -0
- package/dist/__tests__/foreshadow-visibility.test.js +131 -0
- package/dist/__tests__/hook-ledger.test.js +1028 -0
- package/dist/__tests__/naming-lint.test.js +132 -0
- package/dist/__tests__/narrative-health-injection.test.js +359 -0
- package/dist/__tests__/next-step-prejudge-guardrails.test.js +325 -0
- package/dist/__tests__/next-step-title-fix.test.js +153 -0
- package/dist/__tests__/platform-profile.test.js +274 -0
- package/dist/__tests__/promise-ledger.test.js +189 -0
- package/dist/__tests__/readability-lint.test.js +209 -0
- package/dist/__tests__/text-utils.test.js +39 -0
- package/dist/__tests__/title-policy.test.js +147 -0
- package/dist/advance.js +75 -0
- package/dist/character-voice.js +805 -0
- package/dist/checkpoint.js +126 -0
- package/dist/cli.js +563 -0
- package/dist/cliche-lint.js +515 -0
- package/dist/commit.js +1460 -0
- package/dist/consistency-auditor.js +684 -0
- package/dist/engagement.js +687 -0
- package/dist/errors.js +7 -0
- package/dist/fingerprint.js +16 -0
- package/dist/foreshadow-visibility.js +214 -0
- package/dist/fs-utils.js +68 -0
- package/dist/hook-ledger.js +721 -0
- package/dist/hook-policy.js +107 -0
- package/dist/instruction-gates.js +51 -0
- package/dist/instructions.js +406 -0
- package/dist/latest-summary-loader.js +29 -0
- package/dist/lock.js +121 -0
- package/dist/naming-lint.js +531 -0
- package/dist/ner.js +73 -0
- package/dist/next-step.js +408 -0
- package/dist/novel-ask.js +270 -0
- package/dist/output.js +9 -0
- package/dist/platform-constraints.js +518 -0
- package/dist/platform-profile.js +325 -0
- package/dist/prejudge-guardrails.js +370 -0
- package/dist/project.js +40 -0
- package/dist/promise-ledger.js +723 -0
- package/dist/readability-lint.js +555 -0
- package/dist/safe-parse.js +36 -0
- package/dist/safe-path.js +29 -0
- package/dist/scoring-weights.js +290 -0
- package/dist/steps.js +60 -0
- package/dist/text-utils.js +18 -0
- package/dist/title-policy.js +251 -0
- package/dist/type-guards.js +6 -0
- package/dist/validate.js +131 -0
- package/docs/user/README.md +17 -0
- package/docs/user/guardrails.md +179 -0
- package/docs/user/interactive-gates.md +124 -0
- package/docs/user/novel-cli.md +289 -0
- package/docs/user/ops.md +123 -0
- package/docs/user/quick-start.md +97 -0
- package/docs/user/spec-system.md +166 -0
- package/docs/user/storylines.md +144 -0
- package/package.json +48 -0
- package/schemas/README.md +18 -0
- package/schemas/character-voice-drift.schema.json +135 -0
- package/schemas/character-voice-profiles.schema.json +141 -0
- package/schemas/engagement-metrics.schema.json +38 -0
- package/schemas/hook-ledger.schema.json +108 -0
- package/schemas/platform-profile.schema.json +235 -0
- package/schemas/promise-ledger.schema.json +97 -0
- package/scripts/calibrate-quality-judge.sh +91 -0
- package/scripts/compare-regression-runs.sh +86 -0
- package/scripts/lib/_common.py +131 -0
- package/scripts/lib/calibrate_quality_judge.py +312 -0
- package/scripts/lib/compare_regression_runs.py +142 -0
- package/scripts/lib/run_regression.py +621 -0
- package/scripts/lint-blacklist.sh +201 -0
- package/scripts/lint-cliche.sh +370 -0
- package/scripts/lint-readability.sh +404 -0
- package/scripts/query-foreshadow.sh +252 -0
- package/scripts/run-ner.sh +669 -0
- package/scripts/run-regression.sh +122 -0
- package/skills/cli-step/SKILL.md +158 -0
- package/skills/continue/SKILL.md +348 -0
- package/skills/continue/references/context-contracts.md +169 -0
- package/skills/continue/references/continuity-checks.md +187 -0
- package/skills/continue/references/file-protocols.md +64 -0
- package/skills/continue/references/foreshadowing.md +130 -0
- package/skills/continue/references/gate-decision.md +53 -0
- package/skills/continue/references/periodic-maintenance.md +46 -0
- package/skills/novel-writing/SKILL.md +77 -0
- package/skills/novel-writing/references/quality-rubric.md +140 -0
- package/skills/novel-writing/references/style-guide.md +145 -0
- package/skills/start/SKILL.md +458 -0
- package/skills/start/references/quality-review.md +86 -0
- package/skills/start/references/setting-update.md +44 -0
- package/skills/start/references/vol-planning.md +61 -0
- package/skills/start/references/vol-review.md +58 -0
- package/skills/status/SKILL.md +116 -0
- package/skills/status/references/sample-output.md +60 -0
- package/templates/ai-blacklist.json +79 -0
- package/templates/brief-template.md +46 -0
- package/templates/genre-weight-profiles.json +90 -0
- package/templates/novel-ask/example.answer.json +12 -0
- package/templates/novel-ask/example.question.json +51 -0
- package/templates/platform-profile.json +148 -0
- package/templates/style-profile-template.json +58 -0
- package/templates/web-novel-cliche-lint.json +41 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# 小说创作方法论
|
|
2
|
+
|
|
3
|
+
本知识库为 novel CLI 系统提供共享方法论。入口 Skill(`/novel:continue`、`/novel:start`)在 context 组装阶段读取本目录下的 references,按需注入到各 Agent 的 prompt 中。
|
|
4
|
+
|
|
5
|
+
## 卷制滚动工作流
|
|
6
|
+
|
|
7
|
+
网文创作采用"边写边想"模式,以卷(30-50 章)为单位滚动规划:
|
|
8
|
+
|
|
9
|
+
1. **卷规划**:PlotArchitect 生成本卷大纲 + 伏笔计划 + L3 章节契约
|
|
10
|
+
2. **日更续写**:ChapterWriter → Summarizer → StyleRefiner → QualityJudge(单章流水线)
|
|
11
|
+
3. **定期检查**:一致性滑窗审计(每 5 章一次,窗口 10 章)+ 伏笔盘点(每 10 章)+ 风格漂移监控(每 5 章)
|
|
12
|
+
4. **卷末回顾**:全卷一致性报告 → 下卷铺垫建议 → 用户审核
|
|
13
|
+
|
|
14
|
+
核心循环状态机:`VOL_PLANNING → WRITING ⟲ (每章含内嵌门控+修订) → VOL_REVIEW → VOL_PLANNING`
|
|
15
|
+
|
|
16
|
+
## Spec-Driven Writing 原则
|
|
17
|
+
|
|
18
|
+
小说创作遵循"规范先行,实现随后,验收对齐规范"范式:
|
|
19
|
+
|
|
20
|
+
| 层级 | 内容 | 生成者 | 约束强度 |
|
|
21
|
+
|------|------|--------|---------|
|
|
22
|
+
| L1 世界规则 | 物理/魔法/社会硬约束 | WorldBuilder → `rules.json` | 不可违反 |
|
|
23
|
+
| L2 角色契约 | 能力边界/行为模式 | CharacterWeaver → `contracts` | 可变更需走协议 |
|
|
24
|
+
| L3 章节契约 | 前置/后置条件/验收标准 | PlotArchitect → `chapter-contracts/` | 可协商须留痕 |
|
|
25
|
+
|
|
26
|
+
验收采用双轨制:Contract Verification(合规检查 L1/L2/L3/LS,硬门槛)+ Quality Scoring(8 维度评分,软评估)。合规是编译通过,质量是 code review。
|
|
27
|
+
|
|
28
|
+
## 多线叙事体系
|
|
29
|
+
|
|
30
|
+
支持多 POV 群像、势力博弈暗线、跨卷伏笔交汇等复杂叙事结构:
|
|
31
|
+
|
|
32
|
+
- **小说级定义**:`storylines/storylines.json` 管理全部故事线(类型 + 范围 + 势力 + 桥梁关系)
|
|
33
|
+
- **卷级调度**:PlotArchitect 在卷规划时生成 `storyline-schedule.json`(volume_role: primary/secondary/seasoning + 交汇事件)
|
|
34
|
+
- **章级注入**:ChapterWriter 接收 storyline_context + concurrent_state + transition_hint
|
|
35
|
+
- **防串线**:三层策略(结构化 Context + 反串线指令 + QualityJudge 后验校验),每次续写为独立 LLM 调用
|
|
36
|
+
- **活跃线限制**:同时活跃 ≤ 4 条
|
|
37
|
+
|
|
38
|
+
## 去 AI 化四层策略
|
|
39
|
+
|
|
40
|
+
| 层 | 手段 | 执行者 |
|
|
41
|
+
|----|------|--------|
|
|
42
|
+
| L1 风格锚定 | 用户样本 → style-profile.json | StyleAnalyzer |
|
|
43
|
+
| L2 约束注入 | 黑名单 + 语癖 + 反直觉 + 句式多样 | ChapterWriter |
|
|
44
|
+
| L3 后处理 | 替换 AI 用语 + 匹配风格指纹 | StyleRefiner |
|
|
45
|
+
| L4 检测度量 | 黑名单命中率 + 句式重复率 + 风格匹配度 | QualityJudge |
|
|
46
|
+
|
|
47
|
+
核心指标:AI 黑名单命中 < 3 次/千字,相邻 5 句重复句式 < 2。
|
|
48
|
+
|
|
49
|
+
详见 `references/style-guide.md`。
|
|
50
|
+
|
|
51
|
+
## 质量评分标准
|
|
52
|
+
|
|
53
|
+
8 维度加权评分(详见 `references/quality-rubric.md`)。下表为 **legacy fallback 默认值**;实际权重以 `manifest.inline.scoring_weights` 为准(来源:`platform-profile.json.scoring` + `genre-weight-profiles.json`):
|
|
54
|
+
|
|
55
|
+
| 维度 | 默认权重 |
|
|
56
|
+
|------|------|
|
|
57
|
+
| 情节逻辑 | 18% |
|
|
58
|
+
| 角色塑造 | 18% |
|
|
59
|
+
| 沉浸感 | 15% |
|
|
60
|
+
| 风格自然度 | 15% |
|
|
61
|
+
| 伏笔处理 | 10% |
|
|
62
|
+
| 节奏 | 8% |
|
|
63
|
+
| 情感冲击 | 8% |
|
|
64
|
+
| 故事线连贯 | 8% |
|
|
65
|
+
|
|
66
|
+
门控:≥4.0 通过,3.5-3.9 二次润色,3.0-3.4 自动修订,2.0-2.9 人工审核,<2.0 强制重写。有 contract violation(confidence=high,含 LS hard)时无条件强制修订。注:LS-005(跨线实体泄漏)在 M1/M2 阶段为 soft(报告不阻断),M3 升级为 hard。
|
|
67
|
+
<!-- TODO: M3 完成后将 LS-005 直接标记为 hard 并删除此临时说明 -->
|
|
68
|
+
|
|
69
|
+
## Context 管理
|
|
70
|
+
|
|
71
|
+
各 Agent context 用量参考(非硬上限,详见 `docs/dr-workflow/novel-writer-tool/final/prd/08-orchestrator.md` §8.4 按 Agent 分列表):
|
|
72
|
+
- **ChapterWriter**:~19-24K(普通章)/ ~24-30K(交汇章)— 含大纲、摘要、状态、角色、故事线、契约
|
|
73
|
+
- **Summarizer**:~10-12K — 章节全文 + 状态 + entity_id_map
|
|
74
|
+
- **StyleRefiner**:~8K — 章节全文 + 风格 + 黑名单
|
|
75
|
+
- **QualityJudge**:~14-16K — 章节全文 + 大纲 + 角色 + 契约 + 故事线 spec
|
|
76
|
+
|
|
77
|
+
摘要替代全文 + L2 角色裁剪,确保第 500 章时 context 仍稳定。模型 context window(当前约 200K)远大于实际用量。
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# 核心 8 维度质量评分标准
|
|
2
|
+
|
|
3
|
+
本文档定义 QualityJudge 的完整评分标准。每维度 1-5 分,综合分 = 加权均值。
|
|
4
|
+
|
|
5
|
+
> **注意(动态权重)**:评分维度权重以 `manifest.inline.scoring_weights` 为准(来源:`platform-profile.json.scoring` + `genre-weight-profiles.json`)。本文各维度标题中的“权重 X”与下方固定公式仅作为 **legacy fallback 默认值**(当未提供 `scoring_weights` 时使用)。
|
|
6
|
+
|
|
7
|
+
## 1. 情节逻辑(plot_logic)— 权重 0.18
|
|
8
|
+
|
|
9
|
+
评估章节与大纲的一致性、内部逻辑、因果链完整性。
|
|
10
|
+
|
|
11
|
+
| 分数 | 标准 |
|
|
12
|
+
|------|------|
|
|
13
|
+
| 5 | 完美推进大纲目标,因果链清晰无断裂,无逻辑漏洞 |
|
|
14
|
+
| 4 | 推进大纲主要目标,因果链基本完整,可能有 1 处小瑕疵 |
|
|
15
|
+
| 3 | 大纲目标部分达成,有 1-2 处逻辑不够顺畅 |
|
|
16
|
+
| 2 | 偏离大纲方向,有明显逻辑断裂或矛盾 |
|
|
17
|
+
| 1 | 严重偏离大纲,情节混乱无逻辑 |
|
|
18
|
+
|
|
19
|
+
## 2. 角色塑造(character)— 权重 0.18
|
|
20
|
+
|
|
21
|
+
评估角色言行是否符合档案设定、性格连续性、L2 契约合规。
|
|
22
|
+
|
|
23
|
+
| 分数 | 标准 |
|
|
24
|
+
|------|------|
|
|
25
|
+
| 5 | 角色言行完全符合人设,语癖自然,性格连贯,契约无违反 |
|
|
26
|
+
| 4 | 角色基本符合人设,语癖偶有缺失,1 处细微不一致 |
|
|
27
|
+
| 3 | 角色大体符合,但有 1-2 处明显不符合性格设定 |
|
|
28
|
+
| 2 | 角色表现与人设多处矛盾,或违反 L2 契约 |
|
|
29
|
+
| 1 | 角色面目模糊、自相矛盾,或严重违反契约 |
|
|
30
|
+
|
|
31
|
+
## 3. 伏笔处理(foreshadowing)— 权重 0.10
|
|
32
|
+
|
|
33
|
+
评估伏笔的埋设自然度、推进合理性、回收满足感。
|
|
34
|
+
|
|
35
|
+
| 分数 | 标准 |
|
|
36
|
+
|------|------|
|
|
37
|
+
| 5 | 伏笔埋设隐蔽自然,推进不突兀,回收有"啊哈"感 |
|
|
38
|
+
| 4 | 伏笔处理得当,但自然度或满足感稍弱 |
|
|
39
|
+
| 3 | 伏笔存在但不够自然(过于明显或过于隐晦) |
|
|
40
|
+
| 2 | 遗漏应处理的伏笔,或伏笔处理生硬 |
|
|
41
|
+
| 1 | 完全忽视伏笔任务,或伏笔处理导致情节矛盾 |
|
|
42
|
+
|
|
43
|
+
## 4. 沉浸感(immersion)— 权重 0.15
|
|
44
|
+
|
|
45
|
+
评估画面感、氛围营造、详略得当。
|
|
46
|
+
|
|
47
|
+
| 分数 | 标准 |
|
|
48
|
+
|------|------|
|
|
49
|
+
| 5 | 文笔流畅优美,用词精准传神,修辞恰到好处 |
|
|
50
|
+
| 4 | 文笔流畅,用词准确,偶有平淡之处 |
|
|
51
|
+
| 3 | 文笔通顺,但有重复用词或表达不够精准 |
|
|
52
|
+
| 2 | 文笔平庸,用词单一,有明显语病 |
|
|
53
|
+
| 1 | 语句不通,病句频出,严重影响阅读 |
|
|
54
|
+
|
|
55
|
+
## 5. 节奏(pacing)— 权重 0.08
|
|
56
|
+
|
|
57
|
+
评估冲突强度、情节张弛、阅读节奏。
|
|
58
|
+
|
|
59
|
+
| 分数 | 标准 |
|
|
60
|
+
|------|------|
|
|
61
|
+
| 5 | 节奏精准,张弛有度,推进与留白恰到好处 |
|
|
62
|
+
| 4 | 节奏流畅,冲突有吸引力,偶有拖沓 |
|
|
63
|
+
| 3 | 节奏尚可,但部分段落拖沓或过于急促 |
|
|
64
|
+
| 2 | 节奏失衡,明显拖沓或跳跃 |
|
|
65
|
+
| 1 | 节奏混乱,无法正常推进 |
|
|
66
|
+
|
|
67
|
+
## 6. 风格自然度(style_naturalness)— 权重 0.15
|
|
68
|
+
|
|
69
|
+
评估去 AI 化效果,基于可量化指标。
|
|
70
|
+
|
|
71
|
+
| 分数 | AI 黑名单命中率 | 句式重复率(相邻 5 句) | style-profile 匹配度 |
|
|
72
|
+
|------|----------------|----------------------|---------------------|
|
|
73
|
+
| 5 | 0 次/千字 | 0 个重复句式 | 句长、对话比、修辞完全匹配 |
|
|
74
|
+
| 4 | 1-2 次/千字 | ≤ 1 个重复句式 | 大部分匹配,轻微偏差 |
|
|
75
|
+
| 3 | 3-4 次/千字 | 2 个重复句式 | 部分匹配,有偏移 |
|
|
76
|
+
| 2 | 5-7 次/千字 | ≥ 3 个重复句式 | 明显不匹配 |
|
|
77
|
+
| 1 | > 7 次/千字 | 频繁重复 | 完全不匹配 |
|
|
78
|
+
|
|
79
|
+
## 7. 情感冲击(emotional_impact)— 权重 0.08
|
|
80
|
+
|
|
81
|
+
评估情感起伏、读者代入感、情绪共鸣。
|
|
82
|
+
|
|
83
|
+
| 分数 | 标准 |
|
|
84
|
+
|------|------|
|
|
85
|
+
| 5 | 情感冲击强烈,读者强代入感,情绪共鸣持久 |
|
|
86
|
+
| 4 | 情感有起伏,读者能投入,共鸣感良好 |
|
|
87
|
+
| 3 | 情感起伏不明显,代入感一般 |
|
|
88
|
+
| 2 | 情感平板,难以产生代入感 |
|
|
89
|
+
| 1 | 情感缺失,读者无法投入 |
|
|
90
|
+
|
|
91
|
+
## 8. 故事线连贯(storyline_coherence)— 权重 0.08
|
|
92
|
+
|
|
93
|
+
评估多线叙事的切线流畅度、读者跟线难度、并发线暗示自然度。
|
|
94
|
+
|
|
95
|
+
| 分数 | 标准 |
|
|
96
|
+
|------|------|
|
|
97
|
+
| 5 | 切线无缝,读者无跟线困难,并发线暗示自然巧妙 |
|
|
98
|
+
| 4 | 切线流畅,偶有跟线小困惑,暗示基本自然 |
|
|
99
|
+
| 3 | 切线可辨识但略显突兀,或暗示过于明显/缺失 |
|
|
100
|
+
| 2 | 切线生硬,读者可能迷失,暗示不当 |
|
|
101
|
+
| 1 | 切线混乱,线索混淆,严重影响阅读 |
|
|
102
|
+
|
|
103
|
+
**注意**:单线章节(非切线章)此维度默认 4 分,仅评估与上下文的衔接自然度。
|
|
104
|
+
|
|
105
|
+
## 9. 章末钩子强度(hook_strength)— 条件启用
|
|
106
|
+
|
|
107
|
+
当 `platform-profile.json.hook_policy.required=true` 时启用该维度:
|
|
108
|
+
- **评分**:1-5 分(钩子越强分越高)
|
|
109
|
+
- **证据**:必须来自章节末尾(最后 1–2 段的短片段);建议同时写入 `hook.evidence` 与 `scores.hook_strength.evidence`(内容可相同)便于门控与审计
|
|
110
|
+
- **权重**:以 `manifest.inline.scoring_weights.weights.hook_strength` 为准;若未提供 `scoring_weights`,默认权重为 `0.0`(不计入 overall)。当 `hook_policy.required=false` 时,执行器会强制将 `hook_strength` 权重归零(即使权重档案里有非零默认值)。
|
|
111
|
+
|
|
112
|
+
## 综合分计算
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
overall = plot_logic × 0.18
|
|
116
|
+
+ character × 0.18
|
|
117
|
+
+ immersion × 0.15
|
|
118
|
+
+ foreshadowing × 0.10
|
|
119
|
+
+ pacing × 0.08
|
|
120
|
+
+ style_naturalness × 0.15
|
|
121
|
+
+ emotional_impact × 0.08
|
|
122
|
+
+ storyline_coherence × 0.08
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
若提供了 `scoring_weights`,则:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
overall = Σ(scores[dim].score × scoring_weights.weights[dim]) / Σ(scoring_weights.weights[dim]) (加权均值)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 门控决策
|
|
132
|
+
|
|
133
|
+
| 综合分范围 | 合规状态 | 行动 |
|
|
134
|
+
|-----------|---------|------|
|
|
135
|
+
| 任意 | 有 high-confidence violation | 强制修订(无论分数多高;仅 confidence="high" 触发,medium/low 记录警告不阻断) |
|
|
136
|
+
| 4.0-5.0 | 无 violation | 直接通过 |
|
|
137
|
+
| 3.5-3.9 | 无 violation | StyleRefiner 二次润色后通过 |
|
|
138
|
+
| 3.0-3.4 | 无 violation | ChapterWriter(Opus)自动修订 |
|
|
139
|
+
| 2.0-2.9 | 无 violation | 通知用户,人工审核决定重写范围 |
|
|
140
|
+
| < 2.0 | 无 violation | 强制全章重写 |
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# 去 AI 化规则详解
|
|
2
|
+
|
|
3
|
+
本文档定义 novel CLI 系统的完整去 AI 化策略,供 ChapterWriter、StyleRefiner、QualityJudge 参考。
|
|
4
|
+
|
|
5
|
+
## Layer 1: 风格锚定(输入层)
|
|
6
|
+
|
|
7
|
+
### 风格指纹提取
|
|
8
|
+
|
|
9
|
+
StyleAnalyzer 从用户样本中提取以下可量化特征:
|
|
10
|
+
|
|
11
|
+
- **avg_sentence_length**:平均句长(字数),用于校准生成文本的句式节奏
|
|
12
|
+
- **dialogue_ratio**:对话占全文比例,控制叙述与对话的平衡
|
|
13
|
+
- **rhetoric_preferences**:修辞偏好列表(频率标注),如比喻、排比、短句切换
|
|
14
|
+
- **forbidden_words**:作者从不使用的词汇(精准收录,不过度泛化)
|
|
15
|
+
- **character_speech_patterns**:角色语癖,需有样本中的具体例句支撑
|
|
16
|
+
- **writing_directives**:正向写作指令(可执行的风格指南数组),用于直接注入 ChapterWriter prompt
|
|
17
|
+
|
|
18
|
+
### 风格样本降级方案
|
|
19
|
+
|
|
20
|
+
当用户无自有样本时:
|
|
21
|
+
1. **仿写模式**(推荐):指定参考作者 → 提取风格指纹 → 标记 `source_type: "reference"`
|
|
22
|
+
2. **先写后提**:用户先写 1 章 → 再提取
|
|
23
|
+
3. **预置模板**:选择预设风格模板(轻松幽默/热血少年/细腻言情等)→ 微调
|
|
24
|
+
|
|
25
|
+
### 风格漂移监控
|
|
26
|
+
|
|
27
|
+
每 5 章提取一次当前输出的风格特征,与 style-profile.json 对比:
|
|
28
|
+
- 句长偏移 > 20% → 警告
|
|
29
|
+
- 对话比例偏移 > 15% → 警告
|
|
30
|
+
- 新出现的高频 AI 用语 → 追加到黑名单
|
|
31
|
+
|
|
32
|
+
**自动纠偏**:当漂移超阈值时,将偏离项写入 `style-drift.json`,自动注入后续 ChapterWriter 和 StyleRefiner 的 context:
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"detected_chapter": 25,
|
|
36
|
+
"drifts": [
|
|
37
|
+
{"metric": "avg_sentence_length", "baseline": 18, "current": 24, "directive": "句子过长,回归短句节奏"},
|
|
38
|
+
{"metric": "dialogue_ratio", "baseline": 0.4, "current": 0.28, "directive": "对话偏少,增加角色互动"}
|
|
39
|
+
],
|
|
40
|
+
"injected_to": ["ChapterWriter", "StyleRefiner"]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
纠偏指令会持续注入直至下次检测确认回归基线(偏移 < 10%)。
|
|
44
|
+
|
|
45
|
+
## Layer 2: 约束注入(生成层)
|
|
46
|
+
|
|
47
|
+
ChapterWriter prompt 中注入以下硬约束:
|
|
48
|
+
|
|
49
|
+
### 2.1 AI 用语黑名单
|
|
50
|
+
|
|
51
|
+
从 `ai-blacklist.json` 加载,生成时完全禁止。包含但不限于:
|
|
52
|
+
- 情感描写类:不禁、莫名、油然而生、心中暗道、嘴角微微上扬
|
|
53
|
+
- 过渡连接类:与此同时、值得一提的是、毫无疑问
|
|
54
|
+
- 形容夸张类:宛如、恍若、仿佛置身于
|
|
55
|
+
- 详见 `${NOVEL_CLI_ROOT}/templates/ai-blacklist.json`
|
|
56
|
+
|
|
57
|
+
### 2.2 角色语癖
|
|
58
|
+
|
|
59
|
+
每个重要角色至少定义 1 个口头禅或说话习惯:
|
|
60
|
+
- 口头禅出现频率:每 2-3 次对话出现 1 次(不可每句都加)
|
|
61
|
+
- 语癖需符合角色背景(文化人用文言、江湖人用俚语)
|
|
62
|
+
- 不同角色的语癖必须可区分
|
|
63
|
+
|
|
64
|
+
### 2.3 反直觉细节
|
|
65
|
+
|
|
66
|
+
每章至少 1 处"反直觉"的生活化细节,例如:
|
|
67
|
+
- 打斗中途想起锅里还炖着汤
|
|
68
|
+
- 修炼突破时被蚊子咬了一口
|
|
69
|
+
- 严肃对话中对方裤子上有个洞
|
|
70
|
+
|
|
71
|
+
目的:打破 AI 生成文本的"完美感"和"刻板感"。
|
|
72
|
+
|
|
73
|
+
### 2.4 场景描写限制
|
|
74
|
+
|
|
75
|
+
- 场景描写最多 2 句,优先用人物动作带出环境
|
|
76
|
+
- 禁止大段环境白描("空气中弥漫着……远处是……近处有……")
|
|
77
|
+
- 好的范例:`他一脚踢开歪斜的门板,霉味扑面——这地方至少荒了三年。`
|
|
78
|
+
|
|
79
|
+
### 2.5 句式多样性
|
|
80
|
+
|
|
81
|
+
- 禁止连续 3 句相同句式(如连续 3 个"他……"开头)
|
|
82
|
+
- 长短句交替:2-3 个短句后接 1 个长句,或反之
|
|
83
|
+
- 避免排比过度(连续排比 ≤ 3 项)
|
|
84
|
+
|
|
85
|
+
### 2.6 标点符号约束
|
|
86
|
+
|
|
87
|
+
LLM 对特定标点有系统性过度使用倾向,是最容易被读者感知的 AI 痕迹之一:
|
|
88
|
+
|
|
89
|
+
- **破折号(——)限频**:每千字 ≤ 1 处。LLM 极度偏好用破折号做解释性插入、情绪停顿和场景切换,频率远高于人类写手。应改用逗号、句号或重组句式
|
|
90
|
+
- ✗ `他看向远方——那是他曾经的家。` → ✓ `他看向远方。那是他曾经的家。`
|
|
91
|
+
- ✗ `门开了——是她。` → ✓ `门开了,是她。`
|
|
92
|
+
- ✗ `一切都结束了——或许吧。` → ✓ `一切都结束了。或许吧。`
|
|
93
|
+
- **省略号(……)限频**:每千字 ≤ 2 处,禁止连续两句以省略号结尾
|
|
94
|
+
- **感叹号(!)限频**:每千字 ≤ 3 处(对话内不计),叙述文中避免连续感叹
|
|
95
|
+
|
|
96
|
+
### 2.7 对话与内心活动格式
|
|
97
|
+
|
|
98
|
+
人物说话和内心活动统一使用中文双引号(""),格式如下:
|
|
99
|
+
|
|
100
|
+
- **说话**:`XX说:"我出去了。"` 或 `"我出去了。"XX甩手离开。`
|
|
101
|
+
- **内心活动**:`XX心想:"关我什么事。"` 或 `XX暗道:"这人不对劲。"`
|
|
102
|
+
- **禁止**使用单引号('')、直角引号(「」)、英文引号("")包裹对话和心理活动
|
|
103
|
+
- 引号内的句末标点在引号内:`"走吧。"` 而非 `"走吧"。`
|
|
104
|
+
|
|
105
|
+
## Layer 3: 后处理(StyleRefiner)
|
|
106
|
+
|
|
107
|
+
### 润色规则
|
|
108
|
+
|
|
109
|
+
StyleRefiner 对初稿逐项执行:
|
|
110
|
+
|
|
111
|
+
1. **黑名单扫描**:全文搜索 `ai-blacklist.json` 中所有词条
|
|
112
|
+
2. **逐个替换**:命中项替换为风格相符的自然表达,替代词需符合上下文语境
|
|
113
|
+
3. **标点频率修正**:
|
|
114
|
+
- 破折号(——)超过 1 处/千字 → 逐个替换为逗号、句号或重组句式
|
|
115
|
+
- 省略号(……)超过 2 处/千字 → 削减或改用具体描写
|
|
116
|
+
4. **句式调整**:
|
|
117
|
+
- 句长偏离 style-profile 的 avg_sentence_length > 30% 的句子进行拆分或合并
|
|
118
|
+
- 相邻 5 句中出现 ≥ 2 个相同句式 → 改写其中 1 句
|
|
119
|
+
4. **修改量控制**:总修改量 ≤ 原文 15%(字数变化比)
|
|
120
|
+
|
|
121
|
+
### 不可修改项
|
|
122
|
+
|
|
123
|
+
- 角色对话中的语癖和口头禅
|
|
124
|
+
- 情节因果链中的关键句
|
|
125
|
+
- 伏笔暗示语句
|
|
126
|
+
- 角色名、地名、术语
|
|
127
|
+
|
|
128
|
+
## Layer 4: 检测度量(QualityJudge)
|
|
129
|
+
|
|
130
|
+
### 风格自然度评分标准
|
|
131
|
+
|
|
132
|
+
| 分数 | AI 黑名单命中率 | 句式重复率 | 破折号频率 | style-profile 匹配度 |
|
|
133
|
+
|------|----------------|-----------|-----------|---------------------|
|
|
134
|
+
| 5 | 0 次/千字 | 0/5 句 | ≤ 1/千字 | 完全匹配 |
|
|
135
|
+
| 4 | 1-2 次/千字 | ≤ 1/5 句 | ≤ 2/千字 | 基本匹配 |
|
|
136
|
+
| 3 | 3-4 次/千字 | 2/5 句 | 3-4/千字 | 部分偏移 |
|
|
137
|
+
| 2 | 5-7 次/千字 | ≥ 3/5 句 | 5-6/千字 | 明显偏移 |
|
|
138
|
+
| 1 | > 7 次/千字 | 频繁重复 | > 6/千字 | 严重偏移 |
|
|
139
|
+
|
|
140
|
+
### 黑名单维护机制
|
|
141
|
+
|
|
142
|
+
- **初始化**:`${NOVEL_CLI_ROOT}/templates/ai-blacklist.json` 提供 ≥ 30 个常见 AI 高频中文用语
|
|
143
|
+
- **持续更新**:QualityJudge 检测到新高频 AI 用语时,建议追加到黑名单
|
|
144
|
+
- **用户自定义**:用户可手动添加/删除
|
|
145
|
+
- **误伤保护**:如果某个黑名单词是用户风格样本中的高频词,自动豁免
|