ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI辅助小说写作工作流:从提示词工程到API批量生成

AI辅助小说写作工作流:从提示词工程到API批量生成 写小说最难的地方往往不是灵感而是“写了一段之后不知道该往哪里走”。很多作者一开始会花大量时间琢磨文笔、词藻和世界观结果写到十万字时突然发现主线模糊、角色人设漂移、章节之间没有钩子整部作品像一堆精致的零件却没有真正转起来。这是最常见的卡点也是很多写作教程一开始就忽略的地方——它不是文笔问题而是结构问题。把卡点当成流程问题来处理思路会清晰很多。把一个章节拆成“目标、冲突、转折、结尾钩子”把角色拆成“欲望、弱点、行动模式、口癖”把这些结构交给文本生成接口或本地大模型去批量产出候选片段作者只负责筛选、修改和定稿。这样既保住了自己的风格又不会被重复劳动拖垮。这篇文章直接给一套可以落地的 AI 辅助小说写作工作流怎么搭建本地或云端文本生成服务怎么写提示词模板怎么调用 API 做批量环节怎么观察性能和排查失败怎么把生成结果接回自己的写作流程。如果你正在写长篇或者打算把 AI 工具接进创作流程可以先收藏再按步骤试一遍。1. 写作辅助工作流核心能力速览先把这套工作流当成一个“文本生成工具链”来看而不是当成某个单一软件。它的核心能力可以拆成下面几类能力项说明文本生成引擎本地 LLM 服务或云端 API负责实际产出文本片段提示词模板系统把大纲、场景、对白、角色卡拆成可复用的模板避免每次写重复指令批量生成模块一次读取多个任务文件按章节或场景批量生成初稿一致性辅助通过角色设定卡、时间线、伏笔记录减少人设和情节漂移接口 API 能力通过 OpenAI 兼容接口或本地 HTTP 服务接入可被脚本和工具调用输出管理与复核生成结果统一保存为 Markdown 或文本文件便于人工修改和发布前审核这套链路的好处是作者不需要把所有内容都从零写出来只需要把“结构信息”和“约束条件”写清楚然后让模型产出候选最后人工筛选和润色。它解决的核心问题不是“文笔差”而是“写到一半失去方向”和“大量重复性描述占用精力”。硬件和软件要求不复杂。最低条件下一台能跑 Python 的电脑配合云端 API 就能工作如果想全流程本地运行则需要准备一台有足够内存或显存的机器来跑本地模型。具体怎么选后面会展开。2. 最容易卡住的三类结构节点先说结论卡住你的往往不是遣词造句而是下面这三类结构节点。2.1 开篇与世界观展示很多作者开篇就犯错把设定一口气倒出来角色还没出场读者已经看累了。真正的卡点在于“如何把设定藏在故事里”。AI 辅助生成时可以通过提示词强制它先输出“三个世界观展示方案”每个方案都绑定一个具体场景而不是输出设定解释。比如方案 A让角色在对话中自然提到规则方案 B让角色因为触犯规则而遭遇冲突方案 C让旁观者评论规则带来的社会影响这种方式能快速打破“写不下去”的状态因为你不必要凭空想开场只需要从多个候选中选择一个方向继续写。2.2 中段推进与章末钩子长篇写作最容易在 30% 到 60% 的进度处停滞。原因是信息量下降冲突强度不够作者自己都不清楚这一章要完成什么任务。把章节拆成结构化输入后问题就会清晰很多本章目标主角要通过一个测试拿到某个关键线索冲突来源测试负责人是之前的对手故意设置陷阱转折对手在最后关头发现主角与旧案有关结尾钩子主角收到一条加密消息内容指向幕后人物把这些字段填入提示词让模型生成三个“本章推进方案”作者选择其中一个再展开。这样每一步都有明确方向不会写着写着就迷路。2.3 角色一致性与对白节奏长篇小说里角色说话“开始像同一个人”是很常见的卡点。原因是人物没有一张足够具体的设定卡。在工作流设计上建议为每个主要角色建立一张固定卡片包含核心欲望性格标签口头禅说话习惯长度对事件的第一反应模式生成对白时把角色卡和场景上下文一起放进提示词模型输出的语气会明显更稳定。如果发现某段对白不像这个角色不要直接修改先回填角色卡把角色设定补充得更具体再重新生成。3. 环境准备与前置条件这套工作流可以完全用 Python 搭建。下面给一套通用检查清单具体版本以你实际安装为准。3.1 基础环境操作系统Windows 10/11、Linux、macOS 都可以Python 3.9 或更高版本pip 包管理器文本编辑器推荐 VS Code需要安装的 Python 包主要是openai和requests因为不少本地推理服务都提供 OpenAI 兼容接口使用openai客户端会非常省事。pip install openai requests3.2 文本生成服务服务选择有两种本地部署和云端 API。服务类型优点需要注意本地 LLM 服务数据不出本机隐私性好需要下载模型文件对内存/显存有要求云端 API启动简单延迟低涉及成本需要关注数据安全和使用边界本地部署可以优先考虑 Ollama、LM Studio 或 vLLM 这类工具它们会把模型封装成一个本地 HTTP 服务地址例如http://127.0.0.1:11434。如果你已经有可用的文本生成服务不管本地还是云端只要它提供 OpenAI 兼容接口代码逻辑基本不用改。启动本地服务后可以用一个简单请求确认服务可用curl http://127.0.0.1:11434/v1/models如果返回了模型列表说明服务已经就绪。如果没有就检查端口是否被占用或者服务是否完成启动。3.3 模型选择思路模型选择不追求越大越好要看你机器的实际条件。一般规律是机器性能有限时选择小参数模型推理速度快但长文本连贯性稍弱机器内存或显存充足时选择更大模型或更高量化版本生成质量通常更好需要稳定输出长篇时优先选择上下文长度支持较长的模型具体显存占用不能一概而论要结合模型参数、量化等级、上下文长度和并发请求数来确定。第一次测试时建议使用单人测试不做并发观察延迟和显存/内存变化后再决定是否加大规模。3.4 端口占用检查如果服务启动后无法访问先检查端口是否被占用# Windows netstat -ano | findstr 11434 # Linux / macOS lsof -i :11434端口被占用时换一个端口或杀掉占用进程。这个步骤虽然简单却是最常被忽略的启动问题。4. 搭建写作辅助生成服务下面给出一套可复制的搭建流程以 Ollama 为示例。如果你没有装 Ollama也可以用其他提供 OpenAI 兼容接口的工具核心步骤是一致的。4.1 安装并启动本地模型服务以 Ollama 为例# 下载并安装 Ollama 后在终端拉取一个适合中文写作的模型 ollama pull qwen2.5:7b # 启动服务 ollama serve启动后服务默认监听11434端口。如果你使用的是其他工具请以对应工具的文档为准。这一步的目标是得到一个可以接受 HTTP 请求的本地地址。4.2 通过 Python 调用生成接口写一个最小调用脚本确认接口能通import openai client openai.OpenAI( base_urlhttp://127.0.0.1:11434/v1, # 按实际服务地址替换 api_keyEMPTY ) response client.chat.completions.create( modelqwen2.5:7b, # 替换为实际部署的模型名称 messages[ {role: system, content: 你是一名长篇小说写作助手只输出正文不解释设定。}, {role: user, content: 请为以下场景生成 800 字初稿主角在深夜档案室发现一张与自己童年有关的照片。} ], temperature0.7, max_tokens1024 ) print(response.choices[0].message.content)这里需要注意model参数必须和本地服务里实际部署的模型名称一致。如果模型名填错服务会返回模型不存在的错误。4.3 配置文件统一管理不要把模型名、端口、提示词散落在各个脚本里。建议用一份 JSON 配置文件统一管理{ project_name: the_case_file, output_dir: ./outputs, model: qwen2.5:7b, base_url: http://127.0.0.1:11434/v1, temperature: 0.7, max_tokens: 1024, jobs: [ { module: outline, prompt_file: ./prompts/outline.txt }, { module: scene, prompt_file: ./prompts/scene-01.txt }, { module: dialogue, prompt_file: ./prompts/dialogue-01.txt } ] }这样后续修改模型名或提示词时不需要改代码只改配置和模板文件。这个习惯在批量任务里尤其重要。5. 功能测试与效果验证工作流搭建完成后不要直接开始写正文先做一轮小规模功能测试。下面按功能点给出测试方法和判断标准。5.1 场景生成测试测试目的验证模型能否根据场景描述生成完整、符合逻辑的段落。输入示例请生成一个小说场景。 地点深夜报社办公室 人物记者林远同事陈鸣 任务林远刚拿到关键证据陈鸣劝他停止调查 目标表现出林远内在的犹豫和坚持 字数800 字操作步骤把这段输入通过调用脚本发给模型观察生成的文本是否符合以下几个标准是否出现了时间、地点、人物动作是否包含至少一个冲突或相反意见结尾是否有情绪张力或悬念是否出现了和设定明显冲突的内容如果输出的文本属于“说明文”而不是“场景描写”说明提示词里缺少“通过动作和对话展示”的约束需要补充指令例如“禁止使用解说式段落用人物动作和对话推进”。5.2 章末钩子测试测试目的验证模型在限定结构下是否能生成有效的章节结尾。输入示例这一章结尾需要完成三个任务 1. 主角决定前往北方城市。 2. 揭示神秘寄件人的一个关键身份细节。 3. 制造一个新问题让读者好奇下一章。 只输出结尾段落不要输出章节整体。判断成功的标准是结尾是否包含一个明确的“未解决问题”而不只是简单总结本章内容。如果生成结果把任务全部解决没有留下悬念就说明提示词里的“新问题”约束不够强可以再补一句“新问题不能在本章解决”。5.3 角色对白一致性测试测试目的验证角色卡是否生效角色说话的口吻是否稳定。输入示例角色卡 姓名林远 职业记者 核心欲望查清十年前旧案的真相 性格标签谨慎、执拗、怕黑 口癖习惯性重复“我确认过了” 说话习惯句子较短经常追问细节 场景陈鸣劝他放弃调查。请生成两人对话。判断标准对白中林远是否表现出“谨慎 执拗”的倾向是否在关键位置出现“我确认过了”的口癖是否使用短句追问细节。如果模型给出了角色没有说过的长段独白说明角色卡还要补充“说话长度”和“回避话题”的行为约束。5.4 长文本批量生成测试测试目的验证服务在连续多次请求下是否稳定是否会出现上下文丢失或格式混乱。操作步骤准备一个包含 3 到 5 个任务的 JSON 文件让脚本依次生成并在每次请求之间加入短暂延时。观察服务是否持续响应输出是否完整有没有被截断任务失败时是否能通过重试恢复批量生成不要求一次产出完整章节建议将每个任务控制在 300 到 1000 字之间。生成完后再由人工拼接和修改。这样做的好处是降低单次生成失败的风险也更容易定位问题出现的位置。6. 接口 API 调用与批量任务设计如果只是偶尔用一次手动调用就够了。但如果你要写一部长篇批量任务几乎是必须的。这里给出一个通用的批量任务脚本框架。6.1 定义批量任务文件把任务列表放在一个 JSON 文件里例如tasks.json{ tasks: [ { id: scene-01, prompt: 生成场景林远在废楼里发现旧报纸。, max_tokens: 800 }, { id: dialogue-01, prompt: 生成对话陈鸣与林远关于旧案的争执。, max_tokens: 600 } ] }6.2 编写批量生成脚本下面是一个基于requests的通用模板你需要按实际服务地址和模型名调整import json import time import requests API_URL http://127.0.0.1:11434/v1/chat/completions MODEL qwen2.5:7b def generate(prompt, max_tokens800, retries3): payload { model: MODEL, messages: [ {role: system, content: 你是小说章节生成引擎只输出正文。}, {role: user, content: prompt} ], temperature: 0.7, max_tokens: max_tokens } for attempt in range(retries): try: resp requests.post(API_URL, jsonpayload, timeout180) resp.raise_for_status() return resp.json()[choices][0][message][content] except Exception as e: print(f任务失败第 {attempt 1} 次重试: {e}) time.sleep(2) return def run_batch(task_file): with open(task_file, r, encodingutf-8) as f: data json.load(f) results [] for task in data[tasks]: text generate(task[prompt], task.get(max_tokens, 800)) results.append({id: task[id], text: text}) with open(./outputs/last_result.json, w, encodingutf-8) as out: json.dump(results, out, ensure_asciiFalse, indent2) time.sleep(1) return results if __name__ __main__: run_batch(tasks.json)这个脚本做了一件事每一步生成后先写一份last_result.json。它的作用是断点保护。如果批量任务跑到一半网络中断你至少能拿到已经生成的结果不需要从头再跑。6.3 批量任务注意事项批量生成不应该盲目追求速度。建议做到以下几点每个任务独立避免一次请求生成过长的内容任务之间加短暂延时避免触发服务限流文件保存采用临时文件再重命名的方式防止写入中断导致数据损坏生成结果先保存为数据文件再通过脚本合并成 Markdown方便人工审阅如果你的文本生成服务有并发限制就不要在脚本里开大量线程。稳定比速度更重要尤其是一次性生成几十个章节时任务跑到一半失败再排队重来反而更浪费时间。7. 资源占用与性能观察运行文本生成服务时需要观察的资源项和图像生成不太一样重点看列表7.1 观察指标观察项含义常见影响显存占用模型推理时占用的 GPU 显存显存不足会导致服务崩溃或大幅降速内存占用模型文件和推理缓存消耗的系统内存内存不足时系统可能卡顿甚至被杀进程上下文长度单次请求能覆盖的文本量上下文越长生成越慢对显存/内存要求越高生成延迟从提交请求到拿到结果的耗时文本越长延迟越高具体数字需要结合模型、量化等级和部署方式来测试不能一概而论。第一次测试时先用短文本、低并发观察延迟和资源占用再逐步增加文本长度。7.2 如何降低资源占用常用做法包括使用量化模型例如常见的 4-bit、8-bit 量化版本限制max_tokens避免一次性生成过长文本减小上下文长度不要把整本小说都塞进提示词关闭不必要的并发请求如果使用云端 API优先选择适合文本长度的模型避免为长上下文买单7.3 上下文管理的核心原则写小说时不要指望模型记住所有剧情。更稳妥的方式是把必要的设定手动写入提示词例如当前场景的核心冲突本段出现的人物目标需要延续的伏笔章节结尾需要的状态把上下文当做一个“临时工作区”只放当前需要用到的信息。这样既能提高生成稳定性又能显著降低资源消耗。8. 常见问题与排查方法下面是一份高频问题排查表覆盖服务启动、接口调用、生成质量和批量任务。问题现象可能原因排查方式解决方案服务启动后接口无法访问端口被占用、服务未完成启动检查日志查看端口占用情况更换端口或等待服务完全启动请求报 404 或 405接口地址或路径错误查看服务文档确认 API 路径修正base_url和请求路径模型名称不存在参数model与实际模型名不一致调用/v1/models查看可用模型替换为正确的模型名生成内容变成英文提示词没有指定语言在 system 指令中加入“始终使用简体中文”补充语言约束后重新测试输出内容重复温度过低或提示词约束不足提高温度减少重复片段提示适当提高temperature或说明“避免重复”生成内容被截断单次输出长度超过max_tokens查看响应日志检查输出长度提高max_tokens或拆分任务批量任务中途失败网络抖动、服务重启、限流查看异常日志检查last_result.json增加重试机制断点续跑角色口吻前后不一致角色卡信息不足或未固定把角色卡放入每次请求完善角色卡并在提示词中固定显存或内存溢出模型过大或请求并发过高查看系统资源监控换小模型降低并发减少上下文长度输出内容与剧情设定冲突提示词没有携带足够剧情约束将时间线、地点、人物状态写入提示词每次生成前更新剧情快照排查的方法只有一个核心思路先判断问题出在服务层、接口层还是提示词层。服务层问题看日志和端口接口层问题看请求返回和参数提示词层问题看输出逻辑和角色一致性。不要一上来就重装服务先从最小请求开始复现再逐步增加复杂度。9. 最佳实践与使用建议搭建工作流只是开始真正能提高效率的是使用习惯。下面几条建议比较关键。9.1 先小参数测试再放量第一次接触一套模型或服务时先写一个 100 到 200 字的测试提示词确认接口能通、输出格式正确再开始批量任务。不要在一开始就拿三万字的大纲去测出错后排查成本太高。9.2 提示词模板纳入版本管理提示词会随着项目推进不断调整。建议把提示词模板放到 Git 或至少用固定的目录管理每次修改都记录改动原因。不要只在聊天记录里改来改去否则你很难知道哪一版提示词效果最好。9.3 设定库与输出目录分开管理建议目录结构如下novel_project/ ├── outputs/ # 生成结果 ├── prompts/ # 提示词模板 ├── settings/ # 角色卡、世界观、时间线 ├── drafts/ # 人工修改后的正式稿 └── tasks.json # 批量任务配置生成结果和人工修改稿必须分开。如果三个版本的 AI 输出直接覆盖在正式稿上最后很可能分不清哪段是人工写的、哪段是模型生成的。9.4 批量任务要加日志和断点保护批量脚本至少要在每个任务完成后保存一次结果。错误日志里要记录失败任务的 id、请求参数和异常信息方便定位哪一步失败。不要把几十个任务一次性丢进去不管否则失败一个任务会导致后面的结果全部错位。9.5 版权、隐私与合规边界使用 AI 生成小说内容时需要注意几点如果生成内容参考了某部已经出版的作品、影视剧或角色设定要进行版权核对不能直接商用如果涉及真人姓名、肖像、声音需要取得明确授权不要把未公开的剧情创意直接上传到不可信的外部服务避免泄露独家内容生成结果只能作为初稿必须在发布前经过作者本人修改和复核AI 辅助写作的价值在于提高效率而不是替代作者做判断。最终作品的原创性和质量责任仍然在作者自己身上。10. 总结与下一步这套工作流最值得尝试的地方是把“卡壳”从一种情绪问题转换成结构问题。你不需要在灵感枯竭时对着空白文档硬撑只需要把当前章节的目标、冲突、角色状态填进提示词让模型先产出几版候选再自己修改定稿。第一步要验证的功能是“场景生成”。打开服务用一小段场景描述调用接口确认返回文本质量稳定。这一步跑通后再逐步加入角色卡、章末钩子、批量任务和断点保护。最容易踩的坑有两个一是模型名填错导致接口报错二是提示词没有写清楚“只输出正文”导致生成结果一团乱。后续可以继续扩展的方向包括把批量任务接入自己的笔记工具、搭建一套角色卡管理界面、把生成结果自动汇入 Markdown 草稿。先把最小链路跑通再根据实际写作习惯做减法才能真正提高长篇写作的产出效率。
返回列表