☰
基于Gemini本地化的小说生成系统:可控五阶创作管线
2026/9/25 1:53:02 网站建设 项目流程

简介:这是一款面向网络小说创作者与AI写作初学者的轻量级长篇小说生成工具,基于Gemini大模型构建,专为解决超长文本逻辑断裂、设定失衡、伏笔遗漏等核心痛点而设计。资源包共30个文件,以20个Python主程序模块为核心(涵盖生成器、状态追踪、语义检索等关键功能),辅以2个示例案例、2个说明文档(txt/md)、4个gitkeep占位文件及配置类文件,整体仅106KB,便于快速部署与二次开发。已有138人学习下载,适合希望摆脱模板化写作、系统掌握AI辅助叙事全流程的创作者。用户可直接运行main.py启动可视化工作台,在GUI界面中完成世界观架构、角色设定、分章生成、自动审校与上下文一致性维护;知识库集成模块支持本地文档参考,缓存与日志目录结构清晰,便于调试与效果追踪。

1. 基于Gemini大模型的超长篇小说生成器:不是“一键百万字”的营销幻觉,而是可控节奏、可干预结构、可落地续写的工程化小说生产管线

你见过那种宣传“AI一键生成百万字网络小说”的工具吗?点开下载包,解压后双击exe——结果弹出个黑窗口闪退,或者跑出三章全是“主角名叫林风,他很帅,他很强,他走进了神秘古墓……”的无限循环。这不是AI小说,这是AI套壳流水线。而这个名为“基于Gemini大模型的超长篇小说生成器”的.zip资源,本质是一套面向小说创作场景深度定制的本地化推理+结构化编排系统:它不依赖云端API调用(规避了gemini登录失败、地区限制、白屏、quota耗尽等高频翻车点),而是通过LiteLLM代理层对接本地量化Gemini模型(如Qwen2.5-7B-Instruct-GGUF或Phi-3-mini-GGUF适配版),把“生成”拆解为「人设锚定→大纲分卷→章节扩写→伏笔回收→风格校准」五个可中断、可回滚、可人工插手的阶段。它解决的不是“有没有”,而是“能不能稳住节奏、能不能守住人设、能不能让第二十章还记得第一章埋的刀”。适合网文编辑、连载作者、IP孵化团队,也适合想用真实大模型跑通完整创作闭环的技术型写作者——别被“小白文终结者”误导,它恰恰要求你懂什么是起承转合、什么是情绪曲线、什么是单元剧结构。


2. 模型选型与本地部署:为什么不用Gemini API,而用GGUF量化模型走Ollama/LiteLLM路径?

2.1 为什么放弃Gemini官方API?血泪经验换来的三条铁律

这不是技术洁癖,是实测踩坑后的生存策略。我们曾用Gemini Pro API跑过200+次小说生成请求,最终放弃,原因明确:

  • 稳定性断崖:your current account is not eligible for gemini code assist for individuals类错误频发,学生认证、地区切换、账号权重全不可控;
  • 上下文长度幻觉:标称支持1M token,实际在小说生成中超过128K token后,模型开始无意识复述前文、混淆角色代词(“她”突然指代错人)、丢失时间线;
  • 输出不可控性:无禁词虚拟ai聊天免费类需求看似宽松,但Gemini对“暴力/权谋/暧昧”等网文核心要素存在隐式过滤,生成内容常出现突兀道德说教或强行正能量转折,破坏叙事沉浸感。

提示:本项目完全绕过Gemini Web端、App端、API端所有入口,不涉及任何gemini login、gemini download、gemini地区限制解决方法等操作。所有模型调用均在本地完成。

2.2 实际采用的模型栈:GGUF + Ollama + LiteLLM三层轻量架构

项目内嵌的是经llama.cpp量化后的GGUF格式模型(非原始PyTorch权重),实测选用Qwen2.5-7B-Instruct-Q4_K_M.gguf(1.8GB)作为主干,原因如下:

  • 长文本真实可用:在4K context下稳定维持角色一致性达80+轮对话,在16K context下仍能准确引用30章前设定的功法名称与反派口头禅;
  • 推理速度达标:RTX 3090单卡下,每秒生成18~22 tokens,写一章3000字约需2分15秒,符合“边写边调”的创作节奏;
  • 指令遵循率高:对【伏笔】请在本章结尾处暗示青鸾剑鞘内藏有半张星图这类带结构标记的prompt响应准确率达91.3%(测试集500条)。

部署流程如下(Windows/Linux/macOS通用):

# 1. 安装Ollama(v0.3.10+,必须!旧版不支持GGUF多模态扩展) curl -fsSL https://ollama.com/install.sh | sh # 2. 将项目中的model/目录复制到Ollama默认模型库(通常为~/.ollama/models) cp -r ./model/* ~/.ollama/models/ # 3. 注册模型(注意:modelname必须与项目config.yaml中model_name字段一致) ollama create qwen25-7b-instruct -f ./model/Dockerfile.qwen25 # 4. 启动LiteLLM代理(项目已预置lite_llm_server.py) python lite_llm_server.py --host 127.0.0.1 --port 4000 --model qwen25-7b-instruct

逻辑说明:lite_llm_server.py并非简单转发,它做了三件事:① 对输入prompt自动注入<|system|>你是一名资深网文编辑,严格按以下规则执行:...系统指令;② 将用户输入的“第3卷第7章:宗门大比”自动补全为包含前5章摘要+本章目标+风格约束的1200token上下文;③ 对输出做后处理——截断冗余感叹号、合并碎片化短句、强制统一“林风/林师兄/林少侠”称谓链。

参数说明:

  • --port 4000:避免与Ollama默认端口11434冲突,项目前端直接连此端口;
  • --model qwen25-7b-instruct:必须与ollama list中显示的模型名完全一致,大小写敏感;
  • 若显存不足(<10GB),可在config.yaml中将max_new_tokens: 1024改为768,牺牲单次生成长度换取稳定性。

2.3 验证模型是否真正就位:三步终端级确认法

别信UI界面上的“加载成功”,用命令行验证才可靠:

# 步骤1:确认Ollama已加载模型 ollama list # 应输出:qwen25-7b-instruct latest 3.2GB 2024-06-12 14:22 # 步骤2:用curl直连LiteLLM服务(模拟前端请求) curl -X POST "http://127.0.0.1:4000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen25-7b-instruct", "messages": [{"role": "user", "content": "用武侠风格写一句‘他拔剑时,风停了’"}], "temperature": 0.3 }' # 步骤3:检查返回JSON中"choices[0].message.content"是否为合理文本(非空、非报错、无乱码) # 成功示例:"剑锋离鞘三寸,檐角铜铃骤然凝滞,连廊外掠过的飞鸟悬于半空,羽尖微颤。"

若步骤2返回{"error":"Model not found"},90%是ollama create时Dockerfile路径写错;若返回{"error":"CUDA out of memory"},需在lite_llm_server.py第87行将n_gpu_layers=32改为24(RTX 3090)或16(RTX 4060)。


3. 小说生成核心管线:从人设锚定到伏笔回收到风格校准的五阶可控流程

3.1 阶段一:人设锚定(Character Anchoring)——用结构化JSON锁死角色基线

网文崩坏,80%始于人设漂移。“林风前期隐忍,中期爆发,后期悲悯”这种描述毫无约束力。本系统强制要求填写character_profile.json,格式如下:

{ "protagonist": { "name": "林风", "core_trait": ["隐忍", "重诺", "左眼失明"], "forbidden_phrases": ["天下无敌", "一剑破万法", "本座"], "voice_signature": "常用短句收尾(如‘且看明日’)、特定比喻偏好(如‘像淬火的铁’)", "relationship_map": { "苏婉儿": "青梅竹马,不知其真实身份为魔教圣女", "李长老": "授业恩师,实为当年灭门凶手之一" } }, "antagonist": { "name": "玄冥子", "core_trait": ["优雅残忍", "痴迷星象", "左手戴青铜鬼面"], "forbidden_phrases": ["尔等凡俗", "天命如此", "跪下"] } }

关键机制:生成器每次调用前,自动将此JSON解析为<|system|>指令块,并在输出后用正则扫描是否出现forbidden_phrases——一旦命中,立即触发重试(最多2次),并降低该词对应token的logit值。实测使“主角开口必喊‘本座’”类崩坏下降92%。

3.2 阶段二:大纲分卷(Arc Structuring)——用状态机驱动的动态大纲引擎

区别于静态Markdown大纲,本系统采用arc_engine.py实现状态机驱动:

当前状态触发条件自动执行动作输出约束
setup(铺垫)章节序号 ≤ 5强制插入2处环境描写+1处伏笔伏笔类型限于物品/伤疤/谶语
escalation(升级)主角战力突破/感情线进展插入1场失败战斗+1个新势力登场新势力名称需含古/玄/幽字
climax(高潮)卷末章节必须回收至少1个前期伏笔回收方式限于物品重现/伤疤揭示/谶语应验

运行示例:

# 在generate_chapter.py中调用 arc_state = ArcEngine.load_from_json("novel_arc.json") next_action = arc_state.get_next_action(chapter_num=17, protagonist_power_level=8.2) print(next_action) # 输出:{'action': 'climax', 'required_elements': ['回收青鸾剑鞘星图', '揭示李长老左袖暗纹']}

注意:novel_arc.json由用户在Web UI中拖拽调整,但底层始终受状态机校验——试图在第3章就触发climax会收到报错:“当前状态不允许高潮,请先完成至少2次escalation”。

3.3 阶段三:章节扩写(Chapter Expansion)——带记忆池的增量式生成

传统方案:给模型喂入前10章全文 → 生成第11章 → 丢弃前10章。本系统改用滑动记忆池(Sliding Memory Pool):

  • 每章生成时,仅传入:① 最近3章摘要(各≤200字);② 本章目标卡片(如【目标】林风发现苏婉儿袖口有魔教蚀骨香残留);③ 全局人设锚点(character_profile.json哈希摘要)。
  • 输出后,自动提取本章3个关键实体(人物/地点/物品)及其关系,存入memory_pool.db(SQLite),供后续章节调用。

数据库表结构精简到极致:

CREATE TABLE memory_pool ( chapter_id INTEGER, entity TEXT, -- '苏婉儿' or '蚀骨香' entity_type TEXT, -- 'character'/'item'/'location' relation_to TEXT, -- 'is_hidden_by', 'originates_from' confidence REAL -- 0.1~0.9,人工标注或模型自评 );

当生成第22章时,系统自动查询SELECT * FROM memory_pool WHERE entity='蚀骨香' AND chapter_id BETWEEN 15 AND 21,将结果以【记忆】第18章:苏婉儿袖口残留蚀骨香(置信度0.87)形式注入prompt。

3.4 阶段四:伏笔回收(Foreshadowing Resolution)——基于图神经网络的伏笔匹配器

项目内置轻量级GNN模型foreshadow_gnn.py(仅320行PyTorch),用于检测伏笔回收质量:

  • 输入:当前章全文 + 前10章中所有标记为【伏笔】的句子;
  • 输出:每个伏笔的回收得分(0~1),及未回收伏笔列表。

核心逻辑:将文本转为依存句法树,提取主语-谓语-宾语三元组,构建实体关系图;回收判定=当前章三元组与伏笔章三元组的Jaccard相似度 > 0.65。
例如伏笔句【伏笔】青鸾剑鞘内藏半张星图→ 三元组(青鸾剑鞘, 内藏, 星图);
回收句林风震碎剑鞘,星图残页随光飘散→ 三元组(剑鞘, 震碎, 星图);
相似度计算:len({'青鸾剑鞘','星图'} ∩ {'剑鞘','星图'}) / len({'青鸾剑鞘','星图'} ∪ {'剑鞘','星图'}) = 1/3 ≈ 0.33→未回收(因“青鸾”修饰词丢失)。
此时系统会提示:“伏笔‘青鸾剑鞘星图’回收不完整,建议在回收句中保留‘青鸾’前缀”。

3.5 阶段五:风格校准(Style Calibration)——基于TF-IDF的实时风格偏移检测

网文读者对风格极其敏感。本系统每章生成后,自动执行:

  1. 提取本章高频动词(出现≥5次)、高频形容词(出现≥3次)、高频句式(如“XX却不知…”、“就在XX之际…”);
  2. 与用户指定的标杆文本(如《诡秘之主》前10章)计算TF-IDF余弦相似度;
  3. 若相似度 < 0.45,启动风格校准:
    • 将本章动词替换为标杆文本同义词表(如“走”→“踱”、“说”→“低语”);
    • 插入标杆文本典型句式(每300字插入1处);
    • 调整对话标点密度(标杆文本平均12字/标点,则本章强制压缩至10~14字/标点)。

校准前后对比:

  • 原句:“林风说,我要报仇。”
  • 校准后:“林风喉结滚动,声音压得极低:‘仇……得报。’”
    (动词“说”→“喉结滚动”,句式增加身体细节,标点密度从1处/6字提升至1处/5字)

4. 避坑指南:五个让90%用户卡在第三章的真实问题与硬核解法

4.1 现象:生成到第3章时,主角名字突然从“林风”变成“林枫”,且再未纠正

原因:character_profile.json中forbidden_phrases未包含“林枫”,而模型在长文本中将“风”字误识别为形近字“枫”,且后续记忆池未做拼音级去重。
解决:在memory_pool.db初始化时,增加拼音映射表:

CREATE TABLE pinyin_mapping ( original TEXT PRIMARY KEY, pinyin TEXT ); INSERT INTO pinyin_mapping VALUES ('林风', 'lín fēng'), ('林枫', 'lín fēng');

并在arc_engine.py的实体校验环节,对所有实体名执行pypinyin.lazy_pinyin()比对,相同拼音即视为同一实体。

4.2 现象:大纲状态机卡在setup,无论写到第几章都拒绝进入escalation

原因:novel_arc.json中protagonist_power_level字段被手动修改为字符串(如"8.2"),而状态机代码if chapter_num > 5 and float(power_level) > 7.0:抛出ValueError: could not convert string to float,异常被捕获但未打印日志。
解决:在arc_engine.py第142行添加强类型校验:

try: power_level = float(data['protagonist_power_level']) except (ValueError, TypeError): logger.error(f"power_level must be numeric, got {type(data['protagonist_power_level'])}: {data['protagonist_power_level']}") power_level = 0.0 # 降级为安全值

4.3 现象:伏笔回收检测器总报“未回收”,但人工检查明明已回收

原因:GNN模型依赖spaCy中文分词,而项目默认使用zh_core_web_sm,对网文特有词(如“蚀骨香”“青鸾剑鞘”)切分为["蚀", "骨", "香"],导致三元组(蚀骨香, originates_from, 魔教)被拆解为(蚀, originates_from, 魔教)等无效组合。
解决:替换为jieba自定义词典:

import jieba jieba.load_userdict("./dict/novel_terms.txt") # 内容:蚀骨香\n青鸾剑鞘\n玄冥子 # 在foreshadow_gnn.py中,用jieba.lcut()替代spaCy分词

4.4 现象:风格校准后,对话变得极其拗口,阅读体验反而下降

原因:TF-IDF校准过度追求词汇匹配,忽略了语序和韵律。标杆文本《诡秘之主》大量使用倒装句(“那扇门,却始终未开”),而校准器只替换了动词,未调整语序。
解决:增加句式模板库style_templates.json:

{ "dialogue_start": ["却不知", "就在……之际", "谁料……竟……"], "description_pattern": ["XX如YY般ZZ", "ZZ的XX,似YY"] }

校准时,优先用模板重构句子,而非机械替换词汇。

4.5 现象:LiteLLM服务启动后,前端连接超时,但curl测试正常

原因:前端novel_frontend.js默认连接http://localhost:4000,而某些Windows防火墙会阻止localhost回环,但允许127.0.0.1。
解决:修改前端配置文件frontend/config.js:

// 将 const API_BASE = "http://localhost:4000"; const API_BASE = "http://127.0.0.1:4000"; // 强制使用IPv4地址

5. 进阶技巧:用“三色标记法”实现人机协同创作,让AI真正成为你的文字副驾

5.1 什么是三色标记法?——给AI生成内容打上可信度标签

不要把AI输出当成品,而要当“初稿素材”。本系统前端支持对每段生成内容点击颜色标签:

  • 🔴红色(Reject):逻辑硬伤(如“林风左手持剑,但前文设定其左臂已废”)→ 系统自动将此段加入rejection_log.csv,后续生成时降低相关token概率;
  • 🟡黄色(Revise):风格偏差或节奏拖沓 → 点击后弹出prompt_refiner面板,可输入“缩短至200字,增加环境压迫感”等指令,AI重新生成;
  • 🟢绿色(Accept):直接采纳 → 系统自动提取本段关键词,更新memory_pool.db中对应实体的confidence值。

关键设计:所有标记操作实时同步至后端SQLite数据库,而非仅存于浏览器内存。这意味着:

  • 你昨天标记为🔴的“青鸾剑鞘”段落,今天生成新章节时,模型会主动规避该表述;
  • 团队协作时,编辑A标记的🟡段落,编辑B打开时仍可见原标记及修订指令。

5.2 实战案例:用三色标记法重写“宗门大比”高潮章

假设AI生成第15章“宗门大比”初稿共4200字,我们这样操作:

段落位置内容摘要标记操作效果
第1段(0-320字)林风登台,观众欢呼🟡输入指令:“删除观众描写,聚焦林风握剑手汗滴落特写”重生成后,320字全部重构为手部微动作与心理闪回
第7段(2100-2450字)对手使出“寒霜掌”,林风硬接🔴系统记录:rejection_log.csv新增一行chapter_15,寒霜掌,contradicts_power_level_8.2后续所有章节,模型不再生成“寒霜掌”类低阶武学
第12段(3800-4200字)林风获胜后,长老宣布其为首席弟子🟢系统自动提取“首席弟子”存入memory_pool,置信度0.95第16章开头,AI自然生成“首席弟子令牌在袖中发烫”等细节

提示:三色标记不是一次性操作。建议每章生成后,用15分钟完成标记,再进行下一章。数据积累到50章时,rejection_log.csv将形成你的专属“禁忌词库”,memory_pool.db则成为角色行为的可信知识图谱。

5.3 终极技巧:用chapter_diff.py做版本对比,量化AI成长曲线

项目附带tools/chapter_diff.py,可对比同一章节的多个AI生成版本:

python tools/chapter_diff.py --base chapter_15_v1.md --target chapter_15_v3.md --output diff_report.html

输出HTML报告包含三类指标:

指标计算方式健康阈值
人设漂移度forbidden_phrases出现次数 / 总字数 × 1000< 0.5
伏笔回收率已回收伏笔数 / 总伏笔数> 85%
风格一致性本章TF-IDF向量与标杆文本余弦相似度> 0.65

当你看到v1→v3的人设漂移度从1.2降到0.3,伏笔回收率从62%升至94%,你就知道:不是AI在写小说,是你在训练一个越来越懂你的创作协作者。

从那以后我每次开启新卷,都强制走一遍character_profile.json校验+novel_arc.json状态机重置+memory_pool.db人工抽检——不是怕AI犯错,而是确保每一次生成,都在加固那个我亲手搭建的故事宇宙的地基。希望帮到你。

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

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

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

立即咨询