前言
文章介绍了使用unsloth框架对DeepSeek R1 Distill 7B模型进行高效微调,通过COT数据集在医疗领域数据集上实现问答风格优化和知识灌注。详细讲解了微调基础概念、环境准备、数据集处理、模型微调实操等步骤,仅需7G显存和半小时即可完成最小可行性实验,帮助读者快速掌握大模型微调技术,打造专属医疗问答助手。

你能收获什么:
亲手完成DeepSeek R1蒸馏模型的微调实战
对模型微调、推理数据集等知识有一定了解
对大模型运行的机制和原理有一定的了解
有机会制作一个属于自己的定制化大模型
复现仅需7G显存、半小时运行时间即可完成一次最小可行性实验,并获得微调效果。本人使用的GPU信息如下所示,使用平台为云开发平台ADC:

一、基础概念介绍
1.1 微调与强化学习、模型蒸馏
伴随着DeepSeek的兴起,关于强化学习训练、模型蒸馏等概念也逐渐被人熟知,这里简单总结下这三者的异同。微调、强化学习训练和模型蒸馏都是常用的技术方法,尽管这些方法在某些方面存在交集,但它们的核心原理和任务目标却有显著差异。
- 微调(Fine-tuning):
微调是指在已经训练好的大型预训练模型的基础上,进一步训练该模型以适应特定任务或特定领域的数据。相比从零开始训练一个模型,微调所需的数据和计算资源显著减少;可以在特定任务上取得更好的性能,因为模型在微调过程中会重点学习与任务相关的特性;可以在多种领域(如情感分析、问答系统等)上进行微调,从而快速适应不同应用场景。
举个🌰:想象一下,你有一只机器人狗,它已经在基本的狗行为上进行了初步训练,比如行走和听从简单的命令。微调就像是对这只机器狗进行进一步的训练以适应特定的任务环境。比如说,你希望这只机器狗能够在公园里捡回特定种类的球。通过微调,你可以在原有的训练基础上,用一组特定的数据集(比如各种颜色和大小的球)来调整其行为,使其在新环境中表现得更好。
●目标:通过少量的标注数据对预训练模型进行优化,适应具体任务。
●特点:微调的计算量相对较小,能够在有限的数据和计算资源下提升模型在特定任务上的性能。
●应用:常用于下游任务如情感分析、机器翻译、推荐系统等。
- 强化学习(Reinforcement Learning):
强化学习是一种机器学习方法,它通过让智能体在环境中执行动作,以获得反馈或奖励信号,从而学习最优策略。通过不断地试错和调整策略,智能体逐渐找到能够最大化长期回报的行为路径。这种学习方法常用于需要决策和动态环境交互的任务,如游戏、机器人导航和自动化控制系统。
举个🌰:强化学习训练则有点像是教这只机器狗通过尝试和错误来学习新技能。在这种情况下,你没有直接告诉它应该怎么做,而是为它设定一个目标,比如尽可能快地找到并捡起一只球。机器狗每完成一次任务都会获得奖励,然后它将通过调整自己的行为来最大化获得的奖励。例如,如果机器狗发现跑直线能更快地找到球,它可能会在未来的尝试中更倾向于这样做。
●目标:通过与环境的交互,学习最优的行为策略,最大化累积奖励。
●特点:强化学习强调动态决策,它通常不依赖于预定义的数据集,而是依赖于与环境的持续交互。
●应用:强化学习在游戏AI(如AlphaGo)、机器人控制、自动驾驶等任务中有广泛应用。
- 模型蒸馏(Model Distillation):
模型蒸馏是一种模型压缩技术,通过将一个复杂的大型模型(通常称为“教师模型”)中的知识迁移到一个更小的模型(称为“学生模型”)。在这个过程中,教师模型首先对训练数据进行预测,生成软标签即概率分布。这些软标签包含了有关任务的重要信息。学生模型则使用这些软标签进行训练,以接近教师模型的性能。模型蒸馏能够在保持高精度的同时,显著减少模型的大小和计算消耗,适用于在资源受限的环境下部署机器学习模型。
举个🌰:你有一只非常昂贵和精密的机器人狗,它可以完美执行任务。为了降低成本,你希望制造一个更简单的机器狗,同样能有效完成任务。通过模型蒸馏,你会使用大狗的行为数据来训练小狗,让后者理解和模仿前者的精妙动作,同时保持高效性。
●目标:通过教师模型的“知识转移” ,帮助学生模型提升性能,特别是计算能力有限的设备上。
●特点:蒸馏的核心在于知识的迁移,尤其是在模型压缩和部署方面的优势。学生模型通常在性能上能接近教师模型,但参数量更小,计算更高效。
●应用:常见于模型压缩、边缘计算、低功耗设备的部署中,用于提升部署效率并降低计算需求。
1.2 大模型微调
与RAG(Retrieval-Augmented Generation)或Agent技术依靠构建复杂的工作流以优化模型性能不同,微调通过直接调整模型的参数来提升模型的能力。这种方法让模型通过在特定任务的数据上进行再训练,从而’永久’掌握该任务所需的技能。微调不仅可以显著提高模型在特定领域或任务上的表现,还能使其适应于各种具体应用场景的需求。这种能力的增强是通过更精细地调整模型内部的权重和偏差,使其在理解和生成信息时更加精准,因此被广泛用于需要高精度和领域适应性的任务中。
1.2.1 全量微调与高效微调
从广义上讲,微调可以分为两种主要方式:全量微调和高效微调。全量微调是指利用所有可用数据来重新训练模型,以全面优化其参数。尽管这种方法对计算资源的需求较高,但它能够在最大程度上提升模型对特定任务的适应能力。相反,高效微调则采用更精简的策略,只使用部分数据进行调整,并主要修改模型的部分参数。这种方法以相对较低的计算开销,实现对模型性能的显著提升,类似于“以小博大”,非常适合在资源有限的情况下快速调整和增强模型的性能。
全量微调(Full Fine-Tuning)
举个🌰:想象一下你在一家公司管理一个团队,这个团队的所有成员已经接受了基础培训,知道如何处理一般的工作任务。现在,公司引入了一个全新的复杂项目,要求团队具备更多的专业技能和知识。
●优点:全面掌握所有相关技能,使模型对新任务有更高的适应性。
●缺点:耗时更长,资源消耗大。
高效微调(Efficient Fine-Tuning)
高效微调的方法更有针对性,它不需要花费大量的时间和资源。举个🌰:比如,如果机器人狗的任务只是要学会在一种新环境中识别特别的障碍物,你可以在已有的模型基础上,仅仅微调那些与识别相关的参数,而无需重新训练整个模型。
●优点:节省时间和资源,快速提升特定技能。
●缺点:可能不如全面培训那样细致和彻底,但能够在特定任务中高效达标。
现在绝大多数开源模型,在开源的时候都会公布两个版本的模型,其一是Base模型,该模型只经过了预训练,没有经过指令微调;其二则是Chat模型(或者就是不带尾缀的模型),则是在预训练模型基础上进一步进行全量指令微调之后的对话模型:

1.2.2 高效微调与LoRA、 QLoRA
尽管全量微调可以对模型的能力进行深度改造,但要带入模型全部参数进行训练,需要消耗大量的算力,且有一定的技术门槛。相比之下,在绝大多数场景中,如果我们只想提升模型某个具体领域的能力,那高效微调会更加合适。尽管在2020年前后,深度学习领域诞生了很多高效微调的方法,但现在适用于大模型的最主流的高效微调方法只有一种——LoRA。
LoRA( Low-Rank Adaptation)微调是一种参数高效的微调方法,旨在通过引入低秩矩阵来减少微 调时需要调整的参数数量,从而显著降低显存和计算资源的消耗。具体来说,LoRA 微调并不直接调整原始模型的所有参数,而是通过在某些层中插入低秩的适配器(Adapter)层来进行训练。
LoRA的原理:
●在标准微调中,会修改模型的所有权重,而在 LoRA 中,只有某些低秩矩阵(适配器)被训练和调整。这意味着原始模型的参数保持不变,只是通过少量的新参数来调整模型的输出。
●低秩矩阵的引入可以在显存和计算能力有限的情况下,依然有效地对大型预训练模型进行微调,从而让 LoRA 成为显存较小的设备上的理想选择。
举个🌰:想象你想教学生们怎样进行快速心算而不去完全打破他们原有的学习方法。你决定只引入一个简化版本的心算技巧,让他们在现有知识的基础上进行少量调整。这就像是把原有的学习方式轻量化处理,只增加所需的少量新知识,而不是重新教授整个数学课程。
LoRA的优势:
1.显存优化: 只需要调整少量的参数(适配器),显著减少了显存需求,适合显存有限的GPU。
2.计算效率: 微调过程中的计算负担也更轻,因为减少了需要调整的参数量。
3.灵活性: 可以与现有的预训练模型轻松结合使用,适用于多种任务,如文本生成、分类、问答等。
而QLoRA(Quantized Low-Rank Adaptation) 则是 LoRA 的一个扩展版本,它结合了 LoRA 的低秩适配器和量化技术。QLoRA 进一步优化了计算效率和存储需求,特别是在极端显存受限的环境下。与 LoRA 不同的是, QLoRA 会将插入的低秩适配器层的部分权重进行量化(通常是量化为INT4或INT8),在保持性能的同时显著降低模型的存储和计算需求。
举个🌰:针对学生中一些学习资源(如时间或精力)更加有限的情况,你进一步优化教学方法,不仅简化了学习内容(类似LoRA),同时还用了一些有助于记忆的技巧(比如使用图像或口诀),从而更有效地传授知识。这样,每个学生能在有限时间内学会心算法。在技术上,QLoRA涉及量化(quantization)技术,将模型的一部分权重参数存储在较低精度的数值格式中,以此减少内存使用和计算量,同时结合LoRA的低秩调整,让适应过程更加高效。
QLoRA的优势:
1.在显存非常有限的情况下仍能进行微调。
2.可以处理更大规模的模型。
3.适合用于边缘设备和需要低延迟推理的场景。
1.3 高效微调的应用场景
在实际大模型应用场景中,高效微调主要用于以下四个方面:
1.对话风格微调:高效微调可以用于根据特定需求调整模型的对话风格。例如,针对客服系统、虚拟助理等场景,模型可以通过微调来适应不同的语气、礼貌程度或回答方式,从而在与用户互动时提供更符合要求的对话体验。通过微调少量的参数(例如对话生成的策略、情感表达等),可以使模型表现出更具针对性和个性化的风格。
2.知识灌注:知识灌注是指将外部知识或领域特定的信息快速集成到已有的预训练模型中。通过高效微调,模型可以更好地学习新领域的专有知识,而无需重新从头开始训练。例如,对于法律、医疗等专业领域,可以使用少量的标注数据对预训练模型进行微调,帮助模型理解特定行业的术语、规则和知识,进而提升专业领域的问答能力。
3.推理能力提升:高效微调还可以用于提升大模型的推理能力,尤其是在处理更复杂推理任务时。通过微调,模型能够更加高效地理解长文本、推理隐含信息,或者从数据中提取逻辑关系,进而在多轮推理任务中提供更准确的答案。这种微调方式可以帮助模型在解答复杂问题时,提高推理准确性并减少错误。
4.Agent能力(Function calling & MCP能力)提升:在多任务协作或功能调用场景中,高效微调能够显著提升模型Agent能力,使得模型能够有效地与其他系统进行交互、调用外部API或执行特定MCP任务。通过针对性微调,模型可以学会更精准的功能调用策略、参数解析和操作指令,从而在自动化服务、智能助手或机器人控制等领域表现得更加高效和智能。
二、 DeepSeek R1 Distill高效微调环境准备
2.1 unsloth安装
unsloth是推理、微调一体式框架,unsloth将Llama 3.3、Mistral、Phi-4、Qwen 2.5和Gemma的微调速度提高2倍,同时节省80%的内存。
官网地址:GitHub - unslothai/unsloth: Finetune Llama 3, Mistral & Gemma LLMs 2-5x faster with 80% less memory
https://github.com/unslothai/unsloth
使用如下命令快速安装:
pip install unsloth

2.2 wandb安装与注册
2.2.1 wandb基本说明
在大规模模型训练中,往往需要监控和分析大量的训练数据,而WandB可以帮助实现这一目标。它提供了以下几个重要的功能(注意数据安全问题,wandb内网穿透⚠️):
2.2.2 wandb注册与使用
wandb官网:https://wandb.ai/site
使用邮箱注册后,记得拷贝下APIkey

然后即可在令行中输入如下代码安装wandb:
pip install wandb
可设置wandb进行微调记录,并可在对应网站上观察到训练过程如下:

2.3 DeepSeek R1模型下载
ModelScope模型地址:https://www.modelscope.cn/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B

创建DeepSeek-R1-Distill-Qwen-7B文件夹,用于保存下载的模型权重:
mkdir ./DeepSeek-R1-Distill-Qwen-7B
即可使用如下命令进行模型下载:
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local_dir ./DeepSeek-R1-Distill-Qwen-7B
也有其他的下载方法,视使用情况选择。

下载后的模型的完整文件如下:

2.4 微调数据
DeepSeek R1及其蒸馏模型,推理过程的具体体现就是在回复内容中,会同时包含推理部分内容和 最终回复部分内容,并且其推理部分内容会通过(一种在模型训练过程中注入的特殊标记)来进行区分。也就是说, DeepSeek R1模型组的回复格式是一种非常特殊的格式,即包含think部分内容,也包含 response部分内容。
因此,在围绕DeepSeek R1模型组进行微调的时候,微调数据集的回复部分文本也需要是包含推理 和最终回复两部分内容,才能使得DeepSeek R1模型组在保持既定回复风格的同时,强化模型能力,反之则会导致指令消融问题(模型回复不再包含think部分)。
此时think部分和最终回复,共同构成有监督微调的标签。
这种同时包含思考和结果的数据集,在当下并不少见,例如非常著名的数学问答数据集NuminaMath CoT,就同时包含数学问题、问题的解题思路(也就是think部分)和问题最终的答案。而该数据集也是可以用于推理模型微调的数据集。除了NuminaMath CoT数据集外,还有APPs(编程数据集)、 TACO(编程数据集)、long_form_thought_data_5k (通用问答数据集)等,都是CoT数据集,均可用于推理模型微调。
若实际业务有需要,也可以构造类似结构的数据集。

本文选取的数据集是一个包含推理过程的医学数据集:由深圳大数据研究院发布的HuatuoGPT-o1模型的微调数据集—medical-o1-reasoning-SFT,地址:https://www.modelscope.cn/datasets/AI-ModelScope/medical-o1-reasoning-SFT。
为什么要选这个数据集:数学能力已经测试过了,想看看其在更难推理的场景下的能力
数据集总共包含25371条数据,均为医学领域疾病诊断数据集,且不乏一些疑难杂症的推理和判断,数据集整体质量较高,推理过程严谨准确,非常适合进行医疗领域模型微调,可以极大程度提高模型对于病理的推理过程,并在这个过程中完成一些医疗知识的灌注。
三、DeepSeek R1模型微调实操
3.1 unsloth LLama模型推理
需要借助unsloth进行模型推理
导入unsloth
from unsloth import FastLanguageModel
首先设置关键参数,并读取模型:
关键参数
max_seq_length = 2048 //这决定了模型的上下文长度。例如,Gemini 的上下文长度超过 100 万,而 Llama-3 的上下文长度为 8192。允许选择任意数字 - 但出于测试目的,建议将其设置为 2048。Unsloth 还支持非常长的上下文微调,表明可以提供比最佳长 4 倍的上下文长度。
注,若显存不足,则可以load_in_4bit = True,运行4 bit量化版。
模型加载
model, tokenizer = FastLanguageModel.from_pretrained(
现在要自定义微调,可以编辑上面的数字,也可以忽略它,因为已经默认选择了相当合理的数字。目标是改变这些数字以提高准确率,同时也抵消过度拟合。过度拟合是指让语言模型记住数据集,而无法回答新颖的新问题。希望最终模型能够回答从未见过的问题,而不是进行记忆。
r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
微调过程的等级。数值越大,占用的内存越多,速度越慢,但可以提高复杂任务的准确性。我们通常建议数值为 8(用于快速微调),最高可达 128。数值过大可能会导致过度拟合,从而损害模型的质量。
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
选择所有模块进行微调。可以删除一些模块以减少内存使用量并加快训练速度,但强烈不建议这样做。只需在所有模块上进行训练!
lora_alpha = 16,
微调的缩放因子。较大的数字将使微调更多地了解您的数据集,但可能会导致过度拟合。建议将其设置为等于等级r,或将其加倍。
lora_dropout = 0, # Supports any, but = 0 is optimized
将其保留为 0 以加快训练速度!可以减少过度拟合,但效果不大。
bias = "none", # Supports any, but = "none" is optimized
将其保留为 0,以实现更快、更少的过度拟合训练!
use_gradient_checkpointing = "unsloth", # True or"unsloth"for very long context
选项包括True、False 和"unsloth"。建议使用"unsloth",因为内存使用量减少了 30%,并支持极长的上下文微调。https://unsloth.ai/blog/long-context了解更多详细信息。
random_state = 3407,
确定确定性运行的次数。训练和微调需要随机数,因此设置此数字可使实验可重复。
use_rslora = False, # We support rank stabilized LoRA
高级功能可自动设置lora_alpha = 16。
loftq_config = None, # And LoftQ
高级功能可将 LoRA 矩阵初始化为权重的前 r 个奇异向量。可以在一定程度上提高准确度,但一开始会使内存使用量激增。
输出
==((====))== Unsloth 2025.2.12: Fast Qwen2 patching. Transformers: 4.48.3.
在INT4量化情况下,8B模型推理仅需7G左右显存。
此时model就是读取进来的DeepSeek R1 蒸馏模型:
模型信息
model
输出
Qwen2ForCausalLM(
tokenizer是分词器:
分词器
tokenizer
输出
LlamaTokenizerFast(name_or_path='./DeepSeek-R1-Distill-Qwen-7B', vocab_size=151643, model_max_length=131072, is_fast=True, padding_side='left', truncation_side='right', special_tokens={'bos_token': '<|begin▁of▁sentence|>', 'eos_token': '<|end▁of▁sentence|>', 'pad_token': '<|vision_pad|>'}, clean_up_tokenization_spaces=False, added_tokens_decoder={
将模型调整为推理模式:
推理模式
FastLanguageModel.for_inference(model)
输出
Qwen2ForCausalLM(
然后即可和模型进行对话:
问题字符串
question = "你是谁?"
然后这里首先需要借助分词器,将输入的问题转化为标记索引:
转化为标记索引
inputs = tokenizer([question], return_tensors="pt").to("cuda")
索引信息
inputs
输出
{'input_ids': tensor([[151646, 105043, 100165, 11319]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1]], device='cuda:0')}
最后再带入inputs进行对话
回答问题
outputs = model.generate(
此时得到的回复也是词索引:
回复索引
outputs
tensor([[151646, 105043, 100165, ..., 102454, 5373, 99728]],
同样需要分词器将其转化为文本:
转化为文本
response = tokenizer.batch_decode(outputs)
回复文字
response
输出
['<|begin▁of▁sentence|>你是谁?我需要帮助你完成这个任务。8年前,你是一个刚进入职场的大学生,正在寻找工作。现在,你已经找到了一份工作,但可能需要进一步发展。你已经知道你的工作职责,但可能需要了解如何更好地完成任务。你已经知道如何处理日常事务,但可能需要学习如何更高效地完成任务。你已经知道如何与同事和客户沟通,但可能需要学习如何更好地管理时间。你已经知道如何处理工作中的问题,但可能需要学习如何处理压力。你已经知道如何制定工作计划,但可能需要学习如何调整计划以适应变化。你已经知道如何使用办公软件,但可能需要学习如何更好地利用这些工具。你已经知道如何处理紧急情况,但可能需要学习如何更好地预防和化解潜在风险。你已经知道如何进行沟通,但可能需要学习如何更有效地传达信息。你已经知道如何建立关系,但可能需要学习如何更好地维护和扩展这些关系。你已经知道如何完成任务,但可能需要学习如何更高效地完成任务。你已经知道如何处理压力,但可能需要学习如何更好地管理压力。你已经知道如何制定计划,但可能需要学习如何调整计划以适应变化。你已经知道如何使用工具,但可能需要学习如何更好地利用这些工具。你已经知道如何处理紧急情况,但可能需要学习如何更好地预防和化解潜在风险。你已经知道如何进行沟通,但可能需要学习如何更有效地传达信息。你已经知道如何建立关系,但可能需要学习如何更好地维护和扩展这些关系。\n\n好吧,现在我需要帮助用户完成这个任务。首先,我需要理解用户的需求。用户希望从一个刚入职的大学生的角度,逐步提升自己的职场技能,包括效率、时间管理、沟通、关系维护、压力管理、计划调整、工具使用、紧急情况处理和信息传达等。\n\n接下来,我需要考虑用户可能的身份。他可能是一个正在找工作或刚进入职场的大学生,对职场生活充满好奇和挑战。他可能对如何有效地完成工作感到困惑,或者想进一步提升自己的职业能力。\n\n用户可能没有明确说出的深层需求包括:他可能希望找到一个系统化的学习路径,帮助他逐步成长;他可能需要具体的建议或资源,比如培训课程、书籍、工具等;他可能希望了解如何平衡工作与生活,缓解压力,提升幸福感。\n\n因此,我应该提供一个结构化的计划,涵盖效率提升、时间管理、沟通技巧、压力管理、计划调整、工具使用、紧急情况处理、信息传达和关系维护等方面。同时,建议他利用学习资源和实践来持续成长。\n\n最后,我需要用鼓励和支持的语气,帮助他建立信心,相信自己能够通过努力实现职业目标。\n</think>\n\n好的,我将按照您的要求,帮助您逐步提升职场技能。以下是一个结构化的学习计划,涵盖您提到的各个方面:\n\n### 1. 效率提升\n- **学习工具使用**:掌握常用办公软件(如Excel、Word、Teams等)的高级功能,如自动化工具(Power Automate)、模板、快捷键等。\n- **时间管理**:\n - 使用时间管理方法(如番茄工作法、GTD)来提高工作效率。\n - 学习日计划表和周计划表的制作与使用,确保任务按计划完成。\n - 避免多任务处理,专注于一项任务直到完成。\n\n### 2. 时间管理\n- **设定优先级**:学会使用ABC分析法,确定任务的优先级。\n- **建立缓冲时间**:避免过度压缩时间,留出缓冲时间以应对突发情况。\n- **定期复盘**:每周复盘一周的工作,分析效率提升的空间。\n\n### 3. 沟通技巧\n- **有效沟通**:学习如何清晰、简洁地表达自己的观点,倾听他人的意见。\n- **非语言沟通**:观察和学习领导和同事的非语言沟通方式,如眼神交流、肢体语言等。\n- **团队协作**:参与团队项目,锻炼合作能力,学会妥协与协作。\n\n### 4. 压力管理\n- **压力识别**:学会识别压力源,并学会区分短期和长期的压力。\n- **放松技巧**:学习深呼吸、冥想等放松技巧,以应对压力。\n- **寻求支持**:建立支持网络,如朋友、家人或同事,分享压力和困难。\n\n### 5. 制计划与调整\n- **灵活计划**:学习根据实际情况调整计划的能力。\n- **定期评估计划**:每周评估计划的执行情况,及时调整。\n- **快速调整**:遇到变化时,快速调整计划以适应新情况。\n\n### 6. 工具使用\n- **自动化工具**:学习使用Power Automate、 Zapier等工具自动化工作流程。\n- **学习新工具**:根据工作需求,学习和掌握新工具,如Jira、Trello等项目管理工具。\n- **工具比较**:比较不同工具的优缺点,选择最适合自己的工具。\n\n### 7. 紧急情况处理\n- **应急预案**:制定并学习如何处理紧急情况的预案。\n- **快速反应**:练习如何在紧急情况下快速反应,解决问题。\n- **学习经验**:总结处理紧急情况的经验教训,提升应对能力。\n\n### 8. 信息传达\n- **清晰表达**:学习如何用简洁、有力的语言传达关键信息。\n- **视觉沟通**:利用图表、PPT等视觉工具,更有效地传达信息。\n- **倾听反馈**:学习如何从同事和客户那里获取反馈,改进信息传达方式。\n\n### 9. 关系维护\n- **建立联系**:主动与同事、领导']
格式化输出一下:
格式化
print(response[0])
输出
<|begin▁of▁sentence|>你是谁?我需要帮助你完成这个任务。8年前,你是一个刚进入职场的大学生,正在寻找工作。现在,你已经找到了一份工作,但可能需要进一步发展。你已经知道你的工作职责,但可能需要了解如何更好地完成任务。你已经知道如何处理日常事务,但可能需要学习如何更高效地完成任务。你已经知道如何与同事和客户沟通,但可能需要学习如何更好地管理时间。你已经知道如何处理工作中的问题,但可能需要学习如何处理压力。你已经知道如何制定工作计划,但可能需要学习如何调整计划以适应变化。你已经知道如何使用办公软件,但可能需要学习如何更好地利用这些工具。你已经知道如何处理紧急情况,但可能需要学习如何更好地预防和化解潜在风险。你已经知道如何进行沟通,但可能需要学习如何更有效地传达信息。你已经知道如何建立关系,但可能需要学习如何更好地维护和扩展这些关系。你已经知道如何完成任务,但可能需要学习如何更高效地完成任务。你已经知道如何处理压力,但可能需要学习如何更好地管理压力。你已经知道如何制定计划,但可能需要学习如何调整计划以适应变化。你已经知道如何使用工具,但可能需要学习如何更好地利用这些工具。你已经知道如何处理紧急情况,但可能需要学习如何更好地预防和化解潜在风险。你已经知道如何进行沟通,但可能需要学习如何更有效地传达信息。你已经知道如何建立关系,但可能需要学习如何更好地维护和扩展这些关系。
带入问答模板进行回答
结构化输入方法
提示词
prompt_style_chat = """请写出一个恰当的回答来完成当前对话任务。
问题
question = "你好,好久不见!"
格式化输入
[prompt_style_chat.format(question, "")]
输出
['请写出一个恰当的回答来完成当前对话任务。\n\n### Instruction:\n你是一名助人为乐的助手。\n\n### Question:\n你好,好久不见!\n\n### Response:\n<think>']
分词
inputs = tokenizer([prompt_style_chat.format(question, "")], return_tensors="pt").to("cuda")
回复索引
outputs = model.generate(
回复文本
response = tokenizer.batch_decode(outputs)
回复
response
输出
['<|begin▁of▁sentence|>请写出一个恰当的回答来完成当前对话任务。\n\n### Instruction:\n你是一名助人为乐的助手。\n\n### Question:\n你好,好久不见!\n\n### Response:\n<think>\n嗯,用户发来“你好,好久不见!”这句话,看起来像是一种友好的问候,带有亲切感。首先,我需要分析用户的意图,可能是想打招呼或者继续之前的对话。我应该回应得友好且温暖,同时保持专业性。\n\n考虑到用户可能是想建立联系,我应该用一种既亲切又正式的方式回应。比如,使用“你好!很高兴见到你!今天过得怎么样?”这样的回复既表达了问候,又询问了近况,有助于继续对话。\n\n另外,我需要确保语言简洁明了,避免使用复杂的词汇,让用户感觉轻松愉快。同时,保持语气友好,让用户感到被重视和欢迎。\n\n最后,检查一下回复是否符合所有要求,比如是否恰当、是否符合角色设定,以及是否能够有效传达信息。确认无误后,就可以发送这个回复了。\n</think>\n\n你好!很高兴见到你!今天过得怎么样?<|end▁of▁sentence|>']
格式化
print(response[0].split("### Response:")[1])
格式化回复
<think>
3.2 初始模型问答测试
3.2.1 问答模版设置
为测试模型微调的能力,选取了医疗相关的数据集进行微调。
先简单测试下未经微调的模型能力,设置问答模板
提示词
prompt_style = """Below is an instruction that describes a task, paired with an input that provides further context.
翻译如下:
提示词翻译
prompt_style = """以下是一个任务说明,配有提供更多背景信息的输入。
3.2.2 问答测试
接下来抽取部分medical-o1-reasoning-SFT数据集中问题进行提问,并查看初始状态下模型回答结果。
问题1
question_1 = "A 61-year-old woman with a long history of involuntary urine loss during activities like coughing or sneezing but no leakage at night undergoes a gynecological exam and Q-tip test. Based on these findings, what would cystometry most likely reveal about her residual volume and detrusor contractions?"
翻译
question_1 :一位61岁的女性,有长期在咳嗽或打喷嚏等活动中发生不自主尿液流失的病史,但夜间没有漏尿。她接受了妇科检查和Q-tip测试。根据这些检查结果,膀胱测量(cystometry)最可能会显示她的残余尿量和逼尿肌收缩情况如何?
问题2
question_2 = "Given a patient who experiences sudden-onset chest pain radiating to the neck and left arm, with a past medical history of hypercholesterolemia and coronary artery disease, elevated troponin I levels, and tachycardia, what is the most likely coronary artery involved based on this presentation?"
翻译
question_2 :面对一位突发胸痛并放射至颈部和左臂的患者,其既往病史包括高胆固醇血症和冠状动脉疾病,同时伴有升高的肌钙蛋白I水平和心动过速,根据这些临床表现,最可能受累的冠状动脉是哪一条?
问答测试
问题1测试
inputs1 = tokenizer([prompt_style.format(question_1, "")], return_tensors="pt").to("cuda")
回复
<think>
回复翻译
好的,我试着弄清楚这位61岁女性的膀胱压力测定会显示什么。她在咳嗽或打喷嚏等活动中出现不自主的尿液流失,但晚上没有。所以,她经历了尿急,对吧?就是当你因为某些事情而无法控制排尿的时候。
问题2测试
inputs2 = tokenizer([prompt_style.format(question_2, "")], return_tensors="pt").to("cuda")
回复
<think>
回复翻译
好的,我在尝试弄清楚这位患者的胸痛涉及哪个冠状动脉。让我从给定的信息入手,逐步分析。
3.2.3 问答测试结果
标准答案
问题1标准答案
在这种压力性尿失禁的情况下,膀胱测压检查(cystometry)最可能显示正常的排尿后残余尿量,因为压力性尿失禁通常不会影响膀胱排空功能。此外,由于压力性尿失禁主要与身体用力有关,而不是膀胱过度活动症(OAB),因此在测试过程中不太可能观察到逼尿肌的非自主收缩。
问题2标准答案
根据患者表现出的突然胸痛并放射至颈部和左臂,结合其有高胆固醇血症和冠状动脉疾病的病史,肌钙蛋白升高和心动过速,临床症状强烈提示左前降支(LAD)动脉受累。该动脉通常是引发此类症状的罪魁祸首,因为它供应了心脏的大部分区域。放射性疼痛和肌钙蛋白升高的组合表明心肌受损,这使得LAD成为最可能的致病动脉。然而,在没有进一步的诊断检查(如心电图)的情况下,最终的确诊仍需等待确认。
能够看出,在原始状态下,模型能够进行推理并给出回复,但实际上第一个回答过程并不符合医学规范,而第二个问题则直接回答错误。由此可见,在初始状态下,模型对于medical-o1-reasoning-SFT数据集问答效果并不好。
接下来尝试进行微调,并测试微调后模型问答效果。
3.3 最小可行性实验
接下来尝试进行模型微调,对于当前数据集而言,可以带入原始数据集的部分数据进行微调,也可以带入全部数据并遍历多次进行微调。对于大多数的微调实验,可以从最小可行性实验入手进行微调,也就是先尝试带入少量数据进行微调,并观测微调效果。若微调可以顺利执行,并能够获得微调效果,再考虑带入更多的数据进行更大规模微调。
3.3.1 数据集准备
这里直接从modelscope上下载medical-o1-reasoning-SFT数据集。

如果有报错,按提示解决,如果还不行可以取hugging face的数据集,或者换其他数据集、或者将数据集下载到本地再读取。本人尝试了好多,有些数据集能成功,有些不行,各种莫名奇妙的报错,按报错提示改动即可。
数据集下载
from modelscope.msdatasets import MsDataset
查看
ds[0]
输出
{'Question': 'A 61-year-old woman with a long history of involuntary urine loss during activities like coughing or sneezing but no leakage at night undergoes a gynecological exam and Q-tip test. Based on these findings, what would cystometry most likely reveal about her residual volume and detrusor contractions?',
在最小可行性实验中,可以下载500条数据进行微调即可看出效果:
划分数据集
from modelscope.msdatasets import MsDataset
3.3.2 文本进行结构化处理
提示词模版
train_prompt_style = """Below is an instruction that describes a task, paired with an input that provides further context.
然后提取并设置文本生成结束的标记:
文本生成结束标记
EOS_TOKEN = tokenizer.eos_token
输出
'<|end▁of▁sentence|>'
然后定义函数,用于对medical-o1-reasoning-SFT数据集进行修改,Complex_CoT列和Response列进行拼接,并加上文本结束标记:
格式化函数
defformatting_prompts_func(examples):
将数据集整理为如下形式:
数据格式化
ds = ds.map(formatting_prompts_func, batched = True,)
产看格式化后的数据
ds["text"][0]
输出
"Below is an instruction that describes a task, paired with an input that provides further context. \nWrite a response that appropriately completes the request. \nBefore answering, think carefully about the question andcreate a step-by-step chainof thoughts to ensure a logicaland accurate response.\n\n### Instruction:\nYou are a medical expert with advanced knowledge in clinical reasoning, diagnostics, and treatment planning. \nPlease answer the following medical question. \n\n### Question:\nA 61-year-old woman with a long history of involuntary urine loss during activities like coughing or sneezing but no leakage at night undergoes a gynecological exam and Q-tip test. Based on these findings, what would cystometry most likely reveal about her residual volume and detrusor contractions?\n\n### Response:\n<think>\nOkay, let's think about this step by step. There's a 61-year-old woman here who's been dealing with involuntary urine leakages whenever she's doing something that ups her abdominal pressure like coughing or sneezing. This sounds a lot like stress urinary incontinence to me. Now, it's interesting that she doesn't have any issues at night; she isn't experiencing leakage while sleeping. This likely means her bladder's ability to hold urine is fine when she isn't under physical stress. Hmm, that's a clue that we're dealing with something related to pressure rather than a bladder muscle problem. \n\nThe fact that she underwent a Q-tip test is intriguing too. This test is usually done to assess urethral mobility. In stress incontinence, a Q-tip might move significantly, showing urethral hypermobility. This kind of movement often means there's a weakness in the support structures that should help keep the urethra closed during increases in abdominal pressure. So, that's aligning well with stress incontinence.\n\nNow, let's think about what would happen during cystometry. Since stress incontinence isn't usually about sudden bladder contractions, I wouldn't expect to see involuntary detrusor contractions during this test. Her bladder isn't spasming or anything; it's more about the support structure failing under stress. Plus, she likely empties her bladder completely because stress incontinence doesn't typically involve incomplete emptying. So, her residual volume should be pretty normal. \n\nAll in all, it seems like if they do a cystometry on her, it will likely show a normal residual volume and no involuntary contractions. Yup, I think that makes sense given her symptoms and the typical presentations of stress urinary incontinence.\n</think>\nCystometry in this case of stress urinary incontinence would most likely reveal a normal post-void residual volume, as stress incontinence typically does not involve issues with bladder emptying. Additionally, since stress urinary incontinence is primarily related to physical exertion and not an overactive bladder, you would not expect to see any involuntary detrusor contractions during the test.<|end▁of▁sentence|>"
3.3.3 开始微调
开启微调,把模型设置为微调模式:
微调模式
model = FastLanguageModel.get_peft_model(
输出
Unsloth 2025.2.12patched 28 layerswith 28 QKVlayers, 28 Olayersand 28 MLPlayers.
然后导入相关的库:
导库
from trl import SFTTrainer
创建微调对象:
微调对象
trainer = SFTTrainer(
通常不建议更改上述参数:
per_device_train_batch_size = 2,
如果想更多地利用 GPU 的内存,增加批处理大小。同时增加批处理大小可以使训练更加流畅,并使过程不会过度拟合。通常不建议这样做,因为这可能会因填充问题而使训练速度变慢。通常会增加批处理大小,gradient_accumulation_steps这只会对数据集进行更多遍历。
gradient_accumulation_steps = 4,
相当于将批量大小增加到自身之上,但不会影响内存消耗,如果想要更平滑的训练损失曲线,通常建议增加这个值。
max_steps = 60, # num_train_epochs = 1,
将步骤设置为 60 以加快训练速度。对于可能需要数小时的完整训练运行,请注释掉max_steps,并将其替换为num_train_epochs = 1。将其设置为 1 表示对数据集进行 1 次完整传递。通常建议传递 1 到 3 次,不要更多,否则微调会过度拟合。
learning_rate = 2e-4,
如果想让微调过程变慢,但同时又最有可能收敛到更高的准确度结果,降低学习率。通常建议尝试 2e-4、1e-4、5e-5、2e-5 作为数字。
输出
Applying chat template to train dataset (num_proc=2): 100%|██████████| 500/500 [00:01<00:00, 348.86 examples/s]
开始微调
trainer_stats = trainer.train()

这是训练损失,如果目标是设置参数,使其尽可能接近 0.5,如果微调未达到 1、0.8 或 0.5,可能需要调整一些数字。如果损失为 0,这可能也不是一个好兆头。

注意,unsloth在微调结束后,会自动更新模型权重(在缓存中),因此无需手动合并模型权重即可直接调用微调后的模型:
FastLanguageModel.for_inference(model)
输出
PeftModelForCausalLM(
验证之前的问题:
问题验证
inputs = tokenizer([prompt_style.format(question_1, "")], return_tensors="pt").to("cuda")
<think>
能够发现,问题回答更加规范,但仍可能存在一定的回答错误。由此可以考虑继续进行大规模微调。
3.3.4 模型合并
此时本地保存的模型权重在outputs文件夹中:

然后可使用如下代码进行模型权重合并:
权重合并
new_model_local = "DeepSeek-R1-Medical"

3.4 微调参数解析
SFTTrainer 进行监督微调(Supervised Fine-Tuning, SFT),适用于 transformers 和 Unsloth 生态中的模型微调:1. 相关库
●SFTTrainer(来自 trl 库):
○trl(Transformer Reinforcement Learning)是 Hugging Face 旗下的 trl 库,提供监督微调(SFT) 和强化学习(RLHF)相关的功能。
○SFTTrainer 主要用于有监督微调(Supervised Fine-Tuning),适用于 LoRA 等低秩适配微调方式。
●TrainingArguments(来自 transformers 库):
○这个类用于定义训练超参数,比如批量大小、学习率、优化器、训练步数等。
- is_bfloat16_supported(来自 unsloth):
○这个函数检查当前 GPU 是否支持 bfloat16(BF16),如果支持,则返回 True,否则返回 False
○bfloat16 是一种更高效的数值格式,在新款 NVIDIA A100/H100 等GPU上表现更优。
- 初始化 SFTTrainer
SFTTrainer 部分

TrainingArguments 部分

3.5 完整高效微调实验
接下来尝试带入全部数据进行高效微调,以提升模型微调效果。
完整代码:
fromunsloth import FastLanguageModel
完全跑下来时间可能比较久:

10分钟构建能主动提问的智能导购
为助力商家全天候自动化满足顾客的购物需求,可通过百炼构建一个 Multi-Agent 架构的大模型应用实现智能导购助手。该系统能够主动询问顾客所需商品的具体参数,一旦收集齐备,便会自动从商品数据库中检索匹配的商品,并精准推荐给顾客。
mer Reinforcement Learning)是 Hugging Face 旗下的 trl 库,提供监督微调(SFT) 和强化学习(RLHF)相关的功能。
○SFTTrainer 主要用于有监督微调(Supervised Fine-Tuning),适用于 LoRA 等低秩适配微调方式。
●TrainingArguments(来自 transformers 库):
○这个类用于定义训练超参数,比如批量大小、学习率、优化器、训练步数等。
- is_bfloat16_supported(来自 unsloth):
○这个函数检查当前 GPU 是否支持 bfloat16(BF16),如果支持,则返回 True,否则返回 False
○bfloat16 是一种更高效的数值格式,在新款 NVIDIA A100/H100 等GPU上表现更优。
零基础如何高效学习大模型?
你是否懂 AI,是否具备利用大模型去开发应用能力,是否能够对大模型进行调优,将会是决定自己职业前景的重要参数。
为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和鲁为民博士系统梳理大模型学习脉络,这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码免费领取🆓**⬇️⬇️⬇️

【大模型全套视频教程】
教程从当下的市场现状和趋势出发,分析各个岗位人才需求,带你充分了解自身情况,get 到适合自己的 AI 大模型入门学习路线。
从基础的 prompt 工程入手,逐步深入到 Agents,其中更是详细介绍了 LLM 最重要的编程框架 LangChain。最后把微调与预训练进行了对比介绍与分析。
同时课程详细介绍了AI大模型技能图谱知识树,规划属于你自己的大模型学习路线,并且专门提前收集了大家对大模型常见的疑问,集中解答所有疑惑!

深耕 AI 领域技术专家带你快速入门大模型
跟着行业技术专家免费学习的机会非常难得,相信跟着学习下来能够对大模型有更加深刻的认知和理解,也能真正利用起大模型,从而“弯道超车”,实现职业跃迁!

【精选AI大模型权威PDF书籍/教程】
精心筛选的经典与前沿并重的电子书和教程合集,包含《深度学习》等一百多本书籍和讲义精要等材料。绝对是深入理解理论、夯实基础的不二之选。

【AI 大模型面试题 】
除了 AI 入门课程,我还给大家准备了非常全面的**「AI 大模型面试题」,**包括字节、腾讯等一线大厂的 AI 岗面经分享、LLMs、Transformer、RAG 面试真题等,帮你在面试大模型工作中更快一步。
【大厂 AI 岗位面经分享(92份)】

【AI 大模型面试真题(102 道)】

【LLMs 面试真题(97 道)】

【640套 AI 大模型行业研究报告】

【AI大模型完整版学习路线图(2025版)】
明确学习方向,2025年 AI 要学什么,这一张图就够了!

👇👇点击下方卡片链接免费领取全部内容👇👇

抓住AI浪潮,重塑职业未来!
科技行业正处于深刻变革之中。英特尔等巨头近期进行结构性调整,缩减部分传统岗位,同时AI相关技术岗位(尤其是大模型方向)需求激增,已成为不争的事实。具备相关技能的人才在就业市场上正变得炙手可热。
行业趋势洞察:
- 转型加速: 传统IT岗位面临转型压力,拥抱AI技术成为关键。
- 人才争夺战: 拥有3-5年经验、扎实AI技术功底和真实项目经验的工程师,在头部大厂及明星AI企业中的薪资竞争力显著提升(部分核心岗位可达较高水平)。
- 门槛提高: “具备AI项目实操经验”正迅速成为简历筛选的重要标准,预计未来1-2年将成为普遍门槛。
与其观望,不如行动!
面对变革,主动学习、提升技能才是应对之道。掌握AI大模型核心原理、主流应用技术与项目实战经验,是抓住时代机遇、实现职业跃迁的关键一步。

01 为什么分享这份学习资料?
当前,我国在AI大模型领域的高质量人才供给仍显不足,行业亟需更多有志于此的专业力量加入。
因此,我们决定将这份精心整理的AI大模型学习资料,无偿分享给每一位真心渴望进入这个领域、愿意投入学习的伙伴!
我们希望能为你的学习之路提供一份助力。如果在学习过程中遇到技术问题,也欢迎交流探讨,我们乐于分享所知。
*02 这份资料的价值在哪里?*
专业背书,系统构建:
-
本资料由我与鲁为民博士共同整理。鲁博士拥有清华大学学士和美国加州理工学院博士学位,在人工智能领域造诣深厚:
-
- 在IEEE Transactions等顶级学术期刊及国际会议发表论文超过50篇。
- 拥有多项中美发明专利。
- 荣获吴文俊人工智能科学技术奖(中国人工智能领域重要奖项)。
-
目前,我有幸与鲁博士共同进行人工智能相关研究。

内容实用,循序渐进:
-
资料体系化覆盖了从基础概念入门到核心技术进阶的知识点。
-
包含丰富的视频教程与实战项目案例,强调动手实践能力。
-
无论你是初探AI领域的新手,还是已有一定技术基础希望深入大模型的学习者,这份资料都能为你提供系统性的学习路径和宝贵的实践参考,助力你提升技术能力,向大模型相关岗位转型发展。



抓住机遇,开启你的AI学习之旅!

750

被折叠的 条评论
为什么被折叠?



