基于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保姆级安装教程:windows&ubuntu

OpenClaw保姆级安装教程:windows&ubuntu

这次给大家带来了OpenClaw安装全流程,从Node.js环境准备到完整OpenClaw安装配置。无论是Ubuntu还是Windows,都能按照本指南快速完成OpenClaw安装并成功运行。 一、Ubuntu 环境安装教程 对于很多开发者来说,Linux 环境是运行服务器和后台服务的首选。如果你目前还没有安装 Ubuntu 系统,或者对 Linux 环境还比较陌生,完全不用担心。你可以先去阅读一下《安装篇–Ubuntu24.04.2详细安装教程》这篇文章,跟着教程把基础的操作系统环境搭建好之后,再回到这里继续往下进行。 在 Ubuntu 中,我将全程使用命令行来完成安装。 第一步:部署 Node.js 基础运行环境 OpenClaw 对 Node.js 的版本有一定要求,为了保证最佳的兼容性和性能,我们这里强烈推荐安装Node.js 22.x版本。 首先,我们需要下载并执行 NodeSource 提供的官方安装配置脚本,它会自动帮我们配置好软件源:

By Ne0inhk
HarmonyOS 5.0 PC应用开发实战:构建跨设备协同的桌面生产力工具

HarmonyOS 5.0 PC应用开发实战:构建跨设备协同的桌面生产力工具

文章目录 * 每日一句正能量 * 前言 * 一、HarmonyOS PC应用开发背景与机遇 * 1.1 生态发展现状 * 1.2 技术架构特点 * 二、实战项目:跨设备Markdown编辑器 * 2.1 项目需求分析 * 2.2 技术选型 * 三、核心代码实现 * 3.1 工程架构搭建 * 3.2 PC端响应式布局 * 3.3 分布式数据同步实现 * 3.4 PC端多窗口管理 * 3.5 键盘快捷键系统 * 四、跨设备协同场景实战 * 4.1 手机拍照插入PC文档 * 4.2 平板手绘同步到PC * 五、性能优化与最佳实践 * 5.1

By Ne0inhk
玩转ClaudeCode:ClaudeCode安装教程(Windows+Linux+MacOS)

玩转ClaudeCode:ClaudeCode安装教程(Windows+Linux+MacOS)

本文介绍如何安装 AI 编码界一骑绝尘的最强工具 ——— Claude Code。安装不同的操作系统环境,本文会从 Windows、Linux、Mac 三个不同的系统环境依次介绍安装方法。 其中,Windows 系统作为大家最主流的操作系统,提供了两种安装方式,一种方式是直接在 Windows 的终端里安装,另一种是在 Windows 的子系统(WSL)内完成安装。其中,通过 WSL 安装,我们又可以分为,WSL 环境的直装和基于 WSL 的容器化安装(Docker),几种方法各有利弊,但均可正常使用。 Windows 环境直装 Claude Code 1. 获取 Claude Code 账号 访问 Claude Code 中国镜像站,完成账户注册。 输入邀请码

By Ne0inhk
Linux 动静态库完全指南:制作、使用、原理与实战

Linux 动静态库完全指南:制作、使用、原理与实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 库的基础认知:是什么?有哪些? * 1.1 库的本质 * 1.2 库的分类与系统位置 * 1.3 预备工作:自定义库源码 * 二. 静态库:编译时链接,独立运行 * 2.1 整体图示:理清思路 * 2.2 静态库制作流程(Makefile 自动化,更简便) * 2.3 静态库使用场景与命令 * 2.4 静态库核心特点 * 三. 动态库:运行时链接,

By Ne0inhk