AI长篇小说创作系统:基于文件级长期记忆与Smart State模式
2026/8/28 0:24:18 网站建设 项目流程

简介:在自然语言处理与AI内容生成领域,大语言模型(LLM)的上下文长度限制是制约其处理长文本任务的核心瓶颈。其原理在于Transformer架构的自注意力机制计算复杂度随序列长度平方增长,导致模型无法在单次推理中维持超长文本的一致性记忆。为解决这一问题,工程上常引入外部记忆机制与状态管理,通过将关键信息持久化存储并动态检索,突破模型固有窗口限制,实现长期、连贯的文本生成。这种技术方案在需要维持长期一致性的复杂任务中极具价值,例如长篇内容创作、多轮对话系统及复杂决策模拟等场景。本文聚焦于AI长篇小说创作这一具体应用,深入探讨如何通过文件级长期记忆存储角色、世界观等结构化数据,并利用Smart State模式动态管理故事状态与关联,构建一个可持续迭代的创作框架,从而为AI赋予长期记忆与状态管理能力,支撑百万字级别的叙事生成。

1. 项目概述:当AI决定写一部百万字小说

如果你尝试过用ChatGPT或者Midjourney这类AI工具来创作一个短篇故事,可能会觉得挺有意思,但一旦你想让它写一部结构严谨、人物丰满、情节连贯的长篇小说,尤其是超过十万字甚至百万字的鸿篇巨制,你会发现它很快就“失忆”了。上一章的主角还叫张三,下一章可能就变成了李四;前面埋下的伏笔,后面AI自己都忘了填。这背后的核心瓶颈,就是大模型的“上下文长度”限制和“记忆”的短暂性。

最近我在GitHub上看到一个名为“my_ai_town”的开源项目,它提出的“AI长篇小说创作系统”概念,以及其核心的“基于文件级长期记忆的Smart State模式”,恰好瞄准了这个痛点。这不仅仅是一个简单的提示词工程,而是一个系统工程思路,旨在让AI能够像人类作家一样,拥有一个持续更新、随时可查的“创作笔记”和“世界观设定集”,从而支撑起百万字级别的持续创作。简单来说,它试图为AI构建一个外置的、可持久化的“大脑皮层”,专门用来存储长篇叙事所必需的海量、结构化信息。

这个系统适合谁呢?首先肯定是网文作者、编剧、游戏剧情策划等文字创作者,他们可以借助这个系统来辅助构建庞大的世界观和梳理复杂的人物关系。其次,是AI应用开发者和对AI Agent(智能体)感兴趣的技术爱好者,这个项目提供了一个非常具体的、关于如何为AI赋予“长期记忆”和“状态管理”能力的工程实践案例。最后,对于任何对“AI如何理解并生成超长文本”感到好奇的人来说,这个项目的设计思路都是一次绝佳的思维体操。

2. 核心设计思路:从“单次对话”到“持续状态”

传统的AI写作,无论是通过API调用还是聊天界面,本质上都是一次性的“问答”或“指令-响应”。你给一个提示词(比如“写一个关于星际探险的开头”),AI生成一段文本。下一次交互,你们又回到了起点,AI并不记得上次它创造了什么,除非你把之前所有的内容都再次塞进上下文里。这就像让一个只有7秒记忆的鱼来写小说,每写一句话就要重新认识一遍所有角色。

2.1 文件级长期记忆:AI的“外部硬盘”

“文件级长期记忆”是这个系统的基石。它的核心思想是:不再依赖模型有限的上下文窗口来承载所有信息,而是将关键的、需要长期记忆的信息,持久化地存储在外部文件中(如JSON、YAML或数据库)。这些信息通常包括:

  • 角色档案:每个主要角色的姓名、外貌、性格、背景故事、人际关系、当前状态(健康、情绪、所属势力等)。
  • 世界观设定:故事发生的世界规则、地理地图、势力分布、历史年表、魔法或科技体系。
  • 情节大纲与摘要:已经完成章节的详细摘要、未来章节的规划、重要的伏笔和待回收的线索。
  • 故事当前状态:时间线进度、地点场景、角色们的实时位置与关系变化。

这些文件构成了AI创作的“知识库”。每当AI需要生成新的内容时,系统不是把整部小说喂给AI,而是从这些记忆文件中,智能地检索出与当前创作任务最相关的片段(例如,接下来要写的场景涉及的角色和地点),将其作为上下文的一部分,连同创作指令一起发送给大模型。这相当于给了AI一个随时可以翻阅的、超大的“创作手册”。

注意:这里的关键是“相关性检索”。不是把整个记忆库都丢进去,那样会浪费大量Token并引入噪音。系统需要实现一个检索模块,能够根据当前要写的“章节主题”或“场景关键词”,从记忆文件中精准定位出需要的信息。这通常结合了向量数据库(用于语义搜索)和传统的关键词过滤。

2.2 Smart State模式:动态的“故事仪表盘”

如果说“长期记忆”是静态的数据库,那么“Smart State”就是动态的、可推理的状态机。它不仅仅是存储信息,更是管理信息之间的关联和变化。

  1. 状态定义:系统需要明确定义哪些元素是“状态”。例如,角色A对角色B的“好感度”是一个状态,数值可以从-100(仇恨)到100(爱慕)。某个关键道具“上古神剑”的“所在地”也是一个状态,可以是“角色C手中”、“秘境封印中”或“已毁灭”。
  2. 状态更新规则:当AI生成一段新的情节后,系统需要能够自动或半自动地解析这段文本,并根据预定义的规则更新状态。例如,AI写道:“经过生死与共,小明对小红的信任增加了。” 系统应能识别到“小明”和“小红”两个实体,以及“信任增加”这个事件,从而触发“小明对小红的好感度+10”的状态更新。
  3. 状态一致性检查:在生成新内容前,系统可以基于当前状态进行一致性校验。比如,如果状态显示“神剑已在上一章被摧毁”,那么当AI试图生成“他拔出了神剑”这样的情节时,系统可以发出警告或自动纠正。
  4. 状态驱动的创作:Smart State 可以主动引导创作。你可以设置目标状态(例如,“在第十章结束时,主角团需要分裂”),系统在生成中间章节时,会有意识地向这个目标状态推进,安排合适的冲突和事件。

这个模式让AI的创作从“漫无目的地续写”,变成了“在既定框架和目标下的有机生长”。AI更像是一个遵循着复杂规则和拥有丰富背景资料的“故事模拟器”。

2.3 工程架构猜想

基于开源项目常见的模式,这样一个系统的架构可能包含以下组件:

  • 记忆存储层:使用文件系统(JSON/YAML)或轻量级数据库(SQLite)来存储角色、设定、情节摘要等结构化数据。对于非结构化的详细文本,可能使用向量数据库(如ChromaDB, Weaviate)来存储和检索。
  • 状态管理引擎:一个核心模块,负责维护和更新Smart State。它需要定义状态模式(Schema),提供状态查询和修改的API,并可能集成一个简单的事件推理器。
  • 上下文组装器:这是系统的“大脑”。它接收用户的创作指令(如“写下一章”),然后:
    1. 从记忆存储层检索相关角色和设定。
    2. 从状态管理引擎获取当前故事状态。
    3. 结合用户指令、检索到的记忆、当前状态,以及可能的写作风格要求,组装成一个结构化的、超长的提示词(Prompt)。
  • 大模型接口层:调用如GPT-4、Claude 3或开源Llama 3等大模型的API,将组装好的提示词发送出去,并接收生成的文本。
  • 后处理与解析器:对AI生成的文本进行后处理,如格式化。更重要的是,尝试自动解析生成文本中的关键事件,并调用状态管理引擎来更新状态。这一步难度较高,通常需要结合命名实体识别(NER)和规则匹配,或者训练一个专门的小模型。

3. 实操构建:一步步搭建你的AI小说工厂

理解了核心思路,我们来探讨如何动手实现一个简化版本。这里不会直接复制项目代码,而是阐述关键环节的实现逻辑和注意事项,你可以用任何熟悉的编程语言(如Python)来搭建。

3.1 第一步:设计你的记忆与状态数据结构

这是最重要的一步,决定了整个系统的能力和复杂度。我们从简单的开始。

角色档案 (character.json)

{ "characters": [ { "id": "protagonist_li", "name": "李默", "age": 24, "appearance": "黑色短发,眼神锐利,左脸颊有一道浅疤。", "personality": "坚韧、谨慎、外冷内热,背负着家族秘密。", "background": "没落武道世家传人,为寻找失踪的父亲踏入江湖。", "relationships": { "father": {"character_id": "li_feng", "relation": "父子", "current_affinity": 80}, "rival": {"character_id": "su_xin", "relation": "亦敌亦友", "current_affinity": -20} }, "current_status": { "health": 85, "location": "青云镇", "inventory": ["家传玉佩", "精铁长剑"], "goal": "调查青云镇的怪异事件" } } // ... 更多角色 ] }

世界观设定 (world_lore.json)

{ "locations": { "qingyun_town": { "name": "青云镇", "description": "地处边陲的小镇,近期频发居民失踪事件,雾气常浓。", "features": ["客栈", "铁匠铺", "被废弃的祠堂"] } }, "factions": { "mystic_blade_sect": { "name": "神刀门", "alignment": "中立偏正", "current_attitude": {"protagonist_li": "未知"} } } }

故事状态与摘要 (story_state.json)

{ "current_timeline": "故事开始后第七天", "recent_summary": "李默抵达青云镇,在客栈听说了失踪案,决定留下调查。他在镇外树林发现了打斗痕迹和一块神秘的黑色布料。", "active_plot_threads": [ {"id": "plot_missing_people", "description": "青云镇居民失踪之谜", "status": "调查中"}, {"id": "plot_father_clue", "description": "寻找父亲李风的线索", "status": "暂无进展"} ], "smart_state": { "character_affinities": { "protagonist_li->su_xin": -20 }, "key_items_location": { "mysterious_cloth": "in_protagonist_inventory" }, "global_flags": { "qingyun_town_alert_level": "elevated" } } }

实操心得:在设计数据结构时,一定要考虑“可检索性”。为每个实体(角色、地点、物品)设置唯一的ID,并在其他部分引用ID而非名称,这样可以避免因AI生成文本中名称的细微变化(如“李默” vs “李默儿”)导致的匹配失败。smart_state里的键最好也设计成易于程序解析的格式。

3.2 第二步:实现上下文组装与提示词工程

这是系统的“烹饪”环节,把原材料(记忆、状态)加工成AI能理解的美味佳肴(提示词)。

一个强大的提示词模板可能长这样:

你是一位资深小说家,正在创作一部武侠奇幻长篇小说。请根据以下背景信息和当前故事状态,续写下一章的内容。 ## 故事背景与世界观 {从world_lore.json中检索出的相关地点、势力介绍} ## 登场角色档案 {从character.json中检索出的,本章节可能涉及的角色详细档案} ## 已发生情节摘要 {从story_state.json中获取的recent_summary,以及更早的摘要浓缩} ## 当前故事状态与待发展线索 - 时间线:{current_timeline} - 活跃线索:{列出active_plot_threads} - 角色关系状态:{从smart_state中提取的关键关系,如“李默对苏欣心存警惕(亲和度-20)”} - 关键物品状态:{如“李默手中有一块来历不明的黑色布料”} ## 创作指令 1. 请以“第二章 青云迷雾”为题,续写约2000字。 2. 场景主要集中在{目标地点}。 3. 需要推动“青云镇居民失踪之谜”这条线索的发展。 4. 人物对话和行动需严格符合其角色档案中描述的性格与背景。 5. 在章节末尾,请用【状态更新】区块列出本章节导致的明确状态变化,格式如下: - [角色A]对[角色B]的亲和度[增加/减少]了[X]点,原因:[简述]。 - 关键物品[物品名]的位置变更为[新位置]。 - 新触发全局标志:[标志名],值:[值]。 现在,开始你的创作:

注意事项:提示词中的“检索”是关键。你需要一个简单的检索函数。例如,如果下一章场景在“青云镇”,就从world_lore.jsonlocations里取出qingyun_town的描述;从character.json中找出current_status.location是“青云镇”或与青云镇相关的角色。对于更复杂的语义检索(比如找出“所有与神秘事件相关的角色”),就需要引入向量数据库,将记忆片段转换为向量存储,根据查询进行相似度搜索。

3.3 第三步:集成大模型并解析输出

调用大模型API(如OpenAI的ChatCompletion)获得生成的章节文本后,工作只完成了一半。

后处理解析“状态更新”: 提示词中我们要求AI在末尾用特定格式输出状态更新。这是一个“指令遵从”的取巧办法,大大降低了自动解析的难度。你的后处理模块需要:

  1. 从生成文本中识别并提取出【状态更新】区块。
  2. 按照预定格式(如YAML或JSON)解析每一行更新语句。
  3. 将这些更新转换为对story_state.jsonsmart_state字段的操作指令。
# 伪代码示例 def parse_state_updates(text): import re pattern = r'【状态更新】\s*(.*?)\s*(?=##|$)' match = re.search(pattern, text, re.DOTALL) if match: updates_text = match.group(1) updates = [] for line in updates_text.strip().split('\n'): if line.startswith('-'): # 解析类似“- [李默]对[苏欣]的亲和度[增加]了[10]点,原因:共同对敌。” parsed = parse_single_update(line) if parsed: updates.append(parsed) return updates return [] def apply_updates_to_state(updates, story_state): for update in updates: if 'affinity_change' in update: key = f"{update['from']}->{update['to']}" story_state['smart_state']['character_affinities'][key] += update['delta'] # ... 处理其他类型更新 save_to_file(story_state)

踩坑记录:完全依赖AI来自动、准确地输出结构化状态更新是不可靠的。在实践中,AI可能会忽略格式要求,或生成模棱两可的描述。因此,一个更稳健的方案是“半自动”:系统提供一个人机交互界面,在AI生成章节后,高亮显示可能涉及状态变化的句子,由作者进行确认和标准化输入。或者,训练一个专门的小型文本分类模型来识别“状态变更事件”。

3.4 第四步:构建工作流与迭代循环

一个完整的创作迭代循环如下:

  1. 初始化/加载:系统加载所有记忆文件(角色、世界、故事状态)。
  2. 规划:用户(或一个规划AI)确定下一章的目标、场景和要推进的线索。
  3. 检索:系统根据规划,从记忆库中检索所有相关信息。
  4. 组装与生成:组装提示词,调用大模型生成章节内容。
  5. 解析与更新:(尝试)自动解析状态更新,并修改记忆文件。如有歧义,等待用户确认。
  6. 归档:将新生成的章节全文保存到“章节库”,并自动生成一段精炼的摘要,更新到story_state.jsonrecent_summary或一个专门的摘要列表中。
  7. 回到第2步:开始下一轮的创作。

这个循环使得故事能够像滚雪球一样持续推进,而AI始终“记得”雪球的核心是什么。

4. 深入挑战与优化策略

实现一个可用的原型不难,但要让它真正可靠地辅助百万字创作,会遇到许多深水区问题。

4.1 一致性与“AI幻觉”的对抗

这是长文本生成的核心挑战。即使提供了详细的档案,AI仍可能生成与已有设定矛盾的内容(幻觉)。例如,角色档案写明“不会武功”,但AI却让他使出了一套剑法。

应对策略

  • 强化提示词约束:在提示词中反复、多角度强调一致性要求。例如:“绝对注意:角色[张三]没有任何武术功底,在描写其行动时,必须符合普通人特征。”
  • 事后一致性检查:生成文本后,运行一个“一致性校验”模块。这个模块可以是一个规则系统(检查关键词冲突),也可以是一个微调的小型NLI(自然语言推理)模型,判断生成段落与原始设定在语义上是否矛盾。
  • 分层记忆与优先级:设定记忆的优先级。例如,“角色核心设定”(如不会武功)的优先级高于“角色近期状态”(如受伤)。当发生冲突时,以高优先级记忆为准,并在提示词中明确指出。
  • 人类监督回路:在关键节点(如每十章结束时)设置强制的人工审核环节,检查主要设定和情节走向是否跑偏。

4.2 状态管理的复杂性与可扩展性

随着字数增长,smart_state会变得极其复杂。角色两两之间的关系就是一个组合爆炸问题。

应对策略

  • 状态抽象与分组:不要记录所有可能的状态。只记录对情节有驱动力的“关键状态”。关系可以抽象为“盟友”、“中立”、“敌对”等几个等级,而非精确的数值。或者,只记录发生了“质变”的关系(如从“陌生”变为“相识”)。
  • 基于事件的状态更新:定义一系列“事件模板”及其对状态的影响。例如,“共同战斗”事件:若双方为临时盟友,则好感度+5;若一方救另一方,则被救者好感度+15。当解析到类似事件时,自动应用模板。
  • 引入图数据库:当角色和势力关系网非常复杂时,考虑使用Neo4j这样的图数据库来管理状态。节点代表实体,边代表关系,边的属性可以存储亲和度、信任度等。这比JSON文件更适合处理复杂的网络关系查询。

4.3 长期记忆的检索效率与精度

如何从几十万字的摘要和几百条设定中,快速找到当前章节最需要的5条信息?

应对策略

  • 混合检索系统
    • 关键词检索:用于精确匹配名称、地点、物品ID。
    • 向量语义检索:用于模糊需求。例如,“找出所有与‘背叛’和‘阴谋’相关的情节摘要”。将每段记忆文本通过嵌入模型(如text-embedding-3-small)转换为向量,存入向量数据库。查询时,将当前创作主题也转换为向量,进行相似度搜索。
    • 元数据过滤:为每段记忆打上标签(如涉及角色:李默,苏欣事件类型:战斗,对话时间戳:故事早期)。检索时先通过标签快速筛选,再进行语义搜索,提升效率。
  • 记忆摘要与分层:并非所有细节都需要被同等检索。为长篇摘要再生成一个“摘要的摘要”(高亮核心事件)。形成“章节全文 -> 详细摘要 -> 核心要点”三层结构。日常检索主要用“核心要点”层,只有在需要深挖细节时才动用下层。

4.4 创作风格与情节走向的宏观控制

如何防止故事变得散漫或陷入重复?如何保持开篇设定的悬疑感或热血风格?

应对策略

  • 风格嵌入:在系统初始化时,提供几段代表目标风格的示例文本(例如,金庸的武侠片段、阿西莫夫的科幻片段),将其转换为风格向量,并在每次生成提示词时,加入“请模仿以下文本的风格”的指令或通过向量检索相似风格记忆。
  • 宏观规划器:引入一个更高级的“规划AI”或基于规则的规划器。它不负责写具体句子,而是负责规划故事弧光。例如,它可以根据“英雄之旅”模板,在故事的不同阶段(启程、启蒙、归来)设置不同的核心任务和主题基调,并动态调整给“写作AI”的指令。
  • 读者反馈模拟:这是一个更前沿的思路。可以训练一个简单的“读者兴趣模型”,根据过往网文的数据,预测某个情节节点(如“主角受挫”、“新角色登场”、“谜底揭晓”)对读者留存的影响。系统可以据此微调情节走向,但这需要大量的数据和复杂的建模。

5. 常见问题与实战排坑指南

在实际搭建和运行过程中,你一定会遇到各种各样的问题。下面是我根据经验总结的一些典型问题及其解决思路。

问题1:AI完全忽略了我在提示词中提供的角色档案,自己瞎编了一个。

  • 原因:提示词太长,关键信息被淹没在了上下文中后部;或者AI的“注意力”没有集中在档案部分。
  • 解决
    1. 结构化与强调:使用##**等Markdown符号强化档案部分的结构。在指令开头就用加粗文字强调:“以下角色档案是创作的根本依据,请严格遵循。
    2. 前置关键信息:将最重要的、绝对不能违反的设定(如角色核心性格、关键背景)放在提示词的最前面。
    3. 分步引导:不要一次性给出所有档案。先给出本章节必然出现的1-2个核心角色的档案,让AI生成一段他们的互动。然后,在后续的提示中再引入新角色。这类似于“思维链”提示。

问题2:状态更新解析失败率很高,AI不按我要求的格式输出。

  • 原因:大模型对于严格遵守特定输出格式的能力不稳定,尤其是复杂格式。
  • 解决
    1. 简化格式:使用最简单的格式,比如纯键值对。
      状态更新: 亲和度.李默.苏欣 = +10 物品位置.神秘布料 = 李默的行囊
    2. Few-Shot示例:在提示词中提供2-3个非常清晰的状态更新示例。
    3. 转向函数调用(Function Calling):如果使用支持函数调用的模型(如GPT-4),这是最佳方案。你可以定义一个update_story_state的函数,描述其参数。然后让AI在生成文本后,直接调用这个函数并传入解析好的参数。模型输出结构化JSON的可靠性远高于输出自由文本中的特定格式。
    4. 接受不完美:将自动解析视为一个“辅助”功能,预期其有20%-30%的误差率,并设计一个便捷的人工修正界面。

问题3:故事写到二三十章后,感觉情节开始重复、乏味,AI总是在用类似的桥段。

  • 原因:AI的生成本质上是基于概率的,如果长期记忆和状态更新总是提供相似的情境(比如总是在“调查-战斗-发现线索”循环),AI就容易陷入模式化。
  • 解决
    1. 注入随机性与意外:在规划阶段,人为或通过一个随机算法,引入一些“意外事件”。例如,在smart_state中设置一个“意外事件池”,当某些条件满足时(如连续三章没有重大转折),就强制在提示词中加入“本章需要发生一个意外的转折,例如:一位看似盟友的角色突然背叛,或发现之前的线索是误导。”
    2. 扩大记忆检索范围:不要只检索最近几章的摘要。偶尔跳回很早的章节,检索一些被遗忘的伏笔或次要角色,让AI去“回收”这些线索,这能有效创造新鲜感。
    3. 切换叙事焦点:如果主线故事陷入停滞,可以规划一个“支线章节”或“配角视角章节”,将检索焦点切换到其他角色和地点上,这能给AI和读者都带来新的刺激。

问题4:系统运行速度越来越慢,尤其是检索部分。

  • 原因:随着章节和记忆条目指数级增长,简单的线性搜索或全量向量检索开销巨大。
  • 解决
    1. 建立索引:对记忆文件中的关键字段(角色ID、地点、时间戳、标签)建立索引数据库。
    2. 分级存储与缓存:将记忆分为“热记忆”(最近10章相关)和“冷记忆”。每次检索优先在“热记忆”中进行,未命中再查全库。对常用的检索结果进行缓存。
    3. 优化向量检索:使用专业的向量数据库(如Milvus, Pinecone),它们针对大规模向量搜索进行了高度优化,支持索引和近似最近邻搜索,速度远快于自己实现的简单循环。

构建这样一个系统,更像是在设计一个“人机协同”的创作环境。它的目标不是取代作家,而是成为一个不知疲倦、记忆力超群、并能提供无限灵感的超级助手。最重要的经验是:不要追求一步到位的全自动化。将人类作者置于循环之中,让系统处理它擅长的(记忆、检索、提供草稿),让人来处理它不擅长的(宏观规划、审美判断、深度一致性检查),才能发挥最大的效能。从这个开源项目出发,你可以根据自己的需求,裁剪或增强其中的模块,最终打造出最适合自己创作流程的AI伙伴。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询