tokenizer.apply_chat_template()

tokenizer.apply_chat_template() 是 Hugging Face transformers 库中用于将对话历史(messages)格式化为模型可接受的输入文本 的关键方法,尤其在使用 Chat 模型(如 Qwen、Llama-3、ChatGLM、Phi-3 等) 时必不可少。


作用

将结构化的对话列表(如 [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}])

→ 转换为模型训练/推理时使用的 带特殊 token 的字符串 (如 <|im_start|>user\n你好<|im_end|>\n<|im_start|>assistant\n...)。


基本用法

复制代码
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")

messages = [
    {"role": "user", "content": "你好!"},
    {"role": "assistant", "content": "你好呀!有什么我可以帮你的吗?"},
    {"role": "user", "content": "今天天气怎么样?"}
]

# 应用聊天模板
prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,      # 返回字符串(False)还是 token IDs(True)
    add_generation_prompt=True  # 是否在末尾添加 assistant 开始标记(用于生成)
)

print(prompt)
输出示例(Qwen3 格式):
复制代码
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好!<|im_end|>
<|im_start|>assistant
你好呀!有什么我可以帮你的吗?<|im_end|>
<|im_start|>user
今天天气怎么样?<|im_end|>
<|im_start|>assistant

注意:Qwen3 默认会自动插入 system message(若未提供),可通过 add_system_message=False 关闭。


关键参数说明

参数 类型 说明
conversation List[Dict] 对话历史,每个 dict 含 "role"(user/assistant/system)和 "content"
tokenize bool False → 返回 str;True → 返回 List[int](token IDs)
add_generation_prompt bool 若为 True,在末尾加上 `"<
return_tensors str (e.g., "pt") 当 tokenize=True 时,返回张量类型(需配合 padding, truncation 使用)

常见场景

1. 推理时构造 prompt
复制代码
messages = [
{"role": "system", "content": "你是一个助手。"},
{"role": "user", "content": "你好"}]

input_ids = tokenizer.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt"
).to("cuda")
2. 微调时预处理数据集
复制代码
def format_example(example):
    return {
        "text": tokenizer.apply_chat_template(
            example["messages"],
            tokenize=False,
            add_generation_prompt=False  # 微调时通常包含完整对话(含 assistant 回复)
        )
    }

dataset = raw_dataset.map(format_example)
3. 自定义聊天模板(高级)

如果模型没有内置 template,可手动设置:

复制代码
tokenizer.chat_template = "{% for message in messages %}{{message['role']}}: {{message['content']}}\n{% endfor %}"

注意事项

  1. 不是所有 tokenizer 都支持

    • 需要模型在 HF Hub 上定义 chat_template(现代 Chat 模型基本都支持)
    • 可通过 tokenizer.chat_template 查看当前模板
  2. Qwen / Llama-3 / Yi 等格式不同

    • Qwen 使用 <|im_start|> / <|im_end|>
    • Llama-3 使用 <|start_header_id|>user<|end_header_id|>\n\n...<|eot_id|>
    • 不要混用模板!
  3. 微调 vs 推理的差异

    • 微调:输入应包含 完整对话(user + assistant)
    • 推理:只给 user 输入,设 add_generation_prompt=True

如何查看当前 tokenizer 的聊天模板?

复制代码
print(tokenizer.chat_template)
# 或美化输出
import json
print(json.dumps(tokenizer.chat_template, indent=2))
相关推荐
朝朝辞暮i13 分钟前
VLA 系统学习第 21 课——DDPM 与 Noise Scheduler:扩散模型究竟怎样从随机噪声生成机器人动作?
人工智能·深度学习·神经网络·transformer·vla
高洁0116 小时前
AI赋能产业升级与中美未来经济赛道博弈
人工智能·python·深度学习·机器学习·transformer
田里的水稻16 小时前
LLM_Transformer的神经网络
人工智能·深度学习·神经网络·机器学习·transformer
python与大数据分析21 小时前
CNN+Transformer+Mamba 16 模型全景对比|DeepGlobe 遥感土地覆盖分割最全开源工程
cnn·开源·transformer
朝朝辞暮i1 天前
VLA 系统学习第 20 课——Diffusion Policy 为什么要先给动作加噪,再学习把噪声去掉?
人工智能·python·深度学习·transformer·vla
朝朝辞暮i1 天前
第一部分:ACT 阶段总结——从 Behavior Cloning 到完整的 Transformer Action Policy
人工智能·pytorch·深度学习·transformer·vla
杀生丸学AI1 天前
【三维重建】GaussianGPT:迈向自回归三维高斯场景生成
深度学习·3d·transformer·三维重建·自回归·高斯泼贱
TechWayfarer1 天前
精度极限的突破:AI与IPv6如何重塑高精度IP查询
人工智能·网络协议·tcp/ip·transformer
hunteritself2 天前
10 层 4K 实时剪辑,国产工作站进入广电制作核心
大数据·前端·人工智能·深度学习·transformer
Gigavision2 天前
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载
深度学习·算法·transformer