本文详细介绍了微调开源基座模型的完整流程适合想自己训练小模型的读者。文章首先分析了微调的适用场景和与其他方法的对比然后讲解了如何选择基座模型和数据集接着深入剖析了数据准备、模型加载和训练配置等关键步骤最后通过一个真实案例展示了如何评估微调效果。文章强调数据质量的重要性并提供了代码示例帮助读者快速上手实践。开篇读完这篇文章,你会知道:什么时候该微调、选什么模型、数据怎么准备、训练怎么跑,以及训完后怎么判断模型真的变好了。微调不是把模型下载下来跑一遍 SFT 就结束。它通常是为了解决更现实的问题:数据不能出企业、API 调用成本太高、通用模型不懂业务规则,或者模型的回答方式必须被稳定控制。这篇文章会把微调开源基座模型这条完整链路走一遍,并且贯穿一个真实可跑的例子:示例任务:用 DeepMath-103K 数据集微调 Qwen2.5-1.5B,让它学会先输出推理过程(带 think)、再给出数学答案,最后在 MATH500 上评测准确率。代码基于 HuggingFace Transformers,单张 24GB 卡即可跑通。一、先想清楚:到底要不要微调?在动手前,先回答一个更根本的问题——同样一个业务问题,除了微调,还有别的路子吗?有三条常见路径。路径 1:提示工程(Prompt Engineering)类比:助手博览群书但不太懂事,每次交任务前先讲清楚请用礼貌语气,不确定就说不知道,不要瞎猜。零成本、零训练,适合任务简单、上下文可以塞进 prompt 的场景。缺点是每次调用都要带这一大段 prompt,费 token,而且模型有可能忘记指令。路径 2:RAG(检索增强生成)类比:助手不懂行业术语,给他配一本电子版行业词典,回答之前先让他去查。知识和模型解耦,更新知识不用改模型,适合知识密集但推理简单的场景,比如内部知识库问答。缺点是检索质量决定天花板,检索错了模型也救不了。路径 3:微调(Fine-tuning)类比:直接把助手送去培训班。这次培训之后,他的行为方式和思维习惯会真正发生变化,不需要每次再提醒了。效果最深、覆盖最广,但也最贵——需要数据、算力、时间。适合需要模型改变行为方式的场景,比如按公司特定格式回答、掌握新的专业能力、调整语气风格。一个简单判断本文的示例任务(让模型学会数学推理)属于改变行为方式——需要模型学会在给出答案前先推理,是标准的微调场景。二、基座模型 vs 对话模型:选哪个当起点?决定微调后,第一个选择题:选基座模型(Base)还是对话模型(Chat / Instruct)?基座模型是只做过预训练的素材,博览群书,但只会续写文本,不知道人类问一句要答一句这个规矩。对话模型是在基座上做过一轮 SFT RLHF 之后的成品,已经学会了对话礼仪、能理解指令。类比:基座模型像刚从图书馆出来的实习生,什么书都读过,但不会礼貌回答问题;对话模型像参加过公司培训的正式员工,懂规矩、会说话。情况推荐起点从零构建对话能力,数据量大(几十万条)基座模型让模型学会新领域知识 特定格式对话模型 (改造更省力)改造模型的人格或语气风格对话模型数据量小(几百到几千条)对话模型 (基座学不出对话)绝大多数业务场景,答案都是对话模型。本文示例里我们选择的是 Qwen2.5-1.5B 的基座版——因为想让模型学会一种全新的输出格式(think.../think 答案),对话模型自带的行为反而会成为干扰。三、怎么选具体的开源模型?现在开源模型多如牛毛:Qwen、Llama、DeepSeek、Mistral、GLM、Baichuan、Yi……三个维度做选择:① 参数量 —— 看显卡够撑多大的模型模型规模全参微调所需显存LoRA 所需显存1.5B~20 GB~6 GB7B~80 GB(需 A100 × 2)~15 GB14B单卡放不下~28 GB32B多卡训练~60 GB24GB 消费级卡(3090 / 4090)的甜蜜点是 7B LoRA 或 1.5B 全参。本文选 1.5B 全参,一张 24G 卡刚好能吃下。② 许可证(License)商用场景一定要看 License。Apache 2.0 / MIT 最宽松,Llama 系列有额外的商业条款(用户量门槛),部分模型明确禁止商用。③ 生态成熟度看 HuggingFace 下载量、issue 活跃度、有没有官方 chat_template、训练框架支持情况。中文场景优先看 Qwen、DeepSeek、GLM。务实的默认选择:中文任务用 Qwen2.5-7B-Instruct,英文任务用 Llama-3.1-8B-Instruct。本文示例走 Qwen2.5-1.5B 的原因是它体积小、速度快、方便测试。四、数据准备:决定成败的一步业内经验一句话:微调 30% 训练配置 70% 数据质量。4.1 选一个合适的开源数据集本文用 DeepMath-103K(HuggingFace 上公开)。它是一个专门为数学推理准备的数据集,每条包含:question数学题原文final_answer最终答案r1_solution_1/2/3DeepSeek-R1 生成的三条推理过程10 万条太多,单卡训不完。业务里通常只挑一个子集进行训练train train.filter(lambda x: x[length] MAX_LENGTH, num_proc16)print(Samples after token-length filter:, len(train))if len(train) MAX_TRAIN_SAMPLES: train train.shuffle(seedSEED).select(range(MAX_TRAIN_SAMPLES))print(Final SFT training samples:, len(train))4.2 构造训练样本关键设计:让模型学会先输出推理过程,再输出答案。做法是把 R1 的推理放进think.../n里作为 assistant 的回答:def tokenize(example): question example[question] r1_solution clean_solution(example[r1_solution_1]) assistant_content fthink/n{r1_solution}/n/think message [ {role: user, content: question}, {role: assistant, content: assistant_content}, ] result qwen_tokenizer.apply_chat_template( message, add_generation_promptFalse, tokenizeTrue, return_dictTrue, ) result[length] len(result[input_ids]) result[labels] result[input_ids].copy() return resulttrain candidate_data.map(tokenize, batchedFalse, num_proc16)print(Tokenized candidate samples:, len(train))三个要点:messages 里已经包含完整 assistant 回答→add_generation_promptFalselabels input_ids.copy()→ collator 后续会自动把 pad 位置置为 -100num_proc16→ 多进程加速 tokenize4.3 过滤过长样本推理过程往往很长,超过模型上下文会被截断,浪费显存。设一个长度上限:train train.filter(lambda x: x[length] 4096, num_proc16)print(Samples after token-length filter:, len(train))train train.select(range(min(5000, len(train))))演示我们选取 5000 条生产环境里,子集大小取决于目标能力和算力预算4.4 数据质量的三条硬标准类比:训练数据是给学生的教材。参考答案写错了、写偏了、写得不一致,学生就会忠实地学到错的东西。答案正确(基本前提)格式一致(不要今天用 Markdown 明天用纯文本)风格统一(目标是简洁客服,就不要混入啰嗦的例子)数据准备阶段的 80% 时间应该花在清洗和检查上,而不是搞数据增强。五、开源模型的三件套:解剖一个 Qwen2.5-1.5B数据齐了,把模型下载下来。以 Qwen2.5-1.5B 为例,目录长这样加载它,一行代码就够:model AutoModelForCausalLM.from_pretrained(./Models/Qwen2.5-1.5B, torch_dtypetorch.bfloat16)model但这里每一个文件都值得单独说说。5.1 model.safetensors:权重本体类比:如果说模型是一台机器,safetensors 就是里面所有的零件——每一个参数张量。传统.bin/.pt底层是 Python pickle,加载时会执行任意代码,存在木马风险。safetensors 是纯二进制加 JSON 头,不执行代码,加载可零拷贝、跨框架兼容。HuggingFace 现在默认推荐它。一个粗略的显存估算:参数量 × 每参数字节数 权重文件大小。看到 14GB 的 safetensors,基本可以反推是 7B 参数的 FP16 模型。5.2 config.json:模型的装配图类比:safetensors 是零件,config 是装配图——告诉框架每个零件放在哪、几个 attention head、总共几层。关键字段:{ architectures: [ Qwen2ForCausalLM ], attention_dropout: 0.0, bos_token_id: 151643, eos_token_id: 151643, hidden_act: silu, hidden_size: 1536, initializer_range: 0.02, intermediate_size: 8960, max_position_embeddings: 131072, max_window_layers: 28, model_type: qwen2, num_attention_heads: 12, num_hidden_layers: 28, num_key_value_heads: 2, rms_norm_eps: 1e-06, rope_theta: 1000000.0, sliding_window: 131072, tie_word_embeddings: true, torch_dtype: bfloat16, transformers_version: 4.40.1, use_cache: true, use_mrope: false, use_sliding_window: false, vocab_size: 151936}num_key_value_heads: 2是 GQA(Grouped Query Attention)——12 头 Q 只对应 2 头 K/V,推理时 KV cache 显存降 6 倍,现代大模型标配。用print(model)可以看到装配后的完整骨架:5.3 tokenizer 两件套:模型和文字世界的翻译官类比:模型只认数字(token id),不认字符串。tokenizer 就是双向翻译官——把人话翻译成 id 让模型吃,再把 id 翻译回人话给用户看。tokenizer.json 词表 BPE 合并规则(算法本体)tokenizer_config.json 特殊 token chat_template(使用规范)其中chat_template特别重要。它是一个 Jinja2 模板,负责把 messages 数组渲染成模型能吃的字符串。用一段代码看得最清楚:两个开关必须记牢:tokenizeTrue/False返回 token id 还是字符串add_generation_promptTrue/False是否追加该模型说话了的提示推理时必须 True,SFT 训练数据准备时必须 False——训练样本的 messages 已经包含完整的 assistant 回答,再开启就会在末尾额外插入孤立的|im_start|assistant/n,导致 label 错位、loss 计算偏离。六、SFT 的核心机制:只批改回答部分微调用的技术叫 SFT(Supervised Fine-Tuning)——用指令 → 回答配对数据教基座模型怎么听话。类比:老师批作业,不看学生把题目抄得对不对,只改答题部分。SFT 里最重要的一件事就是——只对 response 部分算 loss,prompt 部分不算。一条训练样本会拼成:[prompt tokens x] [response tokens y]如果对整条序列都算 loss,模型会试图生成用户的问题,这偏离目标。工程做法:把 prompt 部分的 label 设为 -100(ignore_index),交叉熵会忽略这些位置。七、训练配置 启动训练上代码。基于 HuggingFace Trainer 的完整训练流程,分三段。7.1 TrainingArguments:训练的控制面板# 设置训练的参数training_args TrainingArguments( # batch size epochs per_device_train_batch_size1, # 显存不足时可以适当缩减最小为1 gradient_accumulation_steps4, num_train_epochs1, # hyperparameters learning_rate1e-6, lr_scheduler_typecosine, # monitoring output_dir./checkpoints, logging_dir./checkpoints/logs, report_tonone, eval_strategyno, save_strategysteps, save_steps100, save_total_limit1, # efficiency bf16True, torch_compileTrue, gradient_checkpointingTrue, # 显存不足时请设置为True # reproducibility seed42, data_seed42)三个决定成败的旋钮。① 学习率类比:培训力度。太猛,学员把原本会的东西忘光光;太轻,培训完等于没培训。情况推荐 LR全参微调对话模型1e-6 ~ 2e-5全参微调基座模型1e-5 ~ 5e-5LoRA 微调1e-4 ~ 5e-4预训练(仅供对比)1e-4 ~ 3e-4新手最常见的错误是照抄预训练 LR 去做 SFT,一轮下来把预训练学到的先验冲得七零八落,输出直接崩坏。SFT 一定要小 LR。② 有效 batch size有效 batch per_device_batch × grad_accum × 卡数 1 × 4 × 1 4类比:老师不是每改一份作业就调整一次教学方法,而是攒够一批作业再总结、再调整。③ 精度与显存bf16True混合精度训练,显存减半、几乎不掉效果gradient_checkpointingTrue反向传播时重算激活值不保存,显存降 30%~70%,速度慢 20%LoRA:只训 0.1%~1% 的参数,显存降到几分之一粗略估算(1.5B 全参微调 BF16):项显存模型权重3 GB梯度3 GB优化器状态(AdamW)12 GB激活值(开 grad checkpoint)~2 GB总计~20 GB消费级 24GB 卡刚好能跑。卡不够,选 LoRA。7.2 DataCollator:批量整理器# 设置默认的用于seq2seq任务的DataCollatorcollator DataCollatorForSeq2Seq( qwen_tokenizer, paddingTrue, pad_to_multiple_of8, return_tensorspt,)Dataset 输出的是不等长的样本,组 batch 时必须对齐。Collator 做三件事:动态 padding每个 batch 内补齐到该 batch 最长,而不是全局最长补到 8 的倍数NVIDIA Tensor Core 在 shape 是 8 或 16 的倍数时才能全速运行,补齐后能带来 30%~50% 加速pad 位置的 label 自动置为 -100交叉熵会忽略这些位置7.3 Trainer:一键启动训练# 使用Trainer进行训练trainer Trainer( modelmodel, argstraining_args, train_datasettrain, processing_classqwen_tokenizer, data_collatorcollator,)trainer.train()Trainer 会自动做:把数据喂给 collator 组 batch前向 → 反向 → 累积梯度 → 每 4 步更新一次参数每 100 步保存 checkpoint训练结束打印 loss 曲线和总耗时一次典型跑完的输出:5000训练样本在24G显存的GPU上训练31分钟。到这里,一个专属版本的 Qwen2.5-1.5B 就落地在./checkpoints/tang_v1_model/目录下了。八、评估:模型真的变好了吗?回到开篇那个问题:训完的模型效果到底有没有变好?三层评估,建议都做。8.1 训练指标层看训练 loss 曲线是否稳定下降(不该突然抖动或爆炸)。这只保证训练没崩,不代表效果好。8.2 自动指标层:用 MATH500 打分本文示例的目标是数学推理,业界通用的评测集是 MATH500 —— 500 道高中/竞赛数学题,自带标准答案。核心思路:让模型在每道题上生成一段推理 答案用正则/表达式解析器从输出里提取最终答案与 ground truth 做数学等价比较统计准确率关键代码(来自eval.py):import transformersimport torchimport datasetsfrom datasets import load_datasetfrom transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForSeq2Seqimport matplotlib.pyplot as pltimport copyimport acceleratefrom tqdm import tqdmfrom utils import math_equal, extract_answer_mathtest_math load_dataset(json, data_files/root/autodl-tmp/llm-course/MATH500/test.jsonl)math500 test_math[train]model_path /root/autodl-tmp/llm-course/checkpoints/tang_v1_modeltokenizer AutoTokenizer.from_pretrained(model_path)# 使用 bfloat16 精度加载模型并自动分配到 GPU (device_mapauto) 避免 OOMmodel AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto)model.eval() # 切换到评估模式if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_tokentokenizer.padding_side lefttest_data math500.select(range(200))BATCH_SIZE 16correct_count 0total_count len(test_data)# 用一个列表把结果存下来方便后续分析哪些题做错了error_cases [] print(f/n 开始在 MATH500 上进行评测总题数: {total_count} 条)# 3. 开始批量推理循环with torch.no_grad(): # 评测阶段不需要计算梯度省显存提速 for start_index in tqdm(range(0, total_count, BATCH_SIZE), descEvaluating): batch [test_data[index] for index in range(start_index, min(start_index BATCH_SIZE, total_count))] # ⚠️ 注意这里的键名 problem 和 solution 请根据你 dataset 的实际打印结果调整 problems [item[problem] for item in batch] # 获取标准答案 (根据你数据的格式可能自带 answer 字段或者需要从 solution 中提取) ground_truths [] for item in batch: ground_truth item.get(answer) if not ground_truth: ground_truth extract_answer_math(item[solution]) ground_truths.append(ground_truth) # 构造对话模板大部分数学模型推荐加上 System Prompt 引导输出格式 texts [] for problem in problems: messages [ {role: user, content: problem} ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) texts.append(text think) # 模板化与张量化 model_inputs tokenizer(texts, return_tensorspt, paddingTrue).to(model.device) # 生成回答 (数学推理建议用 greedy search即 temperature0) generated_ids model.generate( model_inputs, max_new_tokens3700, # 根据显存和题目难度适当调整通常推导步骤较长 temperature0.0, do_sampleFalse, pad_token_idtokenizer.pad_token_id or tokenizer.eos_token_id ) # 截取新生成的部分并解码去掉输入的 prompt 部分 prompt_length model_inputs.input_ids.shape[1] generated_ids generated_ids[:, prompt_length:] responses tokenizer.batch_decode(generated_ids, skip_special_tokensTrue) # 4. 提取模型答案并与标准答案比对 for problem, ground_truth, response in zip(problems, ground_truths, responses): pred_answer extract_answer_math(response) is_correct math_equal(pred_answer, ground_truth) if is_correct: correct_count 1 else: # 记录错题方便后面打磨数据或调优 error_cases.append({ problem: problem, ground_truth: ground_truth, pred_answer: pred_answer, full_response: response })# 5. 输出最终成绩单accuracy correct_count / total_countprint(/n *40)print(f 评测完成)print(f总题数: {total_count})print(f正确题数: {correct_count})print(f最终准确率 (Accuracy): {accuracy * 100:.2f}%)print(*40)本次训练后的正确率用5000条数据训练用200个测试集正确率25%。8.3 业务指标层(最关键)自动指标的问题是语言没有唯一答案。同一道题,模型输出 A、B、C 三种不同的推理都可能是对的,但正则提取答案可能会失败。所以在实际业务里,还需要:内部标注找几位业务专家,对旧模型和新模型的输出盲评LLM-as-judge让 GPT-4 / Claude 当裁判打分,注意规避同一模型评自己的偏见线上 A/B小流量对比,看业务指标(客服解决率、代码采纳率、用户满意度)类比:训练 loss 是学员的模考分数,自动指标是标准化考试成绩,业务指标是他到岗后的实际绩效——三者不完全一致,决定饭碗的是最后一个。结语微调开源基座模型这件事,归根到底是用自家的数据 自家的目标,在通用能力之上,加一层专属能力。整条链路可以浓缩成一句话:选对基座 → 准备好数据 → 用小学习率训 → 用业务指标验收。讨论手上的场景更适合微调、RAG,还是提示工程?混合方案有没有实际跑过?我们是不是可以蒸馏好的模型的结果作为微调的数据集如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取https://mp.weixin.qq.com/s/Zfzd-MCXADSJl_wGtwUU9g