编程开发2026-08-26
Transformers 搭建完整大模型:从数据到部署
文 / 老陈
Transformer编程实战全流程
Transformers 搭建完整大模型:数据 → 清洗 → 训练 → 导出 → 部署 API
从零到一的完整闭环
老陈打码
这是本系列收官篇。前面的篇章,你学会了:注意力、词嵌入、位置编码、Transformer 架构、预训练微调的原理,也动手跑通了模型、微调了专属模型。最后一步,我们把这一切串成一条完整的流水线——从一份原始数据开始,到训练出一个真正能对外服务的模型服务。做完这一篇,你就拥有属于自己的大模型应用了。
我们做一个简单但完整的例子:训练一个中文客服问答小助手,并把它封装成 API 服务,让任何程序都能调用。
Transformers 搭建完整大模型:数据 → 清洗 → 训练 → 导出 → 部署 API
第一步:准备一份数据
先要有数据。假设我们要做一个「客服问答助手」,准备一份「问题-回答」的数据:
# qa.csv
"你们家快递多久能到?","一般 3-5 天内送达,偏远地区 5-7 天。"
"支持退货吗?","支持,收到货 7 天内可无理由退货。"
"怎么联系人工客服?","工作时间 (9:00-18:00) 点右下角在线客服即可。"
第二步:清洗整理成训练格式
把「问题-回答」改造成大模型能学的「对话」格式(和前面 SFT 一样):
import json
# 原始问答,转成对话格式 [{role:user},{role:assistant},...]
def to_chat(rows):
data = []
for q, a in rows:
data.append({"messages": [
{"role": "user", "content": q},
{"role": "assistant", "content": a},
]})
return data
# 存成 jsonl,Trainer 可读
with open("train.jsonl", "w", encoding="utf-8") as f:
for item in to_chat(raw_questions):
f.write(json.dumps(item, ensure_ascii=False) + "\n")
第三步:用 Trainer 微调
对一个小的对话模型(比如 Qwen2.5-0.5B-Instruct)做 SFT。这一步你已经在上一篇学会核心了,这里补上「对话数据」的处理。
from transformers import (
AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForSeq2Seq
)
from datasets import load_dataset
model_id = "Qwen/Qwen2.5-0.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token # 设定填充符号
model = AutoModelForCausalLM.from_pretrained(model_id)
ds = load_dataset("json", data_files="train.jsonl", split="train")
def fmt(batch):
# 把对话拼成一段文本给模型学
texts = [tokenizer.apply_chat_template(x["messages"], tokenize=False,
add_generation_prompt=False) for x in batch["messages"]]
return tokenizer(texts, truncation=True, padding="max_length", max_length=256)
ds = ds.map(lambda x: {"messages": [x["messages"]]}, batched=True)
ds = ds.map(lambda b: fmt({"messages": b["messages"]}), batched=True)
args = TrainingArguments(
output_dir="./my-qa-assistant",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-5,
logging_steps=5,
save_strategy="epoch",
report_to="none",
)
trainer = Trainer(model=model, args=args, train_dataset=ds,
data_collator=DataCollatorForSeq2Seq(tokenizer))
trainer.train()
trainer.save_model("./my-qa-assistant")
第四步:导出(可选,加速推理)
训练完,可以把它优化成更适合部署的格式。用 torch.compile 或导出为 ONNX 能加速;简单场景直接保存 Hugging Face 格式即可。也可以上传回 Hugging Face Hub 分享。
# 上传到 Hub 分享(可选)
from huggingface_hub import HfApi
HfApi().upload_folder(
folder_path="./my-qa-assistant",
repo_id="你的用户名/qa-assistant", # 换成你的仓库名
)
第五步:部署成 API 服务
最后一公里。我们用一个轻量框架把模型包成一个 HTTP 接口,任何程序都能调用。先装 fastapi 和 uvicorn。
pip install fastapi uvicorn
写一个 server.py:
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
app = FastAPI()
# 加载你刚微调好的模型
model_id = "./my-qa-assistant"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
class Chat(BaseModel):
question: str
@app.post("/ask")
def ask(chat: Chat):
# 把问题拼成对话格式
messages = [{"role": "user", "content": chat.question}]
text = tokenizer.apply_chat_template(messages, tokenize=False,
add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=120)
answer = tokenizer.decode(out[0], skip_special_tokens=True)
return {"answer": answer}
启动服务:
uvicorn server:app --host 0.0.0.0 --port 8000
然后任何程序都能这样调用:
import requests
r = requests.post("http://127.0.0.1:8000/ask",
json={"question": "怎么联系人工客服?"})
print(r.json()) # 输出模型生成的回答
多快能上手?一张表总结
| 阶段 | 用到的库 | 核心动作 | 你需要给的 |
|---|---|---|---|
| 数据 | datasets | 加载+把文本转 token | 你自己的数据 |
| 训练 | transformers + Trainer | fit 一个模型 | 数据 + 基座模型 |
| 导出 | save_pretrained | 把模型落盘 | 训练好的权重 |
| 部署 | fastapi / uvicorn | 包成 HTTP 接口 | 模型目录 |
老陈点评:到这里,整个系列就闭环了。你从「什么是注意力」的一头雾水,走到「部署一个自己的大模型 API」。这条路其实非常好走——因为 Hugging Face 的 transformers 把重量级的数学全封装了,你要做的核心只有两件事:准备数据和调用正确的 API。理解了这条流水线,你已经具备了独立开发大模型应用的能力,剩下的就是多做、多跑、多调数据。
系列小结
回望这几篇,其实就一条主线:Transformer 架构(原理)→ transformers 框架(工具)→ 用它开发大模型(实战)。原理让你不迷路,工具让你少写代码,实战让你出真东西。建议你把这几篇当一条视频刷一遍,概念就通了;再照着代码动手敲一遍,能力就真的长在你身上了。
老陈打码