教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载本文基于 smol-course 仓库的 对话模板单元韩文版 编写并结合 对话模板实操 Notebook、SFT 微调 Notebook 及 v1 版 Chat Templates 文档 进行源码级扩充。对话模板Chat Templates是连接只会续写文本的基础模型与能够遵循指令、进行对话的指令模型之间的关键桥梁。本指南将讲解对话模板的核心原理、ChatML 格式约定并给出基于transformers与trl的完整可运行实现帮助你在 SmolLM2 系列模型上正确构造系统消息、多轮对话与自定义模板格式为后续的监督微调SFT打下坚实基础。基础模型 vs 指令模型为什么需要对话模板在深入模板之前先厘清两类模型的本质区别基础模型Base Model在大规模原始文本数据上训练目标只有一个——预测下一个 token。以SmolLM2-135M为例它擅长文本续写但不会听懂指令。指令模型Instruct Model在基础模型之上经过指令微调Instruction Tuning能够遵循特定指令并与用户进行对话。SmolLM2-135M-Instruct就是SmolLM2-135M的指令调优变体。要让基础模型表现得像一个指令模型关键在于以模型能够理解的一致格式构造提示词Prompt这正是对话模板发挥作用的地方。在众多模板格式中ChatML是极具代表性的一种它通过明确的角色标识符system、user、assistant来结构化对话。一个需要牢记的要点是基础模型可能在不同的对话模板上被微调因此在使用某个指令模型时务必使用与该模型匹配的正确对话模板。用错模板轻则影响输出质量重则导致模型产生混乱或非预期的响应。理解对话模板ChatML 格式对话模板的核心是定义与语言模型通信时对话应该以何种格式呈现。模板中包含系统级指令、用户消息、助手响应以模型能够理解的结构化形式组织。这种结构保证了跨交互的一致性并帮助模型对不同类型的输入做出恰当的响应。以下是一个典型的 ChatML 对话模板示例|im_start|user Hi there!|im_end| |im_start|assistant Nice to meet you!|im_end| |im_start|user Can I ask a question?|im_end| |im_start|assistant可以看到每条消息由|im_start|起始、以|im_end|结束中间依次标注角色user/assistant与消息内容对话末尾以一条空的|im_start|assistant开头提示模型接下来应当生成助手的回复即生成提示。好消息是transformers库会结合模型的分词器Tokenizer自动处理对话模板。我们只需要把消息按正确结构组织好剩下的格式化工作全部交给分词器。消息结构system / user / assistant 三种角色在transformers中一段对话被表示为消息字典列表每个字典包含role角色与content内容两个字段。下面是一个基础对话示例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 示例可以清晰看到这种数据结构与模板格式之间的映射关系列表中的顺序即对话的顺序role决定使用哪个角色标识符content则被填充进消息内容区。system消息通常位于最前面为整个会话设定基调。系统消息设定模型的行为基调系统消息为模型的行为方式奠定基础它是一条持续的指令会影响后续所有的交互。例如system_message { role: system, content: You are a professional customer service agent. Always be polite, clear, and helpful. }将role设为system、content设为行为准则描述模型就会在整个会话期间持续遵循这条基调——对于客服、法律、医疗等需要稳定人格设定的场景系统消息是必不可少的配置项。多轮对话通过对话历史维持上下文对话模板通过对话历史维持上下文保存用户与助手之间此前的每一次交流从而支持更连贯的多轮对话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}, ]注意这个对话列表以用户消息结尾模型接下来需要生成的是助手的回复。多轮历史被原样保留在模板中模型据此理解已经说过什么、现在该回答什么这是实现连贯多轮交互的基础。使用 transformers 实现对话模板transformers库内置了对对话模板的完整支持核心方法是分词器的apply_chat_template。以下是仓库 对话模板 Notebook 中的标准用法from 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 )关键参数说明tokenizeFalse返回格式化后的字符串而非 token ID方便直接查看模板效果此时对话内容会以带特殊 token 的文本形式呈现例如|im_start|system\nYou are a helpful coding assistant.|im_end|\n...。add_generation_promptTrue在模板末尾追加生成提示如|im_start|assistant明确告诉模型接下来轮到你作答。若省略tokenize或设为True返回的是 token ID 列表可配合tokenizer.decode(token_ids)还原为文本或直接送入模型生成。在 Notebook 中完整的调用链还展示了三种典型用法# 1) 仅格式化字符串 input_text tokenizer.apply_chat_template(messages, tokenizeFalse) # 2) 格式化并添加生成提示再 tokenize input_text tokenizer.apply_chat_template( messages, tokenizeTrue, add_generation_promptTrue ) print(Conversation decoded:, tokenizer.decode(token_idsinput_text)) # 3) 直接得到 token ID 供模型使用 input_text tokenizer.apply_chat_template(messages, add_generation_promptTrue)生成阶段的完整流程参考 SFT Notebook 中的推理片段from transformers import AutoModelForCausalLM, AutoTokenizer import torch device ( cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu ) model AutoModelForCausalLM.from_pretrained(HuggingFaceTB/SmolLM2-135M).to(device) tokenizer AutoTokenizer.from_pretrained(HuggingFaceTB/SmolLM2-135M) prompt Write a haiku about programming messages [{role: user, content: prompt}] formatted_prompt tokenizer.apply_chat_template(messages, tokenizeFalse) inputs tokenizer(formatted_prompt, return_tensorspt).to(device) outputs model.generate(**inputs, max_new_tokens100) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))自定义模板格式如果内置模板不满足需求可以为不同类型的消息自定义格式。例如为不同角色添加特殊 token 或定制排版template |system|{system_message} |user|{user_message} |assistant|{assistant_message} .lstrip()这里的{system_message}、{user_message}、{assistant_message}是占位符transformers会依据消息列表将其替换为对应角色的实际内容.lstrip()用于去除模板开头的多余空行避免在格式化输出中产生意外的前导空白。自定义模板在接入未提供官方模板的开源模型、或需要统一公司内部对话风格时非常实用。多轮对话支持模板可以处理复杂的多轮对话并始终保持上下文。例如数学辅导场景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?}, ]系统消息、多轮历史与最新的用户问题被依次编排进模板模型得以在完整上下文下继续作答。这正是对话模板在保持交互一致性上的核心价值。面向基础模型的对话格式配置setup_chat_format对于像SmolLM2-135M这样的基础模型其分词器通常尚未内置对话模板。仓库 Notebook 给出的标准做法是使用trl的setup_chat_formatfrom transformers import AutoModelForCausalLM, AutoTokenizer from trl import setup_chat_format model_name HuggingFaceTB/SmolLM2-135M model AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_pathmodel_name).to(device) tokenizer AutoTokenizer.from_pretrained(pretrained_model_name_or_pathmodel_name) # 为模型与分词器配置对话格式添加必要的特殊 token 与 chat template model, tokenizer setup_chat_format(modelmodel, tokenizertokenizer)从调用方式看setup_chat_format会为模型和分词器就地配置对话能力为分词器设置 chat template 并扩充特殊 token配置完成后的分词器即可像指令模型一样使用apply_chat_template。在 SFT 微调 Notebook 中这一步骤是微调前的固定前置操作这印证了对话模板是训练与推理共用基础设施的定位。对话模板在 SFT 训练中的角色对话模板不仅在推理阶段不可或缺在监督微调SFT阶段同样关键。trl的SFTTrainer支持对话式conversational数据集格式即每条样本的messages字段是一个包含role/content的消息列表当训练数据采用该格式时训练器会自动应用模型对应的对话模板。因此将训练数据规范化为消息结构就能让模板在训练与推理两端保持一致——用模板格式训练出的模型也必须用同样的模板格式来推理否则微调效果将大打折扣。课程单元的完整脉络可在 unit1 模块入口 中看到对话模板与监督微调SFT共同构成指令调优Instruction Tuning的两大主题本指南对应其中的第一部分。动手练习将数据集转换为 ChatML 格式仓库 对话模板 Notebook 提供了两个经典练习用于巩固把任意数据集加工成对话模板格式的能力TRL 在训练时会自动处理但理解其内部机制依然很有价值练习一 入门将HuggingFaceTB/smoltalk数据集的everyday-conversations子集转换为 ChatML 格式。from datasets import load_dataset ds load_dataset(HuggingFaceTB/smoltalk, everyday-conversations) def process_dataset(sample): # TODO: 将样本转换为对话格式并使用分词器的模板方法应用对话模板 return sample ds ds.map(process_dataset)练习二 进阶将openai/gsm8k数据集转换为对话格式思路是先用role与content构造消息结构再通过分词器方法套用对话模板ds load_dataset(openai/gsm8k, main) def process_dataset(sample): # 1. 利用 role 和 content 构造消息格式 # 2. 借助分词器方法为样本应用对话模板 return sample ds ds.map(process_dataset)这两个练习分别覆盖了对话型数据集与问答型数据集两类常见形态完成它们即可掌握数据集 → ChatML 的核心转换套路。关键要点与下一步模板即协议基础模型与指令模型的差异本质上取决于训练时所使用的对话格式推理时必须使用与模型训练一致的模板。角色驱动消息列表由system/user/assistant三种角色组成系统消息设定全局行为历史消息维持上下文。一行调用tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)即可完成格式化tokenizeTrue时直接产出可送入模型的 token ID。基础模型也能对话通过trl的setup_chat_format可以为基础模型补齐对话模板配置从而直接进入生成与微调流程。训练推理同构对话式数据集会被SFTTrainer自动套用模板保证训练与推理格式一致。下一步请进入 监督微调SFT单元学习如何基于已格式化的对话数据将基础模型真正训练成指令跟随模型。赞分享教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载相关推荐PaddleNLP 对话生成模板chat_template完全指南多轮对话构造与自定义模板实战PaddleNLP 对话生成模板chat_template完全指南多轮对话构造与自定义模板实战 导读 PaddleNLP 内置了对话模板chat_tem人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Chat Template 完全指南多轮对话构造、自定义模板与微调实战PaddleNLP Chat Template 完全指南多轮对话构造、自定义模板与微调实战 导读 PaddleNLP 已集成 Llama、Qwen、ChatG人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPContext-Engineering 会话协议实战指南用结构化协议模板驯服 AI 对话Context Engineering 会话协议实战指南用结构化协议模板驯服 AI 对话 The quality of your communication文档教程知识库人工智能提示工程上一篇掌握yuzu模拟器从零开始构建高性能Switch游戏环境下一篇如何快速搭建Litemall电商系统Spring Boot Vue 微信小程序完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考