编程开发2026-08-26
用 Transformers 微调专属小模型
文 / 老陈
Transformer编程实战微调
用 Transformers 微调专属小模型:准备数据 → 开始训练 → 评估效果
微调三部曲:数据 → 训练 → 评估
老陈打码
上一篇你跑通了一个大模型,但它只会「通用聊天」——你问什么它答什么,全是网上学来的通用知识。如果你想要一个专门懂你业务的模型呢?比如:专门判断电商评论是好评还是差评、专门回答你家产品的售后问题、专门识别贷款申请是否合规……这时候就要轮到微调(Fine-tuning)出场了。
微调说白了就是:拿一个通用的基座模型,用你自己的数据再「练」一遍,让它变成你这个领域的专家。这一篇,我们完完整整做一次中文情感分析的微调——教模型判断一句话是「正面」还是「负面」。所有步骤都有可运行代码。
用 Transformers 微调专属小模型:准备数据 → 开始训练 → 评估效果
第一步:准备带标签的数据
微调的关键是有标签的数据。每一行包含一段文本(text)和一个标签(label),label 用 0 表示负面、1 表示正面。比如:
# train.csv(一段文本,逗号,标签)
"这家店的东西真难吃,服务还差",0
"衣服质量很好,性价比超高,推荐",1
"物流太慢了,等了一星期,差评",0
"客服态度特别好,很快就解决了问题",1
第二步:加载预训练模型和分词器
我们用 Hugging Face 上一个小巧的中文模型 bert-base-chinese 做底座。
from transformers import (
AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer
)
from datasets import load_dataset
# 模型名(中文 BERT,专门擅长中文句子的语义)
model_id = "bert-base-chinese"
# 分词器 + 分类模型(2 个类别:负面/正面)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id, num_labels=2)
第三步:把数据转成模型能读的格式
每条文本要被「分词 + 转成数字 + 统一长度」。transformers 的 datasets 库帮我们做好了这一切。
# 读取数据
dataset = load_dataset("csv", data_files="train.csv", split="train")
# 分词:把文本转成模型要的数字
def tokenize(batch):
return tokenizer(batch["text"], truncation=True, padding="max_length", max_length=128)
dataset = dataset.map(tokenize, batched=True)
# 划分训练集和验证集
split = dataset.train_test_split(test_size=0.2)
train_set, eval_set = split["train"], split["test"]
第四步:配置训练参数
TrainingArguments 一次性把「怎么练」都定下来:练几轮、学多快、有没有验证等。
args = TrainingArguments(
output_dir="./my-sentiment-model", # 模型保存位置
num_train_epochs=3, # 训练 3 轮
per_device_train_batch_size=16, # 每批 16 条
evaluation_strategy="epoch", # 每轮结束评估一次
logging_steps=10, # 每 10 步打印一次日志
save_strategy="epoch",
report_to="none", # 不上传报表
)
第五步:开练!
把模型、数据、参数塞进 Trainer,一句 train() 就跑起来了。
trainer = Trainer(
model=model,
args=args,
train_dataset=train_set,
eval_dataset=eval_set,
)
# 开始训练(会打印每轮 loss 和准确率)
trainer.train()
# 训练完,把最终模型存下来
trainer.save_model("./my-sentiment-model")
tokenizer.save_pretrained("./my-sentiment-model")
第六步:用它来预测
训练完,这个「专属模型」就能上线干活了——判断任意一句话的情绪。
from transformers import pipeline
# 加载刚微调好的模型
clf = pipeline("sentiment-analysis", model="./my-sentiment-model")
# 测一句
print(clf("这家店太坑了,再也不来了"))
# 输出: [{'label': 'LABEL_0', 'score': 0.98}] → LABEL_0 即负面(0)
print(clf("老板人超好,强烈推荐!"))
# 输出: [{'label': 'LABEL_1', 'score': 0.97}] → LABEL_1 即正面(1)
常见的坑
| 坑 | 怎么办 |
|---|---|
| 数据太少,模型学不会 | 微调最少也要几百条标注数据;太少可以考虑先做数据增强 |
| 标签名要统一 | 训练和预测时的 label 下标要一致(0/1 顺序别乱) |
| 显存不够 | 调小 per_device_train_batch_size(比如 8)或换更小的模型 |
| 分类名显示 LABEL_0/1 | 可以用 id2label 把它映射成「负面/正面」的名字 |
老陈点评:微调是让大模型「为你所用」的分水岭。通用模型是「通才」,微调后的模型从「通才」变成你业务里的「专才」。整个过程你可能只写了十几行代码,但背后是 transformers 把分词、训练、评估、保存全套自动化了。你只要管好两件事:准备好带标签的数据,选对合适的基座模型。这就是微调的全部精髓。
下一篇预告
如果说你已经能「训练自己的小模型」,那最后一步就是把它变成真正能给别人用的「产品」——有数据、能训练、能导出、能部署上线。收官篇《Transformers 搭建完整大模型:从数据到部署》带你走完「数据准备 → 训练 → 导出 → 上线部署」的完整闭环,拥有你自己的大模型应用。
老陈打码