novel-agent微调教程

novel-agent微调教程

1. 微调的场景与目标

场景

现有长篇中文小说 Agent 虽然通过提示词约束去除 AI 腔,但生成章节中仍会出现模板化句式、空泛心理描写、机械转折和过度解释等问题。

  • 仅仅通过提示词工程的约束无法完全消除AI味的句子的生成。

现在已有的可以解决该问题的技术:(调研一下)

  1. 使用skill去AI味:

目标

因此计划使用 Qwen3-8B,在 A10 22GB GPU 上通过 LoRA 微调一个“局部文学编辑器”。它接收目标段落及前后文,只对句子或段落做最小幅度改写:

  • 去除明显 AI 腔;
  • 保持人物、剧情、时间、数字、境界、道具和因果关系不变;
  • 不新增剧情、不续写、不解释;
  • 原文自然时保持原样。
    最终目标是把它接入现有小说生成流程,在章节生成后对高风险段落进行局部润色,使成稿更自然、更像人工写作,同时不破坏长篇小说的一致性。

2. 选择微调框架

这里使用的是LlamaFactory大模型微调框架

LlamaFactory

3. 选择微调的基础模型

最终选择:

  1. 使用Qwen/Qwen3-8B

资源限制

  1. 受制于硬件GPU显存等的限制,这里最多选择一个7b参数量左右的小模型
  2. 因为写的小说是中文网文,所以最好选择中文模型

选型优点

  1. 中文能力和中文网文表达较稳定;
  2. 是Instruct模型,指令遵循能力比 Base 模型好,适合“只改写目标段落、不能改变事实”;
  3. 文本理解能力比qwen2.5-7b-instruct更强
  4. 你的任务不是从零创作,而是“理解上下文后做局部编辑”,8B 足够
  5. ModelScope、Transformers、ms-swift 生态成熟;支持 LoRA/QLoRA;

4. 数据集的构造

4.1 Alpaca 格式

在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为提示词,即提示词为 instruction\ninput。而 output 列对应的内容为模型回答。

如果指定,system 列对应的内容将被作为系统提示词。

1
2
3
4
5
6
7
8
[
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
}
]

对于上述格式的数据,dataset_info.json 中的数据集描述应为:

1
2
3
4
5
6
7
8
9
10
"数据集名称": {
"file_name": "data.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system",
"history": "history"
}
}

具体构造数据集示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

[
{
"system": "你是中文网文局部编辑器。只改写表达,不得改变剧情事实、人物关系、时间、数字、专名、叙事视角和对白归属。原文自然时保持原样。只输出处理后的文本,不解释。",
"instruction": "去除空泛心理描写,改为更自然、克制的表达。",
"input": "这一刻,他的心中不由得涌现出了一股复杂的情绪。",
"output": "复杂的情绪在他心头翻涌。"
},
{
"system": "你是中文网文局部编辑器。只改写表达,不得改变剧情事实、人物关系、时间、数字、专名、叙事视角和对白归属。原文自然时保持原样。只输出处理后的文本,不解释。",
"instruction": "删除冗余表达,保持原意不变。",
"input": "他缓缓地抬起了自己的右手,然后轻轻地擦拭了一下嘴角的鲜血。",
"output": "他抬起右手,擦掉嘴角的血。"
},
{
"system": "你是中文网文局部编辑器。只改写表达,不得改变剧情事实、人物关系、时间、数字、专名、叙事视角和对白归属。原文自然时保持原样。只输出处理后的文本,不解释。",
"instruction": "如果原文已经自然,不做任何修改。",
"input": "陈默把伞搁在门后,鞋底在门槛上蹭了两下。",
"output": "陈默把伞搁在门后,鞋底在门槛上蹭了两下。"
}
]

4.2 数据集格式的建议

  1. system固定,instruction尽量短一些
  2. input的文本长度(这个尽量对应后续真实改写时的上下文长度)
    • 70%:单句、短句改写
    • 30%:几百字段落改写样本,平衡长短,防止模型只会输出短句
  3. 加入原样保留样本,必须占比30%左右: inputoutput一样
  4. 训练和实际推理的输入形式必须一致
  5. system固定写入硬约束:不得改变事实、不得改变剧情、不得改变专名和数字等
  6. instruction 最好使用有限、稳定的几类要求
    • 去除空泛心理描写
    • 删除重复动作
    • 减少机械转折
    • 压缩解释性句子
    • 让对白更自然
    • 调整句子节奏
    • 保留原文,不做修改
  7. input中的文本必须完整
    • 完整的一句话
    • 完整的几句话
    • 完整的一个段落

4.3 第一版数据集构造格式示例

  • systeminstruction固定
  • input是输入的原文内容
  • output是润色改写后的文章内容
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"system": "你是中文网络小说局部编辑器。仅修改语言表达,不得新增、遗漏或改变任何事实信息,包括剧情、人物关系、专名、数字、时间、地点、境界、道具、因果关系和对白归属。不得续写、扩写或解释。只输出可以直接替换原文的最终文本。",
"instruction": "请对以下文本进行最小必要的去AI腔改写;仅在确有必要时修改,原文自然则保持原样。",
"input": "这一刻,他的心中不由得涌现出了一股复杂的情绪。",
"output": "此刻复杂的情绪在他的心头翻涌。"
}

{
"system": "你是中文网络小说局部编辑器。仅修改语言表达,不得新增、遗漏或改变任何事实信息,包括剧情、人物关系、专名、数字、时间、地点、境界、道具、因果关系和对白归属。不得续写、扩写或解释。只输出可以直接替换原文的最终文本。",
"instruction": "请对以下文本进行最小必要的去AI腔改写;仅在确有必要时修改,原文自然则保持原样。",
"input": "雨水顺着屋檐滴下来,砸在青石板上。",
"output": "雨水顺着屋檐滴下来,砸在青石板上。"
}

4.4 数据集常见问题的解决方案

A. 数据量:先做小规模高质量数据

1000->3000->5000

分阶段:

1
2
3
第一轮验证:1000 条左右
正式训练:3000~5000
多题材、多风格:8000~10000 条以上

B. 样本比例

第一轮 1000 条可以这样分:

  1. 需要改写:700 条
  2. 原样保留:300 条

改写样本内部再覆盖这些问题,并且这些问题需要是平均的:

1
2
3
4
5
6
7
空泛心理描写
重复动作
机械转折
解释性复述
模板化收尾
不自然对白
句子节奏问题

C. 样本偏差:长度和内容要接近真实使用场景

最重要的是,训练集要接近未来真实输入
网文小说的特点就是以段落为一个整体内容

长度比例:

  • 80%:完整段落
  • 20%:单独句子或几个短句

D. 多样性:针对多种题材的网文内容

不仅支持历史小说、还支持玄幻、都市、言情等题材的小说

4.5 最终生成的数据集

5. 微调训练