返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

一位淘宝工程同学的大模型LoRA微调尝试

[复制链接]
链载Ai 显示全部楼层 发表于 2 小时前 |阅读模式 打印 上一主题 下一主题

ingFang SC";font-weight: bold;color: rgb(58, 92, 244);line-height: 20px;visibility: visible;">


ingFang SC", system-ui, -apple-system, "system-ui", "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;background-color: rgb(255, 255, 255);visibility: visible;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;">本文主要介绍了大模型时代下,如何通过 LoRA(Low-Rank Adaptation)这一参数高效微调技术,实现对大模型的轻量级定制。文章从微调的基本概念出发,详细阐述了 LoRA 的原理、优势与局限性,并结合本地原生实现(Transformers + PEFT)和百炼平台两种方式,展示了在小样本、低资源场景下的实战流程。结果表明,LoRA 能以极低的计算成本让通用大模型有效学习业务知识,显著提升其在特定任务中的表现,真正实现“让大模型懂业务”,推动 AI 从“可用”走向“好用”。


图片ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;visibility: visible !important;width: 113px !important;"/>
前言

ingFang SC", -apple-system-font, system-ui, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;visibility: visible;line-height: 1.75em;">

ingFang SC", system-ui, -apple-system, "system-ui", "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;background-color: rgb(255, 255, 255);visibility: visible;line-height: 1.75em;">

ingFang SC", system-ui, -apple-system, "system-ui", "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;background-color: rgb(255, 255, 255);visibility: visible;line-height: 1.75em;">如今大模型时代,深刻重塑了很多行业的业务形态与技术架构。从智能客服到内容生成,从代码辅助到推荐系统,大模型正以前所未有的速度渗透到互联网技术的各个领域,成为驱动创新的核心引擎。其强大的泛化能力和上下文理解水平,使得许多过去需要复杂工程与规则设计的任务,如今只需一次“提示”即可完成。

ingFang SC", system-ui, -apple-system, "system-ui", "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;background-color: rgb(255, 255, 255);visibility: visible;line-height: 1.75em;">

ingFang SC", system-ui, -apple-system, "system-ui", "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;background-color: rgb(255, 255, 255);visibility: visible;line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;">然而,尽管大模型展现出惊人的通用能力,对大多数开发者和业务方而言,它仍是一个“黑盒”——我们只能调用其预训练时所掌握的知识与行为模式,难以干预其内部逻辑,也无法直接引导模型适应特定场景的表达习惯、术语体系或业务规则。在生产环境中,这种“能力固定”的特性带来了明显的局限:模型输出可能偏离业务预期,难以保证一致性,更无法随业务演进而持续进化。


面对这一挑战,模型微调(Fine-tuning)提供了一条关键路径。尤其是以LoRA等为代表的参数高效微调技术(PEFT),在不改变主干模型的前提下,仅通过训练少量新增参数,即可实现对大模型行为的精准定制。这不仅大幅降低了计算成本与技术门槛,更让业务开发者能够基于自身积累的高质量数据,赋予通用大模型“专属”的业务理解能力。本文将围绕LoRA微调技术展开,探讨其在小样本、低资源场景下的实践价值,展示如何利用业务数据对大模型进行轻量级定制,真正实现“让大模型懂业务”,推动AI从“可用”走向“好用”,从“通用”迈向“专属”。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;visibility: visible !important;width: 113px !important;"/>
微调

ingFang SC", -apple-system-font, system-ui, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;visibility: visible;line-height: 1em;box-sizing: border-box !important;overflow-wrap: break-word !important;">

么是微调


大模型的微调(Fine-tuning),是指在一个已经预训练好的大模型(比如GPT、DeepSeek、BERT、Llama等)基础上,针对特定任务、领域或数据进行进一步训练。微调通常通过在目标数据集上继续训练模型权重,使模型更适应该任务,从而提升下游任务的表现。

简单来说,预训练让模型掌握通用知识,微调让模型适应某个具体用例。LLM微调是一个有监督学习过程,即有监督微调(SFT),通常语言模型的初始训练是无监督的,但微调是有监督的。

调的分类


按照⽬标任务
  • 标准微调(任务微调):针对某⼀具体任务进⾏微调(如分类、问答、摘要等)。
  • 领域微调:针对某⼀特定领域数据进⾏微调(如医疗、法律、⾦融等)。
  • 指令微调:通过⼤量的「指令-响应」数据集(如Alpaca, Baize等)对模型进⾏微调,使其能够按照⾃然语⾔指令完成多种任务。

按参数调整⽅式
  • 全参数微调(Full-parameterTuning):对所有模型参数进⾏更新。
  • 部分参数微调(Repurposing):只更新部分参数,⽐如最后⼀层、分类头等。
  • 参数⾼效微调(ParameterEfficientFine-Tuning,PEFT):引⼊少量额外可训练参数,冻结原模型绝⼤部分参数,如LoRA、Adapter、Prefix Tuning等,主要⽬的是⽤很少量新参数即实现任务适配。

常⻅微调⽅法


全参数微调
  • 直接在⽬标数据集上继续训练所有模型参数,效果好但耗资源⼤,对硬件要求⾼,不易迁移。

参数⾼效微调(PEFT)
  • LoRA(Low-RankAdaptation):通过在部分参数上引⼊低秩矩阵,仅训练这些新增的低秩参数,⼤⼤减少训练所需参数量和显存消耗。
  • Adapter:在原有⽹络层之间插⼊⼩型新⽹络模块并仅训练这些模块参数。
  • PrefixTuning/PromptTuning:在输⼊或模型内部插⼊可训练的参数向量(前缀、提示),主⽹络参数保持不变。

LoRA微调

什么是LoRA


LoRA(Low-RankAdaptationof LLMs),即LLMs的低秩适应,是参数⾼效微调最常⽤的⽅法。

原理


LoRA的核⼼思想是:冻结预训练的基座模型(BaseModel),在其某些层(如注意⼒中的Q、K、V投影)上,额外添加低秩矩阵(A和B)作为可训练参数,⽤于学习任务特定的增量调整。
  • 原始基座模型的权重 全程保持冻结、未修改。
  • 训练过程中,只有LoRA引⼊的少量新增参数(如lora_A, lora_B)被更新。
LoRA的本质就是⽤更少的训练参数来近似LLM全参数微调所得的增量参数,从⽽达到使⽤更少显存占⽤的⾼效微调。

LoRA的核⼼思路就是,直接freeze基座模型的全部参数,然后额外给模型增加⼀个扰动的module,来模拟finetune之后参数改变的效果。如此⼀来,只要这些扰动的module参数量够⼩且推理够快,就不会影响模型整体的inference成本,且可以⼤幅地缩减模型finetune的开销,因为我们只需要训练极⼩量的⼀部分参数即可。

基座模型只参与训练过程中的前向传播,反向传播更新参数的只有LoRA的插⼊的adapter参数。


  • 保留原来预训练好的权重W不动;
  • 旁路插入一个低秩矩阵BA,对W的输出做一个可学习的微小增量;
  • 只训练A、B这两组很小的参数,就能让模型适配新任务。

上⾯是简化的示意图,实际的Transformer由很多线性投影(如Q、K、V、O、FFN的W₁、W₂等)组成,每个都是⾃⼰的d₁ × d₂矩阵。LoRA是把这些⼤矩阵W逐个冻结,然后在它们上⾯叠加⼀个低秩增量ΔW=BA。 因此,严格来说是对模型⾥的每个⼤矩阵都做⼀次rank = r(远⼩于d₁, d₂)的低秩更新。

训练省资源的根本原因
  • 原来若要微调W,需要存和反向传播d₁·d₂个参数;
  • LoRA只训练A(r×d₂)和B(d₁×r),参数量变成2·r·max(d₁,d₂),当r≪min(d₁, d₂)时可省100×乃⾄10 000×的显存和梯度计算;
  • W冻结→不必存动量/梯度,也不⽤进⾏前后两次matmul⽐较差分,⼤幅降低显存与算⼒。

  • 推理过程

核心机制:权重增量叠加(WeightAddition)。
LoRA(Low-RankAdaptation)在推理时,并不是“绕道”或“替换”,而是:将LoRA学习到的增量权重,加到原始预训练模型的对应权重上。
数学表达:
对于一个原始权重矩阵 W∈Rd×kW∈Rd×k,LoRA引入低秩分解:
ΔW=AB其中A∈Rd×r,B∈Rr×k,r≪dΔW=AB其中 A∈Rd×r,B∈Rr×k,r≪d
推理时的实际权重为:
Wnew=W+ΔW=W+ABWnew=W+ΔW=W+AB
然后使用WnewWnew进行前向计算。

两种推理模式:

模式

说明

特点

1. 推理时动态叠加(On-thefly)

加载原始模型 + LoRA 权重,实时计算W+ΔWW+ΔW

可用,但慢

2. 合并后推理(MergedInference)

将 LoRA 权重 合并到原始模型中,生成一个新模型,直接推理

推理更快、更稳定

⼀般采⽤合并后⽣成新的模型来进⾏推理,同时可以保留原始模型。

  • 优劣势

LoRA 的优势
优势
说明
资源成本低
仅需训练少量参数(如QKV投影层),节省GPU显存和算力
训练速度快
梯度计算集中在小模块,训练效率显著提升
存储友好
一个基础模型+多个LoRA权重(每个几MB~几百MB),便于版本管理和部署
灵活切换任务
可动态加载不同LoRA权重,实现多业务场景快速切换
保护原始模型
原模型冻结,避免灾难性遗忘,保证通用能力

LoRA的局限性
劣势
说明
性能略低于全参数微调
在复杂任务上可能稍逊于全量微调,但差距通常可控(<5%)
依赖基础模型质量
LoRA无法修复基础模型的根本缺陷,微调效果受限于预训练能力
适配层选择敏感
效果受插入位置(如仅attention、FFN等)影响,需实验调优
推理需额外集成
需支持LoRA加载的推理框架(如HuggingFace+PEFT、vLLM、llama.cpp等)

实战


LoRA微调⽬前有多种⽅式实现,Transformers+PEFT原⽣实现,LLaMA-Factory、Axolotl等框架实现,以及借助百炼等封装好的可视化界⾯平台实现。本⽂主要尝试了Transformers+PEFT原⽣实现,以及公司⽣产中更有可能⽤到的百炼平台实现。

  • 原⽣微调

使⽤Transformers+PEFT原⽣实现。

环境搭建
1. transformers+peft+datasets
注意:几个库的版本之间有协同关系,随意安装版本可能导致不兼容问题,可在Hugging Face的官方文档中查看推荐版本。
代码:
pipinstall--upgradetorch==2.1.0+cputorchvision==0.16.0+cpu--index-urlhttps://download.pytorch.org/whl/cpupipinstall-Utransformers==4.38.2peft==0.10.0datasets==2.18.0\acceleratesentencepiecesafetensorstqdm
2.模型准备
这里考虑到微调是在mac本地运行,算力有限,所以使用了较小的DeepSeek-R1-Distill-Qwen-1.5B作为基座模型。使用Hugging Face或Modelscope等下载模型到本地即可。

数据处理
训练数据:
准备好数据文件lora_seckill_qa.jsonl,格式使用如下instruction-response格式。
{"instrucAon":"埋点时主要记录哪些事件?","response":"使⽤的是xx埋点框架,埋点有分为各种事件类型,主要的有曝光事件和点击事件,可以根据曝光和点击事件来统计数据,如点击率等"}{"instrucAon":"xxxxxxxxxxxxxxxxxx?","response":"xxxxxxxxxxxxxxx"}
处理脚本:
import jsonfrom datasets import Datasetfrom transformers import AutoTokenizer# 正确读取jsonlwith open("lora_seckill_qa.jsonl","r", encoding="utf-8") as f:raw_data = [json.loads(line) for line in f if line.strip()]# 如果是单轮格式可直接用# dataset = Dataset.from_list(raw_data)# 若是conversation 格式(如 [{"conversation":[...]}]),需展开def conversation_to_list(item):out = []for turn in item["conversation"]:instr = turn.get("system","") +"\n"+ turn["input"] ifturn.get("system")elseturn["input"]out.append({"instruction": instr.strip(),"response": turn["output"].strip()})return out# 如果你的raw_data 已经是单轮格式就跳过这一段all_samples = []if"conversation"in raw_data[0]:for d in raw_data:all_samples.extend(conversation_to_list(d))dataset = Dataset.from_list(all_samples)else:dataset = Dataset.from_list(raw_data)
# 保存分词器tokenizer = AutoTokenizer.from_pretrained("/Users/shawn/Documents/AI-dev/models/deepseek/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",trust_remote_code=True,local_files_only=True)tokenizer.save_pretrained("./tokenizer")# 保存处理后的数据集dataset.save_to_disk("./processed_dataset_ms")print("预处理完成,已保存!")

训练参数
训练脚本:
import torchfrom datasets import load_from_diskfrom transformers import AutoTokenizer, AutoModelForCausalLM,TrainingArguments, Trainer, default_data_collatorfrom peft import get_peft_model, LoraConfigimport random# 1. 加载数据集dataset = load_from_disk("./processed_dataset_ms")# 2. 样本随机打乱dataset = dataset.shuffle(seed=42)# 3. 分词器tokenizer = AutoTokenizer.from_pretrained("./tokenizer", local_files_only=True)def generate_and_tokenize_prompt(batch):texts = [f"""<s>### Instruction:{instruction}### Response:{response}</s>"""for instruction, response in zip(batch["instruction"],batch["response"])]out = tokenizer(texts,max_length=256,padding="max_length",truncation=True,add_special_tokens=False,return_tensors=None,)# Loss 忽略paddingp.out["labels"] = [[tok if tok != tokenizer.pad_token_idelse-100 for tok in label]for label in out["input_ids"]]return outtokenized_dataset = dataset.map(generate_and_tokenize_prompt,batched=True,remove_columns=dataset.column_names,desc="Tokenizing")# 4. 加载基座模型(如设备有限可指定CPU/其他device)model = AutoModelForCausalLM.from_pretrained("/Users/shawn/Documents/AI-dev/models/deepseek/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",torch_dtype=torch.bfloat16,# MPS、A100 等建议用bfloat16local_files_only=True,trust_remote_code=True)# 5. LoRA 配置lora_config = LoraConfig(r=8,lora_alpha=16,target_modules=["q_proj","v_proj","k_proj","o_proj"],lora_dropout=0.05,# 或0, 稳定死记记忆;推荐小数据降dropoutbias="none",task_type="CAUSAL_LM")model = get_peft_model(model, lora_config)model.print_trainable_parameters()# 6. 训练参数training_args = TrainingArguments(output_dir="./results_ms",per_device_train_batch_size=2,gradient_accumulation_steps=1,learning_rate=3e-4,num_train_epochs=8,logging_dir="./logs_ms",save_steps=100,save_total_limit=3,logging_steps=10,overwrite_output_dir=True,report_to=None,fp16=False)trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset,data_collator=default_data_collator,)# 7. 训练与自动采样输出trainer.train()# 8. 保存模型与tokenizermodel.save_pretrained("./deepseek-7b-lora_ms")tokenizer.save_pretrained("./deepseek-7b-lora_ms")print("训练完成。")

参数解析
LoRA配置参数(lora_config)
1. r=8
  • 含义:LoRA中低秩矩阵的秩(rank),⽤于近似原始权重矩阵。
  • 作⽤:控制新增参数量,显著降低训练显存消耗。
  • 影响:
  • r太⼩→⽋拟合,表达能⼒不足
  • r太⼤→接近全量微调,失去LoRA优势
  • 常⻅值:4~ 64,根据任务复杂度调整(如简单任务⽤r=8,复杂任务可⽤r=32)

2. lora_alpha=16
  • 含义:LoRA权重的缩放因⼦,控制低秩矩阵对输出的影响强度。
  • 作⽤:调节LoRA分⽀的贡献程度,类似“学习率系数”。
  • 影响:
  • 推荐保持alpha/r≥1(如r=8,alpha=16→ ⽐值为2)
  • 值过⼤ → 容易过拟合;值过⼩ → 影响微弱
  • 建议:初试设置alpha=2×r

3. target_modules=["q_proj","v_proj","k_proj","o_proj"]
  • 含义:指定在哪些模块上应⽤LoRA(通常是注意⼒层的投影层)。
  • 作⽤:精准控制适配范围,节省计算资源。
  • 常⻅选择:
  • LLaMA系列:["q_proj", "k_proj", "v_proj", "o_proj"]
  • BERT类:["query", "value", "key", "dense"]
  • 影响:
  • 仅作⽤于部分模块 → 可能限制模型适应能⼒
  • 可根据模型结构扩展(如加⼊up_proj,down_proj)

4. lora_dropout=0.05
  • 含义:LoRA层的Dropout概率,⽤于正则化。
  • 作⽤:防⽌过拟合,提升泛化能⼒。
  • 影响:
  • 值越⼤ → 正则化越强
  • ⼩数据集建议:0.1~0.2
  • ⼤数据集可设为0或0.05
  • 注意:若训练不稳定,可尝试增加dropout

5. bias="none"
  • 含义:是否在LoRA层中引⼊偏置项。
  • 选项:
  • "none":不加偏置(推荐起点)
  • "all":所有模块加偏置
  • "lora_only":仅LoRA层加偏置
  • 影响:
  • 加偏置可能略微提升效果,但增加参数量
  • 建议:从"none"开始,效果不佳再尝试"lora_only"

6. task_type="CAUSAL_LM"
  • 含义:指定任务类型,影响损失函数和标签处理⽅式。
  • 常⽤类型:
  • "CAUSAL_LM":⾃回归语⾔模型(如GPT、LLaMA⽣成任务)
  • "SEQ_CLS":序列分类(如情感分析)
  • "TOKEN_CLS":Token级分类(如命名实体识别)
  • "SEQ_2_SEQ_LM":Seq2Seq任务(如翻译、摘要)
  • 注意:必须与任务匹配,否则训练会出错

训练参数(training_args)
参数
说明
output_dir
"./results_ms"
保存模型检查点、日志等文件的目录
per_device_train_batch_size
2
每个设备上的 batchsize,显存不足时可减小
gradient_accumulation_steps
1
梯度累积步数,等效增大 batchsize(如设为 4→ 实际 batch = 8)
learning_rate
3e-4
学习率,LoRA推荐范围:
1e-4~1e-3
num_train_epochs
8
训练轮数,一般从3~10开始调整
logging_dir
"./logs_ms"
日志保存路径,可用于
TensorBoard可视化
save_steps
100
每隔多少step保存一次
checkpoint
save_total_limit
3
最多保留几个checkpoint,自动删除旧的
logging_steps
10
每隔多少step输出一次日志,便于监控
overwrite_output_dir
True
若目录存在则覆盖,避免手动清理
report_to
None
不连接远程报告工具(如
wandb、tensorboard)
fp16
False
是否启用FP16半精度训练
✅支持设备建议开启(节省显存+加速)
⚠️若开启需确保模型

场景

建议配置

小数据集微调

r=8,alpha=16,dropout=0.1,epochs=5~10

大数据集微调

r=16~32,alpha=32,dropout=0.05,lr=2e-4

显存受限

减小batch_size,启用fp16,使用gradient_accumulation

快速实验

overwrite_output_dir=True,logging_steps=10,save_steps=50


训练成本
使⽤1000条左右数据微调qwen3-14b的模型,⼀次训练成本预计10元左右。可以看到模型微调本⾝的成本并不算很⾼,即使换参数量更⼤的模型以及更多的数据。后续的部署、推理成本才是⼤头。


测试脚本
import torchfrom transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel# 路径设置BASE_PATH ="/Users/shawn/Documents/AI-dev/models/deepseek/deepseekai/DeepSeek-R1-Distill-Qwen-7B"LORA_PATH ="./deepseek-7b-lora_ms"# 加载分词器tokenizer = AutoTokenizer.from_pretrained(BASE_PATH,local_files_only=True,trust_remote_code=True)# === 严格分离模型实例 ===# 原始模型model_base = AutoModelForCausalLM.from_pretrained(BASE_PATH,device_map="mps",torch_dtype=torch.bfloat16,local_files_only=True,trust_remote_code=True)# 微调后的模型(Base + LoRA 适配器)model_base_for_lora = AutoModelForCausalLM.from_pretrained(BASE_PATH,device_map="mps",torch_dtype=torch.bfloat16,local_files_only=True,trust_remote_code=True)model_lora = PeftModel.from_pretrained(model_base_for_lora,LORA_PATH)def format_prompt_one_round(user_input: str) -> str:return f"<s>### Instruction:\n{user_input}\n### Response:\n"def generate_single(model, prompt, tokenizer, max_new_tokens=200):inputs = tokenizer(prompt, return_tensors="pt")for k, v in inputs.items():inputs[k] = v.to(model.device)with torch.no_grad():outputs = model.generate(**inputs,max_new_tokens=max_new_tokens,temperature=0.7,top_p=0.9,do_sample=True,eos_token_id=tokenizer.eos_token_id)full_output = tokenizer.decode(outputs[0], skip_special_tokens=True)reply = full_output[len(prompt):]# 截断下一个分隔符,保证只输出新生成内容for sep in ["<s>","</s>","###"]:if sep in reply:reply = reply.split(sep)[0]return reply.strip()def main():print("="*40)print("DeepSeek 模型微调前/后 单轮对话对比(严格模型物理分离版)")print("="*40)print("输入exit 退出。\n")while True:user_input = input("你说:").strip()if user_input.lower() in {"exit","quit"}:print("对话结束~ 再见!")breakprompt = format_prompt_one_round(user_input)# 原始模型推理base_reply = generate_single(model_base, prompt, tokenizer)# LoRA 微调后模型推理lora_reply = generate_single(model_lora, prompt, tokenizer)print("\n-------------------------------")print("【原模型 输出】↓\n"+ base_reply)print("\n【微调后输出】↓\n"+ lora_reply)print("-------------------------------")if __name__ =="__main__":main()

测试结果case:
可以看到原模型完全无法感知到业务相关的知识,而微调后的模型已经有效的学到了(注:由于数据量小,且模型本身参数量也小,做演示的微调结果存在一定的过拟合)

  • 百炼平台微调

数据准备
根据百炼的训练数据示例格式准备数据

百炼训练数据格式
{“messages":[{"role":"system","content":"Youareaprofessionale-commercetitleanalyst.Givenalongproducttitle,outputONLYthecoreproductentityname(1-5words)withoutanyothertext."},{"role":"user","content":"请从下列商品标题中提取最核心的商品主体,直接输出主体名,不要加其它词:【黑旗】心语肉松原味辣味1kg烘焙面包蛋糕寿司原料商用肉松小贝"},{"role":"assistant","content":"肉松"}]}{"messages":[{"role":"system","content":"Youareaprofessionale-commercetitleanalyst.Givenalongproducttitle,outputONLYthecoreproductentityname(1-5words)withoutanyothertext."},{"role":"user","content":"请从下列商品标题中提取最核心的商品主体,直接输出主体名,不要加其它词:夏季竹枕片成人藤凉席冰丝枕头套单人儿童竹枕席藤枕芯套一对拍2"},{"role":"assistant","content":"枕套"}]}

训练参数
参数跟原⽣实现的参数基本⼀致,可以参考上述的训练参数解析及百炼的⽂档。

评测
1. 创建评测数据集
创建⽅式同训练数据,使⽤百炼模版

2.选择评测⽅式,开始评测
有三种评测⽅式
  • ⼈⼯评测
特点:经过⼈⼯校验打分,在很多应⽤场景下是相对准确的;同时⽐较主观,在⼀些场景下可能不够标准化,且⼈⼒消耗较高。

  • 模型评测
特点:适合评测⽂本⽣成类,可以调整prompt来对⾃⼰微调后模型的回答要点进⾏打分,利⽤另⼀个⼤模型的能⼒,实现灵活打分,但是⽐较依赖模型的能⼒以及prompt,同时分数有时也不够标准化。

  • 基线评测
通过预置的算法来对模型的特定⽅向能⼒进⾏标准化评测。

⼿动测试结果
左侧为微调后的模型,右侧为原始模型,其对商品主体识别的能⼒得到提升。

总结

LoRA(Low-RankAdaptation)微调技术为业务开发场景提供了⾼效、低成本的⼤模型定制化路径,展现出显著优势:
  • 训练成本低,效果出色
  • 显存占用少:仅需微调少量新增参数,可在消费级GPU上完成训练,降低硬件门槛。
  • 训练速度快:参数更新量小,支持快速迭代,适合业务团队敏捷试错。
  • 性能接近全量微调:在多种任务中表现优异,效果逼近全参数微调,性价比极高
  • 部署灵活,易于管理
  • 适配器轻量化:LoRA权重文件通常仅几十MB,便于存储、传输与版本管理。
  • 多任务共享主干:支持“一个基础模型+多个LoRA适配器”的模式,实现不同业务线共用底座模型,提升资源利用率。
  • 稳定可靠,风险可控
  • 缓解过拟合:在小样本场景下表现更稳定,有效避免全参数微调带来的灾难性遗忘或过拟合问题。
  • 保护原始模型:不修改主干参数,仅通过低秩增量进行适配,提升模型鲁棒与可维护性。

核心价值:让大模型真正“懂业务”
LoRA微调的轻量与高效,使得业务开发者能够基于自身积累的高质量业务数据(如客服对话、商品描述、内部流程文本等),对大模型进行快速定制化训练。这不仅大幅降低了AI落地的技术门槛,更让模型输出更可控、更精准、更贴近实际业务需求。未来,我们将持续探索LoRA在真实业务场景中的应用,例如智能推荐、自动化文案生成、研发提效等方向,以数据驱动+模型微调的方式,助力业务增长与技术升级。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ