登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

Transformers Chat Template 怎么避免角色格式不一致

来源:17golang原创

时间:2026-09-27 01:50:12 477浏览 收藏

日常使用Transformers的聊天模板处理对话数据、跑推理的时候,经常碰到角色格式不对齐的问题,只要做好模板绑定、前置校验这几步,就能稳稳避免这类不一致的情况。

直接答案:不要在训练脚本、API 服务和评测代码里分别拼接 [INST]、 等控制 token。统一保存 role 与 content,所有链路都调用同一个 tokenizer 的 apply_chat_template,才能避免角色格式漂移。

官方文档:https://huggingface.co/docs/transformers/main/en/chat_templating

  • 消息层只接受 system、user、assistant 等模板支持的角色。
  • 控制 token 由模型随 tokenizer 提供的模板决定,不能跨模型照搬。
  • 训练通常关闭生成提示;推理生成新回复时通常开启。

先把角色格式变成唯一契约

聊天模型最终看到的仍是一串 token。即使两个模型来自同一基础模型,它们也可能使用完全不同的角色标记。最稳妥的边界是:业务层只生产结构化消息,模板层独占“消息转 token 序列”的职责。

Transformers Chat Template 统一消息契约结构图
图1:训练集、评测集和在线请求都进入同一份 role/content 契约,再由模型 tokenizer 的 Chat Template 转换为专属控制 token。
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_id)
messages = [
    # system 只放全局行为约束,避免混入用户问题。
    {"role": "system", "content": "你是技术支持助手。"},
    {"role": "user", "content": "怎样检查服务状态?"},
]

# 直接完成模板渲染和分词,避免二次添加特殊 token。
inputs = tokenizer.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt",
)

训练和推理不要共用错误参数

场景推荐设置原因
监督训练预处理add_generation_prompt=False样本已包含 assistant 答案,不需要再追加回答起始标记
生成新回复add_generation_prompt=True提示模型接下来应开始 assistant 回复
续写已有 assistant 内容continue_final_message=True保留最后一条消息为待续写前缀

add_generation_prompt 与 continue_final_message 表达相反意图,不应同时开启。前者开始一条新回复,后者延续最后一条已有消息。

Chat Template 训练与推理参数关系图
图2:同一消息契约在训练、生成新回复和预填充三种用途下保持不变,只调整末尾控制 token 的策略。

避免特殊 token 重复

如果先用 tokenize=False 得到字符串,再调用普通 tokenizer,必须注意模板通常已经写入 BOS、EOS 或角色结束标记。此时再次自动添加特殊 token,会出现重复,模型表现可能明显下降。更安全的方式是直接使用 tokenize=True;若必须分两步,则第二步显式设置 add_special_tokens=False。

formatted = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)

# 模板已包含所需控制 token,二次分词时禁止重复添加。
encoded = tokenizer(
    formatted,
    add_special_tokens=False,
    return_tensors="pt",
)

工程中怎样长期保持一致

把模板调用封装成一个共享函数,训练数据转换、离线评测与服务端请求只能通过它进入模型。模型切换时一并切换 tokenizer,不把某个模型的角色 token 写入数据库。上线前至少保留一条固定对话,比较训练预处理和推理入口生成的角色顺序是否一致。

角色名可以随意扩展吗?
不能假定所有模板都支持自定义角色。先查看目标 tokenizer 的模板约定;不支持时应在消息契约层映射为已有角色。

为什么换模型后回答质量突然下降?
常见原因是继续使用旧模型的手写控制 token。应改用新模型 tokenizer 自带的 Chat Template,并检查是否重复添加特殊 token。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>