有勇气的牛排博客

自定义大模型训练 监督微调SFT


1 前言

1.1 定义

SFT 是Supervised Fine-Tuning 的缩写,中文叫做监督微调。它是大模型训练过程中一个关键的阶段,特别是在RLHF(人类反馈强化学习)流程中是第一步。

1.2 SFT 和预训练的区别

项目 预训练(Pretraining) 监督微调(SFT)
数据 大量互联网上抓取的未标注文本 人工标注回答、对话等结构化数据
目标 学习通用语言能力、知识、语法 学习具体任务(如回答、摘要、翻译)
模型输入 连贯文本 任务指令+问题(Prompt)
学习方式 自监督(填空、预测下一个词) 监督学习(有明确标签/答案)

1.3 SFT 的作用

1、让大模型更擅长听指令。

​ 例如:“请写一篇关于保护环境的演讲稿”,这样模型可以知道这是指令,而不是对话。

2、帮助模型适应下游任务。

​ 例如:摘要、翻译、问答、代码生成、法律文书撰写等。

3、打基础,为RLHF 做准备。

​ 没有SFT、RLHF的奖励模型和策略优化,肯呢个收敛很慢,甚至失败。

2 依赖

requirements.txt

# Core transformers>=4.36.0 datasets>=2.14.0 torch==2.3.1 # 可选:低资源训练支持(LoRA、量化等) peft>=0.7.1 accelerate>=0.24.0 bitsandbytes>=0.41.0 # 仅限 GPU,CPU 会报错 # 中文支持模型可能需要 sentencepiece>=0.1.99 protobuf<4.0.0 # 防止模型加载出错 # 用于格式化进度条、日志等 tqdm

如需只在 CPU 上训练,可以手动移除或注释掉:

bitsandbytes>=0.41.0

手动安装

pip install torch==2.3.1 torchvision==0.18.1+cu121 torchaudio==2.3.1+cu121 --index-url https://download.pytorch.org/whl/cu121

2 训练数据

生成模拟数据脚本

import json import random # 示例人物和关系 characters = [ "韩立", "墨大夫", "紫灵", "李慕白", "莫倾城", "楚风", "柳如烟", "剑宗掌门", "江尘", "林清", "沈墨", "苏璃", "周天", "谢灵涯", "唐昊", "萧炎", "白浅", "夜华", "凤九", "东皇太一" ] relations = [ "夫妻", "师徒", "恋人", "敌对", "父女", "师兄弟", "好友", "师妹", "师姐", "师傅", "师尊", "同门", "情敌", "师父", "徒弟", "战友", "师叔", "师伯", "师姑", "父子", "母子", "兄弟", "姐妹" ] # 随机关系句模板生成 def gen_sentence(c1, c2, rel): templates = [ f"{c1}{c2}{rel}关系。", f"{c1}{c2}{rel}。", f"{c2}一直深爱着{c1},两人是{rel}。", f"{c1}{c2}关系复杂,既是{rel},又有矛盾。", f"{c1}{c2}为徒弟,师徒关系牢固。", f"{c1}{c2}情同手足,是{rel}。", f"{c1}深爱着{c2},两人结为{rel}。", f"{c1}{c2}曾是{rel}。" ] return random.choice(templates) # 构造一条训练样本 def gen_input_output(): n = random.randint(1, 3) # 1~3组关系 chosen = random.sample(relations, n) chosen_chars = random.sample(characters, n * 2) input_sentences = [] output_lines = [] for i in range(n): c1 = chosen_chars[2 * i] c2 = chosen_chars[2 * i + 1] rel = chosen[i] input_sentences.append(gen_sentence(c1, c2, rel)) output_lines.append(f"{c1}-{c2}{rel}") # 构造 instruction 和 output instruction = "从以下小说内容中提取人物关系:" + " ".join(input_sentences) return { "instruction": instruction, "input": "", "output": "\n".join(output_lines) } # 生成数据集 data = [gen_input_output() for _ in range(100)] # 保存为 JSON 文件 with open("rel.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) print("✅ 已生成1000条小说人物关系训练数据,保存在 rel_1000.json")
[ { "instruction": "从以下小说内容中提取人物关系:柳如烟是凤九的情敌。 江尘一直深爱着林清,两人是师尊。 东皇太一和沈墨曾是徒弟。", "input": "", "output": "柳如烟-凤九:情敌\n林清-江尘:师尊\n东皇太一-沈墨:徒弟" }, { "instruction": "从以下小说内容中提取人物关系:楚风一直深爱着凤九,两人是师伯。 莫倾城与柳如烟是母子关系。", "input": "", "output": "凤九-楚风:师伯\n莫倾城-柳如烟:母子" }, { "instruction": "从以下小说内容中提取人物关系:李慕白一直深爱着莫倾城,两人是战友。 东皇太一与柳如烟情同手足,是父子。", "input": "", "output": "莫倾城-李慕白:战友\n东皇太一-柳如烟:父子" } ... ]

2 训练代码

# VIP会员可见

image.png

3 调用模型

3.1 单次调用

# VIP可见

3.2 流式调用

# VIP可见

image.png

评论区

×
×