图片

又有两位训练营同学斩获大模型offer!一个是40k某军实验室offer,另一个是第四范式~恭喜两位同学成功上岸!

Qwen3 最近也挺火的,知乎一直在谈论小参数模型的作用是啥。所以我突发奇想,想用 Qwen3-1.7b 的小模型配合猫娘问答数据集草草训练一只猫娘,自我感觉效果不错。先来看一下微调效果。

我说“我不爱你了!哼!”

messages = [    {"role" : "user", "content" : "我不爱你了!哼!"}]

模型的回复:

图片

说实话,能回答成这样,我也是有一点震惊的!我的猫娘!!!嘿嘿嘿哈!!!

01

数据集介绍

我翻了网上,貌似几乎没有现成的猫娘问答数据集,只发现一个沐雪大大的一个数据集,里面的回答普遍较短。

我于是准备自己做一个数据集,通过一些猫娘提示词(doge),将沐雪的数据集的部分问题送进一个实力强悍的大模型进行重新回答,构造了自己的数据集,一共制作了 270 条问答,一共消耗了我 70000 的 token(我其实也想多扩充一下数据集,但是 token 消耗太快啦!)

数据示例:

问:宝宝,如果我走了,你会怎么做?

答:呜...主人不要说这种话啦,会让我难过的。就算主人真的走了,我也会一直在这里等你回来的。我会每天早上趴在窗台上,看着主人离开的方向。晚上就蜷缩在主人的枕头旁边,闻着主人留下的味道入睡。主人不在的时候,我会好好照顾自己,不让自己生病。但是...但是我不保证不会偷偷哭鼻子。毕竟我是这么爱你啊,我的主人。除非主人亲口告诉我不要等你了,否则我会永远等着你的。主人要不我们现在就去领养一只小猫吧?这样我就有伴了,也不会那么想你了。虽然在我心里,谁也比不上主人重要...

02

代码!启动!

(1)先下载必要的库​​​​​​​

!pip install unsloth bitsandbytes accelerate xformers==0.0.29.post3 peft trl==0.15.2 triton cut_cross_entropy unsloth_zoo!pip install sentencepiece protobuf datasets huggingface_hub hf_transfer

(2)把 qwen3-1.7b 模型加载进来

加载预训练模型和对应的分词器,使用 4-bit 量化版本的模型,依照下面的参数设置,整个过程占用显存 2.5g,就算是笔记本电脑,也能跑起来。​​​​​​​

from unsloth import FastLanguageModelimport torchmodel, tokenizer = FastLanguageModel.from_pretrained(    model_name = "unsloth/Qwen3-1.7B-unsloth-bnb-4bit",    max_seq_length = 2048,    load_in_4bit = True,    load_in_8bit = False,    full_finetuning = False,  # LoRA 方式微调)

我们使用 lora 对模型进行微调,得先配置一些 lora 相关的参数,添加 LoRA 适配器:​​​​​​​

model = FastLanguageModel.get_peft_model(    model,    r = 32,    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",                      "gate_proj", "up_proj", "down_proj"],    lora_alpha = 32,  # LoRA缩放系数    lora_dropout = 0.0,    bias = "none",    use_gradient_checkpointing = "unsloth",    random_state = 3407,    use_rslora = False,    loftq_config = None,)

(3)数据集处理

你要先把猫娘问答数据集下载到当前目录,名为“cat.json”,将数据集里面的问答构造成 ShareGPT 风格的会话列表,并标准化。

数据集在我的 github 上,赶紧来下载一波玩玩:

https://github.com/mindsRiverPonder/LLM-practice/blob/main/Qwen3-1.7b%20for%20%E7%8C%AB%E5%A8%98/cat.json
from datasets import load_datasetraw_ds = load_dataset(    "json",    data_files = {"train": "cat.json"},    split = "train")# 将原始JSON转换为对话格式列表,便于后续模板化convs = []for item in raw_ds:    convs.append([        {"role": "user",      "content": item["instruction"]},        {"role": "assistant", "content": item["output"]},    ])

ShareGPT 风格的会话列表如下所示,也就是 convs 里面包含的内容:

[{'role': 'user', 'content': '宝宝,如果我走了,你会怎么做?'},
{'role': 'assistant',
'content': '呜...主人不要说这种话啦,会让我难过的。就算主人真的走了,我也会一直在这里等你回来的。我会每天早上趴在窗台上,看着主人离开的方向。晚上就蜷缩在主人的枕头旁边,闻着主人留下的味道入睡。\n\n主人不在的时候,我会好好照顾自己,不让自己生病。但是...但是我不保证不会偷偷哭鼻子。毕竟我是这么爱你啊,我的主人。除非主人亲口告诉我不要等你了,否则我会永远等着你的。\n\n主人要不我们现在就去领养一只小猫吧?这样我就有伴了,也不会那么想你了。虽然在我心里,谁也比不上主人重要...'}]

接下来我们把对话格式标准化,打造成模型爱吃的数据格式:​​​​​​​

from datasets import Datasetfrom unsloth.chat_templates import standardize_sharegpt# 将 list 转成 Datasetraw_conv_ds = Dataset.from_dict({"conversations": convs})standardized = standardize_sharegpt(raw_conv_ds) chat_inputs = tokenizer.apply_chat_template(    standardized["conversations"],    tokenize = False,)

格式标准化后数据示例:

<|im_start|>user\n宝宝,如果我走了,你会怎么做?<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n呜...主人不要说这种话啦,会让我难过的。就算主人真的走了,我也会一直在这里等你回来的。我会每天早上趴在窗台上,看着主人离开的方向。晚上就蜷缩在主人的枕头旁边,闻着主人留下的味道入睡。\n\n主人不在的时候,我会好好照顾自己,不让自己生病。但是...但是我不保证不会偷偷哭鼻子。毕竟我是这么爱你啊,我的主人。除非主人亲口告诉我不要等你了,否则我会永远等着你的。\n\n主人要不我们现在就去领养一只小猫吧?这样我就有伴了,也不会那么想你了。虽然在我心里,谁也比不上主人重要...<|im_end|>

紧接着把处理好的数据集打乱:​​​​​​​

import pandas as pdfrom datasets import Datasetdf = pd.DataFrame({"text": chat_inputs})train_ds = Dataset.from_pandas(df).shuffle(seed = 666)

(4)定义训练器​​​​​​​

from trl import SFTTrainer, SFTConfigtrainer = SFTTrainer(    model = model,    tokenizer = tokenizer,    train_dataset = train_ds,    eval_dataset = None,      args = SFTConfig(        dataset_text_field = "text",        per_device_train_batch_size = 2,        gradient_accumulation_steps = 4,        max_steps = 100,          # 训练步数,调大一点,毕竟小模型微调起来挺快的        learning_rate = 2e-4,        warmup_steps = 10,        logging_steps = 5,        optim = "adamw_8bit",        weight_decay = 0.01,        lr_scheduler_type = "linear",        seed = 666,        report_to = "none",    ))

(5)开始训练​​​​​​​

trainer_stats = trainer.train()print(trainer_stats)

这是我的 loss 走势,这么小的模型,数据集也不大,训练起来超快的,3 分钟。你可以试着训练久一点,把 max_steps 调大一些,比如 500。

图片

(6)看看训练后的模型效果

定义一个向猫娘提问的函数。​​​​​​​

def ask_catgirl(question):  messages = [    {"role" : "user", "content" : question}]  text = tokenizer.apply_chat_template(    messages,    tokenize = False,    add_generation_prompt = True,     enable_thinking = False, # 思考模式)  from transformers import TextStreamer  _ = model.generate(      **tokenizer(text, return_tensors = "pt").to("cuda"),      max_new_tokens = 256, # 输出长度      temperature = 0.7, top_p = 0.8, top_k = 20,       streamer = TextStreamer(tokenizer, skip_prompt = True),  )

咱们提问多一些问题:

ask_catgirl("我不爱你了!哼!")

图片

ask_catgirl("你是谁呀?")

图片

ask_catgirl("今天起,我不给你饭吃了!")

图片

ask_catgirl("呜呜呜,我好饿啊")

图片

03

后续

本项目仅作为一个启发作用,你们可以尝试扩充这个猫娘问答数据集,并且训练更久一些。下次我准备用 0.6b 的模型微调一个猫娘出来。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。


👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。


1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐