微信扫码
添加专属顾问
淘宝工程师实战分享:如何用LoRA技术低成本定制大模型,让AI真正懂你的业务。 核心内容: 1. LoRA微调技术的原理与优势解析 2. 本地实现与百炼平台两种实战方案对比 3. 小样本场景下的业务适配效果验证
本文主要介绍了大模型时代下,如何通过 LoRA(Low-Rank Adaptation)这一参数高效微调技术,实现对大模型的轻量级定制。文章从微调的基本概念出发,详细阐述了 LoRA 的原理、优势与局限性,并结合本地原生实现(Transformers + PEFT)和百炼平台两种方式,展示了在小样本、低资源场景下的实战流程。结果表明,LoRA 能以极低的计算成本让通用大模型有效学习业务知识,显著提升其在特定任务中的表现,真正实现“让大模型懂业务”,推动 AI 从“可用”走向“好用”。
如今大模型时代,深刻重塑了很多行业的业务形态与技术架构。从智能客服到内容生成,从代码辅助到推荐系统,大模型正以前所未有的速度渗透到互联网技术的各个领域,成为驱动创新的核心引擎。其强大的泛化能力和上下文理解水平,使得许多过去需要复杂工程与规则设计的任务,如今只需一次“提示”即可完成。
然而,尽管大模型展现出惊人的通用能力,对大多数开发者和业务方而言,它仍是一个“黑盒”——我们只能调用其预训练时所掌握的知识与行为模式,难以干预其内部逻辑,也无法直接引导模型适应特定场景的表达习惯、术语体系或业务规则。在生产环境中,这种 “能力固定”的特性带来了明显的局限:模型输出可能偏离业务预期,难以保证一致性,更无法随业务演进而持续进化。
模式 | 说明 | 特点 |
1. 推理时动态叠加(On-thefly) | 加载原始模型 + LoRA 权重,实时计算 W+ΔWW+ΔW | 可用,但慢 |
2. 合并后推理(MergedInference) | 将 LoRA 权重 合并到原始模型中,生成一个新模型,直接推理 | 推理更快、更稳定 |
pip install --upgrade torch==2.1.0+cpu torchvision==0.16.0+cpu --index-url https://download.pytorch.org/whl/cpupip install -U transformers==4.38.2 peft==0.10.0 datasets==2.18.0 \ accelerate sentencepiece safetensors tqdm
2. 模型准备这里考虑到微调是在 mac本地运行,算力有限,所以使用了较小的 DeepSeek-R1-Distill-Qwen-1.5B作为基座模型。使用 Hugging Face或 Modelscope等下载模型到本地即可。{"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") else turn["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_id else -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("训练完成。")
场景 | 建议配置 |
小数据集微调 | 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 |
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()
{“messages": [{"role": "system", "content": "You are a professional e-commercetitle analyst. Given a long product title, output ONLY the core product entityname (1-5 words) without any other text."}, {"role": "user", "content": "请从下列商品标题中提取最核心的商品主体,直接输出主体名,不要加其它词:【黑旗】心语肉松原味辣味1kg 烘焙面包蛋糕寿司原料商用肉松小贝"}, {"role": "assistant", "content": "肉松"}]}{"messages": [{"role": "system", "content": "You are a professional e-commercetitle analyst. Given a long product title, output ONLY the core product entityname (1-5 words) without any other text."}, {"role": "user", "content": "请从下列商品标题中提取最核心的商品主体,直接输出主体名,不要加其它词:夏季竹枕片成人藤凉席冰丝枕头套单人儿童竹枕席藤枕芯套一对拍2"}, {"role": "assistant", "content": "枕套"}]}53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-10-09
淘宝直播数字人互动Harness-Aware Training实践:让Agent Model随Harness一起进化
2026-10-07
约 100 元,用阿里云百炼训练一个类 Jev 决策模型
2026-09-28
EuroSys 2027|快手联合北航提出 TB 级推荐模型 Checkpoint 系统 AdaptCP
2026-09-11
藏语ASR | 藏语语音识别 | Qwen3-ASR识别藏语
2026-07-17
抖音质量效能部不传之秘:用AI精准预估“可能出事”的模块
2026-07-17
Google Colab 谷歌送了你一台「AI 电脑」 你还不知道?
2026-07-16
中国 AI 真正输给美国的,从来不是算力
2026-07-13
淘宝直播数字人 AgenticRL 实践:从 RLVR 到 MultiAgent RL
2026-07-17
2026-01-02
2025-11-19
2025-09-25
2025-06-20
2025-06-17
2025-05-21
2025-05-17
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。