最近一段时间,AI 圈子里最受关注的消息之一,就是英伟达拟以约 140 亿美元收购 Hugging Face。根据媒体披露的信息,这笔交易如果最终完成,将成为这段时间内 AI 领域金额最高的收购案之一。很多开发者听到这个消息的第一反应是:Hugging Face 不是做开源模型平台的吗?英伟达不是做显卡和 CUDA 的吗?它们两家走到一起,对天天用 transformers 写代码的普通开发者到底意味着什么?
本文不从资本角度做太多猜测,而是从技术工程视角出发,围绕“模型加载、微调、部署、托管”这条主线,把 Hugging Face 生态的核心组件拆开讲清楚。即使你之前完全没接触过 Hugging Face,跟着本文把环境搭起来、把示例跑起来,也能理解为什么它的平台会被大厂看上。
1. 收购事件背景:为什么是 Hugging Face
1.1 从“模型社区”到“AI 基础设施”
Hugging Face 最早给人的印象是一个开源 NLP 库的维护者,尤其是 Transformers 库,几乎成了 PyTorch 生态里加载预训练模型的标准入口。发展到今天,它已经不只是一个代码仓库,而是集模型托管、数据集管理、在线体验、推理服务于一体的 AI 开发平台。
用一个表格可以直观理解 Hugging Face 生态的核心组成部分:
| 组件 | 作用 | 典型用法 |
|---|---|---|
| Model Hub | 托管预训练模型,支持版本、标签、README | 下载 BERT、Llama、Qwen 等模型 |
| Datasets | 托管和共享数据集,支持流式加载 | 加载 IMDb、SQuAD、自定义数据 |
| Spaces | 在线 Demo 部署,Git 风格管理 | 快速发布 Gradio 或 Streamlit 应用 |
| Transformers | 统一模型加载、微调、推理 API | pipeline、AutoModel、Trainer |
| Tokenizers | 高效分词器实现 | 与模型配套的前处理 |
| Inference Endpoints | 托管式推理服务 | 一键部署模型 API |
如果只看代码层面,Hugging Face 是“模型界的 GitHub”;如果把训练、微调、部署、监控放到一起看,它已经是一座 AI 基础设施平台。英伟达如果想从卖芯片延伸到 AI 软件栈和模型服务层,Hugging Face 恰好补上了最关键的那块拼图。
1.2 英伟达需要的不只是显卡生意
过去几年,英伟达的 GPU 性能不断提升,但开发者真正卡住的往往不是单卡算力,而是从模型到业务系统的完整链路。比如模型从哪下载、用什么格式加载、怎么统一版本、怎么快速微调、怎么部署成 API、怎么监控线上效果。这些问题是 Hugging Face 生态每天都在解决的。
收购消息背后的逻辑也不难理解:GPU 只是算力基础,模型和工具链才是形成黏性的关键。如果未来开发者从模型下载、实验、部署都在英伟达的软硬件体系里完成,GPU 的采购决策就不只是看 FLOPS,还要看整个开发生态是否顺畅。这也是为什么许多 AI 工程师认为,Hugging Face 的控制权比某一款新显卡本身更值得关注。
需要说明的是,截至本文发布,这笔收购仍以媒体报道为主,交易细节和最终结果要以双方官方公告为准。本文后续内容不会围绕收购金额做过多推测,重点放在开发者真正可用的技术栈上。
1.3 对开发者的三种可能影响
如果交易成行,短期内对开源生态的影响大概率是正向的。原因很简单:Hugging Face 的价值依赖海量开发者持续上传和使用模型,英伟达没有理由在短期内关闭 Model Hub 或把 Transformers 闭源。相反,英伟达可能会把 TensorRT、CUDA 优化、NIM 推理服务等能力与 Hugging Face 平台做更深度的集成。
对普通开发者来说,最值得关注的变化可能有三点:
- 模型推理在 GPU 上的性能优化会更直接,未来可能不再需要手工编写 TensorRT 转换脚本。
- 企业级部署方案会更容易和云服务打通,Hugging Face Spaces 与推理端点可能得到更强的算力支持。
- 开源许可证和模型商用边界会更加被重视,毕竟大厂收购之后,合规风险会摆在更前面。
不管收购最终是否成功,Hugging Face 相关技术栈都已经成为 AI 工程绕不开的部分。下面从环境准备开始,完整走一遍“下载模型、微调、部署”的实战流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:从 Python 到 GPU 推理
2.1 硬件与驱动说明
本文示例以 GPU 环境为主。如果你手边只有 CPU,仍然可以运行后面的大部分代码,只是微调速度会慢一些。建议环境如下:
- 操作系统:Ubuntu 22.04 / Windows 11 / macOS(Apple Silicon 也可以)
- GPU:NVIDIA 显卡,显存建议 8GB 以上,微调大模型时建议 16GB 以上
- 驱动:NVIDIA 驱动与 CUDA 版本匹配,建议 CUDA 12.x
- Python:3.9、3.10 或 3.11
- 包管理工具:pip 或 conda
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。建议用 Anaconda 或 Miniconda 创建独立虚拟环境,避免和系统 Python 环境互相污染。
2.2 创建虚拟环境
如果你使用 conda,可以执行:
bash复制conda create -n hf-tutorial python=3.11 -y
conda activate hf-tutorial
如果使用原生 Python,可以这样创建:
bash复制python3 -m venv hf-tutorial
source hf-tutorial/bin/activate # Windows 下执行 hf-tutorial\Scripts\activate
创建虚拟环境是个好习惯。AI 项目依赖很多,而且版本之间经常有兼容性问题,隔离之后才不会出现“这个项目依赖 PyTorch 2.x,另一个项目要 1.x”这种冲突。
2.3 安装核心依赖
激活环境后,安装 PyTorch、Transformers、Datasets、Accelerate 和 Hugging Face Hub。以下命令以 pip 为例:
bash复制pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install transformers datasets accelerate huggingface_hub
如果你用的是 Apple Silicon Mac,可以去掉 --index-url https://download.pytorch.org/whl/cu124,直接:
bash复制pip install torch transformers datasets accelerate huggingface_hub
安装完成后,建议顺手升级一下 CLI 工具:
bash复制pip install -U huggingface_hub
2.4 验证 PyTorch 与 CUDA
打开 Python 交互环境,检查 CUDA 是否可用:
python复制import torch
print("PyTorch 版本:", torch.__version__)
print("CUDA 是否可用:", torch.cuda.is_available())
if torch.cuda.is_available():
print("GPU 名称:", torch.cuda.get_device_name(0))
print("显存总量: {:.2f} GB".format(torch.cuda.get_device_properties(0).total_memory / 1024**3))
正常情况下,输出类似:
code复制PyTorch 版本: 2.4.0+cu124
CUDA 是否可用: True
GPU 名称: NVIDIA GeForce RTX 4070
显存总量: 12.00 GB
如果 torch.cuda.is_available() 返回 False,需要先检查驱动版本和 CUDA 安装情况,不要在 CUDA 环境未就绪的情况下直接跑训练。
3. Hugging Face 核心组件与技术拆解
3.1 Model Hub:模型即资产
Model Hub 是 Hugging Face 最核心的资产。它本质上是一个 Git 仓库加对象存储,每个模型目录下可以包含模型权重、配置文件、分词器文件、README 和示例代码。
在 Model Hub 上下载模型时,推荐用 snapshot_download 或 transformers 的 from_pretrained 方法,而不是手动在网页上点击下载。以 bert-base-uncased 为例,加载方式如下:
python复制from transformers import BertTokenizer, BertModel
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
print("词汇表大小:", tokenizer.vocab_size)
print("模型参数量: {:.2f}M".format(model.num_parameters() / 1e6))
第一次运行时,transformers 会把模型权重下载到本地缓存目录,默认是 ~/.cache/huggingface。再次加载时,如果本地已经有缓存,就不会重复下载。这一点在企业离线部署时非常有用。
3.2 Transformers 的统一 API
transformers 的核心价值在于“统一抽象”。无论是 BERT、GPT、Llama 还是 Qwen,大部分模型都提供相似的加载接口。最常用的三个类:
pipeline:最高层封装,适合快速验证。AutoModel和AutoTokenizer:根据模型名字自动选择合适的模型结构。Trainer:封装训练循环,简化微调代码。
先看一个用 pipeline 完成情感分析的例子:
python复制from transformers import pipeline
classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
result = classifier("Hugging Face makes AI development easier.")
print(result)
输出结果大概是:
code复制[{'label': 'POSITIVE', 'score': 0.9997899532318115}]
这段代码只有几行,但背后经历了两步:先下载模型和分词器,再执行文本预处理、模型推理、结果后处理。这也是为什么说 pipeline 适合“快速验证思路”。
当项目复杂度上升时,更推荐使用 AutoModel 和 AutoTokenizer,因为可以精确控制数据处理:
python复制from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
texts = [
"The training tutorial is very clear.",
"The API documentation is confusing."
]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
print("input_ids shape:", inputs["input_ids"].shape)
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
predictions = torch.argmax(logits, dim=-1)
for text, pred in zip(texts, predictions):
label = "POSITIVE" if pred == 1 else "NEGATIVE"
print(f"{text} -> {label}")
这里重点解释三个参数:
padding=True:把同一批次的句子填充到相同长度,才能拼成矩阵。truncation=True:超长文本截断到模型最大长度,避免显存浪费。return_tensors="pt":返回 PyTorch 张量格式。
如果漏掉 padding,transformers 不会自动对齐 batch,运行时很可能报错;如果漏掉 truncation,遇到超长文本会直接抛异常或者产生不可预期结果。
3.3 Datasets 与 Tokenizer
datasets 库解决的是数据加载问题。它支持从 Hugging Face 直接加载数据集,也支持读本地 CSV、JSON、Parquet。加载 IMDb 电影评论数据集:
python复制from datasets import load_dataset
dataset = load_dataset("imdb", split="train[:1000]")
print(dataset.features)
print(dataset[0])
输出前一条数据时,会看到典型的字典结构:
code复制{'text': 'I have to say...', 'label': 0}
datasets 比直接用 pandas 多了一个优势:它支持内存映射,海量数据不会一下子全部载入内存,还能配合 train_test_split 快速划分数据集。对于微调任务,这一步非常省心。
3.4 Hugging Face Hub CLI
huggingface_hub 提供了命令行工具 hf。常用场景是把本地模型推送到 Model Hub,或者从 Model Hub 下载私有仓库模型。
登录操作:
bash复制huggingface-cli login
使用 Token 登录:
bash复制huggingface-cli login --token YOUR_ACCESS_TOKEN
Token 可以在 Hugging Face 网站的 Access Tokens 页面创建,分为 Read 和 Write 权限。注意不要把这个 Token 提交到 GitHub 公开仓库。
下载整个模型仓库到指定目录:
bash复制huggingface-cli download bert-base-uncased --local-dir ./models/bert-base-uncased
这条命令在做模型收集和私有化部署时很常用,可以提前把模型下载到内网服务器。
4. 完整实战:加载、微调并托管一个小模型
4.1 场景设计
这一节做一个完整的文本分类微调实验。场景是:训练一个 IMDb 影评情感分类器,在 IMDb 数据集上微调 distilbert-base-uncased,然后验证推理效果,最后把模型推送到 Model Hub。
整体流程分成五步:
- 准备数据。
- 加载预训练模型和分词器。
- 用 Datasets 做前后处理。
- 用
Trainer微调模型。 - 推理验证并保存。
示例项目结构如下:
code复制hf-finetune-demo/
├── train.py
├── inference.py
├── upload.py
└── README.md
4.2 数据准备与 Preprocess
使用 IMDb 数据集的前 800 条做训练,200 条做验证,构造一个快速的微调演示:
python复制from datasets import load_dataset
from transformers import AutoTokenizer
dataset = load_dataset("imdb", split="train[:1000]")
split_dataset = dataset.train_test_split(test_size=0.2, seed=42)
train_dataset = split_dataset["train"]
eval_dataset = split_dataset["test"]
model_name = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True, padding=True, max_length=128)
tokenized_train = train_dataset.map(preprocess_function, batched=True)
tokenized_eval = eval_dataset.map(preprocess_function, batched=True)
tokenized_train = tokenized_train.remove_columns(["text"])
tokenized_eval = tokenized_eval.remove_columns(["text"])
tokenized_train = tokenized_train.rename_column("label", "labels")
tokenized_eval = tokenized_eval.rename_column("label", "labels")
这里用 max_length=128 控制长度,原因是 IMDb 评论长短差异很大,完全截断到 512 会占用更多显存,而 128 对情感分类任务通常已经足够。如果任务变得更复杂,比如长文本新闻分类,可以适当调大。
4.3 加载模型并微调
核心训练代码如下:
python复制from transformers import (
AutoModelForSequenceClassification,
TrainingArguments,
Trainer
)
id2label = {0: "NEGATIVE", 1: "POSITIVE"}
label2id = {"NEGATIVE": 0, "POSITIVE": 1}
model = AutoModelForSequenceClassification.from_pretrained(
model_name,
num_labels=2,
id2label=id2label,
label2id=label2id
)
training_args = TrainingArguments(
output_dir="./results",
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=1,
weight_decay=0.01,
logging_dir="./logs",
logging_steps=50,
save_total_limit=1,
load_best_model_at_end=True,
report_to=[]
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_eval,
tokenizer=tokenizer,
)
trainer.train()
eval_results = trainer.evaluate()
print(eval_results)
几个参数的作用:
evaluation_strategy="epoch":每个 epoch 结束评估一次验证集。save_strategy="epoch":每个 epoch 保存一次 checkpoint。save_total_limit=1:只保留最新一个 checkpoint,避免磁盘被占满。report_to=[]:关闭自动上报到第三方训练平台,减少不必要的网络请求。
如果显存不足,可以把 per_device_train_batch_size 从 8 调成 4 或 2。显存回收通常在进程结束或 del model 后生效。
4.4 推理验证
训练完成后,推理脚本如下:
python复制from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_path = "./results/checkpoint-100"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
model.eval()
texts = [
"This movie is fantastic! Great story and acting.",
"The plot is boring and the characters are flat."
]
inputs = tokenizer(texts, padding=True, truncation=True, max_length=128, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
probs = torch.softmax(outputs.logits, dim=-1)
predictions = torch.argmax(probs, dim=-1)
for text, pred, prob in zip(texts, predictions, probs):
label = model.config.id2label[pred.item()]
confidence = prob[pred].item()
print(f"文本: {text}\n预测: {label}, 置信度: {confidence:.4f}\n")
如果本地目录里没有良好的 checkpoint,也可以直接用 trainer.state.global_step 查看最后的训练步数,或让 Trainer 保存最终模型:
python复制trainer.save_model("./final_model")
tokenizer.save_pretrained("./final_model")
4.5 推送到 Model Hub
模型微调完成后,推送到自己的 Model Hub 仓库:
python复制from huggingface_hub import notebook_login
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# 在 Jupyter 里执行,输入 Token
# notebook_login()
model_dir = "./final_model"
repo_name = "my-distilbert-imdb-classifier"
model = AutoModelForSequenceClassification.from_pretrained(model_dir)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
model.push_to_hub(repo_name, private=True)
tokenizer.push_to_hub(repo_name, private=True)
如果不在 Jupyter 环境,先执行 huggingface-cli login 登录,再运行上面的推送代码。private=True 表示私有仓库,其他人看不到模型。如果想让模型公开,改成 private=False。
推送成功后,别人就能通过一行代码加载你的模型:
python复制from transformers import pipeline
classifier = pipeline("text-classification", model="你的用户名/my-distilbert-imdb-classifier")
5. 常见报错与排查思路
Hugging Face 生态的报错信息通常比较友好,但新手还是会踩到几个固定坑。下面列一个排查表,再展开讲三个最常见的场景。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 模型下载超时 | 网络不稳定或被限制 | 使用镜像配置或提前下载模型 |
| CUDA out of memory | 批次太大或模型太大 | 减小 batch size、开启梯度累积、换小模型 |
| Can‘t load model | 新旧 checkpoint 路径不对 | 确认加载文件和模型类匹配 |
| Tokenizer 与模型不匹配 | 使用了不同模型名的 tokenizer | 统一使用同一个 model name |
| 初始权重随机 | 忘记加载预训练权重 | 检查 from_pretrained 是否正确执行 |
| 上传时 Permission denied | Token 权限不足 | 在官网创建 Write 权限 Token |
5.1 模型下载超时或卡死
很多刚接触 Hugging Face 的开发者最先遇到的问题不是代码写错,而是模型下载不动。BERT 这类中小模型还好,遇到 Llama、Qwen 这种几十 GB 的模型,网络稍不稳定就会超时。
解决方案之一是提前用工具下载模型到本地,再在代码中指定本地路径:
bash复制huggingface-cli download Qwen/Qwen2-1.5B --local-dir ./models/qwen2-1.5b
然后在代码里加载:
python复制model = AutoModel.from_pretrained("./models/qwen2-1.5b")
这样至少能保证推理阶段不再依赖网络。另外,企业内部环境通常会把 HF_ENDPOINT 设置为镜像站地址,但使用前需要确认网络策略允许。
5.2 CUDA Out Of Memory
显存不足是微调和推理阶段最常见的报错。不要一上来就买新显卡,先检查代码:
- batch size 是否设置过大。
max_length是否被拉到 512 以上。- 是否在推理时也保留梯度。
- 是否加载了多余的模型副本。
推理时记得加 torch.no_grad(),这个操作能明显减少显存占用。微调时如果显存不够,优先考虑 per_device_train_batch_size=1,并使用梯度累积:
python复制training_args = TrainingArguments(
per_device_train_batch_size=1,
gradient_accumulation_steps=8,
...
)
梯度累积不会改变训练效果,只是把 8 个 batch 的梯度攒起来再更新一次,等效于 batch size 8,但显存压力小很多。
5.3 模型文件加载失败
如果提示 OSError: Can't load model,通常是因为 checkpoint 不完整或路径错误。先检查目录里是否存在 config.json 和模型权重文件,比如 pytorch_model.bin 或 model.safetensors。
另外,不同模型的加载类不能混用。比如用 AutoModelForSequenceClassification 加载一个纯 causal LM 的权重目录,即使目录里有模型文件,也可能因为分类层不存在而报错。遇到这种情况,先去模型卡片确认任务类型,再选择对应的 AutoModel 子类。
6. 最佳实践与工程建议
6.1 模型版本与依赖记录
Model Hub 里的模型不是只读文件,它像 Git 仓库一样有 commit 记录。拉取模型时,最好把 revision 固定下来:
python复制model = AutoModel.from_pretrained(
"username/my-model",
revision="v1.2.3",
torch_dtype="auto"
)
这样做的好处是:当模型作者更新了 main 分支权重,你的线上推理不会因为模型更新而出现不可控的变化。项目代码里也要用 requirements.txt 或 pyproject 锁住 transformers、datasets、torch 版本。
6.2 离线部署与缓存管理
生产环境通常不允许训练服务器随意访问外网。最佳实践是提前在构建阶段把模型下载到本地,再通过镜像拷入生产环境。用 snapshot_download 可以保留完整的仓库结构和缓存内容:
bash复制huggingface-cli download distilbert-base-uncased --local-dir /data/models/distilbert-base-uncased
需要注意,--local-dir 会把模型按普通文件形式保存,直接指定该目录为 model_path 即可。如果使用默认缓存目录,可以设置环境变量 HF_HOME 来统一管理:
bash复制export HF_HOME=/data/hf-cache
6.3 低成本微调优先选 LoRA
完整微调一个 7B 参数模型,即使有 A100 也需要谨慎规划显存。对普通团队来说,LoRA 是性价比非常高的方案。LoRA 的思想是冻结原模型权重,只训练一小部分低秩矩阵。这种方法显存占用小,训练速度快,效果在大多数场景接近全量微调。
PEFT 库的使用方式大致是:
python复制from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05
)
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters()
训练代码还是走 Trainer,只是把原来的 model 替换成 lora_model。最终保存时只保存 LoRA 权重,推理时再和基础模型合并或动态加载。
6.4 推理服务化与性能优化
模型从本地脚本变成线上服务,不是简单加一个 FastAPI 就完了。需要考虑并发、请求排队、显存占用、超时、日志、监控等一系列问题。一个比较通用的思路是:
- 用 Triton、vLLM 或 TensorRT LLM 承载大模型推理。
- 对外提供 OpenAI 风格的接口,方便业务方接入。
- 小模型用 ONNX Runtime 或 TensorRT 做 CPU/GPU 混合部署。
- 输入长度做限制,防止超长文本拖垮整个服务。
- 对模型推理耗时和失败率做监控,设置告警。
如果英伟达和 Hugging Face 后续在推理层做深度整合,未来这些工具链的搭建成本很可能会下降。
6.5 许可证与合规边界
模型不是随便拿来就能商用。不同模型的开源许可证差异很大:有些允许商用,有些只允许研究,有些对输出内容有额外限制。在微调之前,先去模型卡片查看 License 字段。
企业内部建议建立模型准入清单,记录每个模型的来源、许可证、版本、负责人。这不仅能避免法律风险,还能在模型更新时快速定位影响范围。
6.6 收购之后的工程预案
如果英伟达最终完成对 Hugging Face 的收购,开发者不应该被动等待变化,可以提前做好几件事:
- 备份关键模型到自己的私有仓库或对象存储,避免平台调整导致依赖不可用。
- 关注英伟达官方对 Hugging Face 生态的支持计划,尤其是 TensorRT 和 NIM 的集成文档。
- 对现有微调和部署流水线做抽象,尽量不绑定单一厂商的平台 API,这样迁移成本可控。
- 继续关注开源社区的态度,如果 Hugging Face 生态出现分叉或替代方案,保留可切换的技术路线。
AI 工程化的核心不是押注某一家公司,而是让自己的模型、数据、代码具备可迁移性。
7. 下一步学习路线
本文从收购消息出发,完整梳理了 Hugging Face 生态的工程技术栈。你可以已经掌握了:
- Model Hub、Datasets、Transformers、Hugging Face Hub 的作用与关系。
- 如何在 GPU 环境中安装和验证 PyTorch + Transformers。
- 如何使用
pipeline、AutoModel、Trainer完成从加载到微调的流程。 - 显存不足、模型下载失败等常见问题的排查思路。
- 模型版本控制、离线部署、LoRA 等工程实践。
下一步建议按照这个顺序继续深入:
- 熟悉
Trainer的完整参数,跑通一个多 epoch 分类任务。 - 学习
PEFT库,用 LoRA 微调一个 1B 到 7B 量级的大模型。 - 学习
vLLM或TensorRT LLM,把微调好的模型部署成高并发推理服务。 - 阅读模型卡片的许可证和训练数据说明,建立模型选型评估意识。
- 关注英伟达与 Hugging Face 的后续官方公告,及时更新技术方案。
如果你手边有 GPU,现在就可以把第 4 节的完整代码跑起来,用电影评论数据微调一个属于你自己的分类模型。即使收购消息后续发生变化,这套技术栈本身仍然会在 AI 开发中持续使用多年。
