news 2026/6/23 11:57:27

微调生成特定写作风格助手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微调生成特定写作风格助手

参考

如何把你的 DeePseek-R1 微调为某个领域的专家?今天我们一起来聊聊大模型的进阶使用:“模型微调” ,也就是较大 - 掘金

看完就想试!Unsloth打造个性化AI助手案例展示-CSDN博客

unsloth 布署见

unsloth 部署(简单易上手版本)-CSDN博客

把基础模型下载到本地,确定数据集的格式

训练过程

import os from unsloth import FastLanguageModel, is_bfloat16_supported from datasets import load_dataset import subprocess from trl import SFTTrainer,SFTConfig # 设置代理(可选),详见autodl参考文档 # 1. 加载模型和 tokenizer model, tokenizer = FastLanguageModel.from_pretrained( model_name="/root/Qwen/Qwen2-1.5B-Instruct", max_seq_length=2048, dtype=None, load_in_4bit=True, ) # 2. 添加 LoRA(Unsloth 自动优化) model = FastLanguageModel.get_peft_model( model, r=32, # LoRA rank target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj", "lm_head"], lora_alpha=64, lora_dropout=0.05, bias="none", use_gradient_checkpointing="unsloth", # 更高效 random_state=3407, ) # 3. 加载数据集(假设是 Alpaca 格式) dataset = load_dataset("json", data_files="/root/ft_data.json", split="train") # load_dataset批量处理数据集 # 4. 定义 formatting_func(关键!)把结构化的 instruction/input/output 字段,批量转换成模型能识别的对话格式文本 #更标准的写法,和test的写法一致 def formatting_func(examples): outputs = [] for i in range(len(examples["instruction"])): instruction = examples["instruction"][i].strip() input_text = examples["input"][i].strip() if "input" in examples and examples["input"][i] else "" output = examples["output"][i].strip() # 构造标准化 messages(和推理时一致) messages = [ {"role": "user", "content": f"{instruction}\n{input_text}" if input_text else instruction}, {"role": "assistant", "content": output} ] # 用 apply_chat_template 生成格式(和推理时完全相同) text = tokenizer.apply_chat_template( messages, tokenize=False, # 只生成文本,不编码 add_generation_prompt=False # 训练时不需要加 assistant 生成提示符 ) outputs.append(text) return outputs
# 5. 使用 Unsloth 的 train 方法(自动处理 packing、formatting 等) training_config = SFTConfig( per_device_train_batch_size=4, gradient_accumulation_steps=2, warmup_steps=10, max_steps=100, learning_rate=1e-4, logging_steps=2, save_steps=50, output_dir="/root/my_qwen_assistant", optim="adamw_8bit", seed=3407, fp16=False, bf16=True, packing=False, # 关闭打包,与 Unsloth 无填充批处理兼容 remove_unused_columns=False, # 保留数据集字段,避免格式化函数报错 ) trainer = SFTTrainer( model=model, tokenizer=tokenizer, train_dataset=dataset, formatting_func=formatting_func, # ←← Unsloth 的 SFTTrainer 要求这个 max_seq_length=2048, dataset_num_proc=2, packing=False, args=training_config, ) # 6. 训练并保存 trainer_stats = trainer.train() model.save_pretrained("my_qwen_assistant") tokenizer.save_pretrained("my_qwen_assistant")

推理过程

from peft import PeftModel from unsloth import FastLanguageModel, is_bfloat16_supported # 1. 加载基础模型(保持和训练一致的dtype/device_map) base_model, tokenizer = FastLanguageModel.from_pretrained( model_name="/root/Qwen/Qwen2-1.5B-Instruct", max_seq_length=2048, dtype=None, load_in_4bit=True, ) # 2. 加载LoRA适配器(校验路径) lora_model_path = "/root/my_qwen_assistant" # 校验LoRA权重是否存在 import os if not os.path.exists(lora_model_path): raise ValueError(f"LoRA权重路径不存在:{lora_model_path}") print(f"成功加载LoRA权重:{lora_model_path}") model = PeftModel.from_pretrained(base_model, lora_model_path) model.eval() # 评估模式 # 3. 推理(仅用LoRA模型,删除基础模型推理代码) messages = [ {"role": "user", "content": "项目名称:xxxx;一,xxx,二,xxx。三,xxx。。。"} ] # 用和训练时一致的chat template生成输入 input_ids = tokenizer.apply_chat_template( messages, tokenize=True, add_generation_prompt=True, return_tensors="pt" ).to(model.device) # 生成参数(简化,聚焦核心) outputs = model.generate( input_ids=input_ids["input_ids"], attention_mask = input_ids["attention_mask"], max_new_tokens=800, do_sample=True, # 开启采样,提升回复多样性 temperature=0.7, top_p=0.95, repetition_penalty=1.1, pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id, ) # 解码输出 response = tokenizer.decode(outputs[0][input_ids["input_ids"].shape[1]:], skip_special_tokens=True) print("LoRA模型推理结果:") print(response.strip()) #(可选)验证基础模型结果(对比用) base_model.eval() outputs_base = base_model.generate( input_ids=input_ids["input_ids"], attention_mask = input_ids["attention_mask"], max_new_tokens=800, do_sample=True, temperature=0.7, top_p=0.95, repetition_penalty=1.1, pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id, ) response_base = tokenizer.decode(outputs_base[0][input_ids["input_ids"].shape[1]:], skip_special_tokens=True) print("\n基础模型推理结果:") print(response_base.strip())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 7:31:34

Java新手必看:快速配置环境与首个程序

Java环境配置与第一个程序 1. 下载JDK 访问Oracle官网或OpenJDK(推荐OpenJDK)。选择与操作系统匹配的版本(如Windows x64 Installer)。 2. 安装JDK 双击安装包,按提示完成安装(记录安装路径&#xff0c…

作者头像 李华
网站建设 2026/6/20 8:54:16

SpringBoot4.0+JDK25+GraalVM:云原生新纪元

好的,这是一个结合了 Spring Boot 4.0(假设版本)、未来的 JDK 25 以及 GraalVM 的前沿技术组合,代表了 Java 云原生应用的演进方向。让我们逐步分析其关键特性和架构优势: 1. Spring Boot 4.0:应用框架的进…

作者头像 李华
网站建设 2026/6/21 10:15:20

用Python实现第一个量子机器学习模型完整教程:Qiskit与TensorFlow集成

——手把手代码教学与常见问题解决方案 作者:DREAMVFIA UNION 发布日期:2026年2月1日 版权:© 2026 DREAMVFIA UNION -------------------------------------------------- 目录 1. 第一章:引言——为什么学习量子机器学习 2. 第二章:量子计算基础回顾 3. 第三章…

作者头像 李华
网站建设 2026/6/18 0:12:10

U654615 比特聚集(bit)补题报告

先看题目:题目分析我们有一个长度为 的二进制字符串 ,包含字符 0 和 1,至少有一个 1。 可以交换相邻字符,每次交换算一次操作。 目标:让所有 1 连续排列(形成一段连续的 1)。 求最少操作次数思…

作者头像 李华
网站建设 2026/6/18 8:44:25

AI大模型基于LangChain 进行RAG与Agent智能体开发

大模型,英文名叫Large Model,大型模型。早期的时候,也叫Foundation Model,基础模型。 大模型是一个简称,完整的叫法,应该是“人工智能预训练大模型”。预训练,是一项技术,我们后面再…

作者头像 李华
网站建设 2026/6/21 1:50:46

开题报告-基于BS的在线电影视频播放系统的设计与实现

目录 研究背景与意义系统核心功能技术选型创新点设计预期成果应用价值 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 研究背景与意义 在线电影视频播放系统基于B/S架构(Browser/Server&…

作者头像 李华