本文档引用的文件
大纲节点实现是音频书籍生成系统的核心组成部分,负责构建和管理书籍的层次化结构。本文档深入分析了三个关键大纲节点文件:full-outline.node.ts、outline.node.ts和sections.node.ts的设计原理和实现细节。
该系统采用LangGraph状态机驱动的工作流,支持多种生成策略,包括逐步生成、一步生成和逐章生成。每个策略都有其特定的应用场景和性能特征,能够适应不同规模和复杂度的书籍生成需求。
系统采用模块化的架构设计,主要包含以下核心模块:
graph TB
subgraph "工作流引擎"
GS[GraphState 状态定义]
WF[工作流编排]
end
subgraph "节点实现"
ON[大纲节点]
SN[章节节点]
CN[内容节点]
PCN[逐章节点]
FON[一步大纲节点]
end
subgraph "支撑组件"
PS[解析器]
PT[提示词构建器]
BC[配置管理]
FT[容错机制]
end
subgraph "数据存储"
BS[BookStore]
PRISMA[(Prisma ORM)]
end
GS --> WF
WF --> ON
WF --> SN
WF --> CN
WF --> PCN
WF --> FON
ON --> PS
SN --> PS
CN --> PS
PCN --> PS
ON --> PT
SN --> PT
CN --> PT
PCN --> PT
ON --> BC
SN --> BC
CN --> BC
PCN --> BC
ON --> FT
SN --> FT
CN --> FT
PCN --> FT
ON --> BS
SN --> BS
CN --> BS
PCN --> BS
FON --> BS
BS --> PRISMA
图表来源
章节来源
系统使用LangGraph的Annotation模式实现状态管理,确保状态的原子性和一致性:
classDiagram
class GraphState {
+string bookId
+string|number userId
+string topic
+string bookScale
+number genLevel
+string description
+string|undefined bookPlan
+number currentChapter
+number[] completedChapters
+boolean finished
+string|undefined error
+number progress
+number[] failedChapters
}
class ProgressConstants {
+number OUTLINE_DONE
+number SECTIONS_DONE
+number SUBSECTIONS_DONE
+number CONTENT_START
+number CONTENT_END
+number FOREWORD_DONE
+number AFTERWORD_DONE
}
class StateReducers {
+maxReducer(prev, update) number
+appendReducer(prev, update) array
}
GraphState --> ProgressConstants : "使用"
GraphState --> StateReducers : "实现"
图表来源
BookStore提供统一的数据访问接口,支持复杂的查询和事务操作:
classDiagram
class BookStore {
+create(data) Promise~Book~
+getById(id, filterPublic, userId) Promise~Book|null~
+getAllByUser(userId, includePublic) Promise~Book[]~
+update(id, data) Promise~Book|null~
+createChapters(bookId, chapters) Promise~void~
+createChapterItem(bookIdNum, item, parentId, level) Promise~number~
+updateChapter(bookId, chapterNumber, data) Promise~Chapter|null~
+updateChapterById(id, data) Promise~Chapter|null~
+getChapters(bookId) Promise~Chapter[]~
+getChapterTree(bookId) Promise~any[]~
+generateChapterAudio(bookId, chapterNumber, userId) Promise~object|null~
+generateChapterAudioById(chapterId, userId) Promise~object|null~
}
class Chapter {
+string id
+string bookId
+number number
+string title
+string content
+number wordCount
+string summary
+Date generatedAt
+string error
+string audioUrl
+number audioDuration
+string videoUrl
+number videoDuration
+boolean isPublic
+number level
+number parentId
+string genStage
}
class Book {
+string id
+string title
+string description
+string genStage
+number progress
+Chapter[] chapters
+BookOutline outline
}
BookStore --> Book : "管理"
BookStore --> Chapter : "管理"
图表来源
章节来源
系统采用分层架构设计,支持多种生成策略的灵活切换:
graph TB
subgraph "策略层"
S1[SequentialStrategy<br/>逐步生成策略]
S2[OneStepOutlineStrategy<br/>一步大纲策略]
S3[PerChapterStrategy<br/>逐章生成策略]
end
subgraph "节点层"
N1[planBookNode]
N2[generateOutlineNode]
N3[generateSectionsNode]
N4[generateSubsectionsNode]
N5[writeChaptersNode]
N6[generateFullOutlineNode]
N7[perChapterNode]
end
subgraph "支撑层"
P1[prompts/builder.ts]
P2[parsers/*]
P3[book-type-config.ts]
P4[fault-tolerance.ts]
end
S1 --> N1
S1 --> N2
S1 --> N3
S1 --> N4
S1 --> N5
S2 --> N1
S2 --> N6
S2 --> N5
S3 --> N1
S3 --> N2
S3 --> N7
N1 --> P1
N2 --> P1
N3 --> P1
N4 --> P1
N5 --> P1
N6 --> P1
N7 --> P1
N1 --> P2
N2 --> P2
N3 --> P2
N4 --> P2
N5 --> P2
N6 --> P2
N7 --> P2
N1 --> P3
N2 --> P3
N3 --> P3
N4 --> P3
N5 --> P3
N6 --> P3
N7 --> P3
N1 --> P4
N2 --> P4
N3 --> P4
N4 --> P4
N5 --> P4
N6 --> P4
N7 --> P4
图表来源
一步大纲生成节点实现了高效的树形大纲生成,通过单次AI调用完成章、节、小节的完整结构创建。
flowchart TD
Start([开始生成]) --> LoadPlan["加载规划结果"]
LoadPlan --> BuildPrompt["构建提示词"]
BuildPrompt --> CallLLM["调用LLM生成大纲"]
CallLLM --> ParseResponse["解析JSON响应"]
ParseResponse --> ValidateData{"数据有效?"}
ValidateData --> |否| ErrorHandle["错误处理"]
ValidateData --> |是| SaveOutline["保存大纲到数据库"]
SaveOutline --> CreateChapters["创建章节记录"]
CreateChapters --> CreateSections["创建节记录"]
CreateSections --> CreateSubsections["创建小节记录"]
CreateSubsections --> UpdateProgress["更新进度状态"]
UpdateProgress --> End([完成])
ErrorHandle --> End
图表来源
erDiagram
BOOK {
int id PK
string title
string description
string genStage
number progress
string outlineJson
}
BOOK_CHAPTER {
int id PK
int bookId FK
int number
string title
string summary
string keyPoints
int estimatedWords
int level
int parentId
string genStage
}
BOOK ||--o{ BOOK_CHAPTER : "包含"
BOOK_CHAPTER ||--o{ BOOK_CHAPTER : "父子关系"
图表来源
章节来源
传统的大纲生成节点遵循逐步细化的原则,先生成章级大纲,再逐级扩展到节和小节。
sequenceDiagram
participant Client as 客户端
participant Node as 大纲节点
participant LLM as LLM服务
participant Parser as 解析器
participant Store as 存储层
Client->>Node : 请求生成大纲
Node->>Node : 分析规划结果
Node->>LLM : 发送提示词
LLM-->>Node : 返回大纲JSON
Node->>Parser : 解析响应
Parser-->>Node : 返回结构化数据
Node->>Node : 校验章节数范围
Node->>Store : 保存大纲数据
Node->>Store : 创建章节记录
Node-->>Client : 返回完成状态
图表来源
系统实现了智能的章节数量控制,确保生成的大纲符合预期规模:
| 书籍类型 | 目标章节数 | 允许范围 | 处理策略 |
|---|---|---|---|
| 34万字 | 35章 | 28-42章 | 截断/补充 |
| 21万字 | 27章 | 22-33章 | 截断/补充 |
| 13万字 | 17章 | 14-20章 | 截断/补充 |
| 8万字 | 12章 | 10-14章 | 截断/补充 |
| 5万字 | 9章 | 7-11章 | 截断/补充 |
章节来源
节和小节生成节点实现了分层的大纲扩展机制,支持两级细化生成。
graph LR
subgraph "节生成策略"
A1[逐章生成] --> A2[为每章生成节]
A1 --> A3[支持重试机制]
A1 --> A4[数据库记录验证]
end
subgraph "小节生成策略"
B1[逐节生成] --> B2[为每节生成小节]
B1 --> B3[智能重试]
B1 --> B4[父子关系验证]
end
subgraph "通用特性"
C1[进度跟踪]
C2[错误处理]
C3[状态同步]
C4[数据持久化]
end
A1 --> C1
A1 --> C2
A1 --> C3
A1 --> C4
B1 --> C1
B1 --> C2
B1 --> C3
B1 --> C4
图表来源
系统为每个层级的生成都实现了智能重试机制:
flowchart TD
Start([开始生成]) --> FirstTry["第一次尝试"]
FirstTry --> ParseSuccess{"解析成功?"}
ParseSuccess --> |是| SaveData["保存数据"]
ParseSuccess --> |否| SecondTry["第二次尝试"]
SecondTry --> ParseSuccess2{"解析成功?"}
ParseSuccess2 --> |是| SaveData
ParseSuccess2 --> |否| ThirdTry["第三次尝试"]
ThirdTry --> ParseSuccess3{"解析成功?"}
ParseSuccess3 --> |是| SaveData
ParseSuccess3 --> |否| SkipChapter["跳过章节"]
SaveData --> NextChapter["下一个章节"]
SkipChapter --> NextChapter
NextChapter --> End([完成])
图表来源
章节来源
内容生成节点负责将大纲转换为实际的书籍内容,支持多种生成模式和优化策略。
graph TB
subgraph "内容生成流程"
A[查找叶节点] --> B[构建父节点映射]
B --> C[额度检查]
C --> D{额度充足?}
D --> |否| E[中断生成]
D --> |是| F[内容生成]
F --> G[字数统计]
G --> H[安全防护]
H --> I[音频生成触发]
I --> J[进度更新]
end
subgraph "并行处理"
K[AsyncPool] --> L[并发执行]
L --> M[结果聚合]
end
F --> K
图表来源
系统实现了三层安全防护机制:
章节来源
逐章生成节点实现了每章独立生成的策略,支持章节间的并行处理。
sequenceDiagram
participant Master as 主节点
participant Chapter1 as 章节1
participant Chapter2 as 章节2
participant ChapterN as 章节N
Master->>Chapter1 : 处理第1章
Chapter1->>Chapter1 : 生成章节内容
Chapter1->>Master : 完成第1章
Master->>Chapter2 : 处理第2章
Chapter2->>Chapter2 : 生成章节内容
Chapter2->>Master : 完成第2章
Master->>ChapterN : 处理第N章
ChapterN->>ChapterN : 生成章节内容
ChapterN->>Master : 完成第N章
Master->>Master : 更新整体进度
图表来源
章节来源
系统采用了松耦合的设计原则,各组件之间的依赖关系清晰明确:
graph TB
subgraph "核心依赖"
A[GraphState] --> B[LangGraph]
C[BookStore] --> D[Prisma ORM]
E[Prompts Builder] --> F[动态提示词]
G[Parsers] --> H[JSON解析]
end
subgraph "容错依赖"
I[Fault Tolerance] --> J[AI重试]
I --> K[节点超时]
I --> L[进度监控]
end
subgraph "配置依赖"
M[Book Type Config] --> N[书籍类型]
M --> O[字数限制]
P[Utils] --> Q[进度常量]
end
A --> I
C --> M
E --> P
G --> I
图表来源
章节来源
系统实现了多层次的并发优化:
flowchart TD
Start([请求到达]) --> CheckCache["检查缓存"]
CheckCache --> CacheHit{"缓存命中?"}
CacheHit --> |是| ReturnCache["返回缓存数据"]
CacheHit --> |否| ProcessRequest["处理请求"]
ProcessRequest --> UpdateCache["更新缓存"]
UpdateCache --> ReturnResult["返回结果"]
ReturnCache --> End([完成])
ReturnResult --> End
系统采用了渐进式的内存管理模式:
症状:大纲生成节点抛出解析失败错误
排查步骤:
解决方案:
// 示例:增强的错误处理
try {
const outline = parseOutline(response);
if (!outline) {
throw new Error('解析失败,检查LLM响应格式');
}
} catch (error) {
console.error('解析错误:', error);
// 回退到备用解析器
const fallback = fallbackParse(response);
return fallback;
}
症状:内容生成节点出现字数超限或额度不足
排查步骤:
解决方案:
// 示例:额度检查逻辑
const quotaCheck = await checkQuotaForWords(userId, currentWordCount);
if (!quotaCheck.sufficient) {
console.warn('额度不足,中断生成');
await markGenerationInterrupted(bookId, target.number, currentWordCount);
return {
currentChapter: target.number,
progress: calculateProgress(),
error: '额度不足'
};
}
症状:章节记录创建失败或数据丢失
排查步骤:
解决方案:
// 示例:重试机制
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
try {
const result = await prisma.bookChapter.upsert(...);
return result;
} catch (error) {
if (attempt === MAX_RETRIES - 1) throw error;
await sleep(DELAY_BASE * Math.pow(2, attempt));
}
}
章节来源
大纲节点实现展现了现代AI驱动内容生成系统的最佳实践。通过模块化设计、容错机制和性能优化,系统能够在保证质量的同时提供高效的服务。
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| maxRetries | number | 3 | AI调用最大重试次数 |
| initialDelayMs | number | 2000 | 初始延迟毫秒数 |
| maxDelayMs | number | 30000 | 最大延迟毫秒数 |
| backoffMultiplier | number | 2 | 指数退避倍数 |
| nodeTimeout | object | - | 各节点超时配置 |