1. 项目概述:当AI开始“阅读”并“创作”小说
最近在GitHub上看到一个挺有意思的项目,叫auto-novel/auto-novel。光看名字,你可能会觉得这又是一个用AI生成小说的工具,市面上这类工具已经不少了。但当我深入去研究它的代码和设计思路时,发现它的野心和实现路径,远比一个简单的“AI写作助手”要复杂和深刻得多。它更像是一个试图让AI真正“理解”长篇叙事结构,并在此基础上进行“自主”创作的实验性框架。
简单来说,auto-novel项目的核心目标,是构建一个能够自动化生成、续写乃至优化长篇连贯性小说的系统。它不满足于生成孤立的段落或章节,而是致力于解决长篇创作中最核心的难题:长期一致性。这包括人物性格、故事背景、情节逻辑、世界观设定在数十万甚至上百万字篇幅中的稳定维持。对于任何一个写过小说的人都知道,做到这一点有多难,即便是人类作者也常常需要借助详细的大纲和人物设定表来避免“吃书”(前后矛盾)。而auto-novel试图用一套系统化的工程方法,让AI来攻克这个难题。
这个项目适合谁呢?首先,当然是对于AI辅助创作、自然语言生成技术感兴趣的研究者和开发者。你可以从中学习到如何将大语言模型(LLM)与复杂的控制逻辑、状态管理结合起来,完成一项非结构化的创造性任务。其次,对于网文作者、内容创作者来说,它提供了一个极具潜力的“超级助手”雏形,或许能帮你突破创作瓶颈,快速生成灵感草稿,或者维护庞大的故事设定。最后,对于任何对“AI能否真正理解并创造复杂叙事”这个哲学兼工程问题抱有好奇心的人,这个项目都是一个绝佳的观察样本。
2. 核心架构与设计哲学拆解
auto-novel不是一个单一的模型,而是一个由多个模块协同工作的智能体(Agent)系统。这是理解其价值的关键。它没有试图用一个“全能”的模型解决所有问题,而是采用了“分而治之”的策略,将写小说这个宏大任务分解为一系列子任务,并为每个子任务分配合适的“专家”模块。
2.1 模块化分工:从“独奏”到“交响乐团”
传统的AI写作工具,往往是给一个提示词(Prompt),让一个大模型(比如GPT-4)一次性生成一大段内容。这种方式对于短篇或灵感迸发很有效,但对于长篇,就像让一位音乐家同时演奏所有乐器,极易失控走调。auto-novel的设计哲学是组建一个“交响乐团”。
故事规划师(Story Planner):这是乐团的总指挥。它的职责是基于一个初始种子(比如一个开头、一个主题或几个关键词),生成一个高层次的、结构化的故事大纲。这个大纲可能包括核心冲突、主要情节点、人物弧光、章节划分等。它不关心具体的文字描写,只负责故事的骨骼和走向。在实现上,这个模块通常由一个LLM驱动,但会通过特定的提示工程(Prompt Engineering)和输出格式约束(如要求以JSON或特定标记语言输出),强制其进行结构化思考。
章节生成器(Chapter Generator):这是各个声部的演奏家。在总指挥(大纲)的指导下,每个章节生成器负责将抽象的情节点转化为具体的一章内容。这里的关键是上下文管理。生成器在动笔前,必须清楚地知道:当前故事进展到了哪一步?所有已出场人物的最新状态是什么(情绪、位置、关系)?之前埋下了哪些伏笔?为了实现这一点,项目会维护一个动态的“故事状态”数据库或知识图谱,记录所有关键实体和关系的变化。
一致性检查器(Consistency Checker):这是乐团的调音师和质检员。每当新的章节生成后,这个模块会对其进行扫描,检查是否存在与之前已建立事实相矛盾的地方。例如,第一章说主角的眼睛是蓝色的,第三章却写成了棕色;或者某个角色已经在上一章去了北方,本章却在没有交代的情况下突然出现在南方。检查器同样利用LLM的能力,但任务更聚焦于“事实核对”而非创作。一旦发现矛盾,它可以触发警报,甚至要求章节生成器进行修订。
风格与情感调节器(Style & Tone Modulator):这是赋予作品独特“音色”的模块。一部小说可以有统一的文风(如古典、白话、网文风),但不同场景的情感基调需要变化(悬疑章节的紧张感、温情章节的舒缓感)。这个模块可以通过在提示词中注入风格描述、提供参考段落,或者使用经过特定风格文本微调过的模型,来引导生成内容的情感走向和语言风格,避免全文一个语调的枯燥感。
注意:在实际的代码实现中,这些模块可能并非完全独立,而是以“智能体”的形式存在,通过一个中央调度器(Orchestrator)来传递任务和共享状态。这种架构的优势在于灵活性和可扩展性,你可以随时替换或升级某个模块(比如换用更强大的LLM作为生成器),而不必推翻整个系统。
2.2 状态管理:故事的“记忆中枢”
长篇创作的核心挑战是记忆。auto-novel项目如何让AI记住之前写过的所有内容?它不可能每次都把整部小说(可能已有几十万字)作为上下文喂给LLM,这既不经济(token成本极高)也不现实(有上下文长度限制)。
因此,项目必须设计一套高效的状态摘要与检索系统。这通常包含以下部分:
- 向量数据库(Vector Database):将已生成章节的关键信息(人物描述、地点特征、重要事件、物品细节等)转换为向量(Embeddings)并存储。当需要生成新内容或进行检查时,系统可以根据当前焦点,从向量库中快速检索出最相关的历史片段,作为补充上下文提供给LLM。这相当于为AI配备了一个“外部记忆”,让它能快速“回忆”起相关细节。
- 结构化知识图谱(Knowledge Graph):对于核心设定,如人物关系、世界法则、势力分布等,系统会尝试将其维护在一个结构化的图谱中。这个图谱随着故事推进而动态更新。例如,当两个角色结盟,图谱中的关系边就从“敌对”更新为“同盟”。生成新章节时,相关的子图会被提取出来,帮助LLM保持关系逻辑的一致。
- 渐进式摘要(Progressive Summarization):对于已完成的章节,系统会自动生成多级摘要。比如,每一章有一个百字摘要,每五章有一个五百字的情节梗概,每二十章有一个千字的故事线总结。当需要为后续生成提供背景时,系统可以根据需要提供不同粒度的摘要,而不是原始文本,极大地压缩了有效信息的密度。
这种状态管理机制,是auto-novel区别于简单文本续写工具的技术分水岭。它让AI的“创作”过程,从基于局部模式的“联想”,变成了基于全局状态的“推理”。
3. 关键技术实现与实操要点
理解了架构,我们来看看具体是怎么实现的。这里会涉及一些技术选型和实操中的关键决策。
3.1 大语言模型(LLM)的选型与提示工程
整个系统的智能核心依赖于LLM。选型时需要在能力、成本、可控性和速度之间权衡。
闭源 vs. 开源:
- 闭源模型(如GPT-4、Claude-3):能力强大,尤其在复杂推理和遵循复杂指令方面表现优异。这对于“故事规划师”和“一致性检查器”这类需要高度理解力和逻辑性的模块至关重要。缺点是API调用有成本,且存在延迟,对于需要频繁、快速生成大量文本的“章节生成器”模块,长期运行成本可能很高。
- 开源模型(如Llama 3、Qwen、DeepSeek):可以本地部署,没有调用次数限制,数据隐私性好。近年来,70B参数级别的开源模型在创作类任务上已经表现出接近顶级闭源模型的水平。对于“章节生成器”这种需要“量产”文本的模块,使用一个在本地部署的、经过小说文本微调过的开源模型,是极具性价比的选择。
auto-novel项目通常会采用混合策略,用闭源模型做“大脑”(规划、检查),用开源模型做“手”(具体写作)。
提示工程(Prompt Engineering):这是驱动LLM的灵魂。
auto-novel的提示词绝非简单的“请续写下面的故事”。它是一个高度结构化、包含多重约束的“创作指南”。- 系统提示词(System Prompt):定义模型的角色和基本行为准则。例如:“你是一个专业的小说创作助手,擅长创作具有长期一致性的奇幻冒险故事。你必须严格遵循提供的故事大纲、人物设定和世界观。”
- 用户提示词(User Prompt):包含具体的任务指令、上下文信息和格式要求。一个典型的章节生成提示词可能如下结构:
任务:根据以下信息,撰写小说的第X章。 故事总纲:[此处插入高度浓缩的故事总纲] 上一章摘要:[此处插入上一章的百字摘要] 本章情节点:[从大纲中提取的本章需要完成的核心情节点] 活跃人物状态:[从知识图谱中提取的本章出场人物的最新状态,包括情绪、装备、目标等] 关键设定提醒:[需要在本章中体现或不能违背的世界观设定,如“魔法需要吟唱”、“A城位于北方”] 需要避免的矛盾:[一致性检查器之前发现的、需要在本章规避的问题列表] 写作风格要求:[如“语言简洁明快,多使用对话和动作描写,营造紧张氛围”] 输出格式要求:[如“以纯文本段落输出,不要包含任何Markdown格式或章节标题”]
精心设计的提示词,是将人类创作意图“编译”成AI可执行指令的关键。它极大地压缩了生成过程中的不确定性。
3.2 工作流编排与错误处理
各个模块如何有序协作?这需要一个稳健的工作流引擎。项目可能会采用像LangChain、LlamaIndex或AutoGen这类框架来构建智能体工作流。
一个简化的生成单章工作流可能如下:
- 触发:用户指令或定时任务触发新章节生成。
- 规划:中央调度器调用“故事规划师”,结合当前故事状态,确定下一章的核心目标和情节点。
- 上下文准备:调度器从向量库和知识图谱中,检索出与新章节最相关的所有历史信息(人物、地点、事件),并生成浓缩的上下文摘要。
- 生成:调度器将规划好的情节点和准备好的上下文,组装成详细的提示词,调用“章节生成器”(可能是本地开源模型)生成章节初稿。
- 检查:调度器将新生成的章节与历史状态一起,提交给“一致性检查器”(可能用更强的闭源模型)进行审核。
- 决策:
- 如果检查通过,新章节被正式采纳,系统更新向量库、知识图谱和摘要,流程结束。
- 如果检查发现矛盾,将矛盾点和修订建议反馈给“章节生成器”,进行修订生成。这个过程可能迭代数次。
- 如果多次修订仍无法解决,可能将问题上报给“故事规划师”,请求调整后续大纲,或者最终标记为需要人工介入的“疑难问题”。
实操心得:在设置工作流时,超时重试和熔断机制必不可少。LLM API调用可能失败,网络可能不稳定。必须为每个模块调用设置合理的超时时间,并准备降级方案(例如,一致性检查失败时,如果重试多次仍不行,可以暂时记录日志并放行,后续由人工复查,而不是让整个流程卡死)。此外,成本监控也非常重要,尤其是使用闭源API时,需要在代码中集成成本计算和预警,避免意外的高额账单。
3.3 评估与迭代:如何知道AI写得好不好?
这是一个开放性问题。auto-novel项目本身可能包含一些自动评估机制,但更多依赖于人工评估和基于规则的检查。
自动评估指标:
- 一致性分数:通过“一致性检查器”发现的矛盾数量来反向衡量。矛盾越少,分数越高。
- 多样性分数:分析生成文本的词汇多样性、句法复杂度,避免重复和模板化。
- 与大纲贴合度:使用文本相似度或LLM判断,评估生成章节是否完成了预设的情节点。
- 基础语言质量:如语法错误检测、流畅度评分。
人工评估:这是黄金标准。需要设计评估表格,让人类读者从多个维度打分:
- 连贯性:故事读起来是否顺畅?前后逻辑是否自洽?
- 吸引力:情节是否有趣?是否想继续读下去?
- 人物塑造:人物行为是否符合其设定?是否有成长或变化?
- 文笔:语言是否优美、符合风格?
基于这些反馈,开发者可以回头优化提示词、调整模块参数,甚至重新训练或微调某些模块(如风格调节器),形成一个“创作-评估-优化”的闭环。
4. 从部署到运行:搭建你自己的AI小说工厂
如果你对这个项目感兴趣,想自己搭建一个类似的系统玩一玩,或者进行二次开发,下面是一个大致的实操路线图。请注意,auto-novel是一个实验性项目,其代码可能不断变化,以下流程基于此类项目的通用实践。
4.1 环境准备与依赖安装
首先,你需要一个具备一定算力的开发环境。如果打算使用本地开源模型,GPU是必须的(至少16GB显存,推荐24GB以上)。如果全部依赖云端API,那么一台普通的开发机即可。
克隆项目与依赖:
git clone https://github.com/auto-novel/auto-novel.git cd auto-novel # 仔细阅读项目的README.md和requirements.txt,不同分支可能有不同要求 pip install -r requirements.txt模型准备:
- 对于API模式:你需要准备相应服务的API密钥(如OpenAI, Anthropic等),并将其设置为环境变量。
export OPENAI_API_KEY='your-key-here' - 对于本地模型:你需要下载模型权重。例如,使用
ollama拉取一个适合创作的模型:ollama pull llama3.1:8b-instruct-q4_K_M # 或者使用 huggingface transformers 库
项目配置文件中通常会指定默认使用的模型,你需要根据你的资源和需求修改这些配置。
- 对于API模式:你需要准备相应服务的API密钥(如OpenAI, Anthropic等),并将其设置为环境变量。
基础设施服务:如果需要向量数据库和知识图谱,你需要部署相应的服务。
- 向量数据库:
ChromaDB或Qdrant是轻量级、易于集成的选择,可以本地运行。 - 知识图谱:初期可以用简单的图数据库如
Neo4j(社区版免费),或者甚至用NetworkX库在内存中维护一个简单的图结构。
- 向量数据库:
4.2 核心配置详解
项目的核心通常是一个配置文件(如config.yaml或.env文件),你需要根据你的设置进行调整。
# 示例配置结构 llm: planner: provider: "openai" # 故事规划师使用OpenAI model: "gpt-4-turbo" temperature: 0.7 # 创造性稍高 generator: provider: "local" # 章节生成器使用本地模型 model_path: "./models/novel-llama-7b" # 或者使用 ollama # model: "llama3.1:8b-instruct" temperature: 0.9 # 创造性更高,用于多样化文本生成 checker: provider: "openai" model: "gpt-4" temperature: 0.1 # 创造性极低,专注于事实核对 vector_db: type: "chroma" persist_directory: "./data/chroma_db" knowledge_graph: enabled: true # 初始可以简化,用JSON文件存储核心关系 file_path: "./data/world_graph.json" workflow: max_retries: 3 consistency_check_enabled: true关键参数解析:
- temperature(温度):这是LLM生成时最重要的参数之一。值越高(接近1.0),输出越随机、有创意;值越低(接近0),输出越确定、保守。因此,给“规划师”和“生成器”设置较高的温度(如0.7-0.9)以激发创意,给“检查器”设置极低的温度(如0.1)以确保其判断的稳定和可靠。
- persist_directory:向量数据库的持久化路径,确保重启后记忆不丢失。
- max_retries:工作流中某个步骤失败后的重试次数,防止因临时网络问题导致流程中断。
4.3 启动与初次运行
配置好后,通常可以通过一个主脚本来启动整个系统。
# 假设项目入口是 main.py python main.py --mode "generate" --seed "一个关于星际考古学家发现失落文明的故事"--mode:指定运行模式,如generate(从头生成),continue(续写已有故事),evaluate(评估已有文本)。--seed:提供故事种子。可以是一个开头句子、一段摘要、几个关键词,甚至是一个完整的故事大纲文件路径。
系统启动后,你会在终端或日志文件中看到各个模块的调用信息:
[INFO] 故事规划师启动,基于种子生成大纲... [INFO] 大纲生成完成,共规划12个核心情节点。 [INFO] 开始生成第1章:初探遗迹。准备上下文中... [INFO] 调用本地Llama模型生成章节内容... [INFO] 第1章初稿生成完毕,字数:2150。 [INFO] 启动一致性检查... [INFO] 检查通过,未发现矛盾。 [INFO] 更新向量数据库和知识图谱... [INFO] 第1章处理完成,等待下一步指令或继续生成第2章...首次运行时,由于需要加载模型、初始化数据库,可能会比较慢。成功生成第一章后,就进入了自动或半自动的创作流水线。
5. 常见问题、排查技巧与深度优化
在实际操作中,你一定会遇到各种各样的问题。下面是一些典型问题及其解决思路,以及一些进阶的优化方向。
5.1 生成内容质量不佳
这是最常见的问题,表现为故事无聊、逻辑牵强、人物扁平、文笔重复。
问题诊断与解决:
症状 可能原因 解决方案 故事散乱,没有主线 “故事规划师”的提示词不够强,或使用的模型推理能力不足。 1. 强化规划师的系统提示词,明确要求其输出包含“核心冲突”、“主角目标”、“反派阻碍”、“情感弧线”等要素的结构化大纲。
2. 为规划师升级模型,换用GPT-4、Claude-3 Opus等顶级推理模型。人物对话和行为模式化 “章节生成器”的提示词中缺乏具体的人物状态和性格描述。 1. 在生成每章的提示词中,动态插入该章出场人物的详细状态卡,包括当前情绪、短期目标、对其他人物的看法等。
2. 提供一些该人物的经典对话或行为片段作为示例,让模型模仿。文笔枯燥,描写单一 模型本身缺乏文学训练,或“风格调节器”未起作用。 1. 为“章节生成器”使用在大量文学作品上微调过的模型(如专门的小说模型)。
2. 在提示词中加入具体的风格指令,如“请使用细腻的环境描写来烘托孤独氛围”、“多使用比喻和通感”。
3. 尝试在生成后增加一个“文笔润色”模块,用另一个LLM对初稿进行语言美化。频繁出现事实矛盾 “一致性检查器”不够敏感,或检索的上下文不全面。 1. 加强检查器的提示词,让其专注于“事实核查”,并列出具体的核查清单(人物外貌、地点、时间线、物品归属等)。
2. 优化向量检索策略,确保检索到的上下文片段真正覆盖了所有可能相关的历史信息。可以尝试混合检索(同时检索相似段落和实体关联段落)。进阶技巧:人工引导与“滚雪球”: 完全自动生成的作品往往缺乏灵性。一个更有效的模式是“AI为主,人工为辅”。
- 人工设定关键锚点:在故事的关键节点(开头、情节点、转折点、高潮、结尾),由人类作者亲自撰写或深度修改一段内容。这些高质量、强逻辑的“锚点”会成为AI后续生成时强有力的上下文引导,将故事“拉回”到理想的轨道上。
- “滚雪球”式创作:不要试图让AI一口气生成十万字。而是采用“写一段,评一段,改一段,再继续”的循环。人类作者定期阅读AI生成的内容,提供简短的反馈(如“这段节奏太慢”、“这个人物的反应不符合其性格”),系统将这些反馈融入后续的提示词中,指导AI调整方向。这样,作品的质量会在迭代中不断提升。
5.2 性能与成本问题
生成速度慢,或者API调用费用高昂。
性能瓶颈排查:
- 使用
python -m cProfile或line_profiler进行性能分析,找到是哪个模块(模型推理、向量检索、图谱查询)最耗时。 - 对于本地模型,推理速度主要受限于GPU和模型大小。考虑使用量化版本(如GPTQ、GGUF格式的4-bit或8-bit模型)能大幅提升推理速度并降低显存占用,对质量损失通常很小。
- 对于向量检索,确保建立了有效的索引。对于ChromaDB,选择合适的距离函数(如余弦相似度)和索引类型。如果数据量很大,考虑分批检索或使用近似最近邻(ANN)算法。
- 使用
成本控制策略:
- 模型分工:这是最有效的策略。将昂贵的、高能力的闭源模型(如GPT-4)仅用于最需要复杂推理的“规划”和“检查”环节。将大量的、重复的文本生成任务交给本地部署的开源模型。
- 缓存结果:对于某些中间结果,比如对同一段历史文本的摘要,可以缓存起来,避免重复计算。
- 使用更便宜的API:对于一致性检查等任务,可以尝试使用
gpt-3.5-turbo或claude-3-haiku这类“性价比”模型,虽然能力稍弱,但成本低很多,通过精心设计提示词也能达到不错的效果。 - 设置预算和用量告警:在调用API的代码层集成监控,当日费用或月费用接近阈值时自动告警或切换至降级模式(如改用本地模型)。
5.3 系统稳定性与错误处理
程序运行中意外崩溃,或陷入死循环。
强化错误处理:
# 示例:为LLM调用添加健壮的包装函数 import tenacity from openai import OpenAI client = OpenAI() @tenacity.retry( stop=tenacity.stop_after_attempt(3), # 最多重试3次 wait=tenacity.wait_exponential(multiplier=1, min=4, max=10), # 指数退避等待 retry=tenacity.retry_if_exception_type((APIError, Timeout, APIConnectionError)) # 只针对特定异常重试 ) def robust_llm_call(prompt, model="gpt-3.5-turbo"): try: response = client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], timeout=30.0 # 设置超时 ) return response.choices[0].message.content except Exception as e: log_error(f"LLM调用失败: {e}") # 重试后仍失败,返回一个安全的降级内容或抛出特定异常 raise GenerationFailedError("无法生成内容,请检查网络或API状态。")使用
tenacity这样的重试库,配合指数退避策略,可以有效应对暂时的网络波动或API限流。防止无限循环:在“生成-检查-修订”的循环中,必须设置最大迭代次数(如5次)。如果超过次数仍未通过检查,应记录错误、保存当前状态,并转为“需要人工介入”的状态,而不是让程序一直跑下去。
5.4 内容安全与伦理考量
这是一个无法回避的话题。AI生成的内容可能包含偏见、有害信息或不恰当的描写。
技术层面:
- 使用自带安全机制的模型:大多数主流商用API和负责任的开源模型都在训练中加入了安全对齐(Safety Alignment),会拒绝生成明显有害的内容。
- 后处理过滤:在最终输出前,增加一个“内容安全过滤器”模块。这个模块可以用一个分类模型来识别文本中是否包含暴力、色情、仇恨言论等,也可以使用LLM本身进行判断(提示词:“请判断以下段落是否包含不适于公开发布的内容...”)。
- 关键词黑名单:维护一个基础的关键词黑名单,在生成过程中进行简单过滤。
流程层面:
- 明确告知:如果作品计划公开发布,必须明确标注“由AI辅助生成”。
- 人工审核:建立最终的人工审核环节,确保内容符合平台规范和社会公序良俗。AI是工具,人才是责任的最终主体。
auto-novel项目为我们展示了一条通往AI长篇创作的道路,它不是魔法,而是一套严谨的、模块化的系统工程。它把“创作”这个看似感性的过程,拆解成了可规划、可执行、可检查的理性步骤。虽然目前的技术还远未达到能替代人类顶尖作家的水平,但它已经是一个无比强大的“副驾驶”和“灵感引擎”。对于开发者,它是研究AI认知与推理的绝佳沙盒;对于创作者,它是一把能打开新世界大门的钥匙。未来的发展,或许不在于让AI写得像人一样好,而在于探索人与AI协作创作的全新范式。