← 返回课程列表

Hugging Face 实战学习笔记

🔗 Hugging Face 官网 🤗 模型市场

一、快速入门

1.1 环境搭建

# 安装依赖
pip install transformers torch sentencepiece datasets accelerate

1.2 核心组件

  • transformers:提供预训练模型和工具
  • pipeline:简化模型调用流程
  • datasets:处理数据集
  • accelerate:加速训练

二、Pipeline使用

2.1 文本分类

from transformers import pipeline

classifier = pipeline("sentiment-analysis")
result = classifier("Hugging Face是NLP领域的神器!")
print(result)
# 输出:[{'label': 'POSITIVE', 'score': 0.9998723268508911}]

2.2 命名实体识别

ner = pipeline("ner")
result = ner("我叫张三,来自北京,在清华大学读书。")
print(result)
# 输出:姓名、地点等实体识别结果

2.3 问答系统

qa = pipeline("question-answering")
context = "Hugging Face成立于2016年,总部位于巴黎。"
result = qa(question="Hugging Face成立于哪一年?", context=context)
print(result)
# 输出:{'answer': '2016年', ...}

三、自定义模型加载

3.1 加载预训练模型

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

3.2 模型推理

text = "这是一个测试文本"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)

四、实践Demo规划

📋 Demo实战项目

  • 文本生成Demo:基于GPT-2模型实现中文文本生成
  • 情感分析API:创建一个简单的情感分析接口
  • 模型微调:使用自定义数据集微调BERT模型

五、文本生成Demo实现

5.1 模型选择

使用中文GPT-2模型 gpt2-chinese-cluecorpussmall 实现文本生成

5.2 代码实现

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 加载模型和Tokenizer
model_name = "uer/gpt2-chinese-cluecorpussmall"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 设置生成参数
prompt = "人工智能在未来会改变"
inputs = tokenizer(prompt, return_tensors="pt")

# 生成文本
with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_length=50,
        num_return_sequences=1,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.2
    )

# 解码并输出结果
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("生成文本:", generated_text)

5.3 运行说明

  • temperature:控制生成文本的随机性,值越高越随机
  • top_p:核采样,控制生成词汇的多样性
  • repetition_penalty:避免重复生成相同内容

5.4 示例输出

生成文本:人工智能在未来会改变我们的生活方式,从医疗健康到交通出行,从教育学习到娱乐休闲,AI技术将渗透到每个领域,带来前所未有的便利与创新。

六、情感分析API实现

6.1 技术栈

  • FastAPI:构建API服务
  • Uvicorn:运行ASGI服务器
  • Hugging Face Transformers:情感分析模型

6.2 代码实现

from fastapi import FastAPI
from transformers import pipeline
from pydantic import BaseModel

# 初始化FastAPI应用
app = FastAPI(title="Sentiment Analysis API", version="1.0")

# 加载情感分析模型
sentiment_analyzer = pipeline("sentiment-analysis", model="uer/roberta-base-chinese-finetuned-dianping-chinese")

# 定义请求体模型
class TextRequest(BaseModel):
    text: str

# 定义情感分析端点
@app.post("/analyze-sentiment")
def analyze_sentiment(request: TextRequest):
    result = sentiment_analyzer(request.text)[0]
    return {
        "text": request.text,
        "sentiment": result["label"],
        "confidence": round(result["score"], 4)
    }

# 运行服务器
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

6.3 运行说明

  1. 安装依赖:pip install fastapi uvicorn
  2. 运行脚本:python sentiment_analysis_api.py
  3. 访问API:
    • POST请求:http://localhost:8000/analyze-sentiment
    • 请求体:{"text": "这个产品真的很好用!"}
    • 响应示例:{"text": "这个产品真的很好用!", "sentiment": "positive", "confidence": 0.9987}

6.4 部署建议

  • 使用Docker容器化部署
  • 配合Nginx做反向代理和负载均衡
  • 可使用Hugging Face Inference Endpoints托管模型

七、模型微调Demo实现

7.1 任务说明

使用中文情感分析数据集微调BERT-base-chinese模型,完成二分类任务(正面/负面情感)

7.2 技术栈

  • Hugging Face Transformers:预训练模型与微调工具
  • Hugging Face Datasets:数据加载与处理
  • Hugging Face Evaluate:评估指标计算
  • PyTorch:模型训练框架

7.3 代码实现

from transformers import (
    AutoTokenizer, 
    AutoModelForSequenceClassification,
    TrainingArguments,
    Trainer
)
from datasets import load_dataset, DatasetDict
import evaluate
import numpy as np

# 1. 加载数据集(使用中文情感分析数据集)
dataset = load_dataset("lansinuote/ChnSentiCorp")

# 2. 加载预训练模型和Tokenizer
model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

# 3. 数据预处理函数
def preprocess_function(examples):
    return tokenizer(
        examples["text"], 
        truncation=True, 
        padding="max_length", 
        max_length=128
    )

# 应用预处理
tokenized_datasets = dataset.map(preprocess_function, batched=True)

# 4. 定义评估指标
metric = evaluate.load("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

# 5. 设置训练参数
training_args = TrainingArguments(
    output_dir="./bert-chinese-sentiment-finetuned",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=3,
    weight_decay=0.01,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    logging_dir="./logs",
)

# 6. 初始化Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"].select(range(1000)),  # 取1000条数据快速演示
    eval_dataset=tokenized_datasets["validation"].select(range(200)),
    compute_metrics=compute_metrics,
)

# 7. 开始训练
trainer.train()

# 8. 保存模型和Tokenizer
trainer.save_model("./bert-chinese-sentiment-finetuned")
tokenizer.save_pretrained("./bert-chinese-sentiment-finetuned")

print("模型微调完成,已保存至 ./bert-chinese-sentiment-finetuned")

7.4 关键参数说明

参数 说明
learning_rate 学习率,通常设置为2e-5到5e-5之间
per_device_train_batch_size 每个GPU/CPU的训练批次大小
num_train_epochs 训练轮数,一般2-3轮即可避免过拟合
evaluation_strategy 评估策略,"epoch"表示每轮训练后进行评估
load_best_model_at_end 训练结束后加载效果最好的模型

7.5 预期结果

训练完成后,模型在验证集上的准确率应达到90%以上,可用于实际中文情感分析任务

八、下一步计划

  • 整理所有Demo代码,制作统一的实战文档
  • 将Demo代码和文档更新到知识库网站
  • 验证所有Demo功能正常运行,确保代码可直接执行

📚 学习来源:Hugging Face 官方文档、GitHub开源项目

💡 核心收获:掌握Hugging Face核心API,理解预训练模型使用流程,完成3个实战Demo