文章总结: 本文详细介绍了如何微调自己的渗透模型,包括基础知识、大模型原理、微调方法、具体步骤等,以通俗易懂的方式指导读者进行微调实践。
综合评分: 85
文章分类: 渗透测试,AI安全,二进制安全,CTF,WEB安全,红队,内网渗透
如何微调属于自己的渗透模型?一文帮你吃透大模型微调!快速打造自己的本地渗透大模型!
原创
小猫信安
小猫信安
小猫信安
2026年9月25日 16:03
湖北
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
大模型微调其实不是很难,千万不要被网上铺天盖地的专业术语吓到了,难度远远小于我们的真实0day漏洞挖掘。
因此本文不绕任何弯子,带你以通俗易懂的方式,手把手教你微调一个自己的渗透大模型,争取做到全网最易懂!
基础知识
认识两个开源llm网站
hugging face
https://huggingface.co/
全球最大的模型开源网站,上面模型源码、权重,训练数据集都可以在上面找到,需要科学上网访问,简单来说就是ai版的GitHub。
modelscope
https://www.modelscope.cn/
国内的模型开源网站,上面模型源码、权重都可以在上面找到,就是ai版的gitee。
上面两个网站所有的开源模型基本都包括,比如各大官方模型kimi3 qwen等等都可以在上面找到原始的完整版模型,具体使用方法就不多说了,完全就像当年逛github一样,这里大家相信比我熟。
大模型原理和神经网络
由于这里我不是专业,故只作简单介绍,通俗解释
我们都知道线性拟合
就是用一条直线无限逼近所有点,方便后续预测。
y=wx+b
但是真实情况是我们的每一个文字机器是转换为多维的向量才能被机器识别,
因此这里单单用一条直线肯定不行,就要用到矩阵运算,Y=WX+b
因此每个神经元可以通俗理解为一个函数:矩阵X进来,结果Y出去
每个神经元都是一个函数,数据到达一个神经元,经过这个神经元的运算,再传到下一层,这样层层传递,形成一个庞大的神经元网络,输入层-隐藏层-输出层,最后根据所有函数共同作用得出最后的结果矩阵,然后再把这个矩阵转换成文字,得到最终的预测值。(大体就是这样,编不下去了。)【更多详细可以看b站闪客系列的ai入门】
作为使用者我们只需要知道不同的神经元相互嵌套,数亿个神经元暴力堆叠出一个巨大的“黑箱”,我们每输入一句话这个“黑箱”便会预测概率最高的字作为这句话的下一个字输出。
至于哪些内部机制就要哪些鬼才天才去研究了。。。
为什么要微调?
因为某个官方的模型发布是通用性的,简单来说就是各个领域都会一点知识,但是都不精,雨露均沾,我们若想把模型应用在某一领域加强功能,就要微调。
比如我们要做渗透模型,通用模型直接拿来用肯定不行,会有幻觉,道德限制等等,进行微调可以改善这些问题啦~
什么是微调
所谓“微”就是指调一小奈奈参数,%0.1,%0.01的参数量,因为调所有的参数我们的家用电脑肯定是装不下,显卡也是受不了的,所以只能调一小奈奈参数。
调一小奈奈参数真的会有效果吗?答案是会有效果,而且效果非常大!
调的是什么?
调的是模型的权重,也就是矩阵
如何微调?
用数据集去影响模型。为什么?因为我们不可能手工一个个修改模型参数,参数是矩阵,本质上是无穷个数,数量庞大并且是人类几乎不可能精准理解。
因此,我们无法拆开进行模型一个参数一个参数的设置,只能往模型投喂数据集,对模型的结果进行评判,来影响这个“黑箱”。
数据集是关键,一个模型的效果非常大的一部分受到数据集的影响,因此,我们在如果想要微调一个好的模型,必须选好数据集。
微调类型
全量微调:故名思意,调节所有参数,能做的只有模型的官方大厂加数十万gpu,这我们肯定是做不到的。
冻结微调:调节输出那一层参数,不过参数量依旧巨大,pass
lora微调:通俗来说相当于多加了一层,也就是说在原来大模型再套一层壳,参数量很小,对于我们个人开发者来说就是美滋滋
lora微调原理
假设原来的参数矩阵是5000*3000
不动原来的参数矩阵内部,我们可以把他和另一个5000*3000参数矩阵△W相加,得到微调后的参数矩阵W’,这样我们不需要动原来的参数,就能实现调节。
我们要调的就是这个△W
学过矩阵运算的都清楚,我们可以△W把分解为:5000*n的矩阵A、3000*n的矩阵B,A*B=△W
这个n叫lora_rank (低秩矩阵的秩),我们可以根据自己显卡的性能调节这个lora_rank,调节运算数据量大小。
因此,我们本地只需要训练矩阵A和B,这是很少的一部分参数,然后A*B=△W,最后原始矩阵+△W=W’得到微调的权重,W’就是我们想要的。
这样就能实现调节大模型整体能力的效果。
具体步骤
这里用LLaMA-Factory这个框架进行演示,微调框架有很多,大家可以在网上自行选择
环境准备 → 安装 LLaMA-Factory → 下载模型 → 准备数据集 → 编写训练配置 → 启动训练 → 监控 → 合并 LoRA 权重 → 测试推理
环境准备
先创建一个叫llmaafactory-env的虚拟环境,我们的所有训练都是在这个虚拟环境里进行,防止与其他库进行冲突
python -m venv llamafactory-env
激活环境(每次开新终端都要先激活):
.\llamafactory-env\Scripts\Activate.ps1
安装pytorch
主播这里是RTX 50 系列(Blackwell 架构,sm_120)必须使用 CUDA 12.8+ 版本的 PyTorch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
检查安装是否成功
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0), torch.cuda.get_device_capability(0))"
输出你的显卡名称即安装成功。
安装LLaMA-Factory (需要 Python ≥ 3.9)
pip install "llamafactory[torch,metrics]==0.9.3"
验证安装:
llamafactory-cli version
输出你的版本号即安装成功。
这个框架会自动带上配套依赖:transformers 4.51.3、peft 0.15.2、trl 0.9.6、datasets 3.6.0、accelerate、bitsandbytes 等,我们只需要一键安装即可。
可选:安装 WebUI 支持组件,使用llamafactory-cli webui可视化训练。pip install gradio
下载模型
这里环境部署完了,接下来就是下载模型,主编这里下载ModelScope上的一个Qwen2.5-1.5B-Instruct做示例
pip install modelscopemodelscope download --model [模型名称] --local_dir [下载到哪个地址]
同时也可以用HuggingFace 方式(备用):
pip install -U huggingface_hubhf download Qwen/Qwen2.5-1.5B-Instruct --local-dir D:/HW/ai/models/Qwen2.5-1.5B-Instruct
HF 下载慢可设置镜像:
$env:HF_ENDPOINT='https://hf-mirror.com'
下载完成后目录里应有这些文件:
各个文件作用:
模型本体
model.safetensors:存储全部模型参数(权重与偏置)。
模型结构配置
config.json:模型核心配置,决定网络结构(隐藏维度 1536、层数 28、 注意力头数、词表大小 151936、上下文长度等)。
generation_config.json:推理阶段的默认生成参数,如 do_sample、temperature、top_p、repetition_penalty 等。
分词器(Tokenizer)(三个)
tokenizer.json:快速分词器的完整定义(基于 Rust tokenizers 库), 推荐优先使用。
tokenizer_config.json:分词器行为配置,包含特殊 token(<|im_start|>、 <|im_end|> 等)与 chat template。
vocab.json + merges.txt:慢速分词器使用的词表与 BPE 合并规则(旧格式), 与 tokenizer.json 并存以兼容不同加载方式。
准备数据集
模型下载完之后我们要考虑用哪些数据进行训练
llamafactory 支持多轮对话格式(ShareGPT),每行一个 JSON:
{"conversations": [ {"from": "system", "value": "你是代码审计专家..."}, {"from": "human", "value": "分析这段代码的漏洞..."}, {"from": "gpt", "value": "该漏洞为 CWE-89 SQL注入..."}]}
主播这里在modescope上找了一个代审数据集(注:数据集尽量找下载量多的,否则微调无意义)
合并多个子数据集
python -c "import glob, jsonfiles = sorted(glob.glob(r'D:\code-audit-datasets\subsets\*-sft\train.jsonl'))out = r'D:\mydata\code_audit_full_sft.jsonl' #储存在哪里total = 0with open(out, 'w', encoding='utf-8') as fo: for f in files: for line in open(f, encoding='utf-8'): line = line.strip() if not line: continue fo.write(json.dumps(json.loads(line), ensure_ascii=False) + '\n') total += 1print('TOTAL:', total)"
注册数据集
LLaMA-Factory识别数据集需要先进行注册
我这里把合并后的数据集放到了D:\mydata\code_audit_full_sft.jsonl
还需要在同级目录下创建一个dataset_info.json,这样LLaMA-Factory才能进行查找
新建D:\mydata\dataset_info.json,添加数据集条目:
code_audit_full_sft
{ "code_audit_full_sft": { "file_name": ".jsonl", "formatting": "sharegpt", "columns": { "messages": "conversations" } }}
说明:
file_name`:数据集文件路径(也支持 parquet) formatting: sharegpt:多轮对话格式; alpaca 格式(instruction/input/output) columns:把默认字段名映射到你数据里的实际字段名
编写训练配置文件
新建 D:\train_full.yaml
这里解释一下各个参数:
Model
—— 模型加载
model_name_or_path: D:/models/Qwen2.5-1.5B-Instruct 基座模型的路径。可以填本地目录,也可以填 HuggingFace 模型名(如 Qwen/Qwen2.5-1.5B-Instruct,会自动下载)。
quantization_bit: 4 以 4-bit 量化方式加载模型
Method
—— 微调方法
stage: sft 训练阶段。可选值:
- pt:预训练(续训语料,无问答格式)
- sft:监督微调(指令问答,你用的就是这个)
- rm / ppo / dpo:奖励模型 / 强化学习 / 偏好对齐
do_train: true 执行训练。对应的还有 do_eval: true(只做评估)、do_predict(只做推理)。
finetuning_type: lora 微调类型:
- full:全参数微调(效果最强,显存需求最大)
- lora:只训练低秩适配器(你在用)
- freeze:冻结大部分层,只调顶层
lora_target: all LoRA 适配器挂到哪些模块上。all = 所有线性层(q/k/v/o 投影 + MLP 的 gate/up/down)。也可以写 q_proj,v_proj 只挂注意力层(更省显存但效果弱)。
lora_rank: 8 这就是我们我们上文说过的。矩阵分解的维度,决定可训练参数量。常用 8/16/32/64。
lora_alpha: 16 LoRA 缩放系数 α。实际生效强度 = α / r = 16/8 = 2.0。经验法则:alpha = 2 × rank
lora_dropout: 0.1 训练时随机丢弃 10% 的 LoRA 神经元,防过拟合。
Dataset
—— 数据
dataset: 用哪个数据集。这个名字必须在 dataset_info.json 里注册过
dataset_dir: D:/mydata 数据集文件所在目录,dataset_info.json 也要放这里。
template: qwen 对话模板。把 instruction/input/output 拼成 Qwen 的 chat 格式: <|im_start|>user 问题<|im_end|> <|im_start|>assistant 答案<|im_end|> 必须和基座模型匹配,Qwen 模型填 qwen,填错模型会”听不懂”。
cutoff_len: 2048 单条样本 token 化后的最大长度,超长的直接截断。
preprocessing_num_workers: 4 数据预处理(tokenize)的并行进程数。Windows 上开 4 可以,报错就改 0。
Train
—— 训练超参数
per_device_train_batch_size: 1 每张卡每步喂 1 条样本。
gradient_accumulation_steps: 8 梯度累积 8 步才更新一次参数。等效 batch size = 1 × 8 = 8。小显存显卡靠这个模拟大 batch。
learning_rate: 5.0e-5 学习率 0.00005。LoRA 常用范围 1e-4 ~ 2e-4,全参数微调常用 1e-5 ~ 5e-5。
num_train_epochs: 3 全部数据训练 3 遍。你 5 条数据 × 3 轮 ÷ batch 8 = 只有 1~2 个优化步,这就是 sec-lora-v1 几乎没学到东西的直接原因。
lr_scheduler_type: cosine 学习率衰减策略:cosine = 余弦曲线,先保持高位再平滑降到 0。其他选项:linear(线性)、constant(不变)。
warmup_ratio: 0.03 前 3% 的步数线性热身(学习率从 0 升到设定值),防止开局梯度过大冲坏权重。
bf16: true 用 bfloat16 混合精度训练。RTX 30/40 系都支持。老显卡(如 1080Ti)要改成 fp16: true。
logging_steps: 5 每 5 步打一条日志(loss、lr),写入 trainer_log.jsonl。
save_steps: 100 每 100 步保存一个 checkpoint(checkpoint-100、200…)。
output_dir: 输出目录。LoRA 只存 adapter(adapter_model.safetensors,约 37MB),不存完整模型。
plot_loss: true 训练结束自动生成 loss 曲线图 training_loss.png。
report_to: none 不上报训练指标到第三方平台。可改 tensorboard 或 wandb 做可视化监控。
Eval
—— 验证集
val_size: 0.1 从训练集随机切 10% 当验证集。
per_device_eval_batch_size: 1 验证时 batch 大小。
eval_strategy: steps eval_steps: 100 每 100 步在验证集上算一次 eval_loss。总步数不够 100 时只在结束时评估一次。
启动训练
$env:HF_HUB_OFFLINE=’1′ # 纯本地训练,离线模式避免联网卡顿
llamafactory-cli train D:\train_full.yaml
主播这里是全量训练保留精度,没有量化,打算用的时间长一点,用了36个小时,
如果想节约时间,在配置文件加上quantization_bit字段或者删减部分训练集
最后测试也是用了7分钟
训练完之后会在saves文件夹得到这个Lora适配器70MB,也就是我们最终想要的”壳”
saves/code-audit-lora-full-v1/
├── checkpoint-500/ # 中间检查点(可恢复训练用)
├── checkpoint-1000/
├── …
├── adapter_model.safetensors # ★ 最终 LoRA 权重(约 70MB)
├── adapter_config.json # LoRA 配置
├── tokenizer.json 等 # tokenizer(推理时要一起用)
├── trainer_log.jsonl # 训练日志
├── training_loss.png # loss 曲线图
└── train_results.json # 最终训练指标
测试和合并
接下来就是验证效果和模型对话了,
这里有两种方法
一种运行时加载原模型Qwen2.5-1.5B-Instruct和Lora适配器对话,也就是不合并,只在用时把两个一起加载
$env:HF_HUB_OFFLINE=’1’& “D:\llamafactory-env\Scripts\llamafactory-cli.exe” chat --model\_name\_or\_path D:models/Qwen2.5-1.5B-Instruct–adapter_name_or_path D:/saves/code-audit-lora-full-v1 `–template qwen
效果
第二种就是将Lora适配器和Qwen2.5-1.5B-Instruct打包为一个完整模型,方便我们导入ollama、上传HuggingFace等等
编写打包配置文件 export_full.yaml
打包命令
llamafactory-cli export D:\export_full.yaml
打包完成后 export\_dir 就是一个可以直接部署的完整模型(约 3GB,bf16)。
合并后,和模型进行对话
$env:HF_HUB_OFFLINE=’1′ & “D:\llamafactory-env\Scripts\llamafactory-cli.exe” chat --model\_name\_or\_path D:/models/code-audit-qwen1.5b-merged –template qwen
效果
总体来说两种的效果都可以,本教文只是走一遍微调整体流程,尽量通俗易懂,相关原理描述肯定不专业,毕竟术业有专攻。
这是一个我自己运营的纷传圈,一些网络安全漏洞挖掘相关的学习资料会在这个圈子分享,不定期分享ai挖掘skill,ai的skill漏洞挖掘教程,全网已经公开的各大src漏洞报告,全网最新漏洞poc。
圈子内人数目前已经达到60人,因此基于原价格上调,69元一年
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:小猫信安 小猫信安
小猫信安《如何微调属于自己的渗透模型?一文帮你吃透大模型微调!快速打造自己的本地渗透大模型!》