三层结构
文本
↓ Tokenizer
input_ids(数字序列)
↓ Model
hidden_states / logits
↓ 后处理
最终输出
Tokenizer:文本 ↔ 数字
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
text = "Python 是编程语言"
tokens = tokenizer.tokenize(text)
print(tokens)
# ['python', '是', '编', '程', '语', '言']
ids = tokenizer.encode(text)
print(ids)
# [101, 9686, ..., 102] 包含 [CLS]/[SEP] 等特殊 token
decoded = tokenizer.decode(ids)
print(decoded)
# '[CLS] python 是 编 程 语 言 [SEP]'
一步到位
inputs = tokenizer(
text,
padding=True, # 自动填充到同长
truncation=True, # 超长截断
max_length=128,
return_tensors="pt", # 返回 PyTorch tensor
)
print(inputs.keys()) # ['input_ids', 'token_type_ids', 'attention_mask']
print(inputs["input_ids"].shape)
批量
texts = ["第一条", "稍微长一点的第二条", "三"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# input_ids 自动 pad 成同长
# attention_mask 标记哪些是真实 token、哪些是 pad
Model:把 token IDs 转成预测
from transformers import AutoModelForSequenceClassification
import torch
model = AutoModelForSequenceClassification.from_pretrained(
"uer/roberta-base-finetuned-jd-binary-chinese"
)
model.eval()
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits # 形状 (batch, num_labels)
probs = torch.softmax(logits, dim=-1)
preds = probs.argmax(dim=-1)
不同的 Auto 类
| 任务 | 类 |
|---|---|
| 分类 | AutoModelForSequenceClassification |
| 命名实体识别 | AutoModelForTokenClassification |
| 问答 | AutoModelForQuestionAnswering |
| 文本生成 | AutoModelForCausalLM |
| Encoder-Decoder | AutoModelForSeq2SeqLM |
| 嵌入 / 通用 | AutoModel |
拿到 embedding(通用)
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-zh-v1.5")
model = AutoModel.from_pretrained("BAAI/bge-large-zh-v1.5")
model.eval()
texts = ["文本一", "文本二"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
out = model(**inputs)
# CLS token 的隐藏状态当作句向量
sentence_embeddings = out.last_hidden_state[:, 0] # (2, dim)
# 归一化(用于余弦相似度)
import torch.nn.functional as F
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)
bge-large-zh 系列是中文 RAG 场景常用的 embedding 模型之一;具体哪家"最强"在快速换代,做选型时看 MTEB 排行榜 的当下结果。
把模型移到 GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
model = model.to(device)
inputs = {k: v.to(device) for k, v in inputs.items()}
加载半精度(省一半显存)
import torch
model = AutoModel.from_pretrained(
"model-name",
torch_dtype=torch.float16,
device_map="auto",
)
跑大模型时几乎必加 torch_dtype=torch.float16 / bfloat16。
文本生成的关键参数
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-3B-Instruct")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-3B-Instruct", torch_dtype="auto")
prompt = "讲一个关于程序员的笑话"
inputs = tok(prompt, return_tensors="pt")
out = model.generate(
**inputs,
max_new_tokens=200,
temperature=0.7,
top_p=0.9,
do_sample=True,
)
print(tok.decode(out[0], skip_special_tokens=True))
参数影响:
temperature:温度高 → 更随机top_p:核采样阈值do_sample=True:启用随机采样max_new_tokens:最多生成多少 token
下一篇起进入 LLM API——日常工作 90% 都在这。