基于 Flask + 大模型 API 的可视化小说写作工具。通过四层记忆架构,让大模型在长篇连载中始终记住人设、大纲、世界观,全程不跑偏。
核心特性
四层记忆架构
主要功能
- 自动摘要存储 — 每章写完自动提取摘要存入记忆,下一章自动带上前文记忆
- 自动文件存储 — 按书名创建文件夹,每章按
第001章_标题.md 格式保存 - 多模型适配 — 支持阿里百炼、Kimi、DeepSeek,页面可切换
- 多主题界面 — 浅色(默认)、深色、暖色、护眼绿四套主题
- Markdown 输出 — 生成内容强制 Markdown 格式,方便后期排版发布
快速开始
1. 安装依赖
cd novel-writing-assistant
pip install -r requirements.txt
2. 启动应用
python app.py
浏览器打开 http://localhost:5000
3. 配置 API Key
打开页面后点击「⚙️ 设置」tab,填入你的阿里百炼 API Key 并保存。
也可以通过环境变量配置:set DASHSCOPE_API_KEY=你的Key
4. 开始写作
方式一:单章生成
方式二:一键批量生成
项目结构
novel-writing-assistant/
├── app.py # Flask 主入口 + API 路由
├── config.py # 配置管理(模型、路径)
├── requirements.txt # Python 依赖
├── models/
│ └── llm_client.py # 统一 LLM 接口层
├── memory/
│ ├── anchor.py # 提示词 + 大纲锚定管理
│ └── persistent.py # 记忆持久化(章节摘要、角色状态)
├── templates/
│ └── index.html # 前端页面
├── static/
│ └── style.css # 多主题样式
├── data/ # 配置数据存储
│ ├── prompts.json # 人设、世界观、写作风格
│ ├── outline.json # 书名 + 全书大纲
│ ├── memory.json # 章节摘要 + 角色状态
│ └── settings.json # API Key + 模型选择
└── books/ # 生成的小说存储
└── 我在女子学院当校草/
├── 第001章_阴差阳错.md
├── 第002章_308宿舍集合.md
└── ...
页面模块说明
✍️ 写作
手动输入写作指令,如"写第5章"、"续写第三章,加入新角色"。生成完成后自动保存文件和摘要。
🚀 一键生成
🎭 人设/世界观
- 写作风格 — 字数要求、对话比例、格式要求、禁止事项
📋 大纲管理
- 全书大纲 — 每行一章,格式:
第X章:标题 —— 简述
🧠 记忆管理
⚙️ 设置
- 模型切换(阿里百炼 / Kimi / DeepSeek)
工作原理
每次调用大模型生成时,系统自动构建如下 prompt 结构:
System Prompt:
├── 【人物设定】 ← prompts.json.character
├── 【世界观设定】 ← prompts.json.worldview
├── 【写作风格】 ← prompts.json.style
├── 【全书大纲】 ← outline.json.content
├── 【已完成章节摘要】 ← memory.json(最近5章)
└── 【角色最新状态】 ← memory.json(最近10条)
User Prompt:
└── "请根据以下大纲写第X章..." + 大纲中对应章节描述
这样无论写到第几章,模型始终能"看到"完整的人设、世界观和前文摘要。
执行流程图
以下是用户输入"写第1章"后的完整执行流程:
┌─────────────────────────────────────────────────────────────────┐
│ 用户输入:"写第1章" │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤1:解析章节号 │
│ 从用户输入中提取 chapter_num = 1 │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤2:构建写作指令 │
│ 从 outline.json 中查找第1章大纲: │
│ "第1章:阴差阳错 —— 杨一凡收到录取通知书..." │
│ 生成 prompt:"请根据以下大纲写第1章的完整内容..." │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤3:组装完整 System Prompt(四层记忆注入) │
│ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 第一层:人物设定(prompts.json → character) │ │
│ │ 杨一凡、时大猛、张临志等6人完整人设 │ │
│ └───────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 第二层:世界观设定(prompts.json → worldview) │ │
│ │ 济南女子学校、308宿舍、时代背景 │ │
│ └───────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 第三层:写作风格(prompts.json → style) │ │
│ │ 6000字+、对话70%、Markdown格式、结尾哲理 │ │
│ └───────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 第四层:全书大纲(outline.json → content) │ │
│ │ 100章完整大纲锚定 │ │
│ └───────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 第五层:历史记忆(memory.json) │ │
│ │ 最近5章摘要 + 最近10条角色状态 │ │
│ └───────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤4:调用大模型 API │
│ 将 System Prompt + User Prompt 发送给阿里百炼(qwen-plus) │
│ max_tokens=8000,temperature=0.8 │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤5:模型返回第1章内容(Markdown 格式,6000字+) │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤6:自动保存文件 │
│ → books/我在女子学院当校草/第001章_阴差阳错.md │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤7:自动摘要 │
│ 再次调用模型,传入本章内容,提取100-200字摘要 │
│ 存入 memory.json → chapters[] │
└──────────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 步骤8:返回前端展示内容 │
│ 显示生成内容 + 字数统计 + "已自动保存"提示 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 下次输入"写第2章"时: │
│ 步骤3 的第五层会自动加载第1章摘要 │
│ → 模型"记住"了前面的故事 │
└─────────────────────────────────────┘
上下文一致性保证机制
每一章生成时的 prompt 包含:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
固定不变(每章都带):
✓ 完整人设 → 人物性格不会跑偏
✓ 完整世界观 → 背景设定不会矛盾
✓ 写作风格规范 → 文风保持统一
✓ 100章大纲 → 知道整体走向
动态增长(每章累加):
✓ 前N章摘要 → 记住已发生的事
✓ 角色状态 → 知道人物当前处境
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
这就是为什么模型能在第50章依然记得第1章的人设——因为每次调用都会把完整设定重新注入,而历史记忆通过摘要的方式传递前文信息。
写作风格默认配置
当前默认配置了以下硬性要求(可在页面修改):
多模型支持
| | |
|---|
| DASHSCOPE_API_KEY | |
| KIMI_API_KEY | |
| DEEPSEEK_API_KEY | |
页面配置的 Key 优先级高于环境变量。切换模型在「设置」tab 选择即可。
注意事项
- 批量生成时每章约需 1-2 分钟(取决于模型响应速度和字数要求)
- 生成 100 章全书预计需要 2-3 小时,建议分批生成(如每次10章)
books/ 目录下的 .md 文件可直接用于公众号发布或电子书排版