内容纲要
我们接下来进入 实战项目:从 Prompt 到 Fine-tune 的完整链路演练,让我们通过一个实际的例子,完整地体验如何将 Prompt 与 Fine-tuning 结合,优化模型以适应特定任务。
🌐 项目目标
- 任务:构建一个 文本分类模型,基于 GPT 模型(或类似大语言模型)进行微调,任务为 情感分析。
- 步骤:
- 数据准备:选择并预处理情感分析数据集。
- Prompt 设计:设计合适的输入提示(Prompt)。
- Fine-tune(微调):基于 GPT 模型进行微调。
- 模型评估:测试模型效果。
- 部署推理:部署到实际应用中(如 Web 服务)。
✅ 第一步:数据准备
我们将使用 IMDB 数据集,它是一个经典的情感分析数据集,包含电影评论及其相应的情感标签(正面或负面)。
数据加载和预处理
from datasets import load_dataset
from transformers import AutoTokenizer
# 加载 IMDB 数据集
dataset = load_dataset("imdb")
# 选择模型和 tokenizer
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 数据预处理:tokenize
def tokenize_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
# 对训练集和验证集进行预处理
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 设置输入输出格式
tokenized_datasets.set_format(type="torch", columns=["input_ids", "attention_mask", "label"])
✅ 第二步:Prompt 设计
Prompt 是对模型的输入提示,它决定了模型如何理解任务。对于情感分析,我们的任务是给定一段文本,模型应该输出情感标签。
设计 Prompt
在这个情感分析任务中,Prompt 会指定模型执行情感分类任务。例如,对于输入句子:
"I loved the movie, it was fantastic!"
Prompt 可以设计成:
"Classify the sentiment of the following movie review: 'I loved the movie, it was fantastic!'"
在 Fine-tuning 时,我们将使用类似的 Prompt 格式,将数据和任务结合起来,确保模型能够理解并产生正确的输出。
✅ 第三步:Fine-tuning(微调)
Fine-tuning 是在预训练模型的基础上,通过目标任务(如情感分析)的数据进一步优化模型权重。我们将使用 transformers
库中的 Trainer
类来简化微调过程。
设置微调参数
from transformers import GPT2ForSequenceClassification, Trainer, TrainingArguments
# 加载模型
model = GPT2ForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 设置训练参数
training_args = TrainingArguments(
output_dir="./results", # 保存结果的路径
evaluation_strategy="epoch", # 评估策略
learning_rate=5e-5, # 学习率
per_device_train_batch_size=8, # 每个设备的训练批次大小
per_device_eval_batch_size=16, # 每个设备的评估批次大小
num_train_epochs=3, # 训练轮数
weight_decay=0.01, # 权重衰减
logging_dir="./logs", # 日志路径
logging_steps=10,
)
# 创建 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
)
# 开始训练
trainer.train()
✅ 第四步:模型评估
在训练完成后,我们需要评估模型的性能。我们可以使用常见的指标,如准确率、F1-score 等来评估情感分析的效果。
评估模型
from sklearn.metrics import accuracy_score
# 获取模型输出
predictions, labels, _ = trainer.predict(tokenized_datasets["test"])
# 计算准确率
predicted_labels = predictions.argmax(axis=-1)
accuracy = accuracy_score(labels, predicted_labels)
print(f"模型准确率:{accuracy}")
✅ 第五步:部署推理服务
部署方式:FastAPI + Docker
- FastAPI 服务:我们使用 FastAPI 来创建一个简单的 API 接口,允许用户提交电影评论并返回情感分析结果。
from fastapi import FastAPI
from transformers import pipeline
app = FastAPI()
# 加载训练好的模型
nlp_pipeline = pipeline("text-classification", model=model, tokenizer=tokenizer)
@app.post("/predict")
def predict(text: str):
result = nlp_pipeline(text)
return {"sentiment": result[0]['label']}
- Docker 部署:可以将 FastAPI 服务封装成 Docker 镜像,进行跨平台部署。
# 使用官方 Python 镜像
FROM python:3.9-slim
# 安装依赖
RUN pip install fastapi uvicorn transformers
# 复制代码
COPY . /app
WORKDIR /app
# 启动服务
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
- 推理 API 测试:通过 curl 或 Postman 测试部署后的 API。
curl -X 'POST' \
'http://127.0.0.1:8000/predict' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"text": "I loved the movie, it was fantastic!"}'
✅ 总结
在这次实战项目中,我们:
- 使用 IMDB 数据集进行情感分析任务的训练。
- 设计了适合情感分析的 Prompt,并将其用于 Fine-tuning。
- 使用
Trainer
类简化微调过程。 - 评估了模型效果,并实现了基于 FastAPI 的模型推理 API 服务。
路线概览
- ✅ Transformer 结构和实现(已完成✅)
- ✅ BERT 的结构 + 预训练任务 + 实现(含微调任务)(已完成✅)
- ✅ GPT 架构 + 自回归训练 + 从头训练一个玩具 GPT(已完成✅)
- ✅ ChatGPT 的训练流程拆解(含 RLHF、RAG、Agent)(已完成✅)
- ✅ 实战项目:从 Prompt 到 Fine-tune 的完整链路演练(已完成✅)
🔜 接下来的步骤
- 扩展到其他任务:我们可以将类似的流程应用到其他 NLP 任务,如文本生成、问答系统等。
- 多模态集成:结合图像或视频进行情感分析,扩展为多模态任务。
- 部署:可以将模型部署到 Hugging Face Spaces 或 Vercel,分享给更多用户。