—— 起因

最近一直在想,AI 能不能用来写小说?不是那种生成一小段文字就完事的玩法,而是真正管理一整本书的创作流程 — 大纲、角色、章节、伏笔,全都串起来。

于是在 OpenClaw 的技能库里找到了一个叫 novel-write 的技能,觉得思路不错,就在这基础上二次开发,给它取了个名字叫 妙手

—— 妙手是什么

一句话概括:一个基于 Web 的 AI 小说创作引擎。

你可以在上面管理多本小说,每本小说有独立的会话、角色库和大纲。AI 会根据你设定的内容生成章节,支持流式输出,写到一半可以暂停、继续或者直接停止。

——核心功能

- 多小说管理 — 每本小说独立会话,互不干扰

- AI 章节生成 — 流式输出,支持暂停 / 继续 / 停止

- 智能上下文 — 自动加载最近 3 章内容,保持剧情连贯

- 角色管理 — AI 生成章节时自动识别新角色,手动编辑性格和背景

- 大纲编辑 — AI 生成 + 手动调整双模式

- 版本历史 / 搜索替换 / 导出 TXT

- 快捷键支持 — Ctrl+S 保存、Ctrl+Enter 生成、Esc 停止

- 深色 / 浅色主题切换

技术栈

| 层级 | 技术 |

| 后端 | Python Flask + OpenAI 兼容 API(MiMo V2.5 Pro) |

| 前端 | 原生 HTML / CSS / JS,无框架 |

| 存储 | JSON 文件,轻量且方便迁移 |

选原生前端是因为这个项目不需要太复杂的交互,Flask + JSON 的组合够用,部署也简单。

—— 踩坑记录

做这个项目的过程中踩了几个坑,记录一下:

1. 流式输出时编码错误

API 返回的流式数据在某些情况下会截断中文字符,导致解码报错。排查了半天发现是 API key 配置问题,修复后就正常了。

2. 对话历史无限膨胀

一开始没有限制上下文长度,聊多了 token 消耗暴涨,AI 的回答质量反而下降。后来加了 ContextWindow 配置,限制上下文大小才解决。

3. 智能上下文的取舍

到底要不要每次都加载小说全文?加载多了费 token,加载少了 AI 忘记前面的剧情。最后折中方案是只加载最近 3 章,效果还行但不完美。

——后来发现了天命

妙手做完之后,我在 GitHub 上发现了一个叫 天命 的开源项目,也是用 AI 写小说的。

部署体验之后,说实话,差距挺明显的。天命把故事拆成了结构化数据来管理 — 角色状态、伏笔追踪、位置信息、冲突进度,全都用独立的字段维护。这意味着 AI 不是靠"记忆"来写,而是靠"数据"来写,哪怕写到第 3000 章也能保持连贯。

相比之下,妙手的实现方式还是太粗糙了,更像是"能用"但不够"好用"。

天命 GitHub 地址:https://github.com/zy-zmc/tianming-novel-ai-writer

—— 总结一下

妙手虽然还有很多不足,但这个过程让我学到了不少东西 — 怎么处理流式输出、怎么管理上下文、怎么设计数据结构。从"能跑"到"好用"之间,差的不只是代码量,还有对问题本质的理解。

后续打算研究一下天命的架构思路,看看能不能把一些好的设计借鉴过来,继续优化妙手。