大模型真正进行推理、生成文本 的核心逻辑,我给你逐行通俗、完整、无死角解释,让你彻底看懂每一步在做什么。
逐行代码解释
python
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
1. 作用
把你的输入文本 → 转换成模型能直接接收的张量格式 ,并放到和模型一样的设备上(GPU/CPU)。
拆解
-
tokenizer([text])- 把输入文字切成 token,再转成数字 ID
- 加
[]是为了传入一个列表,让模型接收 batch 格式(必须这样写)
-
return_tensors="pt"- 返回 PyTorch 张量(tensor)
- 大模型只吃张量,不吃普通列表
-
.to(model.device)- 把数据放到模型所在的设备
- 模型在 GPU → 数据也去 GPU
- 模型在 CPU → 数据也去 CPU
- 避免设备不匹配报错
python
generated_ids = model.generate(
**model_inputs,
max_new_tokens=32768
)
2. 作用
让模型开始生成文本!
这是最核心的一行:模型根据你的输入,开始续写/回答。
拆解
-
**model_inputs-
把分词后的
input_ids和attention_mask解包传给模型 -
等价于:
pythonmodel.generate(input_ids=..., attention_mask=...)
-
-
max_new_tokens=32768- 模型最多生成 32768 个 token
- 1 token ≈ 0.7 个中文字符
- 32768 ≈ 2万多字超长文本
- 这是 Qwen3 支持的最大上下文长度
python
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
3. 作用
从模型输出中,只截取【模型新生成的内容】
去掉你输入的原文,只保留回答部分!
超级关键拆解
-
generated_ids[0]- 取第 1 条结果(因为我们只输入了 1 条文本)
-
len(model_inputs.input_ids[0])- 你输入文本的长度(多少个 token)
-
[len(...):]- 切片:从输入结束的位置开始截取
- 只保留模型生成的新内容
- 这一步非常重要!否则输出会包含你的问题
-
.tolist()- 把张量转成普通 Python 列表
- 方便后续解码成文字
用一句话总结整段逻辑
- 把你的文字转成模型能看懂的数字
- 模型根据数字生成新的数字(回答)
- 只截取模型新生成的数字,去掉你的输入
完整流程图示
你的文字 → tokenizer → 数字张量 → 模型生成 → 全部数字(包含输入)→ 切片去掉输入 → 只保留回答数字 → 最后解码成文字
最常见的配套代码(你一定会用到)
python
# 把生成的数字 ID 转回文字
response = tokenizer.decode(output_ids, skip_special_tokens=True)
print(response)
总结
model_inputs:把输入文本转为模型能用的张量,并放到正确设备model.generate():让模型生成文本,max_new_tokens控制最大长度output_ids = ...[len(...):]:只提取模型生成的回答,去掉输入原文