# 大纲生成策略
**本文引用的文件**
- [one-step-outline.strategy.ts](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts)
- [per-chapter.strategy.ts](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts)
- [base.ts](file://server/src/modules/book-generator/strategies/base.ts)
- [types.ts](file://server/src/modules/book-generator/strategies/types.ts)
- [selector.ts](file://server/src/modules/book-generator/strategies/selector.ts)
- [plan.node.ts](file://server/src/modules/book-generator/nodes/plan.node.ts)
- [full-outline.node.ts](file://server/src/modules/book-generator/nodes/full-outline.node.ts)
- [outline.node.ts](file://server/src/modules/book-generator/nodes/outline.node.ts)
- [per-chapter.node.ts](file://server/src/modules/book-generator/nodes/per-chapter.node.ts)
- [content.node.ts](file://server/src/modules/book-generator/nodes/content.node.ts)
- [graph.ts](file://server/src/modules/book-generator/graph.ts)
- [book-type-config.ts](file://server/src/modules/book-generator/book-type-config.ts)
- [utils.ts](file://server/src/modules/book-generator/utils.ts)
- [fault-tolerance.ts](file://server/src/modules/book-generator/fault-tolerance.ts)
- [README.md](file://server/src/modules/book-generator/README.md)
- [FAULT_TOLERANCE.md](file://server/src/modules/book-generator/FAULT_TOLERANCE.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“大纲生成策略”的技术文档,聚焦两类策略:
- OneStepOutlineStrategy 单步大纲生成策略:一次 AI 生成完整树形大纲(章→节→小节),随后对所有叶节点并行生成内容。
- PerChapterStrategy 逐章生成策略:先生成章大纲,再对每章独立生成内部结构与内容,章节间可并行。
文档将从输入参数处理、输出格式规范、质量控制机制入手,深入解析两者的实现原理、数据流、并行与进度控制,并给出参数调优、错误恢复与质量评估建议及使用案例与最佳实践。
## 项目结构
围绕“大纲生成策略”,相关代码主要位于 server/src/modules/book-generator/strategies 与 nodes 目录,配合 LangGraph 状态机与容错层,形成可扩展、可观测、可恢复的生成流水线。
```mermaid
graph TB
subgraph "策略层"
S1["one-step-outline.strategy.ts"]
S2["per-chapter.strategy.ts"]
ST["types.ts"]
SEL["selector.ts"]
SB["base.ts"]
end
subgraph "节点层"
N1["plan.node.ts"]
N2["full-outline.node.ts"]
N3["outline.node.ts"]
N4["per-chapter.node.ts"]
N5["content.node.ts"]
end
subgraph "基础设施"
G["graph.ts"]
FT["fault-tolerance.ts"]
CFG["book-type-config.ts"]
U["utils.ts"]
end
S1 --> N1
S1 --> N2
S1 --> N5
S2 --> N1
S2 --> N3
S2 --> N4
S1 --> SB
S2 --> SB
SB --> G
SB --> FT
N1 --> CFG
N2 --> CFG
N3 --> CFG
N4 --> CFG
N5 --> CFG
N5 --> U
```
图示来源
- [one-step-outline.strategy.ts:1-56](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L1-L56)
- [per-chapter.strategy.ts:1-56](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L1-L56)
- [base.ts:1-73](file://server/src/modules/book-generator/strategies/base.ts#L1-L73)
- [types.ts:1-29](file://server/src/modules/book-generator/strategies/types.ts#L1-L29)
- [selector.ts:1-81](file://server/src/modules/book-generator/strategies/selector.ts#L1-L81)
- [plan.node.ts:1-201](file://server/src/modules/book-generator/nodes/plan.node.ts#L1-L201)
- [full-outline.node.ts:1-243](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L1-L243)
- [outline.node.ts:1-129](file://server/src/modules/book-generator/nodes/outline.node.ts#L1-L129)
- [per-chapter.node.ts:1-324](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L1-L324)
- [content.node.ts:1-546](file://server/src/modules/book-generator/nodes/content.node.ts#L1-L546)
- [graph.ts:1-83](file://server/src/modules/book-generator/graph.ts#L1-L83)
- [fault-tolerance.ts:1-387](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L387)
- [book-type-config.ts:1-133](file://server/src/modules/book-generator/book-type-config.ts#L1-L133)
- [utils.ts:1-24](file://server/src/modules/book-generator/utils.ts#L1-L24)
章节来源
- [README.md:1-215](file://server/src/modules/book-generator/README.md#L1-L215)
## 核心组件
- 策略接口与类型
- 策略名称与接口定义见 [types.ts:1-29](file://server/src/modules/book-generator/strategies/types.ts#L1-L29),统一约束 generate(bookId, topic, bookScale, genLevel)。
- 策略选择器
- 通过 [selector.ts:1-81](file://server/src/modules/book-generator/strategies/selector.ts#L1-L81) 注册并切换策略,默认当前推荐策略为 DeepPlanParallel(策略选择器亦支持运行时切换)。
- 基础执行器
- [base.ts:1-73](file://server/src/modules/book-generator/strategies/base.ts#L1-L73) 提供统一的 LangGraph 编译、流式执行、进度监控与错误处理模板。
- LangGraph 状态机
- [graph.ts:1-83](file://server/src/modules/book-generator/graph.ts#L1-L83) 定义状态字段(bookId、topic、bookScale、genLevel、progress、currentChapter、completedChapters、finished、error 等)与 reducer 策略。
- 容错层
- [fault-tolerance.ts:1-387](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L387) 提供 AI 调用重试、节点超时、进度监控、自动恢复与用户通知。
章节来源
- [types.ts:1-29](file://server/src/modules/book-generator/strategies/types.ts#L1-L29)
- [selector.ts:1-81](file://server/src/modules/book-generator/strategies/selector.ts#L1-L81)
- [base.ts:1-73](file://server/src/modules/book-generator/strategies/base.ts#L1-L73)
- [graph.ts:1-83](file://server/src/modules/book-generator/graph.ts#L1-L83)
- [fault-tolerance.ts:1-387](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L387)
## 架构总览
两策略共享同一执行框架:先规划(planBookNode),再生成大纲,最后生成内容;差异在于大纲生成与内容生成阶段的并行化程度与并发控制。
```mermaid
sequenceDiagram
participant C as "控制器/调用方"
participant STR as "OneStepOutlineStrategy/PerChapterStrategy"
participant BASE as "runGraphWorkflow"
participant G as "LangGraph"
participant N1 as "planBookNode"
participant N2 as "大纲/内容节点"
participant DB as "bookStore/数据库"
C->>STR : 调用 generate(bookId, topic, bookScale, genLevel)
STR->>BASE : 初始化状态并编译工作流
BASE->>G : graph.stream(initialState)
G->>N1 : 执行规划
N1-->>G : 返回规划结果/进度
G->>N2 : 执行大纲/内容生成
N2->>DB : 写入大纲/内容
DB-->>N2 : 确认写入
N2-->>G : 返回阶段性进度/状态
G-->>BASE : 流式步骤输出
BASE-->>C : 完成/失败,更新进度与阶段
```
图示来源
- [one-step-outline.strategy.ts:21-56](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L21-L56)
- [per-chapter.strategy.ts:21-56](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L21-L56)
- [base.ts:26-72](file://server/src/modules/book-generator/strategies/base.ts#L26-L72)
- [graph.ts:23-82](file://server/src/modules/book-generator/graph.ts#L23-L82)
## 详细组件分析
### OneStepOutlineStrategy 单步大纲生成策略
- 工作流
- plan_book → generate_full_outline → write_chapters
- 一次性生成完整树形大纲(章→节→小节),随后对所有叶节点并行生成内容。
- 输入参数处理
- generate(bookId, topic, bookScale, genLevel):其中 genLevel 由规划节点决定或用户覆盖。
- 规划节点 [plan.node.ts:145-200](file://server/src/modules/book-generator/nodes/plan.node.ts#L145-L200) 会根据 bookScale 与用户输入决定最终 genLevel。
- 输出格式规范
- 一步大纲节点 [full-outline.node.ts:135-218](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L135-L218) 输出 JSON,包含 mainTheme、structureLogic、chapters(含 sections/subsections)。
- 内容生成节点 [content.node.ts:102-332](file://server/src/modules/book-generator/nodes/content.node.ts#L102-L332) 为叶节点生成正文,按 genLevel 决定消息构造与内容清理。
- 质量控制机制
- 容错层:AI 调用重试、节点超时、进度监控、自动恢复。
- 字数预算与上限:章节预算偏差检测、全书累计字数上限、全局绝对上限。
- 额度与配额:订阅配额检查与音频分钟消耗。
- 并行与进度
- 内容生成采用并行池(默认并发数见 [content.node.ts:444-545](file://server/src/modules/book-generator/nodes/content.node.ts#L444-L545)),按叶节点并行推进。
- 进度常量 [utils.ts:15-23](file://server/src/modules/book-generator/utils.ts#L15-L23) 控制 outline/content 阶段的进度区间。
```mermaid
flowchart TD
Start(["开始:OneStepOutlineStrategy.generate"]) --> Plan["planBookNode
生成规划(genLevel)"]
Plan --> FullOutline["generateFullOutlineNode
一次性生成完整大纲(JSON)"]
FullOutline --> FindLeaves["定位所有叶节点(level=3)"]
FindLeaves --> ParallelWrite["并行写入叶节点内容
writeChaptersParallelNode"]
ParallelWrite --> AudioTrigger["完成后触发音频生成"]
AudioTrigger --> End(["结束"])
```
图示来源
- [one-step-outline.strategy.ts:25-54](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L25-L54)
- [plan.node.ts:145-200](file://server/src/modules/book-generator/nodes/plan.node.ts#L145-L200)
- [full-outline.node.ts:135-218](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L135-L218)
- [content.node.ts:444-545](file://server/src/modules/book-generator/nodes/content.node.ts#L444-L545)
- [utils.ts:15-23](file://server/src/modules/book-generator/utils.ts#L15-L23)
章节来源
- [one-step-outline.strategy.ts:1-56](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L1-L56)
- [full-outline.node.ts:1-243](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L1-L243)
- [content.node.ts:1-546](file://server/src/modules/book-generator/nodes/content.node.ts#L1-L546)
- [utils.ts:1-24](file://server/src/modules/book-generator/utils.ts#L1-L24)
### PerChapterStrategy 逐章生成策略
- 工作流
- plan_book → generate_outline → per_chapter(每章独立生成内部结构+内容)
- 章节间可并行执行(受 MAX_CONCURRENCY 限制)。
- 输入参数处理
- 与 OneStepOutlineStrategy 相同,先规划 genLevel,再生成章大纲。
- 输出格式规范
- 章大纲节点 [outline.node.ts:14-128](file://server/src/modules/book-generator/nodes/outline.node.ts#L14-L128) 输出章节列表(含 number/title/summary/keyPoints/estimatedWords),并入库 level=1。
- 逐章节点 [per-chapter.node.ts:92-233](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L92-L233) 为每章生成完整内容(Markdown),并按 genLevel 创建节/小节索引。
- 质量控制机制
- 容错层:AI 调用重试、节点超时、进度监控、自动恢复。
- 章节数校验:允许 ±20% 浮动,超出范围进行截断或补充默认章节。
- 内容写入验证:写入后二次校验,失败则重试。
- 并行与进度
- 逐章处理采用串行推进(避免并发写入竞争),但可在外部调度层面对多本书或批次进行并行。
- 进度常量 [utils.ts:15-23](file://server/src/modules/book-generator/utils.ts#L15-L23) 控制 outline/content 阶段的进度区间。
```mermaid
flowchart TD
Start2(["开始:PerChapterStrategy.generate"]) --> Plan2["planBookNode
生成规划(genLevel)"]
Plan2 --> Outline2["generateOutlineNode
生成章大纲(JSON)"]
Outline2 --> LoopChapters["遍历每章(perChapterNode)"]
LoopChapters --> BuildMsg["构建单章提示(含规划/上下文)"]
BuildMsg --> CallLLM["调用LLM生成内容(JSON/纯文本)"]
CallLLM --> Parse["解析内容并写入数据库"]
Parse --> Verify["写入验证(失败重试)"]
Verify --> Next["下一章"]
Next --> |完成| End2(["结束"])
```
图示来源
- [per-chapter.strategy.ts:25-54](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L25-L54)
- [outline.node.ts:14-128](file://server/src/modules/book-generator/nodes/outline.node.ts#L14-L128)
- [per-chapter.node.ts:92-233](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L92-L233)
- [utils.ts:15-23](file://server/src/modules/book-generator/utils.ts#L15-L23)
章节来源
- [per-chapter.strategy.ts:1-56](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L1-L56)
- [outline.node.ts:1-129](file://server/src/modules/book-generator/nodes/outline.node.ts#L1-L129)
- [per-chapter.node.ts:1-324](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L1-L324)
- [utils.ts:1-24](file://server/src/modules/book-generator/utils.ts#L1-L24)
### 策略对比与适用场景
- 适用场景
- OneStepOutlineStrategy:适合追求“快出结果”的场景,一次性生成完整大纲,随后并行填充内容,整体吞吐更高。
- PerChapterStrategy:适合对“章节质量”要求更高的场景,每章独立生成,便于局部迭代与质量把关。
- 性能差异
- OneStepOutlineStrategy:总调用次数约为 1(规划)+1(大纲)+N(内容);内容阶段并行度高,吞吐更快。
- PerChapterStrategy:总调用次数约为 1(规划)+1(大纲)+N(章);每章独立生成,整体时延更稳定,但并行度受限于外部调度。
- 资源消耗
- OneStepOutlineStrategy:内存与并发压力集中在内容生成阶段,需关注数据库写入与音频生成并发。
- PerChapterStrategy:每章生成相对均衡,但总调用次数更多,需关注 LLM 调用与队列压力。
章节来源
- [one-step-outline.strategy.ts:7-11](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L7-L11)
- [per-chapter.strategy.ts:7-11](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L7-L11)
## 依赖分析
- 策略与节点耦合
- OneStepOutlineStrategy 依赖 planBookNode、generateFullOutlineNode、writeChaptersNode;PerChapterStrategy 依赖 planBookNode、generateOutlineNode、perChapterNode。
- 基础设施依赖
- 均依赖 base.ts 的 runGraphWorkflow,统一 LangGraph 编译、流式执行、进度监控与错误处理。
- 容错层 fault-tolerance.ts 提供统一的 AI 调用重试、节点超时、进度监控与自动恢复。
- 配置与工具
- book-type-config.ts 提供书籍规模、章节数与字数范围等配置;utils.ts 提供进度常量与字数统计。
```mermaid
graph LR
STR1["OneStepOutlineStrategy"] --> |调用| PLAN["planBookNode"]
STR1 --> |调用| FOUT["generateFullOutlineNode"]
STR1 --> |调用| WCON["writeChaptersNode"]
STR2["PerChapterStrategy"] --> |调用| PLAN
STR2 --> |调用| OUT["generateOutlineNode"]
STR2 --> |调用| PCH["perChapterNode"]
BASE["runGraphWorkflow"] --> STR1
BASE --> STR2
BASE --> FT["fault-tolerance.ts"]
PLAN --> CFG["book-type-config.ts"]
FOUT --> CFG
OUT --> CFG
PCH --> CFG
WCON --> CFG
WCON --> U["utils.ts"]
```
图示来源
- [one-step-outline.strategy.ts:13-19](file://server/src/modules/book-generator/strategies/one-step-outline.strategy.ts#L13-L19)
- [per-chapter.strategy.ts:13-19](file://server/src/modules/book-generator/strategies/per-chapter.strategy.ts#L13-L19)
- [base.ts:26-72](file://server/src/modules/book-generator/strategies/base.ts#L26-L72)
- [fault-tolerance.ts:1-387](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L387)
- [book-type-config.ts:1-133](file://server/src/modules/book-generator/book-type-config.ts#L1-L133)
- [utils.ts:1-24](file://server/src/modules/book-generator/utils.ts#L1-L24)
章节来源
- [selector.ts:12-20](file://server/src/modules/book-generator/strategies/selector.ts#L12-L20)
- [base.ts:1-73](file://server/src/modules/book-generator/strategies/base.ts#L1-L73)
## 性能考量
- 并发与吞吐
- OneStepOutlineStrategy 的内容并行池(默认并发数见 [content.node.ts:444-545](file://server/src/modules/book-generator/nodes/content.node.ts#L444-L545))可显著提升吞吐;需结合数据库写入能力与音频生成队列容量进行调优。
- PerChapterStrategy 的逐章处理在外部调度层面可并行多本书,但单书内部仍为串行推进。
- 字数与配额
- 章节预算偏差检测与全书累计字数上限(见 [content.node.ts:255-281](file://server/src/modules/book-generator/nodes/content.node.ts#L255-L281) 与 [book-type-config.ts:10-132](file://server/src/modules/book-generator/book-type-config.ts#L10-L132))可避免超预算与资源浪费。
- 订阅配额检查与音频分钟消耗(见 [content.node.ts](file://server/src/modules/book-generator/nodes/content.node.ts#L181-L195, L283-L289))确保成本可控。
- 超时与重试
- 节点超时配置(见 [fault-tolerance.ts:27-38](file://server/src/modules/book-generator/fault-tolerance.ts#L27-L38))与 AI 调用重试(见 [fault-tolerance.ts:68-123](file://server/src/modules/book-generator/fault-tolerance.ts#L68-L123))降低不稳定因素对整体性能的影响。
章节来源
- [content.node.ts:255-281](file://server/src/modules/book-generator/nodes/content.node.ts#L255-L281)
- [book-type-config.ts:10-132](file://server/src/modules/book-generator/book-type-config.ts#L10-L132)
- [fault-tolerance.ts:27-38](file://server/src/modules/book-generator/fault-tolerance.ts#L27-L38)
- [fault-tolerance.ts:68-123](file://server/src/modules/book-generator/fault-tolerance.ts#L68-L123)
## 故障排查指南
- 常见问题与定位
- AI 调用失败:检查重试日志与数据库 errorMsg 字段,确认是否触发自动恢复。
- 节点超时:核对节点超时配置与执行时间,必要时延长超时或优化提示词。
- 长时间无响应:进度监控器会在 10/20/30 分钟发出告警,随后尝试自动恢复。
- 内容写入失败:逐章节点对写入进行二次验证,失败会重试;若持续失败,检查数据库连接与并发写入。
- 容错机制
- AI 调用重试(指数退避)、节点超时、进度监控、自动恢复与用户通知详见 [fault-tolerance.ts:1-387](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L387) 与 [FAULT_TOLERANCE.md:1-334](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L1-L334)。
- 快速恢复
- 若达到最大恢复次数,系统会标记最终失败并提示手动操作;可重新发起生成任务。
章节来源
- [fault-tolerance.ts:188-261](file://server/src/modules/book-generator/fault-tolerance.ts#L188-L261)
- [FAULT_TOLERANCE.md:86-164](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L86-L164)
## 结论
- OneStepOutlineStrategy 更适合“快速产出、高吞吐”的场景,通过一次性生成完整大纲与并行内容生成实现高效交付。
- PerChapterStrategy 更适合“质量优先、可控迭代”的场景,通过逐章生成与写入验证确保每章内容质量。
- 两者共享统一的容错层与状态机,具备完善的错误恢复与进度监控能力,适合在生产环境长期运行。
## 附录
### 参数调优指南
- 策略选择
- 默认策略为 DeepPlanParallel(策略选择器),可通过运行时切换策略(见 [selector.ts:42-56](file://server/src/modules/book-generator/strategies/selector.ts#L42-L56))。
- 并发与超时
- OneStepOutlineStrategy:调整内容并行池并发数(见 [content.node.ts:444-545](file://server/src/modules/book-generator/nodes/content.node.ts#L444-L545))与节点超时(见 [fault-tolerance.ts:27-38](file://server/src/modules/book-generator/fault-tolerance.ts#L27-L38))。
- PerChapterStrategy:外部调度可并行多本书,单书内部仍为串行推进。
- 字数与配额
- 章节预算偏差阈值与全书上限(见 [content.node.ts:255-281](file://server/src/modules/book-generator/nodes/content.node.ts#L255-L281) 与 [book-type-config.ts:10-132](file://server/src/modules/book-generator/book-type-config.ts#L10-L132))可根据业务目标调整。
- 订阅配额检查与音频分钟消耗(见 [content.node.ts](file://server/src/modules/book-generator/nodes/content.node.ts#L181-L195, L283-L289))需与产品定价策略匹配。
### 输出格式规范
- 一步大纲 JSON(见 [full-outline.node.ts:65-99](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L65-L99)):包含 mainTheme、structureLogic、chapters(含 sections/subsections)。
- 章大纲 JSON(见 [outline.node.ts:48-104](file://server/src/modules/book-generator/nodes/outline.node.ts#L48-L104)):包含 chapters(number/title/summary/keyPoints/estimatedWords)。
- 单章内容 JSON(见 [per-chapter.node.ts:76-80](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L76-L80)):包含 content、wordCount;若非 JSON 则直接按纯文本处理。
### 实际使用案例与最佳实践
- 快速试读/短文:选择 OneStepOutlineStrategy,利用并行内容生成快速产出。
- 教程/教材:选择 PerChapterStrategy,逐章生成确保结构与质量,便于后续修订。
- 大规模生成:结合外部调度对多本书并行,单书内部采用 PerChapterStrategy,提高稳定性与可控性。
- 质量评估:依据章节预算偏差检测与全书累计字数上限,结合用户反馈与音频生成完成度进行综合评估。
章节来源
- [selector.ts:23-33](file://server/src/modules/book-generator/strategies/selector.ts#L23-L33)
- [content.node.ts:255-281](file://server/src/modules/book-generator/nodes/content.node.ts#L255-L281)
- [book-type-config.ts:10-132](file://server/src/modules/book-generator/book-type-config.ts#L10-L132)
- [full-outline.node.ts:65-99](file://server/src/modules/book-generator/nodes/full-outline.node.ts#L65-L99)
- [outline.node.ts:48-104](file://server/src/modules/book-generator/nodes/outline.node.ts#L48-L104)
- [per-chapter.node.ts:76-80](file://server/src/modules/book-generator/nodes/per-chapter.node.ts#L76-L80)