基于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 webui3.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.git3.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机器人的文章,最终效果如下
