本文档引用的文件
本项目是一个基于LangGraph的AI内容生成引擎,专注于自动化生成结构化的书籍内容,涵盖从大纲规划、章节创作到音频/视频生成的完整工作流。系统采用策略模式灵活切换生成路径,结合容错机制、配额控制与状态机管理,确保在复杂场景下的稳定性与可扩展性。
项目主要位于 server/src/modules/book-generator 目录下,围绕“策略-节点-状态”的三层架构组织:
strategies/ 管理不同的生成策略(串行、一步大纲+并行内容、逐章内聚)nodes/ 实现具体的工作节点(大纲生成、章节内容生成等)graph.ts 定义LangGraph状态与进度管理book-generator.store.ts 封装数据库访问与状态推进容错层:通过 fault-tolerance.ts 提供重试、超时与自动恢复能力
graph TB
subgraph "策略层"
S1["selector.ts<br/>策略选择器"]
S2["per-chapter.strategy.ts<br/>逐章内聚策略"]
S3["types.ts<br/>策略接口定义"]
end
subgraph "节点层"
N1["full-outline.node.ts<br/>一步大纲节点"]
N2["content.node.ts<br/>内容生成节点"]
end
subgraph "状态层"
G["graph.ts<br/>LangGraph状态定义"]
end
subgraph "控制层"
C1["book-generator.controller.ts<br/>批量生成API"]
C2["langgraph-controller.ts<br/>LangGraph主流程API"]
end
subgraph "存储层"
D["book-generator.store.ts<br/>数据库访问与树形结构构建"]
end
subgraph "容错层"
F["fault-tolerance.ts<br/>重试/超时/恢复"]
end
S1 --> S2
S2 --> N1
S2 --> N2
N1 --> G
N2 --> G
C1 --> D
C2 --> D
D --> F
图表来源
章节来源
章节来源
系统采用“策略-节点-状态”三层架构,结合LangGraph实现多步骤工作流。策略层通过选择器动态切换;节点层负责具体步骤的执行;状态层通过Annotation定义状态与reducer,确保进度与状态的正确收敛。
classDiagram
class LangGraphBookGenerator {
+generate(bookId, topic, bookScale, genLevel) Promise~void~
}
class GenerationStrategy {
<<interface>>
+name StrategyName
+description string
+generate(bookId, topic, bookScale, genLevel) Promise~void~
}
class PerChapterStrategy {
+name "per-chapter"
+description "逐章内聚:先生成章大纲,然后每章独立并行生成结构+内容"
+generate(bookId, topic, bookScale, genLevel) Promise~void~
}
class GraphState {
+bookId string
+topic string
+bookScale string
+genLevel number
+progress number
+finished boolean
+error string
+completedChapters number[]
+failedChapters number[]
}
class FullOutlineNode {
+generateFullOutlineNode(state) Promise~Partial~State~~
}
class ContentNode {
+writeChaptersNode(state) Promise~Partial~State~~
+writeChaptersParallelNode(state) Promise~Partial~State~~
}
class BatchGenerationOrchestrator {
+execute() Promise~Result~
+setCancellationFlag(taskId) void
+clearCancellationFlag(taskId) void
+isTaskCancelled(taskId) boolean
}
class BookStore {
+create(data) Promise~Book~
+getById(id, filterPublic, userId) Promise~Book|null~
+update(id, data) Promise~Book|null~
+getChapterTree(bookId) Promise~any[]~
+updateChapterById(id, data) Promise~Chapter|null~
+generateChapterAudioById(chapterId, userId) Promise~Result~
}
class FaultTolerance {
+callLLMWithRetry(messages, modelId, context) Promise~string~
+executeNodeWithTimeout(fn, timeoutMs) Promise~T~
+startProgressMonitor(bookId) void
+attemptAutoRecovery(bookId) Promise~void~
}
LangGraphBookGenerator --> GenerationStrategy : "委派"
GenerationStrategy <|.. PerChapterStrategy : "实现"
PerChapterStrategy --> GraphState : "使用"
PerChapterStrategy --> FullOutlineNode : "调用"
PerChapterStrategy --> ContentNode : "调用"
BatchGenerationOrchestrator --> BookStore : "读写"
BatchGenerationOrchestrator --> FaultTolerance : "容错"
BookStore --> FaultTolerance : "配合"
图表来源
关键点:
独立大纲生成函数(不依赖策略)
sequenceDiagram
participant Client as "客户端"
participant API as "LangGraph API"
participant Gen as "LangGraphBookGenerator"
participant Sel as "策略选择器"
participant Strat as "PerChapterStrategy"
participant Graph as "LangGraph工作流"
Client->>API : POST /api/book-generator/langgraph/books
API->>Gen : generate(bookId, topic, bookScale, genLevel)
Gen->>Sel : getCurrentStrategy()
Sel-->>Gen : PerChapterStrategy
Gen->>Strat : generate(...)
Strat->>Graph : 初始化状态与节点
Graph-->>Strat : 执行工作流
Strat-->>Gen : 完成
Gen-->>API : 返回结果
API-->>Client : 生成完成
图表来源
章节来源
用途:作为LangGraph工作流的共享状态,贯穿整个生成过程
flowchart TD
Start(["初始化状态"]) --> SetFields["设置基础字段<br/>bookId/topic/bookScale/genLevel"]
SetFields --> InitProgress["初始化进度与完成状态"]
InitProgress --> RunNodes["执行节点<br/>逐步更新状态"]
RunNodes --> ProgressUpdate{"进度是否增加?"}
ProgressUpdate --> |是| UpdateMax["使用maxReducer<br/>只增不减"]
ProgressUpdate --> |否| KeepPrev["保持原值"]
UpdateMax --> NextNode["下一个节点"]
KeepPrev --> NextNode
NextNode --> Finished{"finished为true?"}
Finished --> |是| End(["结束"])
Finished --> |否| RunNodes
图表来源
章节来源
容错:带超时与重试包装,失败时标记失败阶段
sequenceDiagram
participant Node as "fullOutlineNode"
participant LLM as "LLM调用"
participant Store as "BookStore"
participant FT as "容错层"
Node->>FT : executeNodeWithTimeout(...)
FT->>LLM : callLLMWithRetry(buildFullOutlinePrompt,...)
LLM-->>FT : JSON大纲
FT-->>Node : 大纲数据
Node->>Store : update(bookId, outlineJson, progress)
Node->>Store : createChapters/Items(各级章节)
Node-->>Node : 返回进度完成
图表来源
章节来源
状态推进:通过advanceChapter/regenerateChapter安全推进/回退状态
flowchart TD
Start(["开始内容生成"]) --> FindLeaves["查找叶节点"]
FindLeaves --> FilterTargets["过滤未完成目标"]
FilterTargets --> Loop{"遍历目标"}
Loop --> |检查配额| QuotaCheck["checkQuotaForWords"]
QuotaCheck --> |不足| Interrupt["中断生成并标记"]
QuotaCheck --> |充足| BuildMsg["构建消息短文/长篇"]
BuildMsg --> CallLLM["LLM调用工具/非工具"]
CallLLM --> Clean["内容清洗与截断"]
Clean --> Consume["消耗音频分钟配额"]
Consume --> Save["保存内容并推进状态"]
Save --> Loop
Loop --> |完成| Done(["完成"])
图表来源
章节来源
超时:各阶段内置轮询检查与超时控制
sequenceDiagram
participant Orchestrator as "编排器"
participant Store as "BookStore"
participant LLM as "LangGraph生成"
participant TTS as "TTS服务"
participant Merge as "合并服务"
participant WS as "WebSocket"
Orchestrator->>WS : 推送阶段开始
Orchestrator->>Store : 获取书籍与章节树
Orchestrator->>LLM : 异步启动LangGraph生成
Orchestrator->>Store : 轮询检查内容完成
Orchestrator->>TTS : 生成音频并行
Orchestrator->>Merge : 合并音频/视频
Orchestrator->>WS : 推送阶段完成
Orchestrator-->>Orchestrator : 返回结果
图表来源
章节来源
章节来源
外部依赖
TTS/视频生成服务:内容产物生成
graph TB
Strat["策略层"] --> Nodes["节点层"]
Nodes --> State["状态层"]
Orchestrator["编排器"] --> Store["存储层"]
Orchestrator --> FT["容错层"]
Store --> DB["数据库"]
Orchestrator --> WS["WebSocket"]
图表来源
章节来源
[本节为通用性能建议,无需特定文件引用]
章节来源
本AI内容生成引擎通过策略化设计与LangGraph工作流,实现了从大纲规划到内容创作再到多媒体产物的完整自动化。结合容错机制、配额控制与状态机管理,系统在复杂场景下具备良好的稳定性与可扩展性。建议在生产环境中持续优化并发参数、监控指标与成本控制策略,以获得最佳的生成体验。
[本节为总结性内容,无需特定文件引用]
章节来源
章节来源
章节来源