import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained("/home/01_llm/GLM-4/basic_demo/ZhipuAI/glm-4-9b-chat",trust_remote_code=True)
query = "你好"
inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
)
inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(
"/home/01_llm/GLM-4/basic_demo/ZhipuAI/glm-4-9b-chat",
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
trust_remote_code=True
).to(device).eval()
gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
代码中 tokenizer.apply_chat_template
各参数的含义详解:
[{"role": "user", "content": query}]
- 含义:传入一个消息列表(List of message dictionaries),每个消息包含角色(
role
)和内容(content
)。 - 说明:
- 含义:传入一个消息列表(List of message dictionaries),每个消息包含角色(
role
指定消息发送者(如"user"
表示用户输入,"system"
表示系统提示)。content
是消息的文本内容(如用户的问题query
)。- 消息列表需按对话顺序排列(如先系统提示后用户输入)。
add_generation_prompt=True
- 含义:在消息末尾添加模型生成回复的提示符(如
<|assistant|>
),以明确模型需要开始生成回复的位置。 - 说明:
- 含义:在消息末尾添加模型生成回复的提示符(如
- 若设为
False
,则仅拼接输入消息,不添加生成提示。 - 必须设置为
True
,否则模型无法区分输入和待生成内容。
tokenize=True
- 含义:将拼接后的文本转换为 Token ID 序列(数值化表示)。
- 说明:
- 若设为
False
(如 ),则返回原始字符串,需额外调用tokenizer()
进行数值化。 - 设为
True
可直接获得模型可处理的数值输入。
return_tensors="pt"
- 含义:指定返回张量的框架类型为 PyTorch 张量。
- 说明:
- 可选值包括
"pt"
(PyTorch)、"tf"
(TensorFlow)、"np"
(NumPy)。 "pt"
是 PyTorch 模型的通用格式。
return_dict=True
- 含义:以字典形式返回 Tokenization 结果(如包含
input_ids
、attention_mask
等键)。 - 说明:
- 含义:以字典形式返回 Tokenization 结果(如包含
- 若设为
False
,则仅返回 Token ID 张量(不包含掩码等信息)。 - 必须设置为
True
,否则后续model.generate(**inputs)
会因缺少字典解包所需的键而报错。
参数组合的作用总结
-
输入处理流程:
- 按角色和内容拼接消息列表(如
[用户: query]
)。 - 末尾添加生成提示符(如
<|assistant|>
)。 - 将拼接后的文本转换为 Token ID 序列(数值化)。
- 返回 PyTorch 张量格式的字典(含
input_ids
等键)。
- 按角色和内容拼接消息列表(如
-
输出示例:
inputs = { "input_ids": tensor([[ 100, 2034, ... ]]), # Token ID 序列 "attention_mask": tensor([[1, 1, ... ]]) # 掩码标识有效部分 }
此输出可直接用于
model.generate(**inputs)
进行推理。
注意事项
return_dict=True
的必要性: 显示,若未设置此参数,model.generate()
无法正确接收输入。- 设备转移:代码中后续的
.to(device)
将张量移至指定设备(如 GPU),但非apply_chat_template
的参数。
综上,这些参数共同完成了对话输入的标准化、数值化和结构化处理,确保模型能正确理解并生成回复。
如果以上输入的query是字符串列表,代码应该:
def format_queries(queries: List[str], system_prompt: str = None):
messages_list = []
for query in queries:
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": query}) # 用户输入
messages_list.append(messages)
return messages_list
# 批量生成模型输入
messages_list = format_queries(queries, system_prompt="You are an AI expert.")
inputs_list = [
tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True, # 直接返回 Token ID
return_tensors="pt",
return_dict=True
)
for messages in messages_list
]