两年前我在用 AI 写网文。GPT 能写出不错的段落,但写到 50 章它就忘了主角为什么复仇。每开一个新对话,要把设定、前文、角色关系重新喂一遍,token 烧得心疼。
伏笔更惨。第 12 章埋的吊坠,到第 47 章该回收了,我自己都忘了,AI 更不可能记得。写完一章还得手动提醒它"更新角色状态""检查弧线进度"。
试过市面上的工具——要么是 SaaS,数据上云不放心;要么只是 prompt 模板的封装,没有真正的状态管理。
于是决定自己做一个。核心思路很简单:不是给 AI 一个更好的 prompt,而是给 AI 一套它能自己查询和维护的结构化记忆。
这个项目叫 Goink。
选型没有花哨的:
没有用任何云服务。所有数据在本地——这是做长篇写作工具的前提,作者不会接受把几十万字的稿子放云端。
这不是一个 chatbot 套壳。Goink 给 AI 提供了六个维度的结构化数据,AI 在对话中自主查询和维护:
这些数据存在 SQLite 里,跨对话永久保留。AI 不是靠对话窗口的上下文"记住"这些,是靠查数据库。
给 LLM 提供了 31 个 Function Calling 工具,覆盖写作全流程——读文件、写文件、语义搜索、角色 CRUD、伏笔管理、弧线推进、地点查询、读者认知设置、创作偏好、章节管理、子 Agent 调度、web 搜索。
核心是一个 ReAct 循环:LLM 拿到上下文后,自主决定调用哪个工具、传什么参数、下一步做什么。不是 pipeline 式的"大纲 Agent → 正文 Agent → 润色 Agent"——那种设计信息在每一步都在丢失。Goink 的 Agent 在一个连续上下文里完成所有操作。
用户: 写第37章
Agent 内部:
→ 查角色状态 → 搜前文线索 → 查伏笔 → 读上一章 → 写正文 → 更新角色 → 推进弧线 → 自检
还有子 Agent 系统:审稿 Agent 做四维检查(角色一致性/情节逻辑/伏笔管理/读者认知),记忆 Agent 做多维度检索。Sub-agent 的工具调用对主 Agent 不可见,只有最终报告回传,不污染主写作上下文。
这是开发过程中花时间最多的一块。
写到第 50 章,主角见到一个吊坠,AI 需要确认"这个吊坠第一次出现是第几章"。调 search_story_memory("吊坠的来历"),1 秒返回最相关段落——不是关键词匹配,是按语义搜索。
技术栈:BGE-small-zh-v1.5 int8 量化,ONNX Runtime 本地 CPU 推理,sqlite-vec 做向量索引。中文感知分句(在句号感叹号处切分),420 token 窗口,50 重叠。混合搜索三路并发:实体名模糊 + 正文精确 + 语义搜索。
最麻烦的是增量索引——写完章节后台自动刷新,但要去重合并 500ms 内的重复任务,否则连点几次保存会触发多次索引重建。
整套引擎不需要网络、不需要 GPU。一个安装包,打开就用。
默认 AI 不会直接修改正文。每次编辑生成 Diff,Monaco Editor 展示对比,用户批准后写入。写入前还会重读文件比对——如果审批期间文件被其他程序改了,拒绝写入,防止覆盖手动修改。
也有自动模式,AI 连续多轮自由写作,适合信任 AI 发挥的场景。
每个小说是独立 git 仓库。每次对话自动 commit,commit message 包含 session ID 和模型名。支持按 turn 粒度回退——DB 元数据 + git revert 同步原子操作。
"AI 写了一堆东西,我想回到三天前的版本"——这个场景在实际使用中比想象中频繁。
12 个内置写作技能(场景节拍、对白潜台词、节奏控制、悬念钩子等),/技能名 一键加载。自定义 Skill 只需创建 Markdown 文件放到 ~/.goink/skills/,系统热加载。三层覆盖:小说级 > 用户级 > 内置级。
后来又做了技能市场——社区仓库 sigpanic/goink-skills,App 内浏览、搜索、一键安装。你写的好套路,别人一键就能用。
最难的不是技术,是产品决策。 比如"AI 应该自动维护记忆还是等用户提醒"——一开始做成自动的,后来发现用户需要控制感,又加了审批流程。再比如"伏笔应该怎么注入"——全量注入会淹没上下文,最终做成近处完整 + 远处索引的两级方案。
Go + Wails 是个好组合。 单文件分发,启动快,内存占用低。唯一痛点是 CGO——ONNX Runtime 和 sqlite-vec 都需要 cgo,交叉编译比较麻烦。
本地优先是个正确的选择。 写作工具的用户对隐私敏感,数据在本地是个硬需求。虽然开发成本比 SaaS 高(要处理本地文件、本地索引、本地推理),但产品定位更清晰。
如果你也在用 AI 写长文,被"写到后面忘了前面"折磨过,欢迎试试。