基于Llamafactory与LoRA方法的大语言模型微调创建个性化聊天机器人

基于Llamafactory与LoRA方法的大语言模型微调创建个性化聊天机器人

一 、项目背景

随着大语言模型的快速发展,如何让通用模型具备垂直领域的深度知识特定的角色人格,已成为参数高效微调(PEFT,Parameter-Efficient Fine-Tuning)技术的重要应用方向。传统的提示词难以让模型长期、稳定地维持复杂的角色设定和世界观知识,而全参数微调成本高昂。

本项目旨在利用 LlamaFactory 这一大模型微调框架,结合 LoRA(低秩适应) 技术,在保留基础模型通用能力的前提下,低成本地注入明日方舟游戏内的专属知识。目标是打造一个不仅能流畅对话,更能深度理解游戏内世界观设定、模拟特定人格说话方式的智能聊天机器人。

二、 介绍

2.1 Llamafactory

Llamafactory 是一个专注于高效微调大型语言模型的开源工具库。它旨在简化模型微调流程,支持多种主流开源模型,并提供丰富的训练策略和优化技术。其支持多种微调方法,包括全参数微调(Full Fine-tuning)、轻量级微调(如LoRA、QLoRA)、适配器微调(Adapter)等。兼容Hugging Face生态系统,可直接加载预训练模型。

2.2 LoRA

构建大语言模型需要耗费大量时间和资源。这些模型可能包含数万亿个参数,并被设置为特定值。要使模型在特定环境下运行,可能需要进行大量的重新训练,这意味着所有参数都会改变。由于此类模型的参数数量庞大,重新训练既耗时又费力。LoRA(Low-Rank Adaptation) 提供了一种无需重新训练即可快速调整模型的方法。其通过引入低秩矩阵来调整模型的权重,从而显著减少需要训练的参数数量。这种方法在保持模型性能的同时,降低了计算成本和内存占用。

2.3 环境要求

三、 Llamafactory的环境搭建与本地大模型以及数据集的准备

3.1 搭建环境

# 克隆仓库 git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git cd LlamaFactory # 安装依赖 pip install -e . pip install -r requirements/metrics.txt

在安装完依赖后,可执行以下命令进入llamafactory webui

# 进入 Webui llamafactory-cli webui

3.2  下载大模型到本地

在开始使用LlamaFactory微调之前,将基座模型下载到本地是非常重要的一步。因为相比于每次训练从huggingface下载,下载大模型文件到本地进行训练是更加稳定且安全的。用户可以自行选择通过Modelscope或Huggingface将大模型拉取到本地。

这里以从Modelscope库下载Qwen2.5-7B-instruct为例

# 安装Modelscope pip install modelscope # 安装完整模型库 modelscope download --model Qwen/Qwen2.5-7B-Instruct
# 也可以使用Git下载 # 确保lfs已被正确安装 git lfs install git clone https://www.modelscope.cn/Qwen/Qwen2.5-7B-Instruct.git

3.3 准备数据集

这是开始微调前的最后一步,也是非常影响微调后模型效果的重要的一步。Llamafactory主要支持以下三种数据集格式:

# Alpaca 格式 [ { "instruction": "user instruction (required)", "input": "user input (optional)", "output": "model response (required)", "system": "system prompt (optional)", "history": [ ["user instruction in the first round (optional)", "model response in the first round (optional)"], ["user instruction in the second round (optional)", "model response in the second round (optional)"] ] } ]
# Sharegpt 格式 [ { "conversations": [ { "from": "human", "value": "user instruction" }, { "from": "function_call", "value": "tool arguments" }, { "from": "observation", "value": "tool result" }, { "from": "gpt", "value": "model response" } ], "system": "system prompt (optional)", "tools": "tool description (optional)" } ]
# Openai 格式 [ { "messages": [ { "role": "system", "content": "system prompt (optional)" }, { "role": "user", "content": "user instruction" }, { "role": "assistant", "content": "model response" } ] } ]

由于训练集的质量对结果的影响远大于数量,所以建议不要过于依赖ai生成的对话。低质量的AI生成数据不仅无益,反而可能引入噪音,导致模型学习到错误的对话模式。笔者的思路是,首先人工撰写一部分高质量对话,再结合游戏内的文本以及游戏背景世界观,引导ai在此基础上进行分层扩写,对ai做出不同场景下对话的要求(如日常对话,夹杂世界观背景的对话等)。这一部分的比例可以根据需求自行调整。但需对ai生成的对话做检查,对明显不符合世界观或者人物性格的对话做删除或修改。下面是一个从明日方舟wiki源代码提取特定人物文本的脚本。

import re #复制文本' ''' # 使用正则表达式匹配特定格式的对话行 matches = re.findall(r'\[name="普瑞赛斯"\](.*?)\n', text) # 输出 for i, line in enumerate(matches, 1): print(f"{i}. {line}")

数据集准备就绪后,需将其以 JSON 格式存放于 `LlamaFactory/data/` 目录下,并在 `dataset_info.json` 配置文件中完成对应数据集的注册。

 "your data": { "file_name": "preseries_dataset.json", # 这里是你数据集的名字 "format": "alpaca", # 对话模板类型 "columns": { "instruction": "instruction", "output": "output" } },

至此,训练前的准备工作已全部完成,可以在llamafactory webui中进行微调了。

四、 在Llamafactory Webui中进行微调

4.1 首先对llamafactory提供了以下几种微调方式:

1. 全参数微调(Full Parameter Fine-Tuning)

全参数微调是指对预训练模型的所有参数进行更新。这种方法通常需要较大的计算资源和数据量,但能充分调整模型以适应特定任务。适用于数据充足且任务与预训练目标差异较大的场景。

2. LoRA(Low-Rank Adaptation)

LoRA通过低秩矩阵分解来微调模型,仅训练新增的低秩矩阵参数,冻结原始模型参数。显著减少计算和存储开销,适合资源受限的场景。

3. Freeze(参数冻结)

Freeze方法冻结预训练模型的大部分参数,仅微调部分层(如分类头或特定模块)。计算成本低,适用于小规模数据或迁移学习中特征提取层无需调整的场景。

4. OFT(Orthogonal Fine-Tuning)

OFT通过正交变换约束微调过程,保持模型参数的范数和正交性,避免灾难性遗忘。适用于需要保持预训练模型通用性的场景。

对于聊天机器人的训练,LoRA 是最为推荐的微调方法。这主要基于以下几个原因:首先,对话数据具有多样性和多轮性特点,LoRA 通过低秩适配矩阵能够有效捕捉对话模式,同时保持基座模型的通用语言能力不受破坏;其次,聊天机器人开发是一个不断试错、持续优化的迭代过程,LoRA 训练速度快,便于快速验证新数据效果;第三,LoRA 对硬件要求友好,能够在消费级显卡上运行。相比之下,全参数微调虽然理论上能达到更好效果,但训练成本高、迭代周期长。因此,建议使用LoRA进行微调。

4.2 其他设置:

模型路径: 之前下载到本地的大模型的路径

对话模板: 由于不同的大模型有不同的模板,所以需要根据你的基座模型来选择相应的模板

学习率: 学习率是控制模型在每次参数更新时调整步长的超参数,决定收敛速度与精度平衡。一般可以采用默认值5e-5

训练轮数: 训练轮数指机器学习模型在整个训练数据集上完整迭代的次数。在数据量小的情况下可以适当增加训练轮数防止欠拟合

计算类型: bf16具有较大的数值范围,能有效防止训练过程中的梯度溢出和损失爆炸,保证训练稳定性,在训练聊天机器人时一般采用bf16

其余参数可以根据自己的数据集以及对机器人的要求做更改。

4.3 开始微调

在开始微调后,网页右下角会开始自动生成损失函数曲线。通常来说,损失函数的值越低,效果就越好。该过程根据硬件的不同持续的时间也不一样。若设备性能较差可以考虑租用云算力平台。

4.4 模型导出

在微调完成后,可以在llamafactory webui中点击Chat,先加载检查点路径,看看微调效果是否理想。若效果理想,则可以点击Export进行导出了。在Export页面下输入导出路径,基座模型就会与LoRA权重合并并导出到该路径下。

五、 转换格式以及量化

5.1 将safetensors转换成gguf

导出后的模型是safetensores格式,若想进行大模型的ollama本地部署,首先要进行格式转换。在这里使用llamacpp的convert_*.py脚本进行大模型格式的转换

#安装llama.cpp winget install llama.cpp #转换成gguf格式 python convert_hf_to_gguf.py models/7B/qwen1_5-7b-chat --outtype f16 --output ./qwen_gguf.gguf

这里请注意,部分较早的文章中使用的是convert-hf-to-gguf.py,但目前这个脚本已改成下划线。具体可在llama.cpp目录下查看。

5.2 将fp16精度量化到q8或q4精度

在得到fp16精度的gguf文件后,还要进行量化。量化是通过降低模型参数的精度,大幅减少显存占用和计算量,并保持相近的效果。

#将fp16精度量化到q4 ./quantize models/7B/qwen1_5-7b-chat-fp16.gguf models/7B/qwen1_5-7b-chat-q8_0.gguf q8_0

至此已经得到了一个q8精度的大模型,可以进行本地部署了。

六、 将大模型导入Ollama完成本地部署

6.1 Ollama的介绍与下载

Ollama 是一个开源的大型语言模型交互工具,支持在本地运行和微调多种主流模型。其核心功能包括模型下载、版本管理、对话交互和 API 集成,适合开发者和研究人员快速部署 LLM 到本地环境。

# Windows用户可以直接下载Ollama客户端 # Linux或者云平台用户 curl -fsSL https://ollama.com/install.sh | sh 

6.2 Modelfile

导入Ollama这一步需要之前准备好的gguf文件以及一个Modelfile。Modelfile是Ollama用于定义和配置模型的核心文件,采用声明式语法描述模型参数、依赖项及生成规则。通过Modelfile,用户可以自定义模型行为、调整推理参数或整合外部数据。

其格式如下:

# 模型文件 FROM ./ollama-model.gguf # 推理参数 PARAMETER <parameter> <parametervalue> #对话模板 TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ # 系统提示词 SYSTEM """<system message>"""

6.3 导入Ollama

在准备好gguf文件和Modelfile后,就可以将微调好的大模型导入Ollama并进行测试了,

# 将模型导入Ollama,名字自定义 ollama create Priestess_q8 -f ./Modelfile # 打模型列表 ollama list # 运行模型 ollama run Priestess_q8 

如果一切正常,即已经完成了本地部署,效果如下

七、 使用Napcat和Astrbot框架接入QQ

# 通过 Docker Compose 将Astrbot和Napcat部署 mkdir astrbot cd astrbot wget https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml sudo docker compose -f astrbot.yml up -d

具体详细步骤请参考其他接入QQ机器人的文章,最终效果如下

Read more

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

前言:现在AI助手遍地都是,但要么是云端服务要花token钱,要么是功能单一只能聊天,想找一个“不花钱、能干活、保隐私”的电脑AI助理,简直比登天!直到我发现了一个神仙组合——龙虾AI(OpenClaw)+ 本地千问模型,完美解决所有痛点:零token成本、全程本地运行、能接管电脑干活,无论是办公摸鱼还是高效产出,都能轻松拿捏。 本文是纯新手向原创实操教程,全程手把手,从工具认知、环境准备,到龙虾与本地千问的联动配置,再到实战场景演示,每一步都标清重点、避开坑点,不用懂复杂代码,不用花一分钱,普通人跟着走,10分钟就能拥有专属本地AI电脑助理,从此告别云端token焦虑和隐私泄露风险! 一、先搞懂:为什么是“龙虾+本地千问”?核心优势碾压同类组合 在开始操作前,先跟大家说清楚两个核心工具的作用,以及为什么它们搭配起来是“王炸”——毕竟市面上AI工具那么多,选对组合才能少走弯路,真正实现“零成本、高效率”。 1. 两个核心工具,

IDEA集成AI辅助工具推荐(好用不卡顿)

IDEA里集成AI工具,核心要满足上下文感知强、响应快、不卡顿、贴合编码流程。下面按「官方原生」「第三方爆款」「国产友好」分类,覆盖代码补全、生成、重构、调试全场景,附安装和使用要点。 一、官方原生:JetBrains AI Assistant(最省心,无适配问题) 核心定位:JetBrains官方出品,深度内嵌IDEA,和编码、重构、调试流程无缝贴合 核心亮点 * 上下文理解极强:读取项目代码结构、命名规范、依赖关系,生成代码更贴合项目风格 * 全流程AI辅助:代码补全/生成、解释代码、写注释、生成测试用例、优化提交信息、排查报错 * 无额外配置:登录JetBrains账号即可用,支持多语言,不占用过多内存 * 隐私友好:代码数据默认不上传,企业可本地化部署 适用人群

OpenClaw 实战:让 AI 拥有“眼睛“——摄像头访问完全指南

OpenClaw 实战:让 AI 拥有“眼睛“——摄像头访问完全指南

今天冒出个想法,想让openclaw能控制摄像头分析图片。原因是我有本书,网上还没有电子版,想让openclaw分析然后把重点内容讲给我听。 📖让运行在 WSL2 里的 OpenClaw AI 助手能够"看见"摄像头画面。 🚧 探索过程 第一阶段:OpenClaw Node 配对(失败)折腾了 3 小时+,最终因为 WSL2 网络隔离问题放弃。 我在wsl里安了openclaw,他说要控制摄像头,必须在windows上安装node.js,安装npm,折腾了好久,就是报错。结论就是windows和wsl就是隔离的。 具体过程: **安装 Node.js:** 最开始下载了绿色版 Node.js(v24.14.0),遇到了一系列问题: ```powershell # 绿色版 Node.js

人工智能:注意力机制与Transformer模型实战

人工智能:注意力机制与Transformer模型实战

人工智能:注意力机制与Transformer模型实战 1.1 本章学习目标与重点 💡 学习目标:掌握注意力机制的核心原理、经典注意力算法,以及Transformer模型的架构设计与实战应用。 💡 学习重点:理解自注意力与多头注意力的计算逻辑,学会使用TensorFlow搭建Transformer模型,完成机器翻译任务。 1.2 注意力机制的核心思想 1.2.1 为什么需要注意力机制 💡 传统的RNN和LSTM在处理长序列时,存在长距离依赖捕捉能力不足和并行计算效率低的问题。注意力机制的出现,解决了这两个核心痛点。 注意力机制的本质是让模型学会“聚焦”——在处理序列数据时,自动分配不同的权重给输入序列中的各个元素,重点关注与当前任务相关的信息,弱化无关信息的干扰。 比如在机器翻译任务中,翻译“我爱中国”时,模型会给“我”“爱”“中国”分配不同的注意力权重,从而更精准地生成对应的英文翻译。 1.2.2 注意力机制的基本框架 💡 注意力机制的计算通常包含**查询(Query)、键(Key)、值(