[{"data":1,"prerenderedAt":340},["ShallowReactive",2],{"article:column:/column/llm-to-agent-learning/13":3},{"id":4,"title":5,"body":6,"description":332,"extension":333,"meta":334,"navigation":335,"path":336,"seo":337,"stem":338,"__hash__":339},"column/column/llm-to-agent-learning/13.md","13｜SFT：怎样用示范把基础模型教成助手",{"type":7,"value":8,"toc":313},"minimark",[9,14,18,21,24,28,31,34,44,47,51,54,62,65,68,72,75,78,81,84,92,96,99,102,109,112,115,118,121,124,130,133,136,140,143,146,149,152,155,158,164,167,170,174,182,185,193,200,204,212,215,218,221,224,228,234,237,242,245,250,253,256,261,264,269,272,277,280,283,288,291,296,299,304,307,310],[10,11,13],"h2",{"id":12},"_1会接着写为什么还不会按要求答","1．会接着写，为什么还不会按要求答",[15,16,17],"p",{},"你把“周五15点开会”交给模型，要求只提取时间和地点。它可能继续编写通知，也可能补出“A会议室”，或者先写一段热情的解释。基础模型学过怎样预测后续文字，却未必稳定地把这段输入理解成“用户提出任务，现在该由助手完成”。",[15,19,20],{},"监督微调，简称SFT，就是从已有模型出发，用输入与示范回答继续训练，让指定回答在相应条件下变得更容易产生。它延续了下一token预测的计算方式，改变了训练数据及我们选择计分的位置。训练之后参数发生变化；只在聊天里贴几个例子，则是在改变本次上下文。",[15,22,23],{},"本章要追踪一条通知怎样变成训练信号，再判断这种信号能教会什么。先不讨论用多少显存，也不假定必须更新所有参数。SFT回答“用什么示范和目标学习”，下一章的LoRA回答“允许哪些参数怎样更新”。这两件事可以组合。",[10,25,27],{"id":26},"_2一条训练记录必须把任务说完整","2．一条训练记录必须把任务说完整",[15,29,30],{},"先给标注员一份明确规则：提取时间、地点；保留原文中的时间表达；缺失项填“未提供”；不要自行推算日期；多场会议分别记录。否则，同一输入可能得到互相冲突的标准答案，模型会同时收到矛盾信号。",[15,32,33],{},"最简单的样本有请求和回答两部分。请求是“提取时间和地点。通知：周五15点开会”；示范回答是“时间：周五15点；地点：未提供”。任务规则可以放在请求里，也可以放在独立的系统消息里，但模型必须在输入中获得完成任务所需的条件。",[15,35,36,37],{},"常见对话数据会进一步记录role和content。role说明谁在说话，例如user是用户、assistant是助手；content存放对应内容。多轮对话是按时间排列的消息列表，而不是把所有话混成一个无边界段落。另一种prompt、completion格式，则把上下文和要学的续写分成两栏。",[38,39,43],"a",{"href":40,"rel":41},"https://huggingface.co/docs/trl/dataset_formats",[42],"nofollow","TRL数据格式说明",[15,45,46],{},"假如用户第二轮说“只改地点，时间不变”，训练样本就需要保留相关前文。只存最后一句和答案，模型看不到原时间，所谓正确标签便依赖一个缺失条件。数据清洗不仅是删除乱码，还要检查任务是否可答、上下文是否齐全、回答是否忠实，以及不确定时该怎样表达。",[10,48,50],{"id":49},"_3对话模板不是装饰而是输入协议","3．对话模板不是装饰，而是输入协议",[15,52,53],{},"模型最终接收的是token序列，不会直接读取一张“用户”“助手”的界面。chat template，也就是对话模板，把消息列表转成带有角色和边界标记的序列。可以先用人能读懂的示意表示：用户开始、请求、用户结束、助手开始、示范回答、助手结束。",[15,55,56,57],{},"真实模型可能用特殊控制token表示这些边界。不同模型即使来自同一种基础架构，也可能使用不同模板。套错模板，相当于把内容放进模型不熟悉的结构里；若重复添加结束标记，还可能造成错误停顿。模板必须和分词器、训练配置、使用时的输入方式一起检查。",[38,58,61],{"href":59,"rel":60},"https://huggingface.co/docs/transformers/chat_templating",[42],"Transformers对话模板说明",[15,63,64],{},"训练时已经有完整示范回答；使用时通常只给出请求及合适的助手起始结构，让模型继续生成。不能把完整答案误放进测试输入，再把正确输出算成能力。也不能因训练数据保存成JSON，就认为模型天然学会了输出JSON：保存格式与要模仿的回答格式是两回事。",[15,66,67],{},"模板还没有决定所有训练细节。它主要规定文本怎样排队；哪些位置算损失，是下一层选择。把序列打印出来，逐段标出角色、正文、结束标记和计分范围，比仅凭“数据加载成功”更能发现问题。",[10,69,71],{"id":70},"_4回答mask决定哪些预测会被计分","4．回答mask决定哪些预测会被计分",[15,73,74],{},"设整条序列中，每个待预测的目标位置都有一个计分开关m。计分取1，忽略取0；目标token的预测概率记作p。一个常见目标可以写成：损失＝所有位置的m×负对数p之和，除以计分位置的数量。",[15,76,77],{},"为什么选这个目标？我们希望示范回答在请求条件下更可能出现。整段回答的条件概率，是在各个标准前缀下预测下一token概率的乘积；取负对数，把乘积变成逐项相加的惩罚。除以计分token数，是本例的归一化方式。若对多条样本先各自平均，再平均样本，与把所有有效token合在一起平均，长短回答的权重会不同；要像第07章那样先声明分母。",[15,79,80],{},"这里的mask是损失掩码，可以理解成阅卷表上哪些格子要打分。只训练回答时，请求位置不直接计分，但请求仍作为条件参与计算，回答仍可以通过注意力读取它。训练信号也可以沿这条条件计算路径影响可训练参数。“不要求模型复述题目”不等于“把题目从模型眼前擦掉”。",[15,82,83],{},"另一个叫因果掩码的机制，则负责阻止当前位置偷看未来。二者不能混为一谈：因果掩码决定能读哪些位置，损失掩码决定哪些预测进入目标。常见实现用标签值−100表示忽略计分，但这只是程序约定，不是某个真正的词表token。",[15,85,86,87],{},"在多轮对话中，可以对多个助手回复计分，也可以把前文全当条件，只学最后一次回复。要根据任务选择，不能把“助手消息损失”和“最后一条回答损失”自动当成同义词。TRL的SFT文档分别提供assistant_only_loss与completion_only_loss，并说明其适用数据格式；助手掩码还依赖模板支持。",[38,88,91],{"href":89,"rel":90},"https://huggingface.co/docs/trl/sft_trainer",[42],"TRL监督微调说明",[10,93,95],{"id":94},"_5用三个token亲手算一次","5．用三个token亲手算一次",[15,97,98],{},"为避免把汉字误当真实分词结果，假设一个极简示范回答包含三个教学token，依次叫A、B、C；这里省略停止标记的计算。P代表请求和助手起始标记。模型预测A时看到P，预测B时看到P和标准A，预测C时看到P、标准A与标准B。",[15,100,101],{},"把P展开为两个仅为画图而设的token P₁、P₂，整条序列是P₁／P₂／A／B／C。用于这四次预测的输入是P₁／P₂／A／B，目标是P₂／A／B／C。只学回答时，四个目标的loss mask是0／1／1／1。注意A的损失对齐到输入P₂所在的输出位置，不能把“回答token在输入中出现的列”直接当作它自己的预测列。",[15,103,104],{},[105,106],"img",{"alt":107,"src":108},"13｜SFT：怎样用示范把基础模型教成助手：图1","/collections-assets/llm-to-agent-learning/71a0401fba339ab1991bdbe39f639485395081e91172dceaf8e4e08535443b97.png",[15,110,111],{},"图1｜把请求P为图示展开成P₁、P₂：输入与下一位目标错开，loss mask与目标对齐。P₂的预测不计分，A、B、C计分。两个P token是教学压缩表示，不是实际请求长度或真实分词。",[15,113,114],{},"这种使用标准回答前缀的办法叫teacher forcing。即使模型在预测A的位置最看好另一个词，训练B时通常仍给它标准A。整条示范可以一次送入网络，通过因果掩码并行算各位置；这不代表预测A时能偷看A、B、C。",[15,116,117],{},"假设三个标准token的概率分别为0.50、0.25、0.80，对应负对数损失约为0.6931、1.3863、0.2231。只对这三个位置求平均，得到0.7675。程序再用汇总损失反向传播，最后由优化器更新可训练参数。",[15,119,120],{},"三个概率连乘是0.10，表示这个简化三token序列在对应标准前缀条件下的概率。它不是通知事实正确率，也不是部署后有10%的请求能答对。若把三个目标概率都减半，平均损失增加约0.6931，达到1.4607。这可以用普通计算器复核，不需要运行模型。",[15,122,123],{},"再单独核对可见性：预测A的输出来自P₂位置，只能读P₁、P₂；预测B来自A位置，可以读到标准A；预测C来自B位置，可以读到标准A、B。于是“P₂本身不计分”与“P₂可以被回答读取”同时成立。损失掩码没有删除请求的计算路径，回答损失仍可沿依赖回到可训练参数。",[15,125,126],{},[105,127],{"alt":128,"src":129},"13｜SFT：怎样用示范把基础模型教成助手：图2","/collections-assets/llm-to-agent-learning/f8e66088a6eafc5390543467bf1ff384d8b06fc1e7b542efbf5cd4c313b60165.png",[15,131,132],{},"图2｜同一四位置例，因果mask控制每行能读的输入列；loss mask另在目标行选择计分项。三个回答损失平均为0.7675，反向信号沿实际计算依赖回传；橙色反向箭头不表示去修改离散token。",[15,134,135],{},"使用时模型接到的却是自己已经生成的前缀。一次早期错误可能让后续进入训练里少见的状态。因此，还要让模型在留出请求上真正生成完整回答。标准前缀下的损失下降，并不能代替完整任务评测。",[10,137,139],{"id":138},"_6更多样本不一定意味着更多覆盖","6．更多样本，不一定意味着更多覆盖",[15,141,142],{},"现在拿纸写五条通知：时间地点齐全；地点缺失；时间先写14点又更正为15点；一条包含两场会议；内容只讨论开会意向、尚无安排。先按统一规则写示范，再请另一人独立标注，检查分歧在哪里。",[15,144,145],{},"如果“地点缺失”一类全被标成A会议室，那么正确执行损失最小化，反而可能让模型更擅长无依据补全。假设九成训练记录都带这个地点，机械输出它可能看起来很有竞争力。这样的统计捷径不需要模型真正读懂每条通知。",[15,147,148],{},"还可以做一个对照：保持句式不变，只更换时间；保持时间不变，删除地点；把更正语句移到末尾。你是在检查究竟哪些变化应该改变答案，哪些变化不应该改变答案。十种改写若都来自同一原始通知，仍不能替代十种真正不同的业务条件。",[15,150,151],{},"这与软件测试中的契约和变形测试相通：删去地点，预期只把地点字段改为“未提供”，时间应保留；同义改写，预期语义结果不变；更正时间，预期时间更新而无关字段不变。此处验证的是任务关系，不能仅以JSON可解析代替字段忠实。对话模板管序列接口，loss mask管学习目标，任务评测管实际行为，三层应分别检查。",[15,153,154],{},"覆盖也不等于把每个类别强行放到相同比例。罕见但代价高的错误值得单独补充；常见输入仍需足够代表性。给样本分组记录来源和类型，才能知道增加一批数据是在补缺口，还是只是重复原来的容易题。",[15,156,157],{},"泛化的意思，是在没参与训练的新输入上继续按规则工作。为检验它，应让同一原始通知及其近似改写留在同一数据划分里；验证集用于选方案，测试集用于最后检查。若每看一次测试失败就回头改数据，这组题便逐渐变成了调参材料。",[15,159,160],{},[105,161],{"alt":162,"src":163},"13｜SFT：怎样用示范把基础模型教成助手：图3","/collections-assets/llm-to-agent-learning/a6a55708b093594a35c90c944c0e5a2fc2fd92c7e3048e12c21795ffe00934ad.png",[15,165,166],{},"图3｜从“周五15点，A会议室”出发，删地点应只改变地点字段，改时间应只改变时间字段。同源改写整体留在同一数据分组；字段正确、无依据补全、格式与旧能力分别验收。",[15,168,169],{},"还有一项容易漏掉的检查是截断：长通知若被切掉更正时间，标签却仍保留更正后的答案，样本就变成了让模型猜不可见信息。若回答部分全被截掉，只对回答计分的设置甚至可能没有有效目标。应抽查实际送进训练的序列，不能只看原始文件。重复数据和自动生成的示范也要核对来源与事实，生成得快并不能降低标注责任。",[10,171,173],{"id":172},"_7flan与可检查的数据接口","7．FLAN与可检查的数据接口",[15,175,176,177],{},"2021年的FLAN研究把一个1370亿参数的预训练模型，放到超过60个用自然语言指令表达的任务上微调，并在未用于指令微调的任务类型上评估。这是“任务迁移”的一个公开案例：训练不必只围绕某一张固定题单，任务与表达方式的组合也能帮助模型适应新指令。",[38,178,181],{"href":179,"rel":180},"https://arxiv.org/abs/2109.01652",[42],"FLAN原论文",[15,183,184],{},"这个结果支持在相应实验条件下研究跨任务泛化，不能推出几条示范就能创造任何新能力。基础模型已学到的表示、示范覆盖及目标任务难度仍会影响结果。FLAN也不是所有后来助手模型训练流程的统一名称。",[15,186,187,188],{},"把视线移到可检查的实际数据接口，Qwen官方LLaMA-Factory说明列出Alpaca与ShareGPT格式。前者包含instruction、可选input和output，后者用conversations记录说话者与内容。这些字段是样本如何被读入的约定，仍要经过正确映射与模板才能形成训练序列。",[38,189,192],{"href":190,"rel":191},"https://github.com/QwenLM/Qwen3/blob/main/docs/source/training/llama_factory.md",[42],"Qwen数据准备说明",[15,194,195,196],{},"截至2026年10月6日核验的TRL在线文档，以Qwen3-0.6B-Base和指令对话数据展示SFT入口，并分别说明回答损失与适配器训练。读这种示例要分清基座、数据、模板、损失范围和参数更新方式。官方用某个模型演示接口，不能据此断言那个模型原始发布时采用了相同数据和配方。",[38,197,199],{"href":89,"rel":198},[42],"TRL指令微调示例",[10,201,203],{"id":202},"_8学会新习惯也可能挤掉旧能力","8．学会新习惯，也可能挤掉旧能力",[15,205,206,207],{},"同一组参数服务于很多任务。只在很窄的数据上持续更新，可能改善通知提取，却让其他能力退步。明显的旧能力损失常被称为灾难性遗忘；它不是每次微调都会发生，也不能只靠新任务分数发现。",[38,208,211],{"href":209,"rel":210},"https://arxiv.org/abs/2308.08747",[42],"持续微调遗忘研究",[15,213,214],{},"控制学习率与训练时长、保留适当的通用数据、扩大可靠覆盖，都可以作为实验选项，但没有一种设置自动保证不遗忘。较少更新参数也不是免检证书：下一章的LoRA仍然会改变模型输出。",[15,216,217],{},"因此，训练前要留下原模型加提示词的基线，训练后同时比较字段正确率、无依据补全率、格式合规率与原有能力。如果格式从凌乱变整齐，内容却更爱编造，不能用一个合并总分把问题盖住。训练损失很低，也可能只是记住了答案或利用了模板捷径。",[15,219,220],{},"最后问值不值得：偶尔一次的要求，先改提示；频繁变化的资料，先提供当前证据；长期重复且已有可靠示范的行为，才适合认真比较SFT。SFT可以学习如何利用检索资料，但无法单凭训练保证每次自动获得最新信息。",[10,222,223],{"id":223},"本章练习",[225,226,227],"h3",{"id":227},"题目",[15,229,230],{},[231,232,233],"strong",{},"问题1｜对齐输入与两个mask",[15,235,236],{},"给序列P₁／P₂／A／B／C，只计回答A、B、C且省略停止标记，写出四项输入、目标、loss mask；预测B时可以读哪些输入？",[15,238,239],{},[231,240,241],{},"问题2｜计算回答目标",[15,243,244],{},"A、B、C在标准前缀下的概率为0.50、0.25、0.80，求整段概率与平均负对数损失。若都减半，平均损失增加多少？这是否等于任务成功率变化？",[15,246,247],{},[231,248,249],{},"问题3｜设计可解释的验收",[15,251,252],{},"原通知为“周五15点，A会议室”，删去地点时答案哪些字段应变、哪些应不变？同源的一百种改写如何划分？标准A后预测B很准，还应补什么评测？",[225,254,255],{"id":255},"思考提示",[15,257,258],{},[231,259,260],{},"提示1｜对应问题1",[15,262,263],{},"每个输出预测下一项，loss mask对齐目标；因果mask看输出来自哪一行。",[15,265,266],{},[231,267,268],{},"提示2｜对应问题2",[15,270,271],{},"先乘后取负对数，或逐项取负对数再求和；平均分母是3。",[15,273,274],{},[231,275,276],{},"提示3｜对应问题3",[15,278,279],{},"分别控制输入变化、隔离来源与前缀来源；每种检查回答不同问题。",[225,281,282],{"id":282},"参考答案与解析",[15,284,285],{},[231,286,287],{},"答案1｜对应问题1",[15,289,290],{},"输入为P₁／P₂／A／B，目标为P₂／A／B／C，loss mask为0／1／1／1。预测B的输出在A所在行，可读P₁、P₂、A，不能读未来的B。请求目标不计分仍可作为条件，且条件计算路径仍可能影响可训练参数梯度。",[15,292,293],{},[231,294,295],{},"答案2｜对应问题2",[15,297,298],{},"整段概率0.50×0.25×0.80＝0.10；平均损失为（0.693147＋1.386294＋0.223144）÷3＝0.767528…，约0.7675。概率均减半时每项损失增加ln2≈0.6931，平均也增加同样数值到1.460676…，约1.4607。这些是标准序列的条件概率与训练损失，不是事实正确率或任务成功率。",[15,300,301],{},[231,302,303],{},"答案3｜对应问题3",[15,305,306],{},"地点应从“A会议室”改为“未提供”，时间“周五15点”应保持不变。同源的一百种改写应作为同一组，避免跨入训练与测试；还要留出不同来源和条件。标准前缀下预测B准确，不能覆盖先生成错A的情况，应在留出请求上生成完整回答，并分别核对字段、无依据补全、格式与旧能力。",[10,308,309],{"id":309},"下一章",[15,311,312],{},"示范已经变成了明确的目标，但更新全部大矩阵会保存大量梯度与优化器状态。下一章沿同一条会议通知追问：能否固定原矩阵，只训练一条较小的支路，把所需改变送进模型？",{"title":314,"searchDepth":315,"depth":315,"links":316},"",3,[317,319,320,321,322,323,324,325,326,331],{"id":12,"depth":318,"text":13},2,{"id":26,"depth":318,"text":27},{"id":49,"depth":318,"text":50},{"id":70,"depth":318,"text":71},{"id":94,"depth":318,"text":95},{"id":138,"depth":318,"text":139},{"id":172,"depth":318,"text":173},{"id":202,"depth":318,"text":203},{"id":223,"depth":318,"text":223,"children":327},[328,329,330],{"id":227,"depth":315,"text":227},{"id":255,"depth":315,"text":255},{"id":282,"depth":315,"text":282},{"id":309,"depth":318,"text":309},"从信息表示和学习出发，用可核算的例子与白板图逐步理解大模型、后训练、推理和Agent系统。","md",{},true,"/column/llm-to-agent-learning/13",{"title":5,"description":332},"column/llm-to-agent-learning/13","jAKKfJqEZUcnrghrqPYqo01OyNslVoq2yyCzXSQphvE",1791935828763]