1710 lines
31 KiB
Markdown
1710 lines
31 KiB
Markdown
我想接入api 去写,以最少人干预写出最优秀的小说,按你上面的流程要怎么设计? 我是要ai自动化流水线工作
|
||
|
||
|
||
可以,应该设计成一个**AI 小说自动化流水线系统**,不是“一个提示词写到底”。
|
||
|
||
你要的目标是:
|
||
|
||
> 人工只负责输入选题、审核关键关卡、决定是否继续;
|
||
> AI 自动完成选题深化、世界观、人设、卷纲、章纲、正文、润色、质检、上下文记忆更新、伏笔管理。
|
||
|
||
API 层面建议用**结构化输出**,不要让 AI 随便返回一大段文本。OpenAI 官方文档里 Structured Outputs 的作用就是让模型输出严格符合你提供的 JSON Schema,适合这种流水线系统做稳定数据交换。([OpenAI 开发者][1])
|
||
|
||
---
|
||
|
||
# 一、整体系统架构
|
||
|
||
你可以把它设计成 12 个 Agent。
|
||
|
||
不是 12 个模型,而是 12 个不同职责的 AI 调用节点。
|
||
|
||
```text
|
||
用户输入题材
|
||
↓
|
||
01 选题分析 Agent
|
||
↓
|
||
02 故事总策划 Agent
|
||
↓
|
||
03 世界观设定 Agent
|
||
↓
|
||
04 人物档案 Agent
|
||
↓
|
||
05 全书结构 Agent
|
||
↓
|
||
06 分卷细纲 Agent
|
||
↓
|
||
07 章节卡 Agent
|
||
↓
|
||
08 正文写作 Agent
|
||
↓
|
||
09 文风润色 Agent
|
||
↓
|
||
10 连贯性检查 Agent
|
||
↓
|
||
11 质量评分 Agent
|
||
↓
|
||
12 记忆更新 Agent
|
||
↓
|
||
进入下一章循环
|
||
```
|
||
|
||
核心原则:
|
||
|
||
**设计类 Agent 输出 JSON。**
|
||
**正文类 Agent 输出 Markdown / 纯文本。**
|
||
**检查类 Agent 输出评分 + 问题 + 修复建议。**
|
||
**记忆类 Agent 输出压缩后的上下文数据。**
|
||
|
||
---
|
||
|
||
# 二、最少人工干预的完整流程
|
||
|
||
## 阶段 1:人工只输入一个创作 Brief
|
||
|
||
用户只填这些:
|
||
|
||
```json
|
||
{
|
||
"title_working": "请确认她来过",
|
||
"genre": "现实主义悬疑",
|
||
"target_words": 50000,
|
||
"target_chapters": 30,
|
||
"audience": "喜欢现实主义、悬疑、人间观察的读者",
|
||
"style": "克制、电影感、认真优雅、深度共鸣",
|
||
"for_adaptation": true,
|
||
"avoid": ["狗血", "打脸复仇", "豪门虐恋", "低俗猎奇", "强行爽点"],
|
||
"core_idea": "AI仿真人视频修复师调查一个系统中不存在的火灾救人女工"
|
||
}
|
||
```
|
||
|
||
然后系统自动跑。
|
||
|
||
---
|
||
|
||
## 阶段 2:自动生成小说圣经
|
||
|
||
小说圣经就是全书的最高设定文档。
|
||
|
||
里面包括:
|
||
|
||
小说核心;
|
||
世界观;
|
||
主角;
|
||
配角;
|
||
反派系统;
|
||
情绪主线;
|
||
主题表达;
|
||
全书结构;
|
||
风格规则;
|
||
禁用桥段;
|
||
伏笔库;
|
||
短剧改编方向。
|
||
|
||
这一阶段最好不要直接写正文。
|
||
|
||
因为正文还没写,AI 很容易边写边改设定。
|
||
|
||
---
|
||
|
||
## 阶段 3:自动生成全书粗纲
|
||
|
||
比如你要 50 章,它先生成:
|
||
|
||
```text
|
||
第 1 卷:发现她不存在,1–10 章
|
||
第 2 卷:每个人记忆里的她都不同,11–20 章
|
||
第 3 卷:林照是共用身份,21–35 章
|
||
第 4 卷:火灾真相与名字确认,36–50 章
|
||
```
|
||
|
||
这里要控制:
|
||
|
||
每卷目标;
|
||
每卷核心冲突;
|
||
每卷反转;
|
||
每卷人物成长;
|
||
每卷伏笔推进;
|
||
每卷结尾爆点。
|
||
|
||
---
|
||
|
||
## 阶段 4:自动生成当前卷细纲
|
||
|
||
不要一次生成 300 章细纲。
|
||
|
||
最稳的是:
|
||
|
||
**全书粗纲一次生成。**
|
||
**每卷细纲分批生成。**
|
||
**每 10 章做一次校准。**
|
||
|
||
这样不会把后面写死,也能防止前后矛盾。
|
||
|
||
---
|
||
|
||
## 阶段 5:章节自动循环
|
||
|
||
每一章自动执行下面流程:
|
||
|
||
```text
|
||
读取小说圣经
|
||
读取人物档案
|
||
读取当前卷纲
|
||
读取最近 3–5 章摘要
|
||
读取伏笔库
|
||
读取本章章节卡
|
||
↓
|
||
生成正文初稿
|
||
↓
|
||
文风润色
|
||
↓
|
||
连续性检查
|
||
↓
|
||
质量评分
|
||
↓
|
||
如果评分不达标,自动重写或局部修复
|
||
↓
|
||
入库正文
|
||
↓
|
||
更新章节摘要、人物状态、伏笔状态、世界观增量
|
||
↓
|
||
生成下一章章节卡
|
||
```
|
||
|
||
人工只需要在这些节点介入:
|
||
|
||
选题是否通过;
|
||
小说圣经是否通过;
|
||
每卷大纲是否通过;
|
||
每 10 章是否继续;
|
||
最终稿是否发布。
|
||
|
||
---
|
||
|
||
# 三、数据库怎么设计
|
||
|
||
你这个系统最好不要把内容只写在本地文件里。
|
||
|
||
建议数据库表这样设计。
|
||
|
||
---
|
||
|
||
## 1. projects 小说项目表
|
||
|
||
```sql
|
||
CREATE TABLE novel_projects (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
title VARCHAR(255),
|
||
genre VARCHAR(100),
|
||
target_words INT,
|
||
target_chapters INT,
|
||
status VARCHAR(50),
|
||
style TEXT,
|
||
core_idea TEXT,
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## 2. novel_bible 小说圣经表
|
||
|
||
```sql
|
||
CREATE TABLE novel_bible (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
version INT,
|
||
bible_json JSON,
|
||
bible_text LONGTEXT,
|
||
is_active TINYINT DEFAULT 1,
|
||
created_at DATETIME
|
||
);
|
||
```
|
||
|
||
这个表保存最高设定。
|
||
|
||
每次大改都创建新版本,不要覆盖旧版本。
|
||
|
||
---
|
||
|
||
## 3. characters 人物档案表
|
||
|
||
```sql
|
||
CREATE TABLE novel_characters (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
name VARCHAR(100),
|
||
role_type VARCHAR(50),
|
||
profile_json JSON,
|
||
current_state_json JSON,
|
||
forbidden_changes_json JSON,
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
重点是 `current_state_json`。
|
||
|
||
比如人物当前是否知道真相、是否受伤、和主角关系进展到哪里,都放这里。
|
||
|
||
---
|
||
|
||
## 4. volumes 分卷表
|
||
|
||
```sql
|
||
CREATE TABLE novel_volumes (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
volume_no INT,
|
||
title VARCHAR(255),
|
||
start_chapter INT,
|
||
end_chapter INT,
|
||
outline_json JSON,
|
||
status VARCHAR(50),
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## 5. chapters 章节表
|
||
|
||
```sql
|
||
CREATE TABLE novel_chapters (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
volume_id BIGINT,
|
||
chapter_no INT,
|
||
title VARCHAR(255),
|
||
chapter_card_json JSON,
|
||
draft_text LONGTEXT,
|
||
polished_text LONGTEXT,
|
||
final_text LONGTEXT,
|
||
summary_text TEXT,
|
||
quality_score DECIMAL(4,2),
|
||
status VARCHAR(50),
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
正文流程里至少保留三版:
|
||
|
||
初稿;
|
||
润色稿;
|
||
终稿。
|
||
|
||
---
|
||
|
||
## 6. plot_memory 上下文记忆表
|
||
|
||
```sql
|
||
CREATE TABLE novel_plot_memory (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
chapter_no INT,
|
||
memory_type VARCHAR(50),
|
||
memory_json JSON,
|
||
memory_text TEXT,
|
||
created_at DATETIME
|
||
);
|
||
```
|
||
|
||
`memory_type` 可以是:
|
||
|
||
```text
|
||
chapter_summary
|
||
character_update
|
||
world_update
|
||
relationship_update
|
||
timeline_update
|
||
location_update
|
||
```
|
||
|
||
---
|
||
|
||
## 7. foreshadows 伏笔表
|
||
|
||
```sql
|
||
CREATE TABLE novel_foreshadows (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
code VARCHAR(50),
|
||
first_chapter INT,
|
||
expected_reveal_chapter INT,
|
||
actual_reveal_chapter INT,
|
||
surface_text TEXT,
|
||
hidden_truth TEXT,
|
||
status VARCHAR(50),
|
||
related_characters JSON,
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
`status` 建议:
|
||
|
||
```text
|
||
planned
|
||
introduced
|
||
developing
|
||
revealed
|
||
abandoned
|
||
```
|
||
|
||
---
|
||
|
||
## 8. quality_reports 质检报告表
|
||
|
||
```sql
|
||
CREATE TABLE novel_quality_reports (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
project_id BIGINT,
|
||
chapter_no INT,
|
||
score_json JSON,
|
||
problems_json JSON,
|
||
suggestions_json JSON,
|
||
pass_status TINYINT,
|
||
created_at DATETIME
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
# 四、API 调用流水线设计
|
||
|
||
你可以把每个 Agent 做成一个任务节点。
|
||
|
||
## 1. generateNovelBible
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"project_brief": {},
|
||
"market_rules": {},
|
||
"style_constraints": []
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"core_logline": "",
|
||
"theme": "",
|
||
"worldbuilding": {},
|
||
"characters": [],
|
||
"plot_structure": [],
|
||
"foreshadows": [],
|
||
"writing_rules": [],
|
||
"forbidden_rules": []
|
||
}
|
||
```
|
||
|
||
这个必须用 JSON Schema 约束。
|
||
|
||
---
|
||
|
||
## 2. generateVolumeOutline
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"novel_bible": {},
|
||
"target_volume_no": 1,
|
||
"chapter_range": [1, 10],
|
||
"previous_volume_summary": ""
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"volume_title": "",
|
||
"volume_goal": "",
|
||
"main_conflict": "",
|
||
"chapter_outlines": [
|
||
{
|
||
"chapter_no": 1,
|
||
"title": "",
|
||
"goal": "",
|
||
"main_events": [],
|
||
"conflict": "",
|
||
"foreshadows_to_introduce": [],
|
||
"foreshadows_to_advance": [],
|
||
"ending_hook": ""
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 3. generateChapterCard
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"novel_bible_summary": "",
|
||
"character_states": [],
|
||
"recent_chapter_summaries": [],
|
||
"active_foreshadows": [],
|
||
"volume_outline": {},
|
||
"target_chapter_no": 1
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"chapter_no": 1,
|
||
"title": "",
|
||
"target_words": 2500,
|
||
"pov": "",
|
||
"scenes": [
|
||
{
|
||
"scene_no": 1,
|
||
"location": "",
|
||
"time": "",
|
||
"characters": [],
|
||
"scene_goal": "",
|
||
"conflict": "",
|
||
"key_actions": [],
|
||
"key_dialogue_points": [],
|
||
"visual_motifs": []
|
||
}
|
||
],
|
||
"must_happen": [],
|
||
"must_not_happen": [],
|
||
"ending_hook": ""
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 4. writeChapterDraft
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"novel_bible_summary": "",
|
||
"style_rules": [],
|
||
"character_profiles": [],
|
||
"character_current_states": [],
|
||
"recent_summaries": [],
|
||
"chapter_card": {},
|
||
"forbidden_rules": []
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"chapter_no": 1,
|
||
"title": "",
|
||
"draft_text": "",
|
||
"self_notes": ""
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 5. polishChapter
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"draft_text": "",
|
||
"style_rules": [],
|
||
"target_style": "克制、电影感、认真优雅",
|
||
"forbidden_rules": []
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"polished_text": "",
|
||
"changes_summary": []
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 6. continuityCheck
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"novel_bible": {},
|
||
"characters": [],
|
||
"recent_summaries": [],
|
||
"foreshadows": [],
|
||
"chapter_text": ""
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"has_conflict": false,
|
||
"conflicts": [],
|
||
"character_drift": [],
|
||
"timeline_errors": [],
|
||
"setting_errors": [],
|
||
"foreshadow_errors": [],
|
||
"fix_suggestions": []
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 7. qualityScore
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"chapter_text": "",
|
||
"chapter_card": {},
|
||
"quality_standard": {
|
||
"plot": 20,
|
||
"character": 20,
|
||
"style": 20,
|
||
"emotion": 20,
|
||
"adaptability": 20
|
||
}
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"total_score": 86,
|
||
"scores": {
|
||
"plot": 17,
|
||
"character": 18,
|
||
"style": 17,
|
||
"emotion": 16,
|
||
"adaptability": 18
|
||
},
|
||
"problems": [],
|
||
"rewrite_required": false,
|
||
"rewrite_plan": []
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 8. updateMemory
|
||
|
||
输入:
|
||
|
||
```json
|
||
{
|
||
"chapter_no": 1,
|
||
"chapter_text": "",
|
||
"previous_memory": {},
|
||
"existing_foreshadows": []
|
||
}
|
||
```
|
||
|
||
输出:
|
||
|
||
```json
|
||
{
|
||
"chapter_summary": "",
|
||
"character_updates": [],
|
||
"world_updates": [],
|
||
"relationship_updates": [],
|
||
"timeline_update": "",
|
||
"location_update": "",
|
||
"new_foreshadows": [],
|
||
"updated_foreshadows": [],
|
||
"next_chapter_must_continue": []
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
# 五、最关键:自动重写机制
|
||
|
||
你不能只生成一次就入库。
|
||
|
||
要有自动质检闭环。
|
||
|
||
```text
|
||
正文初稿
|
||
↓
|
||
质检评分
|
||
↓
|
||
如果 score >= 85:通过
|
||
如果 75 <= score < 85:局部修复
|
||
如果 score < 75:整章重写
|
||
如果连续重写 3 次仍不通过:进入人工审核
|
||
```
|
||
|
||
建议评分标准:
|
||
|
||
| 项目 | 分数 |
|
||
| ------ | -: |
|
||
| 剧情推进 | 20 |
|
||
| 人物一致性 | 20 |
|
||
| 情绪张力 | 20 |
|
||
| 文风质量 | 20 |
|
||
| 伏笔与结构 | 10 |
|
||
| 短剧改编潜力 | 10 |
|
||
|
||
合格线建议 85 分。
|
||
|
||
---
|
||
|
||
# 六、上下文怎么自动管理
|
||
|
||
重点不是把所有正文都塞进 API。
|
||
|
||
你要做三层记忆。
|
||
|
||
---
|
||
|
||
## 第一层:永久设定记忆
|
||
|
||
每次都要带,但要压缩。
|
||
|
||
包括:
|
||
|
||
小说一句话核心;
|
||
世界规则;
|
||
主角核心人设;
|
||
主要人物不可改动项;
|
||
风格规则;
|
||
禁用桥段。
|
||
|
||
控制在 1500–2500 字。
|
||
|
||
---
|
||
|
||
## 第二层:近期剧情记忆
|
||
|
||
每次写新章,带最近 3–5 章摘要。
|
||
|
||
比如:
|
||
|
||
```text
|
||
第12章:岑青发现旧签到簿中“林照”有五种笔迹……
|
||
第13章:姚知知画出五双手……
|
||
第14章:陈淑蘅第一次承认林照不是一个人……
|
||
```
|
||
|
||
控制在 1000–2000 字。
|
||
|
||
---
|
||
|
||
## 第三层:检索式记忆
|
||
|
||
不是每次都带全部,而是根据当前章节检索相关内容。
|
||
|
||
比如本章涉及陈淑蘅,就从数据库取:
|
||
|
||
陈淑蘅人物档案;
|
||
陈淑蘅最近状态;
|
||
她相关的伏笔;
|
||
她上次出场章节摘要;
|
||
她不能说出的秘密。
|
||
|
||
这部分可以用向量数据库,也可以先用 MySQL 简单检索。
|
||
|
||
早期版本建议先用 MySQL,不要一开始就复杂化。
|
||
|
||
---
|
||
|
||
# 七、自动写作主流程伪代码
|
||
|
||
```js
|
||
async function runNovelPipeline(projectId) {
|
||
const project = await getProject(projectId);
|
||
|
||
// 1. 如果没有小说圣经,先生成
|
||
if (!project.hasBible) {
|
||
const bible = await callAgent("generateNovelBible", {
|
||
project_brief: project.brief
|
||
});
|
||
await saveBible(projectId, bible);
|
||
}
|
||
|
||
// 2. 获取当前章节
|
||
const nextChapterNo = await getNextChapterNo(projectId);
|
||
|
||
// 3. 确保当前卷纲存在
|
||
const volume = await ensureVolumeOutline(projectId, nextChapterNo);
|
||
|
||
// 4. 生成章节卡
|
||
const context = await buildChapterContext(projectId, nextChapterNo);
|
||
|
||
const chapterCard = await callAgent("generateChapterCard", {
|
||
novel_bible_summary: context.bibleSummary,
|
||
character_states: context.characterStates,
|
||
recent_chapter_summaries: context.recentSummaries,
|
||
active_foreshadows: context.activeForeshadows,
|
||
volume_outline: volume.outline,
|
||
target_chapter_no: nextChapterNo
|
||
});
|
||
|
||
await saveChapterCard(projectId, nextChapterNo, chapterCard);
|
||
|
||
// 5. 写正文 + 自动质检
|
||
let finalText = null;
|
||
let finalScore = 0;
|
||
let attempts = 0;
|
||
|
||
while (attempts < 3) {
|
||
attempts++;
|
||
|
||
const draft = await callAgent("writeChapterDraft", {
|
||
...context,
|
||
chapter_card: chapterCard
|
||
});
|
||
|
||
const polished = await callAgent("polishChapter", {
|
||
draft_text: draft.draft_text,
|
||
style_rules: context.styleRules
|
||
});
|
||
|
||
const check = await callAgent("continuityCheck", {
|
||
...context,
|
||
chapter_text: polished.polished_text
|
||
});
|
||
|
||
const score = await callAgent("qualityScore", {
|
||
chapter_text: polished.polished_text,
|
||
chapter_card: chapterCard
|
||
});
|
||
|
||
if (!check.has_conflict && score.total_score >= 85) {
|
||
finalText = polished.polished_text;
|
||
finalScore = score.total_score;
|
||
break;
|
||
}
|
||
|
||
await saveQualityReport(projectId, nextChapterNo, {
|
||
check,
|
||
score,
|
||
attempts
|
||
});
|
||
}
|
||
|
||
if (!finalText) {
|
||
await markChapterNeedHumanReview(projectId, nextChapterNo);
|
||
return;
|
||
}
|
||
|
||
// 6. 保存正文
|
||
await saveFinalChapter(projectId, nextChapterNo, finalText, finalScore);
|
||
|
||
// 7. 更新记忆库
|
||
const memoryUpdate = await callAgent("updateMemory", {
|
||
chapter_no: nextChapterNo,
|
||
chapter_text: finalText,
|
||
previous_memory: context.memory,
|
||
existing_foreshadows: context.activeForeshadows
|
||
});
|
||
|
||
await updateNovelMemory(projectId, nextChapterNo, memoryUpdate);
|
||
|
||
// 8. 进入下一章
|
||
await markChapterCompleted(projectId, nextChapterNo);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
# 八、Agent 调用封装建议
|
||
|
||
不要在代码里到处写 prompt。
|
||
|
||
你要建一张 `agent_prompts` 表。
|
||
|
||
```sql
|
||
CREATE TABLE agent_prompts (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
agent_name VARCHAR(100),
|
||
version INT,
|
||
system_prompt LONGTEXT,
|
||
user_prompt_template LONGTEXT,
|
||
output_schema JSON,
|
||
model_name VARCHAR(100),
|
||
temperature DECIMAL(3,2),
|
||
max_output_tokens INT,
|
||
is_active TINYINT DEFAULT 1,
|
||
created_at DATETIME
|
||
);
|
||
```
|
||
|
||
这样以后你调提示词,不用改代码。
|
||
|
||
每个 Agent 可以有不同模型和温度。
|
||
|
||
建议:
|
||
|
||
| Agent | 温度 | 输出 |
|
||
| ----- | --: | ---- |
|
||
| 总策划 | 0.7 | JSON |
|
||
| 世界观 | 0.5 | JSON |
|
||
| 人物档案 | 0.6 | JSON |
|
||
| 卷纲 | 0.5 | JSON |
|
||
| 章节卡 | 0.5 | JSON |
|
||
| 正文写作 | 0.8 | Text |
|
||
| 润色 | 0.7 | Text |
|
||
| 连贯性检查 | 0.2 | JSON |
|
||
| 质量评分 | 0.2 | JSON |
|
||
| 记忆更新 | 0.2 | JSON |
|
||
|
||
设计类要稳。
|
||
正文类要有创造力。
|
||
检查类要低温度。
|
||
|
||
---
|
||
|
||
# 九、后台页面怎么设计
|
||
|
||
你后台需要这些页面。
|
||
|
||
## 1. 小说项目列表
|
||
|
||
显示:
|
||
|
||
标题;
|
||
题材;
|
||
目标字数;
|
||
当前章节;
|
||
总评分;
|
||
状态;
|
||
最近更新时间。
|
||
|
||
按钮:
|
||
|
||
生成圣经;
|
||
生成下一章;
|
||
自动连写 10 章;
|
||
暂停;
|
||
人工审核。
|
||
|
||
---
|
||
|
||
## 2. 小说圣经页面
|
||
|
||
可查看和编辑:
|
||
|
||
世界观;
|
||
主角;
|
||
人物;
|
||
卷结构;
|
||
风格规则;
|
||
禁用规则。
|
||
|
||
这个页面很重要。
|
||
人工主要在这里把方向控死。
|
||
|
||
---
|
||
|
||
## 3. 章节生产页面
|
||
|
||
显示:
|
||
|
||
章节卡;
|
||
初稿;
|
||
润色稿;
|
||
质检报告;
|
||
终稿。
|
||
|
||
按钮:
|
||
|
||
重写本章;
|
||
局部润色;
|
||
通过入库;
|
||
回滚上一版。
|
||
|
||
---
|
||
|
||
## 4. 伏笔管理页面
|
||
|
||
显示:
|
||
|
||
伏笔编号;
|
||
首次出现;
|
||
预计回收;
|
||
当前状态;
|
||
关联人物;
|
||
是否逾期未回收。
|
||
|
||
建议加红色提醒:
|
||
|
||
“预计第 20 章回收,但当前已写到第 28 章仍未回收。”
|
||
|
||
---
|
||
|
||
## 5. 人物状态页面
|
||
|
||
显示每个人:
|
||
|
||
当前身份;
|
||
当前目标;
|
||
已知信息;
|
||
隐藏秘密;
|
||
关系变化;
|
||
最后出场章节;
|
||
禁止改动项。
|
||
|
||
这样防止 AI 把人写崩。
|
||
|
||
---
|
||
|
||
## 6. 质量监控页面
|
||
|
||
每章评分折线:
|
||
|
||
剧情推进;
|
||
人物一致性;
|
||
情绪张力;
|
||
文风;
|
||
伏笔;
|
||
改编潜力。
|
||
|
||
如果连续 3 章低于 80 分,系统暂停自动写作,进入人工审核。
|
||
|
||
---
|
||
|
||
# 十、最小可行版本 MVP
|
||
|
||
你不要一开始做太复杂。
|
||
|
||
第一版可以只做 6 个 Agent。
|
||
|
||
```text
|
||
1 小说圣经 Agent
|
||
2 章节卡 Agent
|
||
3 正文写作 Agent
|
||
4 质检 Agent
|
||
5 修复 Agent
|
||
6 记忆更新 Agent
|
||
```
|
||
|
||
第一版流程:
|
||
|
||
```text
|
||
用户输入题材
|
||
↓
|
||
生成小说圣经
|
||
↓
|
||
生成 30 章细纲
|
||
↓
|
||
循环:
|
||
生成章节卡
|
||
写正文
|
||
质检
|
||
不合格修复
|
||
保存
|
||
更新记忆
|
||
```
|
||
|
||
第一版数据库只需要:
|
||
|
||
```text
|
||
projects
|
||
novel_bible
|
||
chapters
|
||
characters
|
||
foreshadows
|
||
plot_memory
|
||
quality_reports
|
||
agent_prompts
|
||
```
|
||
|
||
够用了。
|
||
|
||
---
|
||
|
||
# 十一、最重要的提示词模板设计
|
||
|
||
你后台每个 Agent 都需要一套固定 Prompt。
|
||
|
||
下面是可以直接放进系统的核心版本。
|
||
|
||
---
|
||
|
||
## 1. 小说圣经 Agent Prompt
|
||
|
||
```text
|
||
你是专业长篇小说总策划、网文主编、文学作家、剧作结构师和影视导演。
|
||
你的任务不是写正文,而是为一部可长期稳定创作的小说建立“小说圣经”。
|
||
|
||
你必须输出结构化 JSON,不得输出 JSON 之外的解释文字。
|
||
|
||
设计要求:
|
||
1. 故事必须具备长篇连载能力。
|
||
2. 主线清晰,人物弧光明确。
|
||
3. 设定不能互相矛盾。
|
||
4. 不能使用低级狗血、打脸复仇、无脑爽点、低俗猎奇。
|
||
5. 必须设计人物禁止改动项。
|
||
6. 必须设计伏笔库。
|
||
7. 必须设计分卷结构。
|
||
8. 必须考虑后续可改编短剧或视频。
|
||
|
||
用户创作 Brief:
|
||
{{project_brief}}
|
||
|
||
请输出:
|
||
core_logline
|
||
theme
|
||
worldbuilding
|
||
main_characters
|
||
supporting_characters
|
||
antagonist_system
|
||
volume_structure
|
||
foreshadow_plan
|
||
writing_rules
|
||
forbidden_rules
|
||
adaptation_notes
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 章节卡 Agent Prompt
|
||
|
||
```text
|
||
你是长篇小说章节导演。
|
||
你的任务是根据小说圣经、当前卷纲、人物状态、最近章节摘要和伏笔库,设计下一章章节卡。
|
||
你不得写正文,只能设计本章执行方案。
|
||
|
||
要求:
|
||
1. 本章必须承接上一章。
|
||
2. 本章必须推动主线,不能水剧情。
|
||
3. 本章至少完成一个剧情推进、一个人物变化或一个伏笔推进。
|
||
4. 不得改变人物设定。
|
||
5. 不得提前揭露未到时机的秘密。
|
||
6. 结尾必须有钩子,但不能狗血。
|
||
|
||
小说圣经摘要:
|
||
{{bible_summary}}
|
||
|
||
人物当前状态:
|
||
{{character_states}}
|
||
|
||
最近章节摘要:
|
||
{{recent_summaries}}
|
||
|
||
当前伏笔:
|
||
{{active_foreshadows}}
|
||
|
||
目标章节:
|
||
{{chapter_no}}
|
||
|
||
请输出 JSON:
|
||
chapter_no
|
||
title
|
||
chapter_goal
|
||
scenes
|
||
must_happen
|
||
must_not_happen
|
||
foreshadows_to_add
|
||
foreshadows_to_advance
|
||
foreshadows_to_resolve
|
||
ending_hook
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 正文写作 Agent Prompt
|
||
|
||
```text
|
||
你是专业小说家。
|
||
请严格根据章节卡创作正文。
|
||
|
||
必须遵守:
|
||
1. 不得修改小说圣经核心设定。
|
||
2. 不得改变人物性格和当前状态。
|
||
3. 不得提前揭露秘密。
|
||
4. 不得新增无关核心势力、境界、人物。
|
||
5. 不得用巧合强行推动剧情。
|
||
6. 不得写水剧情。
|
||
7. 对白必须符合人物身份。
|
||
8. 场景必须有画面感。
|
||
9. 每一场戏都要推动剧情、人物或伏笔。
|
||
10. 文风必须符合指定风格。
|
||
|
||
小说圣经摘要:
|
||
{{bible_summary}}
|
||
|
||
人物档案:
|
||
{{character_profiles}}
|
||
|
||
人物当前状态:
|
||
{{character_states}}
|
||
|
||
最近章节摘要:
|
||
{{recent_summaries}}
|
||
|
||
章节卡:
|
||
{{chapter_card}}
|
||
|
||
风格要求:
|
||
{{style_rules}}
|
||
|
||
禁止事项:
|
||
{{forbidden_rules}}
|
||
|
||
请创作本章正文,字数 {{target_words}} 字左右。
|
||
只输出正文,不要解释。
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 质检 Agent Prompt
|
||
|
||
```text
|
||
你是严苛的小说主编和连续性审稿人。
|
||
你的任务是检查本章是否合格,不负责夸奖。
|
||
|
||
检查维度:
|
||
1. 是否违背小说圣经。
|
||
2. 是否人物行为崩坏。
|
||
3. 是否时间线冲突。
|
||
4. 是否伏笔遗漏或提前暴露。
|
||
5. 是否存在水剧情。
|
||
6. 是否情绪表达过度狗血。
|
||
7. 是否对白不符合人物身份。
|
||
8. 是否场景缺乏画面感。
|
||
9. 是否本章没有推动主线。
|
||
10. 是否适合后续短剧改编。
|
||
|
||
小说圣经:
|
||
{{bible}}
|
||
|
||
人物状态:
|
||
{{character_states}}
|
||
|
||
伏笔库:
|
||
{{foreshadows}}
|
||
|
||
章节卡:
|
||
{{chapter_card}}
|
||
|
||
本章正文:
|
||
{{chapter_text}}
|
||
|
||
请输出 JSON:
|
||
pass
|
||
total_score
|
||
scores
|
||
problems
|
||
must_fix
|
||
optional_suggestions
|
||
rewrite_required
|
||
rewrite_strategy
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 修复 Agent Prompt
|
||
|
||
```text
|
||
你是小说修稿编辑。
|
||
请根据质检报告修复本章正文。
|
||
|
||
要求:
|
||
1. 只修复质检指出的问题。
|
||
2. 保留原章节中有效的剧情和优秀表达。
|
||
3. 不得新增与章节卡无关的大设定。
|
||
4. 不得破坏上下文连续性。
|
||
5. 修复后必须更符合小说圣经、人设和本章目标。
|
||
|
||
原正文:
|
||
{{chapter_text}}
|
||
|
||
质检报告:
|
||
{{quality_report}}
|
||
|
||
小说圣经摘要:
|
||
{{bible_summary}}
|
||
|
||
章节卡:
|
||
{{chapter_card}}
|
||
|
||
请输出修复后的完整正文。
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 记忆更新 Agent Prompt
|
||
|
||
```text
|
||
你是小说连续性档案管理员。
|
||
你的任务是根据本章正文更新后续写作需要的记忆库。
|
||
你必须准确、简洁,不得加入正文没有发生的内容,不得猜测未来剧情。
|
||
|
||
本章正文:
|
||
{{chapter_text}}
|
||
|
||
已有伏笔库:
|
||
{{foreshadows}}
|
||
|
||
已有角色状态:
|
||
{{character_states}}
|
||
|
||
请输出 JSON:
|
||
chapter_summary
|
||
character_updates
|
||
relationship_updates
|
||
world_updates
|
||
timeline_update
|
||
location_update
|
||
new_foreshadows
|
||
updated_foreshadows
|
||
resolved_foreshadows
|
||
next_chapter_must_continue
|
||
forbidden_to_forget
|
||
```
|
||
|
||
---
|
||
|
||
# 十二、你要做的“上下文拼装器”
|
||
|
||
这个系统最核心的不是 Agent,而是 Context Builder。
|
||
|
||
它负责给每次 API 调用拼上下文。
|
||
|
||
比如写第 18 章,它不能把全部 17 章正文都塞进去,而是拼:
|
||
|
||
```text
|
||
小说圣经摘要
|
||
+ 主角档案
|
||
+ 本章出场人物档案
|
||
+ 最近 5 章摘要
|
||
+ 本章相关伏笔
|
||
+ 当前卷纲
|
||
+ 第 18 章章节卡
|
||
+ 禁止规则
|
||
```
|
||
|
||
伪代码:
|
||
|
||
```js
|
||
async function buildChapterContext(projectId, chapterNo) {
|
||
const bibleSummary = await getActiveBibleSummary(projectId);
|
||
|
||
const volumeOutline = await getVolumeByChapter(projectId, chapterNo);
|
||
|
||
const chapterPlan = await getChapterPlan(projectId, chapterNo);
|
||
|
||
const recentSummaries = await getRecentChapterSummaries(projectId, chapterNo, 5);
|
||
|
||
const sceneCharacters = extractCharactersFromChapterPlan(chapterPlan);
|
||
|
||
const characterProfiles = await getCharacterProfiles(projectId, sceneCharacters);
|
||
|
||
const characterStates = await getCharacterStates(projectId, sceneCharacters);
|
||
|
||
const activeForeshadows = await getRelevantForeshadows(projectId, {
|
||
chapterNo,
|
||
characters: sceneCharacters,
|
||
limit: 20
|
||
});
|
||
|
||
const forbiddenRules = await getForbiddenRules(projectId);
|
||
|
||
return {
|
||
bibleSummary,
|
||
volumeOutline,
|
||
recentSummaries,
|
||
characterProfiles,
|
||
characterStates,
|
||
activeForeshadows,
|
||
forbiddenRules
|
||
};
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
# 十三、自动化程度分三级
|
||
|
||
## L1:半自动
|
||
|
||
人工确认每章。
|
||
|
||
```text
|
||
AI 写一章 → 人工看 → 通过 → 下一章
|
||
```
|
||
|
||
适合刚开始测试。
|
||
|
||
---
|
||
|
||
## L2:自动 10 章一组
|
||
|
||
```text
|
||
AI 连续写 10 章
|
||
每章自动质检
|
||
低分章节自动重写
|
||
10 章后人工总审
|
||
```
|
||
|
||
适合稳定后。
|
||
|
||
---
|
||
|
||
## L3:全自动长篇生产
|
||
|
||
```text
|
||
AI 自动写完整卷
|
||
每 10 章自检
|
||
每卷人工审核
|
||
自动生成改编剧本、分镜、人物图像提示词
|
||
```
|
||
|
||
你最终要做到 L3,但第一版建议从 L1/L2 开始。
|
||
|
||
---
|
||
|
||
# 十四、章节质量评分标准
|
||
|
||
你后台可以把评分做成固定规则。
|
||
|
||
```json
|
||
{
|
||
"plot_progress": {
|
||
"weight": 20,
|
||
"description": "本章是否有效推动主线"
|
||
},
|
||
"character_consistency": {
|
||
"weight": 20,
|
||
"description": "人物行为是否符合既有人设"
|
||
},
|
||
"emotion_depth": {
|
||
"weight": 15,
|
||
"description": "是否有真实情绪,不煽情"
|
||
},
|
||
"style_quality": {
|
||
"weight": 15,
|
||
"description": "语言是否符合目标文风"
|
||
},
|
||
"scene_visualization": {
|
||
"weight": 10,
|
||
"description": "是否适合短剧/视频化"
|
||
},
|
||
"foreshadow_management": {
|
||
"weight": 10,
|
||
"description": "伏笔是否合理推进"
|
||
},
|
||
"continuity": {
|
||
"weight": 10,
|
||
"description": "是否与前文冲突"
|
||
}
|
||
}
|
||
```
|
||
|
||
建议:
|
||
|
||
90 分以上:精品章节;
|
||
85–89:可通过;
|
||
75–84:局部修复;
|
||
75 以下:重写;
|
||
连续 3 次低于 85:暂停人工审核。
|
||
|
||
---
|
||
|
||
# 十五、最适合你的技术架构
|
||
|
||
结合你之前做后台、Codex、数据库、AI 系统的习惯,我建议这样:
|
||
|
||
## 后端
|
||
|
||
Node.js / NestJS 或 Python / FastAPI 都可以。
|
||
|
||
如果你偏后台管理、任务队列、API 编排,建议:
|
||
|
||
```text
|
||
Node.js + NestJS + MySQL + Redis + BullMQ
|
||
```
|
||
|
||
如果你偏 AI 工作流、文本处理、评估模型,建议:
|
||
|
||
```text
|
||
Python + FastAPI + PostgreSQL/MySQL + Redis + Celery
|
||
```
|
||
|
||
你之前项目很多 Node.js 和后台任务,我更建议第一版:
|
||
|
||
```text
|
||
Node.js + MySQL + Redis + BullMQ + OpenAI API/国内模型 API
|
||
```
|
||
|
||
---
|
||
|
||
## 模块结构
|
||
|
||
```text
|
||
novel-system/
|
||
src/
|
||
modules/
|
||
projects/
|
||
bible/
|
||
characters/
|
||
volumes/
|
||
chapters/
|
||
foreshadows/
|
||
memory/
|
||
quality/
|
||
agents/
|
||
workflows/
|
||
prompts/
|
||
model-provider/
|
||
review/
|
||
```
|
||
|
||
---
|
||
|
||
## 核心服务
|
||
|
||
```text
|
||
AgentService:统一调用模型
|
||
PromptService:读取提示词模板
|
||
ContextBuilderService:拼装上下文
|
||
WorkflowService:编排流水线
|
||
QualityService:评分和重写判断
|
||
MemoryService:更新上下文记忆
|
||
ForeshadowService:伏笔管理
|
||
ChapterService:章节生成和版本管理
|
||
```
|
||
|
||
---
|
||
|
||
# 十六、模型选择策略
|
||
|
||
不要所有步骤都用最贵模型。
|
||
|
||
可以分层:
|
||
|
||
## 高模型
|
||
|
||
用于:
|
||
|
||
小说圣经;
|
||
人物档案;
|
||
全书结构;
|
||
正文写作;
|
||
最终润色。
|
||
|
||
## 中模型
|
||
|
||
用于:
|
||
|
||
章节卡;
|
||
记忆总结;
|
||
伏笔更新;
|
||
分卷细纲。
|
||
|
||
## 低模型
|
||
|
||
用于:
|
||
|
||
格式转换;
|
||
标签提取;
|
||
简单摘要;
|
||
重复检查。
|
||
|
||
这样成本会低很多。
|
||
|
||
---
|
||
|
||
# 十七、最容易翻车的地方
|
||
|
||
## 1. 只用一个 Agent 写到底
|
||
|
||
一定会乱。
|
||
|
||
必须拆成:
|
||
|
||
策划、写作、检查、记忆、修复。
|
||
|
||
---
|
||
|
||
## 2. 不做结构化输出
|
||
|
||
设计类输出必须 JSON。
|
||
|
||
否则后面程序无法稳定解析。
|
||
|
||
---
|
||
|
||
## 3. 不保存版本
|
||
|
||
每次重写、润色、修复都要保存版本。
|
||
|
||
否则你不知道哪一版最好。
|
||
|
||
---
|
||
|
||
## 4. 不做自动停机规则
|
||
|
||
如果 AI 连续写崩,你不能让它继续自动写。
|
||
|
||
必须有规则:
|
||
|
||
```text
|
||
连续 3 章低于 80 分 → 暂停
|
||
同一章重写 3 次失败 → 暂停
|
||
出现核心设定冲突 → 暂停
|
||
人物死亡/重大秘密揭露 → 人工审核
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 让 AI 自己决定所有剧情
|
||
|
||
全自动不等于完全放任。
|
||
|
||
正确方式是:
|
||
|
||
**AI 可以自动执行,但不能擅自改主线。**
|
||
|
||
主线、人物命运、重大反转必须由小说圣经和卷纲控制。
|
||
|
||
---
|
||
|
||
# 十八、给 Codex 的开发任务说明
|
||
|
||
你可以直接把下面这段给 Codex,让它开始设计系统。
|
||
|
||
```text
|
||
请开发一个 AI 长篇小说自动化生产系统。
|
||
|
||
目标:
|
||
用户输入小说题材 Brief 后,系统自动生成小说圣经、人物档案、分卷大纲、章节卡、正文、润色稿、质检报告、记忆更新和伏笔管理,实现最少人工干预的长篇小说流水线生产。
|
||
|
||
技术栈:
|
||
Node.js + NestJS + MySQL + Redis + BullMQ。
|
||
模型供应商需要抽象成 ModelProvider,支持 OpenAI API 和其他兼容 OpenAI 格式的模型 API。
|
||
所有 Agent Prompt 存数据库,支持版本管理。
|
||
设计类 Agent 必须支持 JSON Schema 结构化输出。
|
||
正文类 Agent 输出 Markdown/纯文本。
|
||
任务队列使用 BullMQ。
|
||
每个章节生成任务必须支持失败重试、质量评分、自动修复和人工审核状态。
|
||
|
||
核心模块:
|
||
1. projects:小说项目管理
|
||
2. bible:小说圣经管理
|
||
3. characters:人物档案和人物状态管理
|
||
4. volumes:分卷大纲管理
|
||
5. chapters:章节卡、初稿、润色稿、终稿管理
|
||
6. foreshadows:伏笔管理
|
||
7. memory:上下文记忆管理
|
||
8. quality:章节质检和评分
|
||
9. prompts:Agent Prompt 版本管理
|
||
10. agents:统一 AI 调用
|
||
11. workflows:小说生成流水线编排
|
||
12. review:人工审核与回滚
|
||
|
||
核心流程:
|
||
1. 用户创建项目并输入 project_brief。
|
||
2. 系统调用 NovelBibleAgent 生成小说圣经。
|
||
3. 系统调用 VolumeOutlineAgent 生成当前卷大纲。
|
||
4. 系统调用 ChapterCardAgent 生成下一章章节卡。
|
||
5. 系统调用 ChapterWriterAgent 生成正文初稿。
|
||
6. 系统调用 PolishAgent 润色正文。
|
||
7. 系统调用 QualityAgent 做评分。
|
||
8. 系统调用 ContinuityAgent 检查上下文冲突。
|
||
9. 如果评分 >=85 且无严重冲突,则保存为终稿。
|
||
10. 如果评分 75-84,则调用 RepairAgent 局部修复。
|
||
11. 如果评分 <75,则重写本章,最多重试 3 次。
|
||
12. 如果 3 次仍不通过,标记为 need_human_review。
|
||
13. 章节通过后,调用 MemoryUpdateAgent 更新章节摘要、人物状态、伏笔状态、时间线、空间位置。
|
||
14. 进入下一章循环。
|
||
|
||
数据库表:
|
||
novel_projects
|
||
novel_bible
|
||
novel_characters
|
||
novel_volumes
|
||
novel_chapters
|
||
novel_plot_memory
|
||
novel_foreshadows
|
||
novel_quality_reports
|
||
agent_prompts
|
||
agent_runs
|
||
chapter_versions
|
||
|
||
后台页面:
|
||
1. 小说项目列表
|
||
2. 小说圣经编辑页
|
||
3. 人物档案页
|
||
4. 分卷大纲页
|
||
5. 章节生产页
|
||
6. 伏笔管理页
|
||
7. 质量报告页
|
||
8. Agent Prompt 管理页
|
||
9. 自动任务队列页
|
||
10. 人工审核页
|
||
|
||
请先输出:
|
||
1. 完整系统架构
|
||
2. 数据库表结构 SQL
|
||
3. NestJS 模块划分
|
||
4. API 路由设计
|
||
5. BullMQ 任务流程
|
||
6. AgentService 和 ModelProvider 代码骨架
|
||
7. 第一版 MVP 开发计划
|
||
```
|
||
|
||
---
|
||
|
||
# 十九、最终建议
|
||
|
||
你这个系统不要做成“AI 帮我写小说”。
|
||
|
||
要做成:
|
||
|
||
> **AI 主编室 + AI 编剧室 + AI 作家组 + AI 审稿组 + AI 档案管理员**
|
||
|
||
后台真正的核心是:
|
||
|
||
```text
|
||
上下文管理
|
||
结构化输出
|
||
自动质检
|
||
自动修复
|
||
版本管理
|
||
伏笔管理
|
||
人工审核闸门
|
||
```
|
||
|
||
第一版先做到:
|
||
|
||
```text
|
||
输入题材
|
||
→ 生成小说圣经
|
||
→ 生成 30 章细纲
|
||
→ 自动写单章
|
||
→ 自动质检
|
||
→ 自动更新记忆
|
||
→ 继续下一章
|
||
```
|
||
|
||
这就已经可以跑通商业化测试了。
|
||
|
||
[1]: https://developers.openai.com/api/docs/guides/structured-outputs?utm_source=chatgpt.com "Structured model outputs | OpenAI API"
|