🎯 实战项目:从 Prompt 到 Fine-tune 的完整链路演练

内容纲要

我们接下来进入 实战项目:从 Prompt 到 Fine-tune 的完整链路演练,让我们通过一个实际的例子,完整地体验如何将 PromptFine-tuning 结合,优化模型以适应特定任务。


🌐 项目目标

  • 任务:构建一个 文本分类模型,基于 GPT 模型(或类似大语言模型)进行微调,任务为 情感分析
  • 步骤:
    1. 数据准备:选择并预处理情感分析数据集。
    2. Prompt 设计:设计合适的输入提示(Prompt)。
    3. Fine-tune(微调):基于 GPT 模型进行微调。
    4. 模型评估:测试模型效果。
    5. 部署推理:部署到实际应用中(如 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

  1. 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']}
  1. 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"]
  1. 推理 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!"}'

✅ 总结

在这次实战项目中,我们:

  1. 使用 IMDB 数据集进行情感分析任务的训练。
  2. 设计了适合情感分析的 Prompt,并将其用于 Fine-tuning。
  3. 使用 Trainer 类简化微调过程。
  4. 评估了模型效果,并实现了基于 FastAPI 的模型推理 API 服务。

路线概览

  1. Transformer 结构和实现(已完成✅)
  2. BERT 的结构 + 预训练任务 + 实现(含微调任务)(已完成✅)
  3. GPT 架构 + 自回归训练 + 从头训练一个玩具 GPT(已完成✅)
  4. ChatGPT 的训练流程拆解(含 RLHF、RAG、Agent)(已完成✅)
  5. 实战项目:从 Prompt 到 Fine-tune 的完整链路演练(已完成✅)

🔜 接下来的步骤

  1. 扩展到其他任务:我们可以将类似的流程应用到其他 NLP 任务,如文本生成、问答系统等。
  2. 多模态集成:结合图像或视频进行情感分析,扩展为多模态任务。
  3. 部署:可以将模型部署到 Hugging Face Spaces 或 Vercel,分享给更多用户。

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward