2026/10/9 11:57:40

SmolLM 对话模板(Chat Templates)实战指南:从 ChatML 格式到 transformers 集成应用

SmolLM 对话模板(Chat Templates)实战指南:从 ChatML 格式到 transformers 集成应用 教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载对话模板Chat Templates是语言模型对齐Alignment流程的第一步也是本仓库 smol-course 指令微调模块的核心前置知识。本文以 v1/ko/1_instruction_tuning/chat_templates.md 为主干结合仓库内的实操 Notebook 源码系统讲解对话模板的作用机制、ChatML 格式、系统消息与多轮对话的构造方法以及如何借助transformers库的apply_chat_template与 TRL 的setup_chat_format快速落地。读完本文你将能够正确构造任意 instruct 模型所需的对话格式并为后续的监督微调SFT准备好训练数据。为什么对话模板是对齐的第一步基础模型与指令模型的分野基础模型Base Model是在海量原始文本上训练、以预测下一个 token 为目标的模型而指令模型Instruct Model则是在此基础上针对遵循指令、展开对话进行过专门微调的变体。本仓库反复使用的示例正好说明了这一区别HuggingFaceTB/SmolLM2-135M是基础模型HuggingFaceTB/SmolLM2-135M-Instruct是其指令微调instruction-tuned变体。要让基础模型表现得像指令模型关键不在于改模型结构而在于把提示词prompt格式化成模型能够理解的、一致的形态——这正是对话模板的用武之地。ChatML 就是这类模板格式中的典型代表它用清晰的角色指示符system、user、assistant把一段对话结构化。需要特别强调的是同一个基础模型可以被不同的对话模板微调成不同的指令模型。因此使用某个 instruct 模型时必须使用与该模型配套的对话模板否则模型的角色理解与响应模式都会出现偏差。这也是为什么在仓库的 指令微调模块总览 中对话模板被列为与监督微调并列的第一个主题。对话模板在指令微调流程中的位置从 v1/1_instruction_tuning/README.md 可以看到本模块的完整链路是先掌握对话模板把交互结构化→ 再通过 SFT 让模型在任务数据集上学会目标行为。SFT 训练数据的组织、推理时的输入构造都依赖正确的对话模板因此它是对齐流程中名副其实的第一步。理解对话模板ChatML 格式对话模板的核心是定义与语言模型通信时对话应以什么形式呈现。模板中通常包含系统级指令、用户消息、助手回复并把这些内容编排成模型可理解的结构化格式。这种结构保证了交互的一致性也让模型能针对不同类型的输入给出恰当响应。下面是一段典型的 ChatML 格式对话来自原文档|im_start|user 안녕하세요!|im_end| |im_start|assistant 만나서 반갑습니다!|im_end| |im_start|user 질문을 해도 될까요?|im_end| |im_start|assistant可以看到每一条消息都以|im_start|加角色名开头以|im_end|结尾|im_start|assistant出现在最后表示等待模型生成回复。在transformers库中对话模板与模型的 tokenizer 绑定管理我们只需要把消息按正确结构组织好剩下的格式化工序由 tokenizer 完成。下面是一个基础的消息列表示例内容取自原文档messages [ {role: system, content: You are a helpful assistant focused on technical topics.}, {role: user, content: Can you explain what a chat template is?}, {role: assistant, content: A chat template structures conversations between users and AI models...} ]对比前面的 ChatML 示例可以看到这份messages列表里的每条消息role 与 content 键值对都会在应用模板后被映射成|im_start|role\ncontent|im_end|的形式——system、user、assistant三种角色依次展开构成完整的对话上下文。系统消息定义模型的行为基调系统消息System Message负责设定模型的基础行为方式它是一条影响后续所有交互的持续性指令。典型用法如下来自原文档system_message { role: system, content: You are a professional customer service agent. Always be polite, clear, and helpful. }在 ChatML 格式中系统消息会被放置在对话的最前面通常紧跟|im_start|system从而在模型处理后续每一轮用户消息时都保持约束力。实际项目中系统消息常用来声明角色身份、输出规范、知识截止日期等全局性要求——例如仓库新版练习 Notebooknotebooks/1/4.ipynb中 SmolLM3 的系统消息就包含了 Knowledge Cutoff Date、Reasoning Mode 等元信息字段可见系统消息是模板中承载全局配置的核心载体。对话与多轮支持用历史上下文维持一致性对话模板通过维护对话历史conversation history来保持上下文模型在回答当前问题时会同时看到此前用户与助手之间的往来记录从而实现更连贯的多轮对话。原文档给出了这样一个客服场景示例conversation [ {role: user, content: I need help with my order}, {role: assistant, content: Id be happy to help. Could you provide your order number?}, {role: user, content: Its ORDER-123}, ]模板可以处理复杂的多轮对话而不会丢失上下文例如数学辅导场景messages [ {role: system, content: You are a math tutor.}, {role: user, content: What is calculus?}, {role: assistant, content: Calculus is a branch of mathematics...}, {role: user, content: Can you give me an example?}, ]注意这里的规律消息列表中交替排列user与assistant消息system消息置于最前。模板应用后每一轮对话都会带上此前全部轮次的格式化文本这就是多轮一致性的来源。基于 transformers 的实现apply_chat_template 详解transformers库对对话模板提供了内建支持。原文档给出了核心用法先加载模型对应的 tokenizer再调用apply_chat_templatefrom transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(HuggingFaceTB/SmolLM2-135M-Instruct) messages [ {role: system, content: You are a helpful coding assistant.}, {role: user, content: Write a Python function to sort a list}, ] # 대화 템플릿 적용应用对话模板 formatted_chat tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue )apply_chat_template的三个关键参数及其影响如下参数取值作用messages消息列表每条消息需含rolesystem/user/assistant与content两个键角色顺序需符合模板约定tokenizeTrue/False为False时返回格式化后的字符串为True时直接返回token id 列表便于输入模型add_generation_promptTrue/False为True时在末尾追加一条空的assistant角色起始标记指示模型从此处开始生成回复为False时仅输出已有对话的完整格式化文本仓库韩语版实操 Notebookv1/ko/1_instruction_tuning/notebooks/chat_templates_example.ipynb对这三种模式给出了完整的对照实验可作为验证不 tokenize、不加生成提示tokenizer.apply_chat_template(messages, tokenizeFalse)输出纯文本对话其中每个角色由特殊 token|im_start|、|im_end|包裹tokenize 并加生成提示tokenizer.apply_chat_template(messages, tokenizeTrue, add_generation_promptTrue)返回 token id 序列用tokenizer.decode(...)还原后可看到末尾多出一个|im_start|assistant\n的空助手角色标记即模型即将开始续写的位置纯 tokenizetokenizer.apply_chat_template(messages, add_generation_promptTrue)直接得到形如[1, 4093, 198, 19556, ...]的整数列表证明模板化后的对话含特殊 token已落入模型的词表空间。这组实验也印证了原文档的结论只要把消息结构组织正确格式化的脏活完全由 tokenizer 承担——无论是纯文本展示、解码回看还是直接喂给模型生成都只需调整参数即可。自定义对话模板格式除了使用模型自带的模板你还可以按需定制不同消息类型的格式。例如为不同角色添加特殊 token 或调整排版来自原文档template |system|{system_message} |user|{user_message} |assistant|{assistant_message} .lstrip()在transformers中tokenizer 的chat_template属性本身就是一个 Jinja 模板字符串apply_chat_template底层就是对该 Jinja 模板的渲染。因此在自定义格式时既可以像上面这样手工拼装适合快速原型也可以直接改写 tokenizer 的chat_template属性传入完整的 Jinja 模板适合生产化部署。需要留意的是自定义模板必须与模型的微调格式严格一致——如果模型是用 ChatML 微调的却喂给它|system|风格的模板模型将无法正确理解角色。此外TRL 库提供了setup_chat_format(model, tokenizer)工具见 v1/ko/1_instruction_tuning/notebooks/sft_finetuning_example.ipynb 中的用法它会为模型与 tokenizer 一次性配置好对话格式与配套特殊 token在微调场景下可以省去手动设置模板的步骤是原文档自定义格式方案在生产流程中的便捷替代。仓库实战把数据集加工成 ChatML 训练样本理解了模板原理后下一步就是把原始数据集加工成符合 ChatML 格式的训练样本——这正是 v1/ko/1_instruction_tuning/notebooks/chat_templates_example.ipynb 的核心练习也对应模块总览v1/1_instruction_tuning/README.md中列出的两个由易到难的实验任务 入门练习把HuggingFaceTB/smoltalk数据集everyday-conversations配置转换为 ChatML 格式。该数据集的样本本身已是消息结构重点是调用tokenizer.apply_chat_template完成格式化 进阶练习把openai/gsm8k数据集转换为 ChatML 格式。该数据集样本是问题-答案的原始文本对需要先手工构造含role、content的消息列表例如把问题映射为user消息、把答案映射为assistant消息再套用对话模板。两个练习都通过datasets库的map操作逐样本处理。这一加工思路与后续 SFT 完全衔接在 v1/ko/1_instruction_tuning/notebooks/sft_finetuning_example.ipynb 中SFTTrainer会自动按模型的对话模板格式化输入消息——前提是数据已具备messages结构若数据不是这种格式就需要按上面练习中的方式先行转换该 Notebook 也明确提示读者回到本模块../chat_templates.md补课。也就是说对话模板不仅是推理时的输入规范更是监督微调数据管线中不可或缺的一环。小结与下一步对话模板用统一的角色结构system / user / assistant把人与模型的交互格式化是让基础模型表现得像指令模型的前提也是整个对齐流程的起点。核心要点回顾选对模板instruct 模型必须配套其微调时使用的对话模板如 ChatML不可混用正确组织消息rolecontent的消息列表由tokenizer.apply_chat_template统一渲染tokenize控制输出形式add_generation_prompt控制是否追加生成起始标记善用系统消息与多轮历史系统消息设定全局行为基调历史消息维持多轮上下文一致性贯通微调流程把原始数据集如smoltalk、gsm8k加工成 ChatML 格式即可交由 TRL 的SFTTrainer开展监督微调。下一步可以继续阅读仓库中的 监督微调指南并动手运行两个实操 Notebook对话模板练习 与 SFT 微调练习在 SmolLM2 上完整体验模板格式化 → 数据集转换 → 监督微调的完整链路。赞分享教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载相关推荐SmolLM2 聊天模板Chat Templates实战指南从 ChatML 格式到 Transformers 落地SmolLM2 聊天模板Chat Templates实战指南从 ChatML 格式到 Transformers 落地 聊天模板Chat Template教程人工智能大模型NLP微调SmolLM2 对话模板Chat Templates实战指南从消息结构到 ChatML 格式化的完整实现SmolLM2 对话模板Chat Templates实战指南从消息结构到 ChatML 格式化的完整实现 Chat templates对话模板是指令微教程人工智能大模型NLP微调smol-course 实战指南用 Chat Templates 与 ChatML 结构化 SmolLM2 对话smol course 实战指南用 Chat Templates 与 ChatML 结构化 SmolLM2 对话 Chat Template聊天模板是连接教程人工智能大模型NLP微调上一篇WorkshopDL终极指南无需Steam客户端下载创意工坊模组下一篇OpenCore Legacy Patcher为老款Mac注入新生的技术魔法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考