✨文末附开源仓库地址,做 AI 应用落地的同学可以直接拉下来跑。
⚠️ 本文为技术演示项目,仅供学习和交流参考,不建议直接用于生产环境。
当 LLM 遇见小说创作,如何解决"角色太多记混、时间线出错、伏笔忘了收"这些痛点?
前言
AI 写长文本最大的痛点是什么?不是写不出来,是写完就忘------角色死了后面又出场、左手断了还用左手写字、伏笔埋了不收。
让 AI 生成内容容易,让 AI 生成的长文本和已有设定保持一致,才是真正的工程难题。
最近在关注 AI 长文本生成与一致性保障的落地实践,把这套问题在真实场景里跑了一遍:写作流程状态机 + 规则引擎(5 条硬矛盾)+ AI 软矛盾双重检测 + 章节信息自动提取存档,一个完整的 AI 辅助创作闭环。
把字段不一致、状态机流转、信息提取这些坑都沉淀进这套可运行 Demo 里了,文末附开源仓库地址,做 AI 内容生成落地的同学可以直接拉下来跑。
项目目标:为小说作者打造一套 AI 辅助创作系统,作者提供大纲后,AI 逐章生成内容,每章完成后自动进行一致性审查(含软矛盾检测),支持对话式修改和风格指定。
技术挑战:
- 如何让 AI 生成的长文本与已有设定保持一致?
- 如何检测"角色左手断了但用左手写字"这类硬矛盾?
- 如何在章节审核通过后自动提取新信息并更新各管理模块?
- 如何处理多模型协同(LLM 生成 + LLM 审查 + LLM 信息提取)?
系统架构
整体设计
┌─────────────────────────────────────────────────────────────────┐
│ 前端 Vue 3 │
│ ┌──────────┐ ┌────────── ┌──────────┐ ┌────────────────────┐ │
│ │ 大纲规划 │ │ AI写作 │ │ 对话修改 │ │ 六大设定管理模块 │ │
│ └──────────┘ └────────── └──────────┘ └────────────────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ 关系图谱 │ │ 时间线 │ │ 伏笔追踪 │ │ Dashboard 仪表盘 │ │
│ └──────────┘ ──────────┘ └──────────┘ ────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 后端 FastAPI │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 写作流程状态机 │ │
│ │ ┌─────┐ ┌─────┐ ┌───── ┌─────┐ ┌─────────┐ │ │
│ │ │大纲 │──▶│逐章 │──▶│审核 │──▶│矛盾 │──▶│信息提取 │ │ │
│ │ │确认 │ │生成 │ │ │ │检查 │ │+存档 │ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────── │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 硬矛盾规则引擎 (5条规则) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 阿里云百炼 API │
│ Qwen-Plus (章节生成 / 矛盾检测 / 信息提取 / 对话修改) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 本地 JSON 文件存储 │
│ /项目目录/小说名/ │
│ ├── meta.json / world.json / characters.json │
│ ├── relationships.json / timeline.json / items.json │
│ ├── foreshadowing.json / outline.json / contradictions.json │
│ ├── style.json / chapters/ch001.json ... │
└─────────────────────────────────────────────────────────────────┘
核心流程
整个系统的核心是一个写作流程状态机:
- 大纲规划:作者编写或 AI 生成故事梗概 + 章节目录,确认后进入写作
- 逐章生成:基于大纲 + 世界观 + 角色设定 + 前文摘要,调用百炼大模型真实生成
- 审核:左右分栏展示正文和设定信息,作者决定通过 / 要求修改 / 重写
- 矛盾检查:规则引擎检测硬矛盾 + AI 检测软矛盾,生成矛盾列表
- 信息提取:AI 从章节内容自动提取新角色、地点、物品、时间线事件、伏笔
- 确认存档:作者确认后,自动更新各管理模块的数据
使用演示
Step 1:创建项目,规划大纲
用户创建小说项目后,可以编写故事梗概和章节目录。支持 AI 自动生成大纲,也可以手动编辑。确认后进入写作阶段:

如图:故事梗概区域展示完整的小说大纲,下方章节目录支持拖拽排序,每章包含标题、摘要和状态。
Step 2:设定世界观,管理角色
在写作前,作者需要完善世界观设定(地理、势力、修炼体系、历史、种族)和角色档案:

如图:世界观设定分为五个维度,支持实时编辑和变更历史追踪。

如图:角色卡片展示姓名、性格、能力、势力等信息,下方显示成长轨迹和持有物品。
Step 3:AI 写作,审核内容
选择章节和写作风格后,点击 AI 生成按钮,系统调用百炼大模型生成章节内容。生成后进入审核流程:

如图:左侧为章节正文编辑器,右侧显示章节信息和 AI 提取的待确认信息(新角色、时间线事件、伏笔等)。
Step 4:对话式修改,diff 对比
如果作者对生成内容不满意,可以进入对话修改界面,以自然语言告诉 AI 哪里需要修改:

如图:左侧展示修改前后的 diff 对比(红色为修改前,绿色为修改后),右侧为对话界面。
Step 5:矛盾检测,保障一致性
每章审核通过后,系统自动进行矛盾检测,包括规则引擎检测的硬矛盾和 AI 检测的软矛盾:

如图:矛盾列表展示类型、严重程度、描述、涉及角色和修改建议,支持解决/忽略操作。可展开查看详细说明和检测规则。
Step 6:时间线管理,冲突检测
时间线页面按时间顺序展示关键事件,支持冲突检测(如同一角色同时出现在不同地点):

如图:时间轴展示事件详情(涉及角色、地点、关联章节),点击"检测冲突"自动检查逻辑矛盾。
Step 7:Dashboard 总览,掌握全局
Dashboard 仪表盘展示创作进度全貌:

如图:顶部统计卡片显示总字数、章节进度、待处理矛盾、未揭晓伏笔;左侧饼图展示章节状态分布;右侧活动时间线展示最近的创作动态。
Step 8:写作进度总览
详细的写作进度页面展示各章节的完成情况和提醒:

如图:章节详情表格展示每章状态和字数进度条,底部提醒区显示待处理矛盾和未揭晓伏笔数量。
技术选型思考
为什么选 FastAPI?
- 类型安全:Pydantic 自动校验请求参数,减少运行时错误
- 异步支持:AI 调用是 IO 密集型任务,原生异步提升并发能力
- 文档自动生成:Swagger UI 方便前后端联调
- 路由模块化:12 个路由模块清晰分离,易于维护
为什么前端用 Vue 3?
- Composition API:复杂状态管理更清晰(如写作流程状态机)
- 生态成熟:Element Plus 组件库开箱即用(表格、时间线、对话框等)
- 拖拽交互:SortableJS 实现章节拖拽排序
- SVG 可视化:原生 SVG 实现关系图谱节点连线图
为什么用阿里云百炼?
- 模型能力:Qwen-Plus 在中文长文本生成和一致性判断上表现优秀
- API 统一:OpenAI 兼容接口,一个 SDK 调用所有能力
- 国内访问:无需翻墙,延迟低,适合 Demo 演示
为什么用本地 JSON 存储?
- Demo 场景:无需数据库,部署简单
- 数据透明:JSON 文件可直接查看和编辑
- 按项目隔离:每个小说项目独立目录,数据互不干扰
核心代码实现
1. 硬矛盾规则引擎
5 条规则检测常见的逻辑矛盾:
python
def check_hard_contradictions(chapter_content, characters, items, timeline):
contradictions = []
# 规则1:死亡角色出现
dead_chars = [c for c in characters if c.get('status') in ('死亡', '已死')]
for dc in dead_chars:
if dc['name'] in chapter_content:
contradictions.append({
"type": "hard", "severity": "high",
"description": f"角色「{dc['name']}」已死亡但在本章出现"
})
# 规则2:伤残肢体使用
# 规则3:位置冲突
# 规则4:物品归属错误
# 规则5:能力超限
return contradictions
2. AI 软矛盾检测
将章节内容 + 角色设定 + 世界观组合成 prompt,调用大模型判断合理性:
python
def check_contradiction(chapter_content, characters, world_setting, timeline, items):
system_prompt = """你是一位专业的小说编辑,负责检查小说内容的一致性。
检查要点:角色行为是否与性格一致、能力是否超出设定、时间线是否合理...
请以JSON数组格式返回矛盾列表。"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"世界观:{world_setting}\n角色:{char_info}\n内容:{chapter_content}"}
]
result = chat_completion(messages, temperature=0.3)
return parse_json(result)
3. 信息提取与自动存档
章节审核通过后,AI 自动提取新信息并更新各模块:
python
def confirm_extract(project_id, chapter_index, extracted_data):
# 更新角色(新增角色 + 成长轨迹)
for nc in extracted_data.get("new_characters", []):
characters.append({"name": nc["name"], ...})
for change in extracted_data.get("character_changes", []):
c["growth_log"].append({"chapter": chapter_index+1, "change": change["change"]})
# 更新时间线、物品、伏笔...
# 标记章节为 completed
4. 写作流程状态机
大纲确认 → 逐章生成 → 审核 → 矛盾检查 → 信息提取 → 二次确认 → 存档
pending draft approved extracting completed
每个状态转换都有对应的 API 端点和前端交互。
踩坑记录
1. Vue 单文件组件重复模板块
问题 :App.vue 底部残留了默认的 <script setup> 和 <template> 块,导致编译错误。
原因:使用 Write 工具覆盖文件时,追加而非替换。
解决 :手动删除重复的模板块,确保只有一个 <template> 和一个 <script setup>。
2. PowerShell 的 && 语法
问题 :cd backend && python -m uvicorn 在 PowerShell 中报错。
原因 :PowerShell 不支持 &&,需要使用 ; 分隔。
解决 :改用 cd backend; python -m uvicorn app.main:app --port 8001
3. 字段名不一致
问题:矛盾检测页面不显示涉及角色。
原因 :前端模板使用 row.involved_characters,但 demo 数据使用 characters 字段。
解决 :前端兼容两种字段名 (row.involved_characters || row.characters || [])
4. 端口占用
问题 :[Errno 10048] 端口 8001 已被占用。
解决:检查已有进程,复用或切换到其他端口。
工程化实践
1. 模块化路由设计
后端 12 个路由模块,每个模块对应一个功能领域:
python
app.include_router(projects.router, prefix="/api/projects")
app.include_router(outline.router, prefix="/api/projects/{project_id}/outline")
app.include_router(world.router, prefix="/api/projects/{project_id}/world")
app.include_router(characters.router, prefix="/api/projects/{project_id}/characters")
# ... 共 12 个路由模块
2. 前端 API 封装
统一的 API 封装层,所有请求通过 request() 函数:
javascript
async function request(url, options = {}) {
const res = await fetch(BASE_URL + url, {
headers: { 'Content-Type': 'application/json', ...options.headers },
...options
})
if (!res.ok) throw new Error((await res.json()).detail)
return res.json()
}
3. 本地 JSON 存储
按项目目录组织,每个项目包含所有数据文件:
data/
└── demo001/
├── meta.json # 项目元信息
├── outline.json # 大纲+章节目录
├── world.json # 世界观设定
├── characters.json # 角色档案
├── relationships.json # 关系图谱
├── timeline.json # 时间线
├── items.json # 物品/装备
├── foreshadowing.json # 伏笔追踪
├── contradictions.json# 矛盾记录
├── style.json # 风格配置
└── chapters/ # 章节正文
├── ch001.json
├── ch002.json
└── ...
功能清单
| 模块 | 功能 | 状态 |
|---|---|---|
| 项目脚手架 | Vue3+Vite+FastAPI+CORS+侧边栏 | ✅ |
| 项目管理 | CRUD+卡片列表+示例数据 | ✅ |
| 大纲规划 | 拖拽排序+AI生成+确认流程 | ✅ |
| 世界观 | 5维度编辑+变更历史 | ✅ |
| 角色管理 | 档案+状态追踪+成长轨迹 | ✅ |
| 关系图谱 | SVG节点图+变化历史 | ✅ |
| 时间线 | 事件管理+冲突检测 | ✅ |
| 物品装备 | 档案+流转历史 | ✅ |
| 伏笔追踪 | 登记+状态筛选 | ✅ |
| AI写作 | 百炼API+风格选择+分栏审核 | ✅ |
| 对话修改 | 聊天+diff对比+重写 | ✅ |
| 矛盾检测 | 规则引擎5条+AI软矛盾 | ✅ |
| 信息提取 | 自动提取+确认+更新各模块 | ✅ |
| 进度总览 | 饼图+活动时间线+统计 | ✅ |
| 示例数据 | 5矛盾覆盖全场景 | ✅ |
总结
这个项目让我对 AI 应用落地有了更深的理解:
- 一致性保障是核心:AI 生成的长文本容易与已有设定矛盾,规则引擎 + AI 双重检测是必要的
- 流程状态机很重要:写作流程有明确的状态转换,每个环节都需要清晰的 UI 反馈
- 信息提取是闭环关键:章节审核通过后自动提取新信息,才能保持各模块数据同步
- Demo 也要功能完整:即使是演示项目,也要覆盖所有功能点,才能展示产品价值
如果你也在做 AI 应用开发,希望这些经验对你有帮助。
源码仓库(已开源)
完整源码已开源至 Gitee,含可运行 Demo + 核心代码注释 + 踩坑修复方案:
项目地址 :Gitee - ViralWrite-AI ⭐ 欢迎 Star
仓库包含:
- 写作流程状态机(大纲→生成→审核→矛盾检查→信息提取→存档)
- 硬矛盾规则引擎(5 条规则)+ AI 软矛盾双重检测
- 章节信息自动提取 + 各管理模块自动更新
- 对话式修改 + diff 对比视图
- SVG 关系图谱 + 时间线冲突检测
- Vue3 前端 + FastAPI 后端 + 12 个路由模块
本 Demo 仅做技术复盘与学习演示,基于 AI 长文本生成与一致性保障工程实践经验提炼,后续还会持续迭代补充更多场景优化。