novel-agent微调教程
novel-agent微调教程
1. 微调的场景与目标
1.1 场景
现有长篇中文小说 Agent 虽然通过提示词约束去除 AI 腔,但生成章节中仍会出现模板化句式、空泛心理描写、机械转折和过度解释等问题。
- 仅仅通过提示词工程的约束无法完全消除AI味的句子的生成。
1.2 目标
因此计划使用 Qwen3-8B,在 A10 22GB GPU 上通过 LoRA 微调一个“局部文学编辑器”。它接收目标段落及前后文,只对句子或段落做最小幅度改写:
- 去除明显 AI 腔;
- 保持人物、剧情、时间、数字、境界、道具和因果关系不变;
- 不新增剧情、不续写、不解释;
- 原文自然时保持原样。
最终目标是把它接入现有小说生成流程,在章节生成后对高风险段落进行局部润色,使成稿更自然、更像人工写作,同时不破坏长篇小说的一致性。
1.3 现在已有的可以解决该问题的技术
A. 使用skill去AI味:
Humanizer 是一款面向 Claude Code / OpenCode 环境的开源 Skill 插件,核心作用是识别并消除 AI 生成文本中的典型写作痕迹,将文本改写得更自然、更贴近人类真实写作风格。
局限性
- 本质是规则化指令工程,存在效果天花板:属于Skill 级别的指令工程
- 场景偏向通用非虚构文本,文学创作适配性极差:完全没有覆盖小说、散文等文学体裁的典型 AI 问题
- 原生仅适配英文,中文场景效果大幅打折
B. 现有微调模型去AI味
魔搭社区官方发布过《我们给大模型去掉了 “AI 味”》实战教程:
- 基于 LoRA 技术微调大模型,让输出文本减少标准化 AI 腔,更贴近人类口语 / 写作风格
- 教程实测微调后模型的 AI 感明显降低
局限性
- 训练目标是通用评论风格,不是小说场景的局部改写,也不做 “事实不变” 约束
- 训练的数据集不贴合网文写作的内容
Qwen 系列网文写作 LoRA:基于 Qwen2/Qwen3 基座微调,覆盖男频、女频、玄幻、现实等题材,训练数据为优质人类网文正文,能让生成文本更符合网文叙事节奏,减少通用 AI 的书面化腔调和空泛描写。
1.4 微调模型 vs 中文大模型
只针对段落为整体的内容进行改写
微调模型不一定要比先进大模型“写得更好”,它的价值可以是更便宜、更稳定、更快、更可控。
2. 选择微调框架
这里使用的是LlamaFactory大模型微调框架
3. 选择微调的基础模型
最终选择:
- 使用
Qwen/Qwen3-8B
资源限制
- 受制于硬件GPU显存等的限制,这里最多选择一个7b参数量左右的小模型
- 因为写的小说是中文网文,所以最好选择中文模型
选型优点
- 中文能力和中文网文表达较稳定;
- 是Instruct模型,指令遵循能力比 Base 模型好,适合“只改写目标段落、不能改变事实”;
- 文本理解能力比
qwen2.5-7b-instruct更强 - 你的任务不是从零创作,而是“理解上下文后做局部编辑”,8B 足够
- ModelScope、Transformers、ms-swift 生态成熟;支持 LoRA/QLoRA;
4. 数据集的构造
4.1 Alpaca 格式
在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为提示词,即提示词为 instruction\ninput。而 output 列对应的内容为模型回答。
如果指定,system 列对应的内容将被作为系统提示词。
1 | |
对于上述格式的数据,dataset_info.json 中的数据集描述应为:
1 | |
具体构造数据集示例:
1 | |
4.2 数据集格式的建议
system固定,instruction尽量短一些input的文本长度(这个尽量对应后续真实改写时的上下文长度)- 70%:单句、短句改写
- 30%:几百字段落改写样本,平衡长短,防止模型只会输出短句
- 加入原样保留样本,必须占比30%左右:
input和output一样 - 训练和实际推理的输入形式必须一致
system固定写入硬约束:不得改变事实、不得改变剧情、不得改变专名和数字等instruction最好使用有限、稳定的几类要求- 去除空泛心理描写
- 删除重复动作
- 减少机械转折
- 压缩解释性句子
- 让对白更自然
- 调整句子节奏
- 保留原文,不做修改
input中的文本必须完整- 完整的一句话
- 完整的几句话
- 完整的一个段落
4.3 第一版数据集构造格式示例
system和instruction都固定input是输入的原文内容output是润色改写后的文章内容
1 | |
4.4 数据集常见问题的解决方案
A. 数据量:先做小规模高质量数据
1000->3000->5000
分阶段:
1 | |
B. 样本比例
第一轮 1000 条可以这样分:
- 需要改写:700 条
- 原样保留:300 条
改写样本内部再覆盖这些问题,并且这些问题需要是平均的:
1 | |
C. 样本偏差:长度和内容要接近真实使用场景
最重要的是,训练集要接近未来真实输入
网文小说的特点就是以段落为一个整体内容
长度比例:
- 80%:完整段落
- 20%:单独句子或几个短句
D. 多样性:针对多种题材的网文内容
不仅要支持历史小说、还支持玄幻、都市、言情等题材的小说
增加多来源、多题材数据。 至少覆盖现代都市、玄幻、科幻、悬疑、言情、轻松对白、第一人称和不同叙述密度,避免把任务等同于“古风化”。
4.5 最终生成的数据集
前10条展示:
1 | |
5. 微调训练
下载llamafactory环境
1 | |
对话命令(非思考型):
1 | |
训练参数(qwen3_8b_ai_style_qlora_full.yaml):
1 | |
正式训练命令:
1 | |
训练完成之后对话命令:
1 | |
6. 测试模型
在 data/dataset_info.json 注册:
1 | |
测试模型命令的yaml文件:
1 | |
执行测试命令:
1 | |
7. 部署模型
7.1 合并模型
合并原始模型Qwen3-8B和lora训练好的adapter
合并模型的参数配置:
1 | |
合并的命令:
1 | |
合并后模型的产物:
1 | |
7.2 将 Hugging Face 模型转换为 F16 GGUF
Tokenizer 修复并验证通过后,重新执行转换:
1 | |
完成后检查:
1 | |
本次生成的 F16 GGUF 约 16 GB。F16 文件主要作为量化输入,不适合直接在 16 GB 内存的 M1 Mac 上运行。
7.3 编译 llama.cpp 并执行 Q4_K_M 量化
执行 Q4_K_M 量化:
1 | |
本次量化统计:
1 | |
最终文件:
1 | |
7.4 在本地电脑使用微调模型
- 从 Notebook 直接下载模型: 最终只需迁移 Q4_K_M 文件;
- 在 Apple M1 Mac 上部署 llama.cpp
在本地电脑使用llama.cpp用微调模型进行推理对话
显示思考过程:
1 | |
隐藏 Qwen3 思考过程:
1 | |
启动本地网页与 API 服务
启动 llama-server:
1 | |
浏览器访问:
1 | |
OpenAI 兼容接口:
1 | |