Transformers chat template 怎么生成 assistant token 掩码
在做对话微调时,真正需要的不是把整段聊天都当成监督信号,而是让 loss 主要落在 assistant 回复上。Transformers 已经提供了现成的路径:让 chat template 用 {% generation %} 标记 assistant 内容,再调用 apply_chat_template() 时打开 return_assistant_tokens_mask=True。返回字典里的 assistant_masks 会与 input_ids 等长,assistant token 为 1,system/user 以及其他上下文 token 为 0。
官方地址:https://huggingface.co/docs/transformers/main/en/chat_templating
- 掩码不是按 role 字段在 Python 侧猜出来的,而是由模板中的 generation 区间映射到 token。
return_assistant_tokens_mask=True必须配合tokenize=True、return_dict=True。- 模板没有 generation 块、字符到 token 的映射异常或被截断时,掩码可能全 0 或只覆盖可映射部分。
先把三个返回条件配齐
最小调用要同时满足三个条件:输出需要被切成 token,返回结构需要是字典,并显式要求 assistant 掩码。掩码字段名是 assistant_masks,不是 labels,也不是模型生成后的新 token。
from transformers import AutoTokenizer
# 这里使用支持 chat_template 的 tokenizer;模型名称可替换为自己的检查点
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-beta")
messages = [
{"role": "user", "content": "用一句话解释向量数据库"},
{"role": "assistant", "content": "它用向量相似度检索语义相关内容。"},
]
# tokenize 和 return_dict 不能省略,否则无法请求 assistant_masks
encoded = tokenizer.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_assistant_tokens_mask=True,
add_generation_prompt=False,
)
# 这些数组应当一一对应,便于构造训练 labels 或检查标注范围
input_ids = encoded["input_ids"]
assistant_masks = encoded["assistant_masks"]
print(len(input_ids), len(assistant_masks))
print(sum(assistant_masks)) # 只统计被标成 assistant 的 token 数
这里的 mask 只描述已经出现在消息里的 assistant 内容。如果最后一条消息是 user,并且你把 add_generation_prompt=True 用于推理,它是在末尾添加 assistant 起始提示,并不等于已经生成了 assistant 回复,所以不要把这两个概念混在一起。

模板必须显式包住 assistant 内容
return_assistant_tokens_mask 的实现依赖模板渲染时记录 assistant 内容的字符区间。自定义 Jinja 模板时,把 assistant 分支放进 generation 块;system 和 user 分支不要误包进去。
{%- for message in messages %}
{{- '\n' }}
{%- if message['role'] == 'assistant' %}
{%- generation %}{{- message['content'] }}{%- endgeneration %}
{%- else %}
{{- message['content'] }}
{%- endif %}
{{- eos_token }}
{%- endfor %}
模板本身仍然负责控制 token、换行和结束标记;generation 块只是告诉 Transformers 哪一段渲染文本属于 assistant。它不会改变对话格式,也不会自动把所有 role 为 assistant 的消息重新改写。
如果使用的是模型自带模板,先查看 tokenizer.chat_template,确认它是否包含 generation 标记。没有标记时,最直接的结果不是“mask 计算错了”,而是当前模板没有提供可追踪的 assistant 区间。

用对齐检查定位全零掩码
排查时不要只打印一串 0/1。把 token、掩码和解码文本放在同一行,能快速看出是模板没有标记,还是某些字符没有映射到 token。
# 逐 token 对照,避免把掩码位置误认为字符下标
tokens = tokenizer.convert_ids_to_tokens(encoded["input_ids"])
for index, (token, flag) in enumerate(zip(tokens, encoded["assistant_masks"])):
# flag=1 表示该 token 落在模板的 assistant generation 区间
print(f"{index:03d} {flag} {token}")
# 训练时只把非 assistant 区域设为 -100,忽略它们的交叉熵
labels = [token_id if flag else -100
for token_id, flag in zip(encoded["input_ids"], encoded["assistant_masks"])]
| 现象 | 优先检查 | 处理方式 |
|---|---|---|
| 调用直接报参数错误 | tokenize 或 return_dict 是否为 False | 改为 tokenize=True, return_dict=True |
| assistant_masks 全 0 | 模板是否含 {% generation %} | 修改模板或更换支持掩码的模板 |
| 掩码长度对不上 | 是否把 mask 当成字符数组 | 只与同一返回对象的 input_ids 对齐 |
| 长样本后段消失 | max_length 和 truncation | 先检查截断方向,再调整长度或数据切分 |
训练和推理不要混用两种意图
训练完整对话时,通常使用 add_generation_prompt=False,让样本保留已有 assistant 回复,再用 mask 选择监督区域。推理准备新回复时,通常使用 add_generation_prompt=True;此时没有真实 assistant 内容可供掩码标 1。若最后一条消息是 assistant 预填内容,则考虑 continue_final_message=True,它与 add_generation_prompt=True 不能同时使用。
还要留意多模态消息。图像占位符和处理器的文本映射可能让 assistant 区间出现全零或偏移,不能因为纯文本样例正常就推断所有 processor 都正常。先用纯文本对话确认模板,再单独验证图文输入的 token 与 mask 对齐。
常见问题
assistant_masks 是模型自动生成的标签吗?
不是。它是 chat template 渲染出的 assistant 字符区间映射到 token 后得到的输入标记,模型不会替你判断业务上的监督范围。
能不能只传 return_assistant_tokens_mask=True?
不能。该选项要求同时返回 token 化结果和字典结构,也就是 tokenize=True、return_dict=True。
模板已有 assistant role,为什么仍然全零?
role 判断和 generation 跟踪是两件事。只有模板显式使用 generation 块,Transformers 才能记录可映射的 assistant 区间。
mask 能直接替代 attention_mask 吗?
不能。attention_mask 控制哪些输入位置参与注意力,assistant_masks 用来选择哪些 token 作为 assistant 监督区域,训练代码里通常还要把它转换成 labels 的 -100。
Go HTTP 重定向后为什么请求体无法重放
- 上一篇
- Go HTTP 重定向后为什么请求体无法重放
- 下一篇
- Go encoding/json/v2 怎么用选项统一控制字段名匹配
-
- 科技周边 · 人工智能 | 2小时前 |
- Diffusers LoRA 权重融合后怎么恢复基础模型
- 291浏览 收藏
-
- 科技周边 · 人工智能 | 5小时前 |
- Sentence Transformers 向量归一化何时影响相似度
- 372浏览 收藏
-
- 科技周边 · 人工智能 | 7小时前 | 人工智能 · 位置偏差 大模型评测 LLM-as-a-Judge 成对评测
- 大模型回答怎么设计成对评测减少位置偏差
- 314浏览 收藏
-
- 科技周边 · 人工智能 | 9小时前 | 人工智能 · OpenAI Realtime API VAD server_vad semantic_vad
- OpenAI Realtime API 怎么配置语音轮次检测
- 293浏览 收藏
-
- 科技周边 · 人工智能 | 12小时前 |
- OpenAI Structured Outputs 怎么约束嵌套 JSON 结构
- 247浏览 收藏
-
- 科技周边 · 人工智能 | 14小时前 | 人工智能 · PyTorch ONNX dynamic_shapes 动态维度
- ONNX 导出动态维度怎么声明输入轴
- 194浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | 人工智能 · PyTorch 混合精度 AMP GradScaler 梯度溢出 optimizer.step
- PyTorch GradScaler 何时会跳过参数更新
- 268浏览 收藏
-
- 科技周边 · 人工智能 | 19小时前 | 人工智能 · 深度学习 · PyTorch 随机种子 DataLoader num_workers worker_init_fn
- PyTorch DataLoader 多进程为什么会重复随机数据
- 316浏览 收藏
-
- 科技周边 · 人工智能 | 21小时前 | 大模型 Accelerate device_map 多设备推理
- Accelerate device_map 怎么把大模型分配到多设备
- 150浏览 收藏
-
- 科技周边 · 人工智能 | 23小时前 |
- Hugging Face Datasets Streaming 怎么处理超大数据集
- 148浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 | 人工智能 · LoRa PEFT target_modules
- PEFT LoRA 怎么选择 target_modules
- 251浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 |
- Hugging Face Catalog API 怎么创建推理端点
- 333浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 337次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 394次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 388次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 353次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 178次使用
-
- 本地大模型反复输出同一句话怎么调整生成参数
- 2026-09-06 501浏览
-
- Python 调用大模型时如何用结构化输出校验 JSON:从解析失败到可重试
- 2026-08-29 501浏览
-
- AI写作工具免费版安装教程(含豆包Clawdbot)
- 2026-05-30 501浏览
-
- WPS AI能自动生成PPT吗?输入主题一键制作演示文稿
- 2026-05-27 501浏览
-
- Canva手机闪退解决方法及适配指南
- 2026-05-25 501浏览

